![](/uploads/posts/2022-08/03.png)
Содержание статьи
Разведка
Сканирование портов
Добавляем IP-адрес машины в /
:
10.10.11.154 retired.htb
И запускаем сканирование портов.
![Результат работы скрипта Результат работы скрипта](/uploads/posts/2022-08/02.png)
Что же мы нашли? Порт 22 — служба OpenSSH 8.4p1, порт 80 — веб‑сервер Nginx. Также из результатов скана Nmap видим редирект, в котором страница передается в качестве параметра.
![Главная страница сайта Главная страница сайта](/uploads/posts/2022-08/03.png)
Точка входа
LFI
При таком запросе страниц сайта нужно сразу проверить, получится ли отобразить не тот файл, который был вставлен разработчиком. Попробуем запросить /
, воспользовавшись обходом каталогов.
curl http://retired.htb/index.php?page=/../../../../../../../etc/passwd
![Содержимое файла /etc/passwd Содержимое файла /etc/passwd](/uploads/posts/2022-08/04.png)
Уязвимость подтверждена, поэтому перейдем к эксплуатации. Нам нужно знать, какие файлы читать, поэтому поищем на сайте скрытые страницы. Так как мы уже столкнулись с форматами PHP и HTML, то такие страницы и будем искать. Для этого воспользуемся сканером ffuf.
Команда следующая:
ffuf -u http://retired.htb/FUZZ.php -t 256 -wdirectory_2.3_medium_lowercase.txt
![Результат поиска файлов PHP с помощью ffuf Результат поиска файлов PHP с помощью ffuf](/uploads/posts/2022-08/05.png)
ffuf -u http://retired.htb/FUZZ.html -t 256 -wdirectory_2.3_medium_lowercase.txt
![Результат поиска файлов HTML с помощью ffuf Результат поиска файлов HTML с помощью ffuf](/uploads/posts/2022-08/06.png)
Нашли всего одну новую страницу — beta.
.
![Страница beta.html Страница beta.html](/uploads/posts/2022-08/07.png)
На странице нужно загружать файл лицензии, который будет отправлен на следующий адрес:
http://retired.htb/activate_license.php
Посмотрим, что произойдет с файлом дальше. Для этого получим код найденного обработчика.
curl http://retired.htb/index.php?page=activate_license.php
![Исходный код activate_license.php Исходный код activate_license.php](/uploads/posts/2022-08/08.png)
Таким образом, загруженный через форму файл будет отправлен приложению, которое работает на локальном порте 1337. Попробуем выяснить, что это за приложение, с помощью LFI. Я запустил Burp Intruder и передал ему список информативных файлов из Unix.
![Burp Intruder — вкладка Positions Burp Intruder — вкладка Positions](/uploads/posts/2022-08/09.png)
В результате сканирования узнаем, что нам доступен в том числе и файл /
, где и находим процесс activate_license
и соответствующий ему идентификатор процесса (PID) — 487.
![Результат сканирования Результат сканирования](/uploads/posts/2022-08/10.png)
Зная PID процесса, мы можем получить полную командную строку, что даст нам путь к файлу.
curl http://retired.htb/index.php?page=/proc/487/cmdline
![Командная строка процесса 487 Командная строка процесса 487](/uploads/posts/2022-08/11.png)
Получаем полный путь к файлу обработчика, а также видим, что порт для прослушивания передается в качестве аргумента. Скачиваем этот файл на локальный хост для анализа.
wget http://retired.htb/index.php?page=/usr/bin/activate_license
Точка опоры
Переполнение буфера
Теперь перейдем к анализу приложения. Каждый выбирает для себя более удобный инструмент, но я остаюсь приверженцем IDA Pro. Закидываем бинарь в декомпилятор и ищем функцию main
.
Итак, приложение стандартным способом открывает порт, ожидает соединения, и, если оно происходит и если функция fork
выполнена успешно, оно запускает функцию activate_license
.
![Псевдокод функции main Псевдокод функции main](/uploads/posts/2022-08/12.png)
В функции activate_license
происходит бесконтрольное чтение в буфера размером 512 байт.
![Псевдокод функции activate_license Псевдокод функции activate_license](/uploads/posts/2022-08/13.png)
Таким образом, мы нашли место для переполнения буфера, осталось определиться со смещением нагрузки и методом эксплуатации. Для этого нужно запустить программу в удаленном отладчике, переполнить буфер и посмотреть, на каком смещении от начала буфера будет вершина стека, когда программа упадет.
![Параметры удаленного отладчика IDA Pro Параметры удаленного отладчика IDA Pro](/uploads/posts/2022-08/14.png)
Но при отладке мы не попадаем в функцию activate_license
, поэтому мне пришлось запатчить инструкцию условного перехода (jnz
).
![Код программы до исправления Код программы до исправления](/uploads/posts/2022-08/15.png)
![Код программы после патча jnz Код программы после патча jnz](/uploads/posts/2022-08/16.png)
Теперь сгенерируем последовательность де Брёйна, которая поможет быстро определить смещение.
![Генерирование последовательности де Брёйна Генерирование последовательности де Брёйна](/uploads/posts/2022-08/17.png)
Отправляем эти данные нашей программе и после ошибки выполнения смотрим данные в регистре RBP
.
echo aaabaaac... | nc 127.0.0.1 1337
![Значения регистров Значения регистров](/uploads/posts/2022-08/18.png)
Конвертируем полученное значение и вычисляем смещение — 520.
![Получение смещения Получение смещения](/uploads/posts/2022-08/19.png)
Выбирать метод долго не пришлось. Мы можем получить доступ к области неисполняемой памяти.
![Карта памяти Карта памяти](/uploads/posts/2022-08/20.png)
Для успешной эксплуатации мы отправим вместе с данными шелл‑код, с помощью ROP-цепочек сделаем этот сегмент памяти исполняемым и передадим управление на шелл‑код.
Скачать:
Скриншоты:
Важно:
Все статьи и материал на сайте размещаются из свободных источников. Приносим свои глубочайшие извинения, если Ваша статья или материал была опубликована без Вашего на то согласия.
Напишите нам, и мы в срочном порядке примем меры.