news 2026/9/13 11:20:12

Active Directory 攻击模拟 Agent 的 API 参考:基于 Impacket 与 ldap3 的域环境安全评估实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Active Directory 攻击模拟 Agent 的 API 参考:基于 Impacket 与 ldap3 的域环境安全评估实战指南

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):

  1. 只做侦察与风险信号提取——不执行实际的票据伪造或 hash 破解;
  2. 输出结构化 JSON 报告——供后续人工研判或 SIEM/报告系统消费;
  3. 对失败操作宽容处理——例如 SMB 连接失败时返回True(保守地视为签名已要求),避免单点故障中断整体评估。

这样的设计让 Agent 既能独立运行产出报告,也能嵌入到 SKILL.md 五步工作流中充当 Step 1(侦察)与 Step 2(BloodHound 前的数据预筛)的自动化底座。

二、依赖与版本要求:两条关键依赖链

API 参考文档明确列出了两个核心依赖及其用途:

最低版本用途
impacket>=0.11.0Kerberos 攻击、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 枚举域内全部用户对象,返回字典列表,每个字典含samaccountnamespnsno_preauthadmin_count四个键。

实现要点(agent.py):

  • f"{domain}\\{username}"DOMAIN\user形式绑定Server(dc_ip, get_info=ALL)
  • 使用(objectClass=user)过滤条件、SUBTREE搜索范围,仅请求sAMAccountNameservicePrincipalNameuserAccountControlmemberOfadminCountpwdLastSetlastLogon等属性,把 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_PREAUTH0x400000)被置位的账户。

实现(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_datestringdatetime.utcnow().isoformat()ISO-8601 格式的评估时间戳
total_usersintlen(users)LDAP 枚举到的用户总数
kerberoastable_accountslistfind_kerberoastable可 Kerberoast 的账户名列表
asrep_roastable_accountslistfind_asrep_roastable可 AS-REP Roast 的账户名列表
high_value_groupsobjectenum_groups高危组名到成员数的映射
dc_smb_signing_requiredboolcheck_smb_signingDC 是否要求 SMB 签名
risk_summarylist规则拼接分级风险结论列表

报告落地通过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.kerberosv5TGT/TGS 请求函数Kerberoasting / AS-REP Roasting 的协议底座,对应 SKILL.md Step 3 的impacket-GetUserSPNsimpacket-GetNPUsers
impacket.smbconnection.SMBConnectionSMB 协商与签名检查本 Agent 中check_smb_signing的直接依赖;同时支撑 PtH/PtT 横向移动中的impacket-psexec
impacket.dcerpc.v5.samrSAM 远程协议的用户/组枚举传统 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 明确列出的前提,这也是评估合法性的底线:

  1. 书面授权:必须持有明确指定目标 AD 域、测试约束与禁区账户/系统的书面授权;
  2. 低权限起点:使用低权限域用户账户登录,以模拟真实攻击者位置;
  3. 网络可达:测试工作站已加域或可经 88、135、139、389、445、636、3268、3269 端口访问域控;
  4. 工具链就绪:BloodHound(含 SharpHound/AzureHound 收集器)、Impacket、Mimikatz(或 pypykatz)、Rubeus、CrackMapExec、Hashcat/John(含 rockyou.txt、SecLists 词典);
  5. 禁止事项:未经授权不得测试;不得在生产域控的业务时段运行;不得在未事先协调的情况下执行可能导致真实用户账户锁定的测试。

对应到 Agent 运行,--dc-ip--domain--username--password都应在授权范围内指定,输出报告仅用于内部风险评估,不应在报告中包含超出授权范围的明文凭据。

八、从 API 到场景:Agent 如何嵌入完整 AD 攻击模拟

将 API 参考中的函数映射回 SKILL.md 的完整工作流,可以看到 Agent 承担了"侦察自动化"的角色:

  • Step 1(AD 侦察):SKILL.md 使用Get-ADDomaincrackmapexec smbGet-ADUsernltest等命令做人工枚举;Agent 的ldap_enum_users+enum_groups以代码形式覆盖了用户、SPN、UAC、高危组这几个最高价值的枚举维度,产出结构化候选清单;
  • Step 2(BloodHound 分析):Agent 的high_value_groupsrisk_summary为 BloodHound 的"Shortest Paths to Domain Admins"、"Find Principals with DCSync Rights"等内置查询提供了初步目标优先级;
  • Step 3(Kerberos 攻击)find_kerberoastable/find_asrep_roastable输出的账户名,直接对应impacket-GetUserSPNs -requestimpacket-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),仅供参考

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

AERIS-10:把 10.5GHz 开源相控阵雷达从图纸搬到实验台

AERIS-10:把 10.5GHz 开源相控阵雷达从图纸搬到实验台 【免费下载链接】PLFM_RADAR Open-source, low-cost 10.5 GHz PLFM phased array RADAR system 项目地址: https://gitcode.com/GitHub_Trending/pl/PLFM_RADAR AERIS-10 是一套面向实验室和教学场景的开…

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

FLUENT在锂电池热失控仿真中的优势与应用

1. 项目概述:锂电池热失控仿真为何选择FLUENT 去年参与某动力电池Pack热管理项目时,我们团队在电芯级热失控仿真环节踩过不少坑。当时试过三种仿真工具,最终FLUENT以其在复杂多物理场耦合方面的优势脱颖而出。不同于常规的热仿真,…

作者头像 李华
网站建设 2026/9/13 11:16:31

软考网规:第十章网络规划与设计论文历年真题分布(已更新)

网络规划与设计论文历年真题分布(2009-2025) 一、历年论文真题 2025年11月 试题一:论智慧校园网络的规划与设计 论题二:论边缘计算架构在视频网络中的应用 2024年11月 试题一:论“网络去NAT”的规划与设计 试题二:论企业智能制造中的网络规划设计与实施 2023年11…

作者头像 李华