Professional bachelor's (ASS&R)Homelab6 min read

From a standard account to a Golden Ticket: attacking Active Directory in a homelab

To see what my production fixes actually stop, I attacked a deliberately vulnerable Active Directory in my homelab, from a standard user account to full control of the domain.

Context
Homelab · 3-node Proxmox cluster, LAB.AD.local domain on Windows Server 2022
Period
August 2026
My role
Led independently, from building the lab to the defensive summary
Tools
Impacket · BloodHound · Hashcat · CrackMapExec · Nmap · PowerShell

In short

The problem

I had hardened a production directory without ever seeing the attacks each fix was meant to counter.

What I did

I built a vulnerable domain in my homelab and ran eight steps, from reconnaissance to a Golden Ticket, recording for each its trace and its countermeasure.

The result

Full control of the domain from a standard account. Defender blocked Pass-the-Hash via psexec, and the Golden Ticket only went through after three rejections by the controller.

8steps, from a standard user account to full control of the domain
< 1sto crack the ticket of a service account with a common password
9 / 52users / groups mapped with a standard account

Context

In production, I audited and hardened the Active Directory of a small business, without ever having seen the attacks those fixes block. This project fills that gap, from the attacker's side.

Everything happens in my homelab, a three-node Proxmox cluster: nothing touches the company, and these techniques were only used on this lab, which I own. The scenario starts from minimal access, a standard user's password, as after a successful phishing attempt. For each step, three questions: what the attack exploits, the trace it leaves, and the measure that would have stopped it.

What I did

  1. Build a reproducible labA Windows Server 2022 controller and a Kali workstation with static addresses. A PowerShell script injects weaknesses common in companies: weak passwords, service accounts with SPNs, an administrator with a guessable password, a relaxed policy. Snapshot of the controller before the first attack.
  2. Map with a standard accountNmap finds the controller through the ports it must expose (DNS, Kerberos, LDAP, SMB). BloodHound then reads the whole directory and shows the paths to Domain Admins, without any privilege.
  3. Crack a service account offlineAny user can request a service account's ticket and look for its password offline: that is Kerberoasting. Two accounts resist the rockyou wordlist without rules, which does not make them strong; a third one, added with a common password, falls in under a second.
  4. Get a domain adminA dictionary attack on the single account BloodHound pointed to, not password spraying, which tries one password across many accounts. The right password is 11 characters long and meets Windows complexity rules: common passwords must be refused too.
  5. Take the domainWith that account, DCSync replicates every account's hashes, including krbtgt. Defender blocks Pass-the-Hash attempted with psexec; a Golden Ticket forged with krbtgt's AES256 key, like legitimate tickets, opens every share on the controller without a password.
Eight-step attack chain, from network discovery to the Golden Ticket 1 · Nmap DC-LAB identified without an account 2 · BloodHound paths to admins with amartin 3 · Kerberoasting 1 account of 3 cracked with amartin 4 · CrackMapExec accounts enumerated with svc-backup 5 · Dictionary Summer2023! found target: cadmin 6 · DCSync krbtgt hash with cadmin 7 · Pass-the-Hash blocked by Defender Administrator 8 · Golden Ticket DC shares after 3 rejections attempt blocked goal reached
Fig. 1The eight steps, with the account used or obtained at each one. AS-REP roasting, tried without success, is not shown.
See technical details

The lab. Two VMs on an internal network without DHCP: the DC-LAB controller (4 vCPUs, 4 GB of RAM), a new LAB.AD.local forest, DNS pointing to itself; the Kali workstation (2 vCPUs, 4 GB), DNS pointing to the controller, because Kerberos needs correct name resolution. Windows Firewall disabled on the controller, Microsoft Defender enabled.

Weakness introducedWhat it enables
Users with common passwordsThe attacker's starting account
Two service accounts with SPNsKerberoasting
Unconstrained delegation on a service accountImpersonating anyone who authenticates to it
A Domain Admins member with a guessable passwordTaking control of the domain
Policy: 4 characters, no complexity, no expiryMaking all of the above possible
Kali terminal: nmap -sV on the controller's AD ports at 10.0.10.10, with Kerberos, LDAP (LAB.AD.local domain), SMB and Terminal Services open; username, MAC address and hostname masked.
Fig. 2Lab: Nmap reconnaissance of the domain controller, which exposes DNS, Kerberos, LDAP, SMB and RDP and reveals the domain name.

Mapping. The BloodHound collector records 9 users and 52 groups, with their rights and delegations. The Community Edition would not start properly on Kali; version 4, with a single graph database, was enough: what I needed was the map, not the latest interface. PingCastle, run in parallel, correctly rates the injected weaknesses as high risk.

BloodHound graph: user, group, computer, OU and GPO nodes linked by MemberOf, GenericWrite, Contains, GPLink, DCSync and AddKeyCredentialLink edges, converging on the Domain Admins target group.
Fig. 3Lab: BloodHound graph of the paths to Domain Admins (MemberOf, GenericWrite, DCSync, AddKeyCredentialLink).
Hashcat terminal: mode 13100 (Kerberos 5 TGS-REP), rockyou.txt wordlist, status Exhausted, 0 of 2 hashes recovered; current candidate and username masked.
Fig. 4Lab: Hashcat exhausts the roughly 14 million rockyou words without cracking the two service accounts (0 of 2).

Dead ends and findings. AS-REP roasting needs an account without Kerberos pre-authentication: it was enabled on the target account, so I dropped that path. In the hashes replicated by DCSync, the LM hashes are empty: the old algorithm is not stored.

Windows Security notification: Threats found, Microsoft Defender Antivirus found threats, two successive alerts.
Fig. 5Lab: the Pass-the-Hash attempt with psexec is blocked by Microsoft Defender, which deletes the dropped binary.

An alert nobody sees. Defender's block stays local to the controller. On a server with no open session, the alert goes unnoticed: that is the job of central collection, like my Wazuh SOC.

An empty ticket file, with no error. The extraction tool's write option produced an empty file while the tickets were shown on screen. I checked the file's actual content, then filtered standard output myself: easier to verify.

AttackTrace and detectionCountermeasure
Reconnaissance (Nmap, BloodHound)Unusual volume of LDAP queries from one workstation, visible only if logs are centralisedYou cannot stop an authenticated account from reading the directory: you detect it
KerberoastingBurst of service ticket requests in RC4 (event 4769 on the controller)Random service passwords of 25+ characters, or group managed service accounts (gMSA)
Dictionary attack on one accountRepeated authentication failures on the same accountLockout threshold, long and uncommon passwords for every admin account, MFA on sensitive accounts
DCSyncReplication request from a machine that is not a controller (event 4662)Limit the accounts that hold replication rights
Pass-the-HashDefender alert, observed here, but local to the serverProtected Users group for sensitive accounts, up-to-date antivirus or EDR, central collection
Golden TicketNo file or service, but Kerberos anomalies that can be spotted if the controller's logs are collectedProtect the accounts with replication rights (the key comes from DCSync); double krbtgt rotation to invalidate tickets already forged; an up-to-date Windows Server already rejects non-existent accounts

The incident

The Golden Ticket rejected three times

Problem

The controller rejected the forged ticket, even though the krbtgt key was correct.

Fix

Three causes removed one by one: a clock skew of several hours, when Kerberos tolerates five minutes; a ticket forged before the time was corrected; an invented account, which an up-to-date Windows Server 2022 rejects. Forged again for the real “Administrator” account, the ticket was accepted.

Results

The ticket gives access to every share on the controller, system drive included, and stays valid for years. Changing every password does not invalidate it; only a double krbtgt rotation does.

That is exactly what I had applied to the production directory: double krbtgt rotation, LM and NTLMv1 refused, 11 admin accounts flagged “sensitive and cannot be delegated”, which protects them from unconstrained delegation, and the Protected Users group tested. This lab showed me concretely what each of these measures counters, and its limits: the double rotation invalidates tickets already forged, it does not prevent forging a new one if the key leaks again. Recent patches also narrow the attacker's margin: the same attack, which used to work with a made-up account, now requires an existing one.

Kali terminal: export KRB5CCNAME, impacket-smbclient over Kerberos without a password, then the shares command listing ADMIN$, C$, IPC$, NETLOGON and SYSVOL; username and hostname masked.
Fig. 6Lab: with a Golden Ticket forged from the krbtgt key, passwordless Kerberos access to the controller's ADMIN$, C$, NETLOGON and SYSVOL shares.

What I would improve

  • Exploit the unconstrained delegation set up on the service account: one more realistic step, and the effect of the production “sensitive account” flag made visible.
  • Collect the Windows-side traces (events 4769 and 4662, once auditing is enabled) and send them to the SIEM, to check that each step raises an alert.
  • Isolate the lab in a dedicated VLAN with no route to the rest of the homelab: the first scan saw five hosts for two lab machines.

Skills

  • Kerberos
  • Active Directory attack chain
  • BloodHound and Impacket
  • Troubleshooting by elimination
  • Detection and countermeasures
  • Reproducible lab