Хакер - HTB RouterSpace. Повышаем привилегии через баг в sudo

Хакер - HTB RouterSpace. Повышаем привилегии через баг в sudo

hacker_frei

https://t.me/hacker_frei

RalfHacker

Содержание статьи

  • Разведка
  • Сканирование портов
  • Точка входа
  • Точка опоры
  • Локальное повышение привилегий

В этом рай­тапе мы про­ана­лизи­руем при­ложе­ние для Android, что­бы най­ти уяз­вимость на сер­вере, а затем повысим при­виле­гии с помощью уяз­вимос­ти в sudo. Наша цель — зах­ватить «лег­кую» машину RouterSpace с пло­щад­ки Hack The Box.

WARNING

Под­клю­чать­ся к машинам с HTB рекомен­дует­ся толь­ко через VPN. Не делай это­го с компь­юте­ров, где есть важ­ные для тебя дан­ные, так как ты ока­жешь­ся в общей сети с дру­гими учас­тни­ками.

РАЗВЕДКА

Сканирование портов

До­бав­ляем IP-адрес машины в /etc/hosts, что­бы было удоб­нее обра­щать­ся к ней:

10.10.11.148 routerspace.htb

И запус­каем ска­ниро­вание пор­тов.

Справка: сканирование портов

Ска­ниро­вание пор­тов — стан­дар­тный пер­вый шаг при любой ата­ке. Он поз­воля­ет ата­кующе­му узнать, какие служ­бы на хос­те при­нима­ют соеди­нение. На осно­ве этой информа­ции выбира­ется сле­дующий шаг к получе­нию точ­ки вхо­да.

На­ибо­лее извес­тный инс­тру­мент для ска­ниро­вания — это Nmap. Улуч­шить резуль­таты его работы ты можешь при помощи сле­дующе­го скрип­та.

#!/bin/bash

ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)

nmap -p$ports -A $1

Он дей­ству­ет в два эта­па. На пер­вом про­изво­дит­ся обыч­ное быс­трое ска­ниро­вание, на вто­ром — более тща­тель­ное ска­ниро­вание с исполь­зовани­ем име­ющих­ся скрип­тов (опция -A).

#!/bin/bash

ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)

nmap -p$ports -A $1

Ре­зуль­тат работы скрип­та

На­ходим два откры­тых пор­та: 22 — служ­ба SSH и 80 — веб‑сер­вер. Пер­вым делом, как обыч­но, ищем любую полез­ную информа­цию на сай­те. Дол­го искать не приш­лось — находим ссыл­ку на ска­чива­ние фай­ла APK.

Глав­ная стра­ница сай­та

Мы ска­чали при­ложе­ние для Android, но нуж­на соот­ветс­тву­ющая вир­туаль­ная машина. Я буду исполь­зовать AVD, который вхо­дит в Android Studio. Ниже при­веду эта­пы раз­верты­вания подоб­ной «вир­туал­ки».

ТОЧКА ВХОДА

Пер­вым делом нуж­но выб­рать тип и модель вир­туаль­ного девай­са.

Вы­бор устрой­ства

За­тем накатить нуж­ную вер­сию Android и при­нять кон­фигура­цию по умол­чанию.

Вы­бор вер­сии ПО
Кон­фигура­ции соз­данно­го устрой­ства

Те­перь в менед­жере устрой­ств дол­жна отоб­ражать­ся толь­ко что соз­данная вир­туаль­ная машина.

Ме­нед­жер устрой­ств

Нам необ­ходимо акти­виро­вать режим раз­работ­чика. Для это­го, как и в реаль­ном смар­тфо­не, заходим в нас­трой­ки: System → About и мно­го раз нажима­ем на поле Build number.

В кон­це кон­цов отоб­разит­ся сооб­щение, что режим раз­работ­чика акти­виро­ван. В меню System появит­ся новое меню Developer options.

System → About и новый SystemВ меню раз­работ­чика сле­дует акти­виро­вать отладку по USB (USB debugging), что­бы мы мог­ли управлять устрой­ством с помощью ADB.

INFO

