Содержание статьи
warning
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Разведка
Сканирование портов
Добавляем IP-адрес машины в /
:
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 видим редирект, в котором страница передается в качестве параметра.
Точка входа
LFI
При таком запросе страниц сайта нужно сразу проверить, получится ли отобразить не тот файл, который был вставлен разработчиком. Попробуем запросить /
, воспользовавшись обходом каталогов.
curl 'http://retired.htb/index.php?page=/../../../../../../../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
ffuf -u 'http://retired.htb/FUZZ.html' -t 256 -w directory_2.3_medium_lowercase.txt
Нашли всего одну новую страницу — beta.
.
На странице нужно загружать файл лицензии, который будет отправлен на следующий адрес:
http://retired.htb/activate_license.php
Посмотрим, что произойдет с файлом дальше. Для этого получим код найденного обработчика.
curl 'http://retired.htb/index.php?page=activate_license.php'
Таким образом, загруженный через форму файл будет отправлен приложению, которое работает на локальном порте 1337. Попробуем выяснить, что это за приложение, с помощью LFI. Я запустил Burp Intruder и передал ему список информативных файлов из Unix.
В результате сканирования узнаем, что нам доступен в том числе и файл /
, где и находим процесс activate_license
и соответствующий ему идентификатор процесса (PID) — 487.
Зная PID процесса, мы можем получить полную командную строку, что даст нам путь к файлу.
curl 'http://retired.htb/index.php?page=/proc/487/cmdline'
Получаем полный путь к файлу обработчика, а также видим, что порт для прослушивания передается в качестве аргумента. Скачиваем этот файл на локальный хост для анализа.
wget 'http://retired.htb/index.php?page=/usr/bin/activate_license'
Точка опоры
Переполнение буфера
Теперь перейдем к анализу приложения. Каждый выбирает для себя более удобный инструмент, но я остаюсь приверженцем IDA Pro. Закидываем бинарь в декомпилятор и ищем функцию main
.
Итак, приложение стандартным способом открывает порт, ожидает соединения и, если оно происходит и если функция fork
выполнена успешно, запускает функцию activate_license
.
В функции activate_license
происходит бесконтрольное чтение из буфера размером 512 байт.
Таким образом, мы нашли место для переполнения буфера, осталось определиться со смещением нагрузки и методом эксплуатации. Для этого нужно запустить программу в удаленном отладчике, переполнить буфер и посмотреть, на каком смещении от начала буфера будет вершина стека, когда программа упадет.
Но при отладке мы не попадаем в функцию activate_license
, поэтому мне пришлось запатчить инструкцию условного перехода (jnz
).
Теперь сгенерируем последовательность де Брёйна, которая поможет быстро определить смещение.
Отправляем эти данные нашей программе и после ошибки выполнения смотрим данные в регистре RBP
.
echo aaabaaac... | nc 127.0.0.1 1337
Конвертируем полученное значение и вычисляем смещение — 520.
Выбирать метод долго не пришлось. Мы можем получить доступ к области неисполняемой памяти.
Для успешной эксплуатации мы отправим вместе с данными шелл‑код, с помощью ROP-цепочек сделаем этот сегмент памяти исполняемым и передадим управление на шелл‑код.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»