ibernal1815/log-normalizer

GitHub: ibernal1815/log-normalizer

这是一个Python工具,用于解析和规范化多种安全日志格式,统一输出并提取IOC,以简化安全分析和事件响应。

Stars: 0 | Forks: 0

# log-normalizer / ioc-extractor 为我的家庭实验室而构建,作为学习检测工程和 SOC 分析工作流的一部分。这个想法很简单:每次调查都涉及翻阅不同格式的原始日志,所以我想要一个工具,能够摄入所有日志并输出一致的、我可以实际使用的格式。 ## 背景 / 为什么我构建这个 当我在我的 Sysmon 实验室中模拟攻击场景时,我一直遇到同样的问题——我有三种不同格式的日志(来自 Windows 的 EVTX、来自我的 Ubuntu 虚拟机的 auth.log、来自 pfSense 的 syslog),而且没有干净的方法来比较它们。我要么手动 grep 它们,要么导出到 SIEM,这对于快速分类来说过于复杂。 所以我写了这个工具。它可以读取任何这些格式,将每个条目标准化为相同的 JSON 模式,并自动提取 IOC。这样我就可以将输出管道传输到 jq、输入 Wazuh 或基于它编写 Sigma 规则,而不必关心原始格式是什么。 ## 功能 - 解析 `.evtx`(Windows 事件日志)、`syslog` 和 `auth.log` 文件 - 根据文件名和内容自动检测格式——或者你可以手动指定 - 将每个条目标准化为一致的模式 - 提取每个条目和全局的 IOC:IPv4、IPv6、域名、MD5/SHA1/SHA256、文件路径 - 标记可疑模式——Windows 事件 ID(4625、4672、7045、1102 等)和 Linux 认证模式 - 输出完整的 JSON 报告:标准化条目 + 去重的 IOC 摘要 - 通过 `rich` 打印彩色终端摘要 标准化条目示例: ``` { "timestamp": "2024-01-15T03:22:11", "source_ip": "198.51.100.42", "destination_ip": null, "user": "root", "event_id": "4625", "action": "Failed logon", "raw": "Jan 15 03:22:11 server sshd[1842]: Failed password for root from 198.51.100.42", "iocs": { "ipv4": ["198.51.100.42"] }, "flags": ["Failed SSH password"] } ``` ## 项目结构 ``` log-normalizer/ │ ├── main.py # CLI entry point — arg parsing and orchestration ├── detector.py # auto-detects log format from filename + content sample ├── parsers.py # three parsers: parse_evtx, parse_syslog, parse_auth ├── ioc_extractor.py # IOC regex extraction + merge/finalize helpers ├── patterns.py # all regex patterns, suspicious event IDs, Linux flag patterns ├── reporter.py # JSON report builder + rich terminal output │ ├── tests/ │ ├── test_ioc_extractor.py │ ├── test_detector.py │ ├── test_parsers.py │ └── samples/ │ ├── sample_auth.log │ ├── sample_syslog.log │ └── sample_report.json │ ├── tutorial.md ├── README.md └── .gitignore ``` ## 依赖要求 - Python 3.8+ - `rich` —— 终端格式化 - `python-evtx` —— 仅用于 `.evtx` 解析,否则可选 安装: ``` pip install rich python-evtx ``` ## 快速开始 ``` # 克隆仓库 git clone https://github.com/ibernal1815/log-normalizer.git cd log-normalizer # 安装依赖 pip install rich python-evtx # 使用附带的示例文件尝试一下 python main.py --input samples/sample_auth.log --format auth python main.py --input samples/sample_syslog.log --output report.json ``` ## 使用方法 ``` python main.py --input [--format ] [--output ] [--iocs-only] ``` | 参数 | 缩写 | 描述 | |---|---|---| | `--input` | `-i` | 日志文件路径 *(必需)* | | `--format` | `-f` | `auto` *(默认)*,`evtx`,`syslog`,`auth` | | `--output` | `-o` | 将 JSON 写入此文件 *(默认:标准输出)* | | `--iocs-only` | — | 仅输出 IOC 摘要部分 | ### 示例 ``` # Windows 事件日志 — 自动检测,完整报告保存至文件 python main.py --input Security.evtx --output report.json # auth.log — 明确格式,仅IOC摘要 python main.py --input /var/log/auth.log --format auth --iocs-only # syslog — 将JSON输出到标准输出 + 终端摘要 python main.py --input /var/log/syslog # 将IOC摘要通过管道输入jq以仅筛选IP python main.py --input auth.log --iocs-only | jq '.ioc_summary.ipv4' ``` ## 输出格式 ``` { "meta": { "generated_at": "2024-01-15T04:00:00+00:00", "total_entries": 847, "total_iocs": 23 }, "ioc_summary": { "ipv4": ["185.220.101.5", "198.51.100.42"], "domain": ["malicious.example.com"], "sha1": ["3395856ce81f2b7382dee72602f798b642f14d0"] }, "entries": [ { ... }, { ... } ] } ``` `ioc_summary` 在所有条目中进行了去重。`entries` 包含每一行日志,包括没有 IOC 的行。 ## 标记的可疑模式 ### Windows 事件 ID | ID | 描述 | |---|---| | 4625 | 登录失败 | | 4648 | 使用显式凭据登录(可能为传递哈希指标) | | 4672 | 为新登录分配特殊权限 | | 4698 | 创建计划任务 | | 4720 | 创建新用户账户 | | 4728 | 成员添加到全局特权组 | | 4732 | 成员添加到本地管理员组 | | 7045 | 安装新服务 | | 1102 | 安全审计日志被清除 | | 4719 | 系统审计策略更改 | ### Linux 认证 / 系统日志 - SSH 密码尝试失败 - PAM 认证失败 - `sudo` 命令执行 - 添加新用户(`useradd` / `adduser`) - 无效用户名登录尝试 - 直接 root 登录 - 打开 root 会话 ## IOC 提取说明 **哈希冲突预防** —— 首先提取 SHA256(64 个字符),在寻找 SHA1(40 个字符)之前从工作字符串中清除这些字符,然后是 MD5(32 个字符)。如果不这样做,一个 SHA256 哈希值会匹配所有三种模式。 **IP 过滤** —— 回环地址(`127.x`)、不可路由地址(`0.0.0.x`)和广播地址(`255.255.x`)会被自动丢弃。 **域名正则表达式** —— 与硬编码的顶级域名列表匹配,以避免提取随机标记或主机名。 **系统日志年份** —— RFC 3164 系统日志不包含年份。解析器假设为当前年份。 ## 运行测试 ``` python -m pytest tests/ -v python -m pytest tests/test_ioc_extractor.py -v python -m pytest tests/test_parsers.py -v ``` 完整演练请参见 `tutorial.md`,包括在输出中应该寻找什么。 ## 如何融入真实的 SOC 工作流 这不是 SIEM 的替代品——它是一个快速分类和预处理工具。 - **首次查看可疑日志** —— 管道传输,立即看到标记的事件和提取的 IOC,无需启动任何重型工具 - **IOC 关联** —— 提取所有 IP/域名/哈希值,并与威胁情报进行检查 - **检测规则开发** —— 先标准化日志,然后基于一致的模式编写 Sigma 规则,而不是分别处理每种原始格式 - **实验室场景** —— 我在我的 Sysmon 实验室中运行攻击场景,并在编写检测说明之前使用此工具处理生成的日志 ## 技术栈 Python 3 · `rich` · `python-evtx` · `argparse` · `re` · `json` · `pytest` ## 相关项目 - [sysmon-sysinternals-detection-lab](https://github.com/ibernal1815/sysmon-sysinternals-detection-lab) —— 我在此生成此工具处理的 EVTX 文件 - [malware-analysis-lab](https://github.com/ibernal1815/malware-analysis-lab) —— 动态分析中的认证/系统日志工件输入此工具以进行 IOC 提取
标签:AMSI绕过, IOC 提取, JSON 输出, Linux 认证日志, OISF, Python 工具, SIEM 集成, SOC 分析, Windows 事件日志, 不可变基础设施, 事件日志处理, 二进制发布, 威胁情报提取, 威胁检测, 安全事件分析, 安全日志分析, 安全规则引擎, 安全运营, 开源工具, 扫描框架, 数据结构化, 日志收集, 日志管理, 日志规范化, 日志解析, 网络安全, 自动化安全分析, 证书伪造, 逆向工具, 隐私保护