Android Debug Bridge (ADB) — это уни­вер­саль­ный инс­тру­мент коман­дной стро­ки, который поз­воля­ет вза­имо­дей­ство­вать с устрой­ством Android. ADB упро­щает выпол­нение раз­личных дей­ствий с устрой­ством, таких как уста­нов­ка и отладка при­ложе­ний, а так­же пре­дос­тавля­ет дос­туп к обо­лоч­ке Unix, которую мож­но исполь­зовать для выпол­нения команд. Под­робнее про ADB читай в статье «Иг­ра всле­пую. Управля­ем Android-смар­тфо­ном через ADB».

Сна­чала пос­мотрим под­клю­чен­ные устрой­ства.

bash

adb devices

Спи­сок под­клю­чен­ных устрой­ств

Те­перь уста­новим ска­чан­ное при­ложе­ние. Сде­лать это прос­то:

adb install RouterSpace.apk

Ус­танов­ка при­ложе­ния через ADB

И в меню нашего Android появит­ся икон­ка уста­нов­ленной APK. Пос­ле запус­ка уви­дим изоб­ражение роуте­ра и кноп­ку для про­вер­ки ста­туса соеди­нения.

Ме­ню при­ложе­ний
При­ложе­ние RouterSpace

При про­вер­ке ста­туса при­ложе­ние отправ­ляет какие‑то дан­ные по сети. Что­бы узнать, что имен­но оно отправ­ляет, про­пус­тим тра­фик через Burp Proxy. Для это­го в нас­трой­ках Burp Proxy соз­дадим новый Proxy Listener на VPN-интерфей­се (у меня это tun0). Для прос­лушива­ния я ука­зал порт 8081.

Нас­трой­ка Burp Proxy

А так­же уста­новим эти нас­трой­ки в AVD: Settings → Proxy.

Нас­трой­ка AVD Proxy

И при сле­дующей про­вер­ке ста­туса соеди­нения уви­дим в Burp перех­вачен­ный пакет.

Зап­рос в Burp Proxy

ТОЧКА ОПОРЫ

Ком­бинаци­ей кла­виш Ctrl-R переве­дем зап­рос в Burp Repeater. Затем выпол­ним зап­рос и получим в ответ тот же адрес.

Тес­товый зап­рос в Burp Repeater

Нуж­но про­верить, дей­стви­тель­но ли сер­вер воз­вра­щает то, что мы ему прис­лали, или под­верга­ет дан­ные допол­нитель­ной обра­бот­ке. Для это­го добавим еще какие‑нибудь слу­чай­ные сим­волы к дан­ным в нашем зап­росе.

Тес­товый зап­рос в Burp Repeater

И сно­ва получа­ем то, что отпра­вили. Толь­ко добав­ляет­ся сим­вол перево­да стро­ки \n. Это типич­но для коман­ды echo. Веро­ятно, наш ввод переда­ется в коман­дную обо­лоч­ку. Поп­робу­ем выпол­нить инъ­екцию коман­ды id.

Инъ­екция коман­ды id

Ко­ман­да успешно выпол­нилась! Оста­лось получить пол­ноцен­ную коман­дную обо­лоч­ку. Попыт­ки проб­росить реверс‑шелл ока­зались безус­пешны, тог­да я коман­дой ssh-keygen сге­нери­ровал пару клю­чей SSH и записал пуб­личный на сер­вер в файл ~/.ssh/authorized_keys.

За­пись SSH-клю­ча

А теперь под­клю­чим­ся с помощью при­ват­ного клю­ча, получим сес­сию SSH и заберем поль­зователь­ский флаг.

Флаг поль­зовате­ля

ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ

Мы получи­ли дос­туп к сер­веру, но от име­ни поль­зовате­ля. Теперь нуж­но соб­рать как мож­но боль­ше информа­ции, что­бы понять, как доб­рать­ся до рута. Как всег­да, вос­поль­зуюсь скрип­том PEASS.

Справка: скрипты PEASS

Что делать пос­ле того, как мы получи­ли дос­туп в сис­тему от име­ни поль­зовате­ля? Вари­антов даль­нейшей экс­плу­ата­ции и повыше­ния при­виле­гий может быть очень мно­го как в Linux, так и в Windows. Что­бы соб­рать информа­цию и наметить цели, мож­но исполь­зовать Privilege Escalation Awesome Scripts SUITE (PEASS) — набор скрип­тов, которые про­веря­ют сис­тему на авто­мате.

С помощью SSH заг­рузим на хост скрипт для Linux.

scp -i id_rsa linpeas.sh paul@routerspace.htb:~/

Пос­ле его выпол­нения на уда­лен­ном хос­те получа­ем огромный мас­сив информа­ции. Но из полез­ного скрипт под­све­чива­ет нам вер­сию sudo и ука­зыва­ет, что в ней есть уяз­вимость.

Вер­сия sudo
Су­щес­тву­ющие уяз­вимос­ти

Это CVE-2021-3156: любой неп­ривиле­гиро­ван­ный поль­зователь может получить при­виле­гии root на уяз­вимом хос­те, исполь­зуя кон­фигура­цию sudo по умол­чанию.

Внут­ри это устро­ено так. Судо­ер объ­еди­няет передан­ные ему аргу­мен­ты коман­дной стро­ки в буфер, выделен­ный в куче. Одна­ко если аргу­мент коман­дной стро­ки закан­чива­ется одним сим­волом обратной косой чер­ты, то это вызыва­ет ошиб­ку в сле­дующем бло­ке кода.

if (sudo_mode & (MODE_RUN | MODE_EDIT | MODE_CHECK)) {

...

if (ISSET(sudo_mode, MODE_SHELL|MODE_LOGIN_SHELL)) {

...

for (to = user_args, av = NewArgv + 1; (from = *av); av++) {

while (*from) {

if (from[0] == '\' && !isspace((unsigned char)from[1]))

from++;

*to++ = *from++;

}

*to++ = ' ';

}

...

}

...

}

Та­ким обра­зом, если в нашем слу­чае from[0] — это \, тог­да from[1] будет завер­шающим нуль‑сим­волом \0 (не про­белом), а это при­ведет к выпол­нению усло­вия опе­рато­ра if. Тог­да про­изой­дет сме­щение ука­зате­ля from на нуль‑сим­вол и копиро­вание в перемен­ную user_args (через to). Все это при­ведет к копиро­ванию в эту перемен­ную дан­ных уже за пре­дела­ми буфера — то есть перепол­нению буфера в куче.

Но что­бы попасть в этот уяз­вимый блок кода, судо­ер дол­жен быть запущен в режиме MODE_SHELL. Это­го мож­но дос­тичь, если при запус­ке ука­зать опцию -s или -i (она добавит допол­нитель­но MODE_LOGIN_SHELL). И помимо это­го, с одним из фла­гов MODE_RUN,MODE_EDIT (-e) и MODE_CHECK (-l).

А теперь самое инте­рес­ное: если выпол­няет­ся сле­дующее усло­вие, то про­изой­дет экра­ниро­вание всех метасим­волов, вклю­чая обратную косую чер­ту, и уяз­вимый блок кода ста­новит­ся недос­тижимым!

if (ISSET(mode, MODE_RUN) && ISSET(flags, MODE_SHELL))

Слож­ность в том, что мы не можем акти­виро­вать режим MODE_EDIT или MODE_CHECK без акти­вации MODE_RUN. Но можем вос­поль­зовать­ся sudoedit, который авто­мати­чес­ки уста­новит MODE_EDIT, но не MODE_RUN. Ну а пос­ле получе­ния уяз­вимос­ти перепол­нения буфера в куче воз­можны раз­ные вари­анты.

INFO

Ав­томати­чес­кая экс­плу­ата­ция этой уяз­вимос­ти уже реали­зова­на в го­товом экс­пло­ите. Прос­то заг­рузим скрипт на хост и выпол­ним для получе­ния при­виле­гиро­ван­ного кон­тек­ста.

Флаг рута

Ма­шина зах­вачена!

Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei



Report Page