HTB Usage
Раскручиваем SQL-инъекцию и атакуем Laravel
Наша цель — получение прав суперпользователя на машине Usage с учебной площадки Hack The Box. Уровень задания — легкий.
warning
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Разведка
Сканирование портов
Сначала добавим IP-адрес машины в файл /
:
10.10.11.18 usage.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.9p1;
- 80 — веб‑сервер Nginx 1.18.0.
На SSH, не имея учетных данных, нам пока делать нечего, поэтому сосредоточимся на веб‑сервере. Для начала выясним, какие на сайте используются технологии. Это удобно делать с помощью сервиса WhatWeb. Он анализирует веб‑страницу и пытается определить, какие CMS, веб‑серверы, языки программирования, фреймворки и другие технологии используются на сайте.
Запустим WhatWeb и передадим ему IP-адрес целевого сервера:
whatweb http://10.10.11.18

Результаты сканирования показывают, что веб‑сайт использует Laravel — популярный PHP-фреймворк, который широко применяется для разработки веб‑приложений. Это важная информация, так как в случае уязвимостей в Laravel мы сможем их использовать для дальнейшей атаки.
Кроме того, на сайте настроен редирект на домен usage.
.
На сайте мы видим стандартную форму авторизации с возможностью регистрации новых пользователей.

Точка входа
При попытке перейти на страницу Admin (/
) мы сталкиваемся с ошибкой Unknown host.

Это происходит из‑за того, что наш локальный DNS не знает о существовании поддомена admin.
. Чтобы исправить это, нужно обновить запись в файле /etc/hosts:
10.10.11.18 usage.htb admin.usage.htb
После этого перезагружаем страницу, и перед нами открывается главная страница администраторской панели.

В поисках точки входа переходим к тестированию функции восстановления пароля на странице /
. Это потенциальная точка для проведения SQL-инъекции.
Справка: SQL-инъекции и sqlmap
SQL-инъекция — это тип уязвимости, при котором злоумышленник может внедрить произвольный SQL-код в запрос к базе данных через пользовательский ввод. Это может позволить просматривать, изменять или удалять данные из базы данных, а также иногда получать доступ к операционной системе. Чтобы найти возможность провести SQL-инъекцию, при тестировании приложений отправляют специальные символы и последовательности через проверяемое поле и смотрят реакцию сервера. Если сервер отвечает иначе на определенные символы, это может свидетельствовать о наличии уязвимости.
Sqlmap — это мощный инструмент для автоматизации процесса эксплуатации SQL-инъекций. Он позволяет автоматически обнаруживать и использовать уязвимости, подбирать пароли, извлекать данные и выполнять команды на сервере.
Подробнее читай в статье «SQL-инъекции. Разбираем на пальцах одну из самых популярных хакерских техник».
Просмотрим запрос на сервер в Burp History.

Теперь будем перебирать разные последовательности символов. Если сервер отреагирует каким‑то необычным образом, это даст нам направление для дальнейших исследований.
Для перебора перенаправим запрос комбинацией клавиш Ctrl-I в Burp Intruder.


В итоге получаем несколько типичных для SQL injection нагрузок. Продолжаем проверку SQL-инъекции, и среди UNION-нагрузок, определяющих количество столбцов в таблице, всего одна дает отличный от остальных нагрузок результат. Так мы понимаем, что в таблице семь столбцов, а уязвимость на сайте присутствует.

Попробуем автоматизировать эксплуатацию уязвимости.
SQL-инъекция
Сохраним запрос из Burp History в файл r.
, после чего передадим файл программе sqlmap в параметре -r
. Также в параметре -p
укажем уязвимый POST-параметр email
и запросим базы данных на сервере (--dbs
). Спустя полчаса sqlmap определил уязвимость, подобрал нагрузку и нашел существующие базы данных.
sqlmap -r r.txt -p email --batch --level 5 --thread=10 --dbs


Среди представленных баз данных нам нужна пользовательская usage_blog
. Получим таблицы (--tables
) из этой базы (-D
).
sqlmap -r r.txt -p email --batch --level 5 --thread=10 -D usage_blog --tables

Наибольший интерес представляет таблица admin_users
. Выгрузим из этой таблицы (-T
) все данные (--dump
).
sqlmap -r r.txt -p email --batch --level 5 --thread=10 -D usage_blog -T admin_users --dump

Так мы получаем всего один хеш пароля администратора. Судя по виду, использован алгоритм хеширования bcrypt. Определить соответствующий режим hashcat можно, поискав слово bcrypt в справке утилиты.
hashcat -h | grep bcrypt

Теперь мы знаем, что нам нужен режим 3200, и мы можем запустить подбор пароля. Для этого будем использовать популярный словарь rockyou.txt. Перебор займет всего пару минут.
hashcat -m 3200 hash rockyou.txt

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

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

Эта версия фреймворка уязвима к выполнению произвольного кода через неконтролируемую загрузку файлов на странице параметров пользователя (CVE-2023-24249). Это позволит нам загрузить PHP-шелл.
Справка: реверс-шелл
Обратный шелл — это подключение, которое активирует атакуемая машина, а мы принимаем и таким образом подключаемся к ней, чтобы выполнять команды от лица пользователя, запустившего шелл. Для приема соединения необходимо создать на локальной машине listener, то есть «слушатель».
Запускаем листенер:
pwncat-cs -lp 4321
И загружаем php-reverse-shell в формате JPG, предварительно установив свои данные для подключения к листенеру.

Отлавливаем запрос в Burp Proxy и добавляем к имени загружаемого файла еще одно расширение .
.


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

Продвижение
В домашнем каталоге пользователя есть файл .
, в котором находим учетные данные пользователя admin
.


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

Пользователь dash у нас уже есть, поэтому пробуем подключиться как пользователь xander.

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

Видим, что мы можем запустить файл /
от имени пользователя root без ввода пароля. Скорее всего, это можно будет использовать. Давай посмотрим, что это за файл.
file /usr/bin/usage_management

Это скомпилированная бинарная утилита, а значит, ее анализ будет немного сложнее, нежели скрипта на Bash или на Python. При запуске программы нам предложат выбрать один из трех вариантов.

Стоит проверить, что будет происходить в системе при работе этой программы. Для отслеживания вновь запускаемых процессов будем использовать утилиту pspy64. Логинимся по SSH в новой консоли, запускаем pspy64, а затем выбираем первую функцию в исследуемом приложении. В логах pspy64 тут же отобразится странный процесс.

Утилита вызывает через командную оболочку архиватор 7za. Используем утилиту strings
для получения всех строк из файла.

Видимо, перед выполнением команды 7za
рабочий каталог меняется на var/
. В аргументах 7za
интересна последовательность параметров --
. Параметр --
означает, что все последующие «слова» будут восприниматься не как параметры, а только как пути к файлам.
Получается, что если мы создадим в каталоге /
файл @id_rsa
и симлинк id_rsa
на ключ /
, то 7za
будет воспринимать id_rsa
как список файлов. А при попытке прочитать каждую строку из id_rsa
как файл архиватор будет выводить сообщение об ошибке, содержащее эту строку. Таким образом мы получим все содержимое приватного ключа пользователя root.
cd /var/www/html/
touch @id_rsa
ln -s /root/.ssh/id_rsa id_rsa
sudo /usr/bin/usage_management


Как и предполагалось, мы получаем все содержимое файла по ссылке. Перепечатываем ключ и заходим по SSH как пользователь root.

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