roshini111/sysmon-security-parser-and-log-analysis
GitHub: roshini111/sysmon-security-parser-and-log-analysis
一款零依赖的 Python Sysmon 日志解析与安全分析工具链,能将原始 XML 日志转化为结构化数据,并提供基于规则的风险评分、行为关联及 MITRE ATT&CK 映射。
Stars: 0 | Forks: 0
# Sysmon 安全解析器与日志分析
本文档涵盖了**基础解析器**(`parser.py`)以及**高级流水线**(`advanced_parser.py` 和 `investigation_report.py`)的日常使用。有关高级流水线的完整架构、MITRE 映射、OSINT 扩展及企业部署指南,请参阅 **[ADVANCED_README.md](ADVANCED_README.md)**。
## 目录
1. [这是什么项目?](#1-what-is-this-project)
2. [它解决什么问题?](#2-what-problem-does-it-solve)
3. [它在哪里使用?](#3-where-is-it-used)
4. [它为什么有用?](#4-why-is-it-useful)
5. [基础解析器与高级流水线对比](#5-basic-parser-vs-advanced-pipeline)
6. [必需的 Sysmon XML 输入及重要字段](#6-required-sysmon-xml-input-and-important-fields)
7. [如何运行 parser.py](#7-how-to-run-parserpy)
8. [如何运行 advanced_parser.py](#8-how-to-run-advanced_parserpy)
9. [过滤示例](#9-filtering-examples)
10. [JSON、JSONL 和 CSV 导出示例](#10-json-jsonl-and-csv-export-examples)
11. [调查报告命令](#11-investigation-report-command)
12. [JSON 输出示例](#12-example-json-output)
13. [如何运行测试](#13-how-to-run-tests)
14. [当前局限性](#14-current-limitations)
## 1. 这是什么项目?
Sysmon 安全解析器与日志分析是一个零依赖的 Python 工具链(仅使用标准库 —— 无需 `pip install`),它能够读取 Sysmon XML 事件日志并将其转化为结构化、可过滤、具有证据评分的安全数据。它的范围涵盖了从最小化的单一用途解析器(`parser.py`)到完整的多阶段流水线,后者可以对风险进行评分、将事件关联为行为链、映射至 MITRE ATT&CK、提取失陷指标,并且 —— 仅在获得明确的人工批准时 —— 核对这些指标与 VirusTotal 的比对情况。
## 2. 它解决什么问题?
Sysmon 日志是完整却冗长的 XML:每个进程、网络连接、文件写入、注册表更改以及 DNS 查询都是其自身深层嵌套的 `` 元素,这让人工阅读变得十分困难,且输入到临时脚本或笔记本中也十分繁琐。本项目通过以下方式解决此问题:
- 将原始的 Sysmon XML 转换为干净、结构化的 JSON/JSONL/CSV。
- 应用确定性的、基于证据的检测规则,而不再要求分析师人工识别可疑的命令行。
- 将相关事件(例如,一个进程写入文件,然后修改注册表,再建立网络连接)关联为一个单一的经过评分且有序的时间线,而无需分析师从扁平化的日志中拼凑事件。
- 生成一份可读的调查报告,而不需要进行单独的手动编写。
## 3. 它在哪里使用?
- **SOC(安全运营中心)** —— 对导出的 Sysmon 批次进行分类处理,以快速将普通活动与需要升级处理的事件区分开来。
- **事件响应** —— 针对怀疑遭到入侵的主机,构建一个有序、已评分的事件发生时间线。
- **威胁狩猎** —— 按进程、用户、计算机或时间窗口过滤大型的 Sysmon 导出数据,以测试某项假设(例如,“上周是否有主机运行过编码过的 PowerShell 命令?”)。
- **数字取证** —— 针对特定主机或时间范围,生成一份具备审计性、附有证据引用的进程/文件/注册表/网络/DNS 活动记录。
- **恶意软件分析** —— 检查在实验室环境中执行的样本的进程创建、文件释放、持久化以及网络/DNS 行为。
- **SIEM 日志准备** —— 在原始 Sysmon XML 被摄取或转发到 SIEM 之前,将其规范化为扁平的 JSON/JSONL/CSV。
## 4. 它为什么有用?
- **无第三方依赖。** 可在任何运行 Python 3 的地方运行,无需安装任何内容,且除了标准库之外没有任何供应链风险面。
- **确定且基于证据。** 每一个风险点和每一个 MITRE 映射都可以追溯到特定的规则和特定的日志证据片段 —— 绝无任何猜测或由模型推断的内容。
- **从不夸大声明。** 没有固定 MITRE 映射的规则将被报告为 `"Unmapped"`,而不是被分配一个看似合理的猜测;干净的 OSINT 结果也绝不会被称为安全的证明。
- **设计上保持人在回路。** 没有明确且被记录的人工批准步骤,就不会进行任何外部查询(例如 VirusTotal)。
- **可审计的输出。** JSON 输出保留了完整的细节(评分、证据、关联推理)以供机器/审计使用,而 Markdown 报告则保持了对人类分析师的可读性。
## 5. 基础解析器与高级流水线
| | `parser.py` (基础) | `advanced_parser.py` + 流水线 (高级) |
|---|---|---|
| 支持的事件 ID | 仅限 1(进程创建) | 1, 3, 11, 13, 22 |
| 提取的字段 | `EventID`, `TimeCreated`, `Computer`, `Image`, `CommandLine`, `ParentImage`, `User`, `IntegrityLevel` | 特定于事件 ID 的字段集(见下文),外加 `ProcessGuid`/`ProcessId` |
| 过滤 | 无 | `--event-id`, `--user`, `--process`, `--computer`, `--start-time`, `--end-time` |
| 输出格式 | 仅 JSON | JSON, JSONL, CSV |
| 检测/评分 | 无 | 基于规则的检测、风险评分、时间线关联、MITRE 映射(`timeline_analyzer.py`) |
| 报告 | 无 | Mermaid 流程图、IOC 提取、经人工批准的 OSINT 扩展、置信度评分,以及综合调查报告(参见 [ADVANCED_README.md](ADVANCED_README.md)) |
当您只需要快速查看事件 ID 1 的数据时,请使用 `parser.py`。若需要进行过滤、多事件类型解析、检测和报告,请使用 `advanced_parser.py` 及其余的流水线组件。
## 6. 必需的 Sysmon XML 输入及重要字段
两个解析器都期望使用 Windows 事件日志 XML 命名空间(`http://schemas.microsoft.com/win/2004/08/events/event`)的标准 Sysmon XML,可以是以下格式之一:
- 单个 `` 文档,或
- 包含多个 `` 子节点的 `` 文档。
每个事件都必须包含一个 `` 块,其中至少包含 `EventID`、`TimeCreated`(时间戳从 `SystemTime` 属性读取,而不是元素文本)和 `Computer`。相关的 `` 字段取决于事件 ID:
| 事件 ID | 含义 | 从 `` 读取的字段 |
|---|---|---|
| 1 | 进程创建 | `Image`, `CommandLine`, `ParentImage`, `User`, `IntegrityLevel`, `ProcessGuid`, `ProcessId`, `ParentProcessGuid`, `ParentProcessId` |
| 3 | 网络连接 | `Image`, `User`, `Protocol`, `SourceIp`, `SourcePort`, `DestinationIp`, `DestinationPort`, `DestinationHostname`, `ProcessGuid`, `ProcessId` |
| 11 | 文件创建 | `Image`, `TargetFilename`, `CreationUtcTime`, `User`, `ProcessGuid`, `ProcessId` |
| 13 | 注册表值更改 | `Image`, `TargetObject`, `Details`, `User`, `ProcessGuid`, `ProcessId` |
| 22 | DNS 查询 | `Image`, `QueryName`, `QueryStatus`, `QueryResults`, `User`, `ProcessGuid`, `ProcessId` |
XML 中缺失的任何字段都将作为 `null` 返回,而不会引发错误。`ProcessGuid` 是用于将来自同一进程的相关事件进行分组的首选关联键;当它缺失时,流水线会回退到按 Computer + User + Image 进行匹配。只有事件 ID 1 包含 `ParentProcessGuid`/`ParentProcessId`,因为只有进程创建事件才具有父进程。
## 7. 如何运行 parser.py
```
py parser.py sample_event.xml
py parser.py multiple_events.xml
```
`parser.py` 会将格式化的 JSON 打印到终端。如果给定的文件不存在,它会打印 `Error: file not found: ` 并以非零状态退出;如果 XML 无效,它会打印 `Error: invalid XML in :
` 并以非零状态退出。
## 8. 如何运行 advanced_parser.py
```
py advanced_parser.py advanced_events.xml
```
在没有选项的情况下,这会解析文件中的每个事件,并将其作为 JSON 打印到终端,其中包括事件 ID 1 事件通过内置的基于规则的检查所获取的 `Suspicious` 标志和 `DetectionReasons` 列表。
## 9. 过滤示例
所有过滤器都可以组合使用;提供的每个过滤器都必须匹配(逻辑 AND)。`--user`、`--process` 和 `--computer` 不区分大小写,并接受完整值或简写形式(例如,`asmith` 匹配 `CORP\asmith`,`WORKSTATION02` 匹配 `WORKSTATION02.corp.local`)—— 绝不进行子字符串匹配。
```
py advanced_parser.py advanced_events.xml --event-id 1
py advanced_parser.py advanced_events.xml --user asmith
py advanced_parser.py advanced_events.xml --computer WORKSTATION02
py advanced_parser.py advanced_events.xml --process powershell.exe
py advanced_parser.py advanced_events.xml --start-time 2026-07-13T09:00:00 --end-time 2026-07-13T09:31:00
py advanced_parser.py advanced_events.xml --event-id 1 --process powershell.exe --user asmith
```
## 10. JSON、JSONL 和 CSV 导出示例
`--format` 默认为 `json`;`--output` 会在文件中写入,而不是终端。
```
py advanced_parser.py advanced_events.xml --format json --output events.json
py advanced_parser.py advanced_events.xml --format jsonl --output events.jsonl
py advanced_parser.py advanced_events.xml --format csv --output events.csv
```
## 11. 调查报告命令
`investigation_report.py` 运行完整的流水线(解析、评分、关联、MITRE 映射,以及 —— 如果存在的话 —— OSINT 结果),并同时写入 `investigation_report.json`(完整细节)和 `investigation_report.md`(可读摘要):
```
py investigation_report.py demo_mixed_events.xml
```
它本身从不执行 OSINT 查找。如果 `approval_record.json` 以及 `enrichment_plan.json` 或 `live_enrichment_results.json` 中任意一个已存在于当前目录中,它会自动检测并包含它们;否则,您可以显式指定它们的路径:
```
py investigation_report.py demo_mixed_events.xml --approval-record approval_record.json --enrichment-results enrichment_plan.json
```
## 12. JSON 输出示例
`advanced_parser.py` 针对单条事件 ID 1 记录的输出:
```
{
"EventID": "1",
"TimeCreated": "2026-07-13T09:30:00.0000000Z",
"Computer": "WORKSTATION02.corp.local",
"Image": "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe",
"CommandLine": "powershell.exe -ExecutionPolicy Bypass -WindowStyle Hidden -File C:\\Users\\asmith\\AppData\\Roaming\\update.ps1",
"ParentImage": null,
"User": "CORP\\asmith",
"IntegrityLevel": "Medium",
"ProcessGuid": "{c3333333-0000-0000-0000-000000000003}",
"ProcessId": "4400",
"ParentProcessGuid": null,
"ParentProcessId": null,
"Suspicious": true,
"DetectionReasons": ["Execution policy bypass"]
}
```
针对相同样本文件(`demo_mixed_events.xml`)的 `investigation_report.json` 中的 `ExecutiveSummary` 片段:
```
{
"ExecutiveSummary": {
"InputFilename": "demo_mixed_events.xml",
"TotalEvents": 7,
"OverallRiskScore": 85,
"OverallSeverity": "Critical",
"EvidenceConfidenceScore": 75,
"SuspiciousEventCount": 4,
"RuleBasedDetectionCount": 4,
"BehavioralChainCount": 1
}
}
```
## 13. 如何运行测试
```
py -m unittest discover -s tests -p "test_*.py" -v
```
所有测试均仅针对本地固定的 XML 文件和临时文件运行。每个与 OSINT 相关的测试都会模拟网络调用 —— 测试套件绝不会向 VirusTotal 或任何其他外部服务发出真实请求,也绝不需要 API 密钥。
## 14. 当前局限性
- **当前项目分批分析 XML 日志文件。** 每次运行都会读取完整的 Sysmon XML 导出;不支持实时跟踪日志。
- **目前尚不支持连续的实时监控。** 检测和评分发生在您针对导出文件运行工具时,而不是在事件发生时。
- **Sysmon 事件 ID 3 不提供传输的字节量**,因此无法仅从网络事件评估数据泄露量。
- **横向移动检测需要身份验证、EDR、防火墙或 Windows 安全日志** —— 仅凭 Sysmon 数据不足以确认横向移动。
- **OSINT 结果是辅助证据,而非证明。** 恶意的 VirusTotal 结果会强化调查发现;干净或未找到的结果并不能为嫌疑洗脱嫌疑。
- **切勿将 API 密钥放在源代码中。** `VT_API_KEY` 必须在您自己的 shell 中设置为环境变量 —— 本仓库中的任何文件绝不会读取、写入或打印它。
标签:AMSI绕过, Cloudflare, MITRE ATT&CK, Python, Sysmon, 威胁检测, 无后门, 逆向工具