Active Directory 攻击模拟 Agent 的 API 参考:基于 Impacket 与 ldap3 的域环境安全评估实战指南
【免费下载链接】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
在 Anthropic-Cybersecurity-Skills 仓库中,skills/executing-active-directory-attack-simulation技能面向获授权的 Active Directory 安全评估场景,通过 BloodHound 攻击路径分析、Mimikatz 凭据提取与 Impacket 协议级攻击(Kerberoasting、AS-REP Roasting、委派滥用等)识别可能导致域沦陷的错误配置与危险权限路径。本篇以该技能附带的 API 参考文档 为主体,结合同目录下的 agent.py 实现 与 SKILL.md 工作流,完整讲解自动化评估 Agent 的依赖选型、命令行接口、核心函数契约、输出 JSON Schema 以及底层 Impacket 模块的调用原理。读完本文,你将能够理解并运行这套 AD 攻击模拟 Agent,把 LDAP 枚举、Kerberoastable/AS-REP Roastable 账户筛查、高危组枚举与 SMB 签名检测自动化地聚合为一份结构化风险评估报告。
一、Agent 定位:从 API 参考到实战评估闭环
API 参考文档描述的是一个名为 "Active Directory Attack Simulation Agent" 的 Python 程序,它把 AD 评估中最常见、最耗时的侦察与验证步骤封装成可编程接口。该 Agent 与SKILL.md定义的完整评估流程互为表里:SKILL.md 负责"人在回路"的战术编排(BloodHound 分析、Kerberos 攻击、横向移动、提权到 Domain Admin),而 API 参考定义的 Agent 则负责把这些评估中可自动化、可复现的部分(枚举、筛选、汇总)沉淀为代码。
从源码结构看,Agent 的职责边界非常清晰(agent.py):
- 只做侦察与风险信号提取——不执行实际的票据伪造或 hash 破解;
- 输出结构化 JSON 报告——供后续人工研判或 SIEM/报告系统消费;
- 对失败操作宽容处理——例如 SMB 连接失败时返回
True(保守地视为签名已要求),避免单点故障中断整体评估。
这样的设计让 Agent 既能独立运行产出报告,也能嵌入到 SKILL.md 五步工作流中充当 Step 1(侦察)与 Step 2(BloodHound 前的数据预筛)的自动化底座。
二、依赖与版本要求:两条关键依赖链
API 参考文档明确列出了两个核心依赖及其用途:
| 库 | 最低版本 | 用途 |
|---|---|---|
| impacket | >=0.11.0 | Kerberos 攻击、SMB 交互、DCSync |
| ldap3 | >=2.9 | 对用户、组、SPN 的 LDAP 枚举 |
这两条依赖与 Agent 的两大能力域一一对应:
- impacket承载了网络协议层面的能力:
SMBConnection用于 SMB 会话协商与签名检查,impacket.krb5.kerberosv5支撑 TGT/TGS 请求(Kerberoasting 的底层),impacket.dcerpc.v5.samr提供 SAM 远程协议的用户/组枚举; - ldap3承载了目录信息层面的能力:以域内低权限用户身份绑定域控的 389 端口,通过
Connection.search()递归(SUBTREE)查询用户对象与组对象。
源码在导入阶段就做了缺失依赖的显式拦截(agent.py):
try: from impacket.smbconnection import SMBConnection except ImportError: sys.exit("impacket is required: pip install impacket") try: import ldap3 from ldap3 import Server, Connection, ALL, SUBTREE except ImportError: sys.exit("ldap3 is required: pip install ldap3")安装命令即pip install impacket ldap3。需要说明的适用前提:这两个库均为跨平台纯 Python 实现,但 Agent 的运行机需要具备到达目标域控的网络通路(SKILL.md 列出的端口为 88、135、139、389、445、636、3268、3269),且持有合法的域内用户凭据。
三、CLI 用法:五个必须参数与一个可选参数
API 参考给出的标准调用方式如下:
python scripts/agent.py \ --dc-ip 10.10.10.1 \ --domain corp.local \ --username testuser \ --password 'P@ssw0rd' \ --output ad_report.json对照 main() 的参数解析实现,各参数的语义、约束与默认值如下:
| 参数 | 必填 | 说明 | 默认值 |
|---|---|---|---|
--dc-ip | 是 | 域控 IP 地址,同时用于 LDAP 绑定与 SMB 签名检查 | 无 |
--domain | 是 | 域 FQDN(如corp.local),用于推导 LDAP Base DN 与绑定用户名 | 无 |
--username | 是 | 低权限域用户名(模拟真实攻击者起点) | 无 |
--password | 是 | 域用户密码 | 无 |
--output | 否 | 报告输出路径 | ad_assessment.json |
关于--domain值得说明一个实现细节:Base DN 并非由参数直接提供,而是通过",".join(f"DC={part}" for part in domain.split("."))从 FQDN 动态推导(agent.py)。例如corp.local会推导为DC=corp,DC=local,省去了手写 Base DN 的负担,也意味着--domain必须是标准 FQDN 形式。
主流程(main())依次执行三步并落盘:
users = ldap_enum_users(args.dc_ip, args.domain, args.username, args.password) groups = enum_groups(args.dc_ip, args.domain, args.username, args.password) report = generate_report(users, groups, args.dc_ip)随后将报告写入--output指定的文件(默认ad_assessment.json),并在标准输出同步打印格式化后的 JSON。
四、函数详解:五个核心接口的契约与实现
API 参考定义了五个函数,下面逐一结合源码解读其输入输出契约与底层实现。
4.1ldap_enum_users(dc_ip, domain, username, password) -> list
契约:通过 LDAP 枚举域内全部用户对象,返回字典列表,每个字典含samaccountname、spns、no_preauth、admin_count四个键。
实现要点(agent.py):
- 以
f"{domain}\\{username}"的DOMAIN\user形式绑定Server(dc_ip, get_info=ALL); - 使用
(objectClass=user)过滤条件、SUBTREE搜索范围,仅请求sAMAccountName、servicePrincipalName、userAccountControl、memberOf、adminCount、pwdLastSet、lastLogon等属性,把 LDAP 传输负载降到最低; - 关键的 UAC 解析逻辑:
no_preauth = bool(uac & 0x400000)——这里0x400000正是DONT_REQUIRE_PREAUTH标志位,是判断账户是否可被 AS-REP Roast 的唯一依据; - 属性缺省值做了防御性兜底(
if entry.userAccountControl else 0),避免空值导致类型转换崩溃。
从数据结构看,ldap_enum_users是整个 Agent 的信息源头:后续的 Kerberoastable 筛查、AS-REP Roastable 筛查以及风险摘要全部消费它返回的列表。
4.2find_kerberoastable(users) -> list
契约:从用户列表中筛出设置了servicePrincipalName的账户——这些是impacket-GetUserSPNs进行 Kerberoasting 的目标。
实现(agent.py):
targets = [u for u in users if u["spns"]]即列表推导过滤spns非空的条目,逻辑极简。其背后的攻击语义是:任何拥有 SPN 的账户(典型如 SQL Server 服务账户MSSQLSvc/host:1433)都会被 AD 允许申请 TGS 票据,而 TGS 可用离线字典攻击破解出服务账户明文密码。SKILL.md 将其映射到 MITRE ATT&CK T1558.003(Kerberoasting),评估中发现的此类账户通常直接进入 CRITICAL 风险摘要。
4.3find_asrep_roastable(users) -> list
契约:筛出 UAC 标志DONT_REQUIRE_PREAUTH(0x400000)被置位的账户。
实现(agent.py):
targets = [u for u in users if u["no_preauth"]]直接复用ldap_enum_users阶段已经解析好的no_preauth布尔值。攻击语义:未启用 Kerberos 预认证的账户允许攻击者直接请求 AS-REP,返回的加密时间戳可离线破解(对应impacket-GetNPUsers与 hashcat 模式 18200)。源码将 UAC 位运算解析集中在上游,使得本函数保持"过滤即所得"的简洁契约。
4.4enum_groups(dc_ip, domain, username, password) -> dict
契约:查询五个高危组的成员关系,返回组名到成员 DN 列表的映射。
实现(agent.py):
high_value_groups = [ "Domain Admins", "Enterprise Admins", "Schema Admins", "Backup Operators", "Account Operators", ]对每个组执行(&(objectClass=group)(cn={group_name}))的 LDAP 查询并取member属性。这五个组的选择并非随意:Domain Admins / Enterprise Admins / Schema Admins 是目录森林的"皇冠宝石",Backup Operators 与 Account Operators 则分别具备绕过权限读取备份数据与修改账户属性的能力,是权限提升链条中的高频中转站。从源码结构可以推断,该函数返回的成员数(len(members))在报告阶段会被用于high_value_groups字段的成员计数。
4.5check_smb_signing(target_ip) -> bool
契约:连接目标 445 端口进行 SMB 协商,检查签名是否为必需。返回False表示可实施中继攻击。
实现(agent.py):
smb = SMBConnection(target_ip, target_ip, sess_port=445, timeout=5) smb.negotiateSession() signing = smb.isSigningRequired() smb.close() return signing这是 Agent 中唯一直接使用 impacket 运行时能力的函数。两点值得注意:
- 超时设为 5 秒,避免不可达目标长时间挂起整个评估;
- 异常路径返回
True(保守默认"已要求签名"),意味着连接失败不会误报"可中继",保证结论安全可靠。这与 SKILL.md 中对 NTLM Relay 攻击的前提判断一致:只有当 SMB 签名未强制时才可能将捕获的 NTLM 认证转发到其他服务实现提权。
4.6generate_report(users, groups, dc_ip) -> dict
契约:聚合全部发现,生成带风险摘要的 JSON 报告。
实现(agent.py)是该 Agent 的输出中枢:
report = { "assessment_date": datetime.utcnow().isoformat(), "total_users": len(users), "kerberoastable_accounts": [u["samaccountname"] for u in kerberoastable], "asrep_roastable_accounts": [u["samaccountname"] for u in asrep], "high_value_groups": {g: len(m) for g, m in groups.items()}, "dc_smb_signing_required": smb_signing, "risk_summary": [], }风险摘要按严重度分级追加(agent.py):
CRITICAL:存在 Kerberoastable 账户;HIGH:存在无预认证账户;HIGH:DC 未要求 SMB 签名(可中继)。
可以看到dc_smb_signing_required的语义与check_smb_signing的返回值是取反关系:报告字段为true表示"签名已要求"(安全),为false才触发"中继可能"的高危摘要——阅读报告时切勿混淆。
五、输出 Schema:一份可机器消费的风险快照
API 参考给出的标准输出结构如下:
{ "assessment_date": "ISO-8601", "total_users": 500, "kerberoastable_accounts": ["svc-sql", "svc-web"], "asrep_roastable_accounts": ["old-account"], "high_value_groups": {"Domain Admins": 5}, "dc_smb_signing_required": true, "risk_summary": ["CRITICAL: 2 accounts are Kerberoastable"] }对照源码逐字段说明其来源与语义:
| 字段 | 类型 | 来源 | 语义 |
|---|---|---|---|
assessment_date | string | datetime.utcnow().isoformat() | ISO-8601 格式的评估时间戳 |
total_users | int | len(users) | LDAP 枚举到的用户总数 |
kerberoastable_accounts | list | find_kerberoastable | 可 Kerberoast 的账户名列表 |
asrep_roastable_accounts | list | find_asrep_roastable | 可 AS-REP Roast 的账户名列表 |
high_value_groups | object | enum_groups | 高危组名到成员数的映射 |
dc_smb_signing_required | bool | check_smb_signing | DC 是否要求 SMB 签名 |
risk_summary | list | 规则拼接 | 分级风险结论列表 |
报告落地通过json.dump(report, f, indent=2)写入(agent.py),保证可读性。这份 Schema 的设计意图是"快照式"的:它量化了域内暴露面(账户总数、高危组规模),直接点名了需要优先处置的账户(Kerberoastable / AS-REP Roastable),并以risk_summary给出供汇报引用的结论句。
需要强调的边界:Agent 只输出"风险候选",不输出破解后的明文密码或攻击链细节。更完整的攻击链取证(如"低权限用户 → IT-Support 组 → GenericAll 于 SVC-SQL → Kerberoast → 域控会话 → DCSync")由 SKILL.md 定义的人工 + 工具编排流程产出,二者配合构成完整评估闭环。
六、关键 Impacket 模块:底层协议能力的调用锚点
API 参考最后列出四个底层模块,它们是理解 Agent 能力边界(以及 SKILL.md 中后续攻击步骤)的关键:
| 模块 | 用途 | 在评估中的角色 |
|---|---|---|
impacket.krb5.kerberosv5 | TGT/TGS 请求函数 | Kerberoasting / AS-REP Roasting 的协议底座,对应 SKILL.md Step 3 的impacket-GetUserSPNs、impacket-GetNPUsers |
impacket.smbconnection.SMBConnection | SMB 协商与签名检查 | 本 Agent 中check_smb_signing的直接依赖;同时支撑 PtH/PtT 横向移动中的impacket-psexec |
impacket.dcerpc.v5.samr | SAM 远程协议的用户/组枚举 | 传统 Windows 协议枚举路径;SKILL.md 中域内枚举的底层支撑 |
ldap3.Connection.search() | 带过滤器与属性列表的 LDAP 搜索 | 本 Agent 中用户/组枚举的统一通道,对应 SKILL.md Step 1 的ldapsearch类查询 |
值得串联的一条调用链是:ldap_enum_users通过ldap3拿到spns与 UAC 标志 →find_kerberoastable/find_asrep_roastable筛选出目标账户 → SKILL.md Step 3 用impacket.krb5.kerberosv5家族的 CLI(GetUserSPNs / GetNPUsers)实际请求票据 → hashcat(模式 13100 / 18200)离线破解。Agent 输出的账户名单,正是后续 Kerberos 攻击的目标清单——这是 API 参考与完整攻击模拟工作流之间的天然接口。
七、运行前置条件与安全边界(必读)
Agent 以及整个技能的使用都必须满足 SKILL.md 明确列出的前提,这也是评估合法性的底线:
- 书面授权:必须持有明确指定目标 AD 域、测试约束与禁区账户/系统的书面授权;
- 低权限起点:使用低权限域用户账户登录,以模拟真实攻击者位置;
- 网络可达:测试工作站已加域或可经 88、135、139、389、445、636、3268、3269 端口访问域控;
- 工具链就绪:BloodHound(含 SharpHound/AzureHound 收集器)、Impacket、Mimikatz(或 pypykatz)、Rubeus、CrackMapExec、Hashcat/John(含 rockyou.txt、SecLists 词典);
- 禁止事项:未经授权不得测试;不得在生产域控的业务时段运行;不得在未事先协调的情况下执行可能导致真实用户账户锁定的测试。
对应到 Agent 运行,--dc-ip、--domain、--username、--password都应在授权范围内指定,输出报告仅用于内部风险评估,不应在报告中包含超出授权范围的明文凭据。
八、从 API 到场景:Agent 如何嵌入完整 AD 攻击模拟
将 API 参考中的函数映射回 SKILL.md 的完整工作流,可以看到 Agent 承担了"侦察自动化"的角色:
- Step 1(AD 侦察):SKILL.md 使用
Get-ADDomain、crackmapexec smb、Get-ADUser、nltest等命令做人工枚举;Agent 的ldap_enum_users+enum_groups以代码形式覆盖了用户、SPN、UAC、高危组这几个最高价值的枚举维度,产出结构化候选清单; - Step 2(BloodHound 分析):Agent 的
high_value_groups与risk_summary为 BloodHound 的"Shortest Paths to Domain Admins"、"Find Principals with DCSync Rights"等内置查询提供了初步目标优先级; - Step 3(Kerberos 攻击):
find_kerberoastable/find_asrep_roastable输出的账户名,直接对应impacket-GetUserSPNs -request与impacket-GetNPUsers -usersfile的攻击目标; - Step 4-5(凭据攻击与提权):Agent 的 SMB 签名检测结果可用于判断 NTLM Relay(
impacket-ntlmrelayx)是否可行;而 DCSync(impacket-secretsdump -just-dc-ntlm)等提权验证仍属于人工编排步骤。
以 SKILL.md 提供的医疗行业场景为例:评估一个含 5,000 用户、800 台计算机、15 台域控的医院域时,先用 Agent 跑出 Kerberoastable / AS-REP Roastable / 高危组成员 / SMB 签名状态四类信号,再针对svc-sql这类目标执行 GetUserSPNs → hashcat 破解 → psexec 横向移动 → LSASS 提取 → DCSync 验证的完整链路,最终按 SKILL.md 的"Output Format"模板输出带 ID、严重度(CVSS)、攻击链、影响与修复建议的结构化发现。Agent 的自动化价值正是在于把第一步的枚举耗时从小时级压缩到分钟级,并保证每次评估的覆盖面一致、结果可比。
参考文件速查
- API 参考(本文主体):skills/executing-active-directory-attack-simulation/references/api-reference.md
- Agent 完整实现:skills/executing-active-directory-attack-simulation/scripts/agent.py
- 技能元数据与完整攻击模拟工作流:skills/executing-active-directory-attack-simulation/SKILL.md
- 框架映射说明:mappings/README.md 与 mappings/mitre-attack/coverage-summary.md(T1558 Kerberoasting、T1003 凭据转储等技术的仓库级覆盖索引)
【免费下载链接】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),仅供参考