ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

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

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 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在 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 2BloodHound 前的数据预筛的自动化底座。二、依赖与版本要求两条关键依赖链API 参考文档明确列出了两个核心依赖及其用途库最低版本用途impacket0.11.0Kerberos 攻击、SMB 交互、DCSyncldap32.9对用户、组、SPN 的 LDAP 枚举这两条依赖与 Agent 的两大能力域一一对应impacket承载了网络协议层面的能力SMBConnection用于 SMB 会话协商与签名检查impacket.krb5.kerberosv5支撑 TGT/TGS 请求Kerberoasting 的底层impacket.dcerpc.v5.samr提供 SAM 远程协议的用户/组枚举ldap3承载了目录信息层面的能力以域内低权限用户身份绑定域控的 389 端口通过Connection.search()递归SUBTREE查询用户对象与组对象。源码在导入阶段就做了缺失依赖的显式拦截agent.pytry: 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 Pssw0rd \ --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(fDC{part} for part in domain.split(.))从 FQDN 动态推导agent.py。例如corp.local会推导为DCcorp,DClocal省去了手写 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_infoALL)使用(objectClassuser)过滤条件、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.pytargets [u for u in users if u[spns]]即列表推导过滤spns非空的条目逻辑极简。其背后的攻击语义是任何拥有 SPN 的账户典型如 SQL Server 服务账户MSSQLSvc/host:1433都会被 AD 允许申请 TGS 票据而 TGS 可用离线字典攻击破解出服务账户明文密码。SKILL.md 将其映射到 MITRE ATTCK T1558.003Kerberoasting评估中发现的此类账户通常直接进入 CRITICAL 风险摘要。4.3find_asrep_roastable(users) - list契约筛出 UAC 标志DONT_REQUIRE_PREAUTH0x400000被置位的账户。实现agent.pytargets [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.pyhigh_value_groups [ Domain Admins, Enterprise Admins, Schema Admins, Backup Operators, Account Operators, ]对每个组执行((objectClassgroup)(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.pysmb SMBConnection(target_ip, target_ip, sess_port445, timeout5) 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.pyCRITICAL存在 Kerberoastable 账户HIGH存在无预认证账户HIGHDC 未要求 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, indent2)写入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-GetUserSPNs、impacket-GetNPUsersimpacket.smbconnection.SMBConnectionSMB 协商与签名检查本 Agent 中check_smb_signing的直接依赖同时支撑 PtH/PtT 横向移动中的impacket-psexecimpacket.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家族的 CLIGetUserSPNs / 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 1AD 侦察SKILL.md 使用Get-ADDomain、crackmapexec smb、Get-ADUser、nltest等命令做人工枚举Agent 的ldap_enum_usersenum_groups以代码形式覆盖了用户、SPN、UAC、高危组这几个最高价值的枚举维度产出结构化候选清单Step 2BloodHound 分析Agent 的high_value_groups与risk_summary为 BloodHound 的Shortest Paths to Domain Admins、Find Principals with DCSync Rights等内置查询提供了初步目标优先级Step 3Kerberos 攻击find_kerberoastable/find_asrep_roastable输出的账户名直接对应impacket-GetUserSPNs -request与impacket-GetNPUsers -usersfile的攻击目标Step 4-5凭据攻击与提权Agent 的 SMB 签名检测结果可用于判断 NTLM Relayimpacket-ntlmrelayx是否可行而 DCSyncimpacket-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.mdAgent 完整实现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.mdT1558 Kerberoasting、T1003 凭据转储等技术的仓库级覆盖索引【免费下载链接】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),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进