Хакер - HTB Late. Эксплуатируем инъекцию шаблонов в сервисе обработки изображений
hacker_frei
RalfHacker
Содержание статьи
- Разведка
- Сканирование портов
- Точка входа
- Точка опоры
- От SSTI к RCE
- Локальное повышение привилегий
В этом райтапе я покажу, как эксплуатировать серверную инъекцию шаблонов (SSTI) в сервисе для распознавания текста на изображениях. А в повышении привилегий нам поможет пользовательский скрипт для отслеживания логина и логаута пользователей. Упражняться будем на «легкой» машине Late с площадки Hack The Box.
WARNING
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
РАЗВЕДКА
Сканирование портов
Добавляем IP-адрес машины в /etc/hosts:
10.10.11.156 late.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.
Брутить SSH смысла нет, поэтому начинаем исследование с веб‑сервера.
Справка: брутфорс учеток
Поскольку вначале у нас нет учетных данных, нет и смысла изучать службы, которые всегда требуют авторизации (например, SSH). Единственное, что мы можем делать здесь, — это перебирать пароли брутфорсом, но машины с HTB почти всегда можно пройти по‑другому. В жизни таких вариантов может не быть, к тому же есть шансы подобрать пароль или получить его при помощи социальной инженерии.
Заглянем на сайт через браузер.

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

Снова ничего интересного. Тогда перейдем к сканированию файлов HTML (ведь нас встретили именно такие статические страницы):
ffuf -u 'http://late.htb/FUZZ.html' -t 256 -w directory_2.3_medium_lowercase.txt

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


Найденный поддомен добавим в файл /etc/hosts и заглянем на расположенный там сайт.
10.10.11.156 late.htb images.late.htb

Нас встречает преобразователь изображений в текст, написанный с использованием Flask, а это значит, что нужно сразу проверить наличие уязвимостей SSTI.
ТОЧКА ОПОРЫ
Я решил отправить первое попавшееся под руку изображение, чтобы посмотреть, как работает этот конвертер, и в ответ получил запрос на сохранение файла. Файл содержал весь текст с отправленного изображения, заключенный в тег <p>.

От SSTI к RCE
Раз мы можем управлять кодом на странице, попробуем проэксплуатировать SSTI.
Справка: server-side template injection
Server-side template injection (SSTI), или инъекция шаблонов на стороне сервера, — это механизм атаки, при котором злоумышленник внедряет в шаблон вредоносный код. Шаблоны нужны веб‑разработчикам, чтобы можно было настраивать внешний вид сайта только в одном месте и затем не копировать вручную. По сути, шаблон — это документ HTML, где в нужных местах отмечены переменные и команды, которые при генерации итоговой страницы будут заменены данными. В том числе это могут быть и данные, полученные от посетителя сайта.
Атака затрагивает момент, когда присланная информация объединяется с шаблоном. Злоумышленник формирует строку таким образом, чтобы она не просто подставилась в шаблон, но была интерпретирована как код. Если это возможно, то он добавит свои директивы, с помощью которых выполнит эксфильтрацию данных или даже захват веб‑сервера.
В качестве теста уязвимости SSTI я отправил {{7*7}}. Если сервер уязвим, он выполнит это выражение и вернет нам результат. Я написал эту последовательность в текстовом редакторе, сделал скриншот и отправил его.

Видим, что сервер уязвим к внедрению шаблонов. Не выполняя обычные перечисления, я решил сразу попробовать получить RCE. Давай получим результат выполнения команды id. Для этого импортируем модуль os. Снова пишем весь код в редакторе, делаем скриншот, отправляем изображение и получаем информацию о текущем контексте работы.
${{ config.__class__.from_envvar.__globals__.import_string("os").popen("id").read() }}

RCE есть, теперь нужно получить стабильный доступ к хосту. Не будем сразу пытаться пробросить реверс‑шелл, а сначала запросим приватный ключ пользователя svc_acc, что даст нам возможность подключиться по SSH.
${{ config.__class__.from_envvar.__globals__.import_string("os").popen("cat /home/svc_acc/.ssh/id_rsa").read() }}

Есть приватный ключ. Копируем его в отдельный файл, назначаем права командой chmod 0600 id_rsa, затем подключаемся по SSH и забираем флаг пользователя.

ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ
Теперь, когда мы получили доступ к хосту, нам необходимо собрать информацию. Загрузим на хост скрипт PEASS, запустим его и посмотрим, что он найдет.
Справка: скрипты PEASS для Linux (загрузка через SCP)
Что делать после того, как мы получили доступ в систему от имени пользователя? Вариантов дальнейшей эксплуатации и повышения привилегий может быть очень много, как в Linux, так и в Windows. Чтобы собрать информацию и наметить цели, можно использовать Privilege Escalation Awesome Scripts SUITE (PEASS) — набор скриптов, которые проверяют систему на автомате.
Чтобы воспользоваться скриптом, его нужно сначала загрузить на локальный хост.
wget https://github.com/carlospolop/PEASS-ng/releases/latest/download/linpeas.sh -O /tmp/linpeas.sh
Затем с помощью встроенных средств SSH загружаем скрипт на удаленный хост, назначаем ему права и выполняем.
scp -i id_rsa /tmp/linpeas.sh svc_acc@late.htb:/tmp/
chmod +x /tmp/linpeas.sh
/tmp/linpeas.sh

Мы узнали, что в нашем владении — скрипт /usr/local/sbin/ssh-alert.sh. Посмотрим, для чего он нужен.

Этот скрипт сообщает, что обнаружен логин по SSH, и отправляет руту сообщение с помощью sendmail. Так как мы владельцы этого файла, мы можем внести в него изменения. Давай посмотрим, что приводит к его запуску.
Для отслеживания запускаемых процессов в системе будем использовать утилиту pspy64. Загрузим ее на хост тем же способом, которым загружали linpeas, а потом выполним. Поскольку найденный скрипт сообщает о подключении по SSH, в другом терминале подключимся по SSH, а затем отключимся.

В выводе находим отображение запуска найденного скрипта, но, что более интересно, он запускается в контексте пользователя с UID=0, а это root. Таким образом, мы можем написать в скрипт свои команды, которые будут выполнены в привилегированном контексте.
В качестве метода закрепления давай назначим файлу командной оболочки бит SUID.
Справка: бит SUID
Когда у файла установлен атрибут setuid (S-атрибут), обычный пользователь, запускающий этот файл, получает повышение прав до пользователя — владельца файла в рамках запущенного процесса. После получения повышенных прав приложение может выполнять задачи, которые недоступны обычному пользователю. Из‑за возможности состояния гонки многие операционные системы игнорируют S-атрибут, установленный shell-скриптам.
echo "chmod u+s /bin/bash" >> ssh-alert.sh
Теперь снова зайдем по SSH, сразу же выйдем и проверим права на файл.

S-бит установлен, и мы можем изменить контекст пользователя и забрать флаг рута.
/bin/bash -p

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