Anthropic-Cybersecurity-Skills 实战:基于 Windows Security Event Logs 与 python-evtx 检测 RDP 暴力破解攻击
【免费下载链接】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
导读
本文围绕 detecting-rdp-brute-force-attacks 技能的 API 参考文档展开,系统讲解如何通过解析 Windows 安全事件日志(EVTX 文件)检测针对 RDP(远程桌面协议)端点的暴力破解攻击。你将掌握 Event ID 4625/4624 等核心事件的含义、RDP 登录类型(Logon Type 3/10)与失败子状态码的判读、wevtutil 与 python-evtx 的取证级解析方法,以及基于阈值模型的暴力破解 / 密码喷洒 / 账户沦陷三类检测模式,并可直接复用仓库中 agent.py 的完整检测实现生成 JSON 检测报告。
为什么检测 RDP 暴力破解:攻击面与检测原点
RDP 是暴露在互联网上的 Windows 端点最常见的攻击面之一。攻击者通过对 RDP 服务进行高频凭据猜测(对应 MITRE ATT&CK 技术 T1110(Brute Force)),尝试撞库进入内网,成功后即获得远程交互式会话,为横向移动与后续提权(如 T1078 Valid Accounts、T1021.001 Remote Services: Remote Desktop Protocol)铺路。
Windows 原生会将每一次登录尝试写入安全事件日志,这构成了检测的天然数据源。检测的核心思路是:
- 捕获Event ID 4625(登录失败)事件,且仅关注 Logon Type 为 10(RemoteInteractive)或 3(Network,NLA 启用时的预认证阶段)的记录——这两类才真正对应 RDP 场景;
- 按源 IP 统计失败频率与目标用户分布,识别暴力破解与密码喷洒模式;
- 将失败事件与后续的Event ID 4624(登录成功)做关联,判断是否已有账户在暴力破解后沦陷。
该技能在仓库中映射了 NIST CSF 2.0 的 DE.CM-01、DE.AE-02、DE.AE-06、ID.RA-05 以及 MITRE ATT&CK 的 T1021.001、T1110.001、T1110.003、T1078(见 SKILL.md 的 frontmatter),适用于事件调查、SIEM 检测规则编写与安全监控覆盖验证三类场景。
Windows 安全事件 ID 速查表
检测的全部语义都建立在以下四个核心事件 ID 之上。解析 EVTX 日志时,System节中的EventID决定事件类型,EventData节中的字段则提供攻击者的来源与目标信息。
| Event ID | 含义 | 关键字段 |
|---|---|---|
| 4625 | 登录失败(Failed logon attempt) | TargetUserName、IpAddress、SubStatus、LogonType |
| 4624 | 登录成功(Successful logon) | TargetUserName、IpAddress、LogonType |
| 4776 | NTLM 凭据验证(Credential validation) | TargetUserName、Workstation、Status |
| 4771 | Kerberos 预认证失败(Pre-auth failed) | TargetUserName、IpAddress、Status |
需要说明:4625/4624 是 RDP 暴力破解检测的主干事件;4776 用于覆盖 NTLM 认证路径(例如针对 SMB/凭据验证的猜测),4771 用于覆盖 Kerberos 预认证失败。在 agent.py 的_extract_event_data实现中,正是从事件 XML 的System/EventID与System/TimeCreated节点提取事件编号与时间戳,再通过遍历EventData下所有带Name属性的Data节点,把TargetUserName、IpAddress、SubStatus、LogonType等字段统一装配成字典,供后续分析消费。
RDP 登录类型(Logon Type)判定
日志字段中的LogonType是区分"这是不是 RDP 登录"的第一道过滤器。攻击者流量与正常管理操作在登录类型上有明确区别,误把本地控制台登录(Type 2)或服务登录(Type 5)当作 RDP 会造成大量误报。
| Type | 名称 | 出现场景 |
|---|---|---|
| 3 | Network | 启用 NLA(网络级别认证)时的 RDP 预认证阶段 |
| 10 | RemoteInteractive | NLA 通过后的 RDP 远程交互式会话 |
在 agent.py 中,检测器用RDP_LOGON_TYPES = {"3", "10"}直接定义了关注集合,并在解析循环中仅将LogonType命中该集合的 4625 事件记入failed_logons、4624 事件记入successful_logons,其余登录类型一律忽略。这意味着你可以在不改动任何检测逻辑的情况下,通过修改这个集合来扩展或收窄监控范围。
失败子状态码(Sub-Status)判读
4625 事件的SubStatus字段揭示了攻击者失败的具体原因,是区分"撞库无效用户名""密码错误""账户已被锁定/禁用"等不同攻击阶段的关键依据。
| Sub-Status | 含义 |
|---|---|
| 0xC0000064 | 用户不存在 |
| 0xC000006A | 密码错误 |
| 0xC0000234 | 账户已锁定 |
| 0xC0000072 | 账户已禁用 |
| 0xC0000193 | 账户已过期 |
| 0xC0000071 | 密码已过期 |
仓库实现更进一步: agent.py 内置了FAILURE_SUBSTATUS映射表,在 0xC0000064/0x6A/0x72/0x6F/0x70/0x71/0x234/0x193 之外,还补充了 0xC000006F(非登录时段登录)与 0xC0000070(工作站限制),把十六进制状态码归一化为user_does_not_exist、wrong_password、account_locked、account_disabled等可读标签。分析阶段会对全部失败事件的子状态码做Counter统计,使报告能直接给出"失败原因分布",例如某次攻击中wrong_password占比 92%、夹杂少量user_does_not_exist,即可推断攻击者在用有效用户名列表试密码,而非盲目撞库。
日志导出:wevtutil 命令行操作
获取 EVTX 文件是检测的起点。既可以在目标主机的 Windows 事件查看器中手动导出 Security 日志,也可以在命令行用wevtutil完成导出、筛选与计数。
# 导出 Security 日志为 EVTX 文件 wevtutil epl Security C:\logs\security.evtx # 查询 RDP 登录失败事件(EventID=4625 且 LogonType=10) wevtutil qe Security /q:"*[System[(EventID=4625)] and EventData[Data[@Name='LogonType']='10']]" /f:text # 统计最近 100 条登录失败事件(按时间倒序) wevtutil qe Security /q:"*[System[(EventID=4625)]]" /c:100 /rd:true /f:text三条命令各有分工:epl(Export Log)把完整 Security 日志固化为 EVTX 取证副本,适合离线分析;qe(Query Events)配合 XPath 过滤器直接在目标机上做实时研判,/c:100限制返回条数、/rd:true表示按时间倒序(最新的在前);/f:text输出人类可读文本。在企业环境中,EVTX 文件通常由 WEF(Windows Event Forwarding)集中收集后统一离线分析,这与 python-evtx 的离线解析路径完全吻合。
EVTX 离线解析:python-evtx 库用法
拿到 EVTX 文件后,Python 侧使用python-evtx逐条还原事件记录为 XML,再抽取结构化字段:
import Evtx.Evtx as evtx with evtx.Evtx("Security.evtx") as log: for record in log.records(): xml_str = record.xml()安装依赖:pip install python-evtx lxml(lxml用于后续 XML 解析)。
从源码实现看,agent.py 的parse_events方法将这段基本用法封装成了健壮的解析循环:逐条调用record.xml()并用try/except跳过无法解析的损坏记录,随后通过_extract_event_data抽取EventID、SystemTime与全部EventData字段,最终按事件类型分别进入failed_logons与successful_logons两个列表。若环境中未安装 python-evtx,检测器会在构造阶段抛出明确的RuntimeError提示安装命令,避免静默失败。
检测阈值模型与三类攻击模式
api-reference.md 给出了开箱即用的阈值模型,它们与 agent.py 的参数默认值一一对应:
| 模式 | 阈值 | 指示的攻击行为 |
|---|---|---|
| 暴力破解(Brute force) | 单个 IP 在 15 分钟内失败次数 > 10 | 针对单一目标的凭据猜测 |
| 密码喷洒(Password spray) | 单个 IP 尝试的用户数 > 5 | 多用户单密码的低慢攻击 |
| 账户沦陷(Compromise) | 同一 IP 先出现 4625 后出现 4624 | 暴力破解已成功 |
在代码层面,这三类模式分别对应analyze方法中的三段逻辑(agent.py):
- 暴力破解:对
failed_logons按源 IP 做Counter统计,失败数 ≥threshold(默认 10,可通过命令行--threshold调整)且非-占位值的 IP 被标记为brute_force_ips。注意代码注释与默认值均将时间窗口预设为 15 分钟,而当前实现以整份日志为统计范围,因此 15 分钟窗口适合在 SIEM 侧用流式查询实现;离线批处理可理解为"日志覆盖周期内每 IP 失败 ≥ 10 次"。 - 密码喷洒:以源 IP 为键收集去重后的目标用户集合,用户数 ≥ 5 的 IP 被标记为
spray_ips——这一指标在低慢型喷洒攻击中尤其有效,因为喷洒攻击的单用户失败次数通常很低,无法触发暴力破解阈值。 - 账户沦陷:取
brute_force_ips与成功登录 IP 集合的交集,并回溯该 IP 的成功登录用户,产出potential_compromises列表(包含 IP、沦陷用户、失败次数),直接对应"4625 之后出现 4624"的关联规则。
端到端检测流程
综合 SKILL.md 的四步工作流与 API 参考文档,完整检测链路如下:
Step 1:导出安全事件日志。使用wevtutil epl Security C:\logs\security.evtx或事件查看器将 Security 日志固化为 EVTX 文件。
Step 2:解析失败登录事件。用 python-evtx 解析 Event ID 4625,提取源 IP、目标用户名、失败原因(SubStatus)与登录类型字段。
Step 3:分析攻击模式。按时间窗口统计每个源 IP 的失败次数;检测单 IP 多用户的用户名喷洒;将 4625 失败与同一 IP 后续的 4624 成功登录做关联。
Step 4:生成检测报告。输出 JSON 报告,包含 Top 攻击 IP、被针对的账户、基于时间维度的分析与沦陷指示器。
运行仓库检测器
仓库提供了开箱即用的命令行入口,无需二次开发即可完成上述四步:
python scripts/agent.py /path/to/Security.evtx --threshold 10 --output-dir ./rdp_brute_force_report参数说明:evtx_file(必填)为 Security.evtx 路径;--threshold为标记暴力破解的最小失败次数,默认 10;--output-dir为报告输出目录,默认./rdp_brute_force_report。执行后检测器会解析日志、执行分析,将完整报告打印到终端并写入rdp_brute_force_report.json。
检测报告结构解读
报告的 JSON 骨架在 agent.py 与generate_report方法(agent.py)中定义,包含以下区块:
- 元信息:
report_date(UTC 生成时间)、evtx_file(数据来源)、detection_threshold(所用阈值); - 总量指标:
total_failed_logons、total_successful_logons、unique_source_ips; - 攻击者视角:
top_attacking_ips(按失败次数排名的 Top 20 源 IP)、targeted_users(被针对的 Top 20 用户名)、failure_reasons(子状态码分布); - 攻击模式:
brute_force_ips(命中暴力破解阈值的 IP)、password_spray_ips(命中喷洒阈值的 IP); - 沦陷指示:
potential_compromises(暴力破解后出现成功登录的 IP 与账户列表)。
这份报告既可用于 SOC 告警研判,也可作为 SIEM 检测规则的离线验证基准——将规则跑在同一份 EVTX 上,比对命中 IP 是否与报告的brute_force_ips一致。
前置条件与适用边界
- 环境:Python 3.9+,安装
python-evtx与lxml;需要 Windows Security EVTX 日志文件(事件查看器导出或 WEF 集中收集)。 - 知识准备:理解 Windows 认证事件 ID(4624/4625/4776),熟悉 RDP 登录类型(NLA 对应 Type 3、RemoteInteractive 对应 Type 10)。
- 场景边界:该方案基于端点安全日志的离线/集中分析,适用于蓝队监控、事件响应与 SIEM 规则建设;在线实时告警需要将同样的事件筛选逻辑下沉到 SIEM 查询(如 Splunk/Elastic)或 WEF 管道中,并叠加 15 分钟时间窗口的流式统计。
- 合规说明:仓库以 Apache-2.0 授权(见 LICENSE),agent.py 明确标注"仅供授权的安全监控与蓝队使用"。
小结
RDP 暴力破解检测的本质,是把 Windows 原生安全日志转化为可量化、可关联的攻击画像:用LogonType 3/10锁定 RDP 流量,用SubStatus还原失败原因,用源 IP 频率识别暴力破解与密码喷洒,用 4625→4624 的时序关联定位已沦陷账户。本文所引用的 API 参考、技能流程 与 检测实现 三份文件相互印证,构成了一个从日志采集、离线解析、模式识别到报告产出的完整可运行闭环,可直接应用于 SIEM 规则编写、事件调查与监控覆盖验证。
【免费下载链接】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),仅供参考