Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
В этом райтапе мы раскрутим уязвимость локального включения файлов, что поможет нам при написании эксплоита на основе ROP + mprotect. Поборов проверку лицензии, мы повысим привилегии при помощи руткита binfmt_misc. Препарировать будем машину Retired с площадки Hack The Box. Задачка классифицирована как сложная, хотя я бы так не сказал.
warning
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Добавляем IP-адрес машины в /etc/hosts
:
10.10.11.154 retired.htb
И запускаем сканирование портов.
Справка: сканирование портов
Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта.
#!/bin/bashports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr 'n' ',' | sed s/,$//)nmap -p$ports -A $1
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A
).
Результат работы скрипта
Что же мы нашли? Порт 22 — служба OpenSSH 8.4p1, порт 80 — веб‑сервер Nginx. Также из результатов скана Nmap видим редирект, в котором страница передается в качестве параметра.
Главная страница сайта
При таком запросе страниц сайта нужно сразу проверить, получится ли отобразить не тот файл, который был вставлен разработчиком. Попробуем запросить /etc/passwd
, воспользовавшись обходом каталогов.
curl 'http://retired.htb/index.php?page=/../../../../../../../etc/passwd'
Содержимое файла /etc/passwd
Уязвимость подтверждена, поэтому перейдем к эксплуатации. Нам нужно знать, какие файлы читать, поэтому поищем на сайте скрытые страницы. Так как мы уже столкнулись с форматами PHP и HTML, то такие страницы и будем искать. Для этого воспользуемся сканером ffuf.
Справка: сканирование веба c ffuf
Одно из первых действий при тестировании безопасности веб‑приложения — это сканирование методом перебора каталогов, чтобы найти скрытую информацию и недоступные обычным посетителям функции. Для этого можно использовать программы вроде dirsearch и DIRB.
Я предпочитаю легкий и очень быстрый ffuf. При запуске указываем следующие параметры:
-w
— словарь (я использую словари из набора SecLists);
-t
— количество потоков;
-u
— URL;
-fc
— исключить из результата ответы с кодом 403.
Команда следующая:
ffuf -u 'http://retired.htb/FUZZ.php' -t 256 -w directory_2.3_medium_lowercase.txt
Результат поиска файлов PHP с помощью ffufffuf -u 'http://retired.htb/FUZZ.html' -t 256 -w directory_2.3_medium_lowercase.txt
Результат поиска файлов HTML с помощью ffuf
Нашли всего одну новую страницу — beta.html
.
Страница beta.html
На странице нужно загружать файл лицензии, который будет отправлен на следующий адрес:
http://retired.htb/activate_license.php
Посмотрим, что произойдет с файлом дальше. Для этого получим код найденного обработчика.
curl 'http://retired.htb/index.php?page=activate_license.php'
Исходный код activate_license.php
Таким образом, загруженный через форму файл будет отправлен приложению, которое работает на локальном порте 1337. Попробуем выяснить, что это за приложение, с помощью LFI. Я запустил Burp Intruder и передал ему список информативных файлов из Unix.
Burp Intruder — вкладка Positions
В результате сканирования узнаем, что нам доступен в том числе и файл /proc/sched_debug
, где и находим процесс activate_license
и соответствующий ему идентификатор процесса (PID) — 487.
Результат сканирования
Зная PID процесса, мы можем получить полную командную строку, что даст нам путь к файлу.
curl 'http://retired.htb/index.php?page=/proc/487/cmdline'
Командная строка процесса 487
Получаем полный путь к файлу обработчика, а также видим, что порт для прослушивания передается в качестве аргумента. Скачиваем этот файл на локальный хост для анализа.
wget 'http://retired.htb/index.php?page=/usr/bin/activate_license'
Теперь перейдем к анализу приложения. Каждый выбирает для себя более удобный инструмент, но я остаюсь приверженцем IDA Pro. Закидываем бинарь в декомпилятор и ищем функцию main
.
Итак, приложение стандартным способом открывает порт, ожидает соединения, и, если оно происходит и если функция fork
выполнена успешно, оно запускает функцию activate_license
.
Псевдокод функции main
В функции activate_license
происходит бесконтрольное чтение в буфера размером 512 байт.
Псевдокод функции activate_license
Таким образом, мы нашли место для переполнения буфера, осталось определиться со смещением нагрузки и методом эксплуатации. Для этого нужно запустить программу в удаленном отладчике, переполнить буфер и посмотреть, на каком смещении от начала буфера будет вершина стека, когда программа упадет.
Параметры удаленного отладчика IDA Pro
Но при отладке мы не попадаем в функцию activate_license
, поэтому мне пришлось запатчить инструкцию условного перехода (jnz
).
Код программы до исправления
Код программы после патча jnz
Теперь сгенерируем последовательность де Брёйна, которая поможет быстро определить смещение.
Генерирование последовательности де Брёйна
Отправляем эти данные нашей программе и после ошибки выполнения смотрим данные в регистре RBP
.
echo aaabaaac... | nc 127.0.0.1 1337
Значения регистров
Конвертируем полученное значение и вычисляем смещение — 520.
Получение смещения
Выбирать метод долго не пришлось. Мы можем получить доступ к области неисполняемой памяти.
Карта памяти
Для успешной эксплуатации мы отправим вместе с данными шелл‑код, с помощью ROP-цепочек сделаем этот сегмент памяти исполняемым и передадим управление на шелл‑код.
Источник: xakep.ru