Содержание статьи
Захватывать будем учебную машину Extension с площадки Hack The Box. Уровень — «сложный».
warning
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Разведка
Сканирование портов
Добавляем IP-адрес машины в /
:
10.10.11.171 extension.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 7.6p1 и 80 — веб‑сервер Nginx 1.14.0. Начинаем, конечно же, с сайта.

На сайте видим указанный домен, который добавляем в файл /
.
10.10.11.171 extension.htb snippet.htb
Так как он реальный, мы можем просканировать поддомены. Я использую сканер ffuf.
Справка: сканирование веба c ffuf
Одно из первых действий при тестировании безопасности веб‑приложения — это сканирование методом перебора каталогов, чтобы найти скрытую информацию и недоступные обычным посетителям функции. Для этого можно использовать программы вроде dirsearch и DIRB.
Я предпочитаю легкий и очень быстрый ffuf. При запуске указываем следующие параметры:
-
-w
— словарь (я использую словари из набора SecLists); -
-t
— количество потоков; -
-u
— URL; -
-r
— выполнять редиректы; -
-fs
— фильтровать страницы по размеру; -
-fc
— исключить из результата ответы с кодом 403.
Место перебора помечается словом FUZZ
.
Команда получается следующая:
ffuf -u 'http://snippet.htb/' -r -w subdomains-top1million-110000.txt -t 256 -H 'Host: FUZZ.snippet.htb' --fl 30

Так находим еще два поддомена, которые тоже добавляем в файл /
. Там найдем сервисы Gitea и RoundCube.
10.10.11.171 extension.htb snippet.htb dev.snippet.htb mail.snippet.htb


В Gitea можем без авторизации посмотреть существующих пользователей.

Сканирование каталогов на пользовательском сайте тоже ничего не дало.
ffuf -u 'http://snippet.htb/FUZZ' -r -w directory_2.3_medium_lowercase.txt -t 256

Точка входа
Тогда посмотрим на пользовательский сайт через Burp. Нас интересует Burp History.

В коде страницы видим использование какого‑то API. Изучив его подробнее, находим возможность не только получать разную информацию, но и дампить ее.

Первым делом я решил посмотреть на пользователей сайта, но это получится только после авторизации.

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

Так как нам интересна информация о пользователях, в качестве значения будем использовать users
. Но имя параметра нужно будет перебрать. Раз ответ пришел в формате JSON, передавать параметр мы будем так же. Для перебора я использовал Burp Intruder.


И находим название нужного параметра — download
. Ответ очень большой, поэтому сохраняем в файл и выводим в jq
.

Нам доступны хеши паролей пользователей, поэтому для перебора попробуем узнать алгоритм с помощью hashid
.

В качестве алгоритма шифрования, скорее всего, используется SHA-256. Давай выберем из списка все пары логинов и паролей.
cat users.dump| jq | grep 'email"\|password' | cut -d '"' -f 4 > users.txt
Затем можно все последовательности .
заменить двоеточием, тогда мы получим строки типа логин:
. Отправляем список программе John the Ripper и указываем формат хеша. Спустя несколько секунд получим пароль.
john -form=dynamic='sha256($p)' --wordlist=~/tmp/wordlists/Passwords/rockyou.txt creds.txt

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

Точка опоры
Пользовательский сервис
Мы можем перейти к сниппетам и создать свой. Так у нас будет возможность менять и удалять его.

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


Просмотрим вытащенный нами сниппет и найдем там HTTP-заголовок базовой аутентификации. Декодируем строку Base64 и получаем учетные данные для пользователя jean
.


С полученными учетными данными можем авторизоваться в Gitea. Там нам доступен один проект.

Gitea
Сам проект — это плагин браузера для быстрого оповещения об ошибках. В настройках проекта находим соавтора, это нам пригодится.

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

Находим подобный фрагмент в коде текущего параметра.

Из сообщения удаляется любая последовательность символов, если она заключена в треугольные скобки, то есть похожа на HTML-тег. Также если присутствует последовательность символов, приведенных в переменной filter
. Но в самом регулярном выражении ошибка, так удалится только первое вхождение последовательности в тегах. Проверим это, для чего запустим веб‑сервер и отправим следующую строку:
qwe<qwe><img src="http://10.10.14.7/test">



В логах веб‑сервера увидим подключение, значит, можно проэксплуатировать хранимую XSS.
Хранимая XSS
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»