Хакер - HTB RouterSpace. Повышаем привилегии через баг в sudo
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

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


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

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

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

ТОЧКА ОПОРЫ
Комбинацией клавиш Ctrl-R переведем запрос в Burp Repeater. Затем выполним запрос и получим в ответ тот же адрес.

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

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

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

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

ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ
Мы получили доступ к серверу, но от имени пользователя. Теперь нужно собрать как можно больше информации, чтобы понять, как добраться до рута. Как всегда, воспользуюсь скриптом PEASS.
Справка: скрипты PEASS
Что делать после того, как мы получили доступ в систему от имени пользователя? Вариантов дальнейшей эксплуатации и повышения привилегий может быть очень много как в Linux, так и в Windows. Чтобы собрать информацию и наметить цели, можно использовать Privilege Escalation Awesome Scripts SUITE (PEASS) — набор скриптов, которые проверяют систему на автомате.
С помощью SSH загрузим на хост скрипт для Linux.
scp -i id_rsa linpeas.sh paul@routerspace.htb:~/
После его выполнения на удаленном хосте получаем огромный массив информации. Но из полезного скрипт подсвечивает нам версию 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