HTB Retired. Пишем эксплоит ROP + mprotect и используем переполнение буфера
the Matrix

Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Добавляем IP-адрес машины в /etc/hosts:
И запускаем сканирование портов.
Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта.
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A).

Что же мы нашли? Порт 22 — служба OpenSSH 8.4p1, порт 80 — веб‑сервер Nginx. Также из результатов скана Nmap видим редирект, в котором страница передается в качестве параметра.

При таком запросе страниц сайта нужно сразу проверить, получится ли отобразить не тот файл, который был вставлен разработчиком. Попробуем запросить /etc/passwd, воспользовавшись обходом каталогов.

Уязвимость подтверждена, поэтому перейдем к эксплуатации. Нам нужно знать, какие файлы читать, поэтому поищем на сайте скрытые страницы. Так как мы уже столкнулись с форматами PHP и HTML, то такие страницы и будем искать. Для этого воспользуемся сканером ffuf.
Одно из первых действий при тестировании безопасности веб‑приложения — это сканирование методом перебора каталогов, чтобы найти скрытую информацию и недоступные обычным посетителям функции. Для этого можно использовать программы вроде dirsearch и DIRB.
Я предпочитаю легкий и очень быстрый ffuf. При запуске указываем следующие параметры:
Команда следующая:


Нашли всего одну новую страницу — beta..

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

Таким образом, загруженный через форму файл будет отправлен приложению, которое работает на локальном порте 1337. Попробуем выяснить, что это за приложение, с помощью LFI. Я запустил Burp Intruder и передал ему список информативных файлов из Unix.

В результате сканирования узнаем, что нам доступен в том числе и файл /proc/sched_debug, где и находим процесс activate_license и соответствующий ему идентификатор процесса (PID) — 487.

Зная PID процесса, мы можем получить полную командную строку, что даст нам путь к файлу.

Получаем полный путь к файлу обработчика, а также видим, что порт для прослушивания передается в качестве аргумента. Скачиваем этот файл на локальный хост для анализа.
Теперь перейдем к анализу приложения. Каждый выбирает для себя более удобный инструмент, но я остаюсь приверженцем IDA Pro. Закидываем бинарь в декомпилятор и ищем функцию main.
Итак, приложение стандартным способом открывает порт, ожидает соединения, и, если оно происходит и если функция fork выполнена успешно, оно запускает функцию activate_license.

В функции activate_license происходит бесконтрольное чтение в буфера размером 512 байт.

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

Но при отладке мы не попадаем в функцию activate_license, поэтому мне пришлось запатчить инструкцию условного перехода (jnz).


Теперь сгенерируем последовательность де Брёйна, которая поможет быстро определить смещение.

Отправляем эти данные нашей программе и после ошибки выполнения смотрим данные в регистре RBP.

Конвертируем полученное значение и вычисляем смещение — 520.

Выбирать метод долго не пришлось. Мы можем получить доступ к области неисполняемой памяти.

Для успешной эксплуатации мы отправим вместе с данными шелл‑код, с помощью ROP-цепочек сделаем этот сегмент памяти исполняемым и передадим управление на шелл‑код.
Впоследствии будем дополнять следующий шаблон эксплоита.
Для работы с ROP-цепочками нам потребуется карта памяти процесса с удаленного хоста, получить которую мы можем через LFI.

Для поиска ROP-цепочек нам нужно получить используемую версию libc.
Теперь можем определиться и с самой ROP-цепочкой. Нам нужно изменить права на блок памяти, и в этом поможет функция mprotect:
Функция принимает три аргумента, передавать которые мы будем инструкциями pop rdi, pop rsi и pop rdx. Проверить наличие соответствующих цепочек мы можем следующим образом:

Есть все данные для вызова функции mprotect, передавать в качестве параметров мы будем адрес стека и его размер (получаем из карты памяти), третий параметр функции — новые права, используем маску rwx (7). Вот код эксплоита на текущем этапе:
Следующей инструкцией станет jmp на адрес в регистре RSP (указатель стека), так как там будет расположен шелл‑код. Но найти инструкцию jmp rsp в регистре не удалось, поэтому скачаем и проверим другие используемые библиотеки. Нужную инструкцию обнаруживаем в библиотеке libsqlite.

Сам шелл‑код сгенерируем с помощью msfvenom из Metasploit Framework.

Полный код эксплоита будет следующим:
Запускаем листенер на указанном при генерации шелл‑кода порте (rlwrap -cAr nc -lvp 4321) и выполняем эксплоит.


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

Скрипт находит много интересного в разделе с бэкапами: какой‑то пользовательский файл /usr/bin/webbackup, службу website_backup, а также таймер для этой службы. Глянем, что собой представляет пользовательский файл.

Это скрипт на Bash, поэтому просмотрим его исходный код.

Этот сценарий должен архивировать при помощи zip все содержимое каталога /var/www/ и сохранять результат в /var/www/. При этом найденная служба, скорее всего, запускает скрипт раз в минуту.

Подобные задания на Hack The Box не новы, и заядлые «игроки» знают, что делать в данном случае: создавать символическую ссылку на другой файл. Тогда при обработке этой ссылки будут произведены операции с самим файлом. Создадим в каталоге /var/www/ ссылку на приватный ключ пользователя.
Теперь дождемся срабатывания скрипта, разархивируем только что созданный архив и заберем желанный ключ.

И, подключившись с полученным ключом, забираем флаг пользователя.

В домашнем каталоге пользователя находим интересный проект emuemu.

Файл из этого проекта уже был упомянут в выводе LinPEAS в разделе Linux capabilities. Но сначала пару слов о том, что же это такое.

В Linux пользователь root получает особый контекст при запуске любых процессов. Так, ядро и приложения, работающие от имени root, обычно пропускают любые ограничения, заданные на действия в определенном контексте, поэтому root может делать все, что захочет. Но что, если процессу, который работает в непривилегированном контексте, нужно выполнить требующее привилегий действие, не повышая уровня прав?
Например, бывает нужно разрешить процессу записывать в журнал аудита ядра, но не позволять отключить этот аудит. Ведь если запустить этот процесс в контексте рута, он сможет выполнить оба действия!
Тут на помощь и приходят Linux capabilities. Эти «возможности» предоставляют процессу не все множество привилегий, а какое‑то его подмножество. Другими словами, все привилегии рута разбиваются на более мелкие независимые друг от друга привилегии и процесс получает только те, которые ему нужны.
В данном случае активирована привилегия cap_dac_override, которая позволяет обойти проверку прав на запись для любого файла, то есть дает возможность записывать данные в абсолютно любой файл.
Теперь перейдем к самому приложению, благо есть даже исходные коды. Так, в файле reg_helper.c происходит запись в /proc/sys/fs/binfmt_misc/register.

Поскольку в binfmt_misc записывается подконтрольный нам ввод, мы можем использовать готовый эксплоит, чтобы запустить руткит и получить контроль над системой. Но в файл эксплоита нужно внести несколько изменений:


Выполняем наш файл и получаем привилегированную командную оболочку.

Машина захвачена!
Источник
Наши проекты:
- Кибер новости: the Matrix
- Хакинг: /me Hacker
- Кодинг: Minor Code
👁 Пробить человека? Легко через нашего бота: Мистер Пробиватор