RNB-Team/LogHound
GitHub: RNB-Team/LogHound
LogHound 是一款后渗透 EVTX 日志分析器,用于解析 Windows 安全事件日志并将身份验证会话数据映射到 BloodHound CE 中以辅助横向移动分析。
Stars: 9 | Forks: 1
# LogHound

**用于 BloodHound 映射的后渗透 EVTX 分析器**
*LogHound 收集并解析 Windows 安全事件日志(.evtx),提取身份验证事件、会话数据和登录元数据,以便导入 BloodHound 并获取更深入的对抗性遥测数据。*
## 原理与概述
LogHound 的构建是为了解决红队和网络渗透测试人员面临的一个特定问题:如何在不破坏操作安全性的前提下,高效跟踪横向移动目标、破译活跃用户会话,并确定明确的机器所有权。
Active Directory 域控制器上的事件日志文件(`Security.evtx`)可能高达数 GB。传统的加载技术通常会耗尽系统内存或导致崩溃,从而留下明显的痕迹。LogHound 通过在强大的 Impacket 框架之上利用基于 chunk 的流式处理范式来解决这一问题。
它映射网络结构,根据登录频率确定实际上是谁“拥有”某台机器,计算出准确的工作时间以识别非工作时间(夜猫子)的操作,并无缝地将这些情报输入到 BloodHound CE (v5+) 中。
## 安装步骤
LogHound 依赖于 Python 3 和 Impacket。强烈建议使用虚拟环境。
```
# 1. Clone 仓库
git clone https://github.com/LogHound/LogHound.git
cd LogHound
# 2. (可选但推荐)创建 Python 虚拟环境
python3 -m venv venv
source venv/bin/activate
# 3. 安装必需的依赖项
pip install -r requirements.txt
```
## CLI 参数说明
LogHound 的 CLI 与标准的 Impacket 模块(如 `secretsdump.py`)交互方式完全相同,要求您指定一个明确的操作模式(`--local` 或 `--remote`)。
```
python loghound.py [[domain/]username[:password]@]
[options]
```
### 操作模式(必选)
- `--local EVTX_FILE`:解析已经位于您本地机器上的 `.evtx` 文件。
- `--remote`:使用提供的凭据从远程目标系统下拉取 `Security.evtx`。
### 身份验证与连接
- `-hashes LMHASH:NTHASH`:使用 NTLM 哈希进行 Pass-The-Hash 认证。
- `-k`:使用 Kerberos 认证。从由 `KRB5CCNAME` 环境变量指定的 `.ccache` 文件中提取凭据。
- `-aesKey hex_key`:为 Kerberos 使用特定的 AES 密钥(128 或 256 位)。
- `-no-pass`:不要交互式地提示输入密码。
- `-keytab KEYTAB_FILE`:使用 Kerberos keytab 文件进行认证。
- `-dc-ip IP`:域控制器的显式 IP 地址。
- `-target-ip IP`:目标机器的显式 IP 地址(绕过 NetBIOS 名称解析失败的情况)。
### 输出格式
- `-format {json,csv,md,all}`:指定基于文本的输出格式。注意:交互式 HTML 报告和 BloodHound JSON 文件*始终*会生成。默认为 `json`。
- `-outputfile BASENAME`:子目录中生成的输出报告的名称前缀。
### 性能
- `-threads N`:并行运行的解析器线程数(默认值:4)。
- `-chunk-size N`:每个解析 chunk 的日志记录数。较低的值可减少 RAM 开销;较高的值解析速度略快(默认值:1000)。
## 示例
- Bloodhound edges。
- HTML 报告。
## 架构与数据流
LogHound 采用了一种高度解耦且节省内存的分析流水线:
1. **收集 (`core/collector.py`)**:通过 SMB 连接到目标,然后通过 WMI 执行 `wevtutil epl Security` 将安全事件日志导出到目标上的临时文件中。随后通过 SMB 将导出的文件下载到 `loot/YYYY-MM-DD__Security.evtx` 中,以避免覆盖。
2. **解析 (`core/parser.py`)**:多线程 chunk 解析器对原始 `.evtx` 二进制文件进行流式处理,并持续将解析后的事件发送到临时 JSON Line 缓冲区(`jsonl/loghound_dump.jsonl`)中。如果中断,它可以从精确的检查点恢复。
3. **分析 (`core/analyzer.py`)**:逐行遍历 `.jsonl` 流以保持较低的 RAM 占用。它计算中间状态字典(会话跟踪、所有权评分、逻辑跟踪)。
4. **导出 (`core/exporter.py` & `core/exporter_bloodhound.py`)**:将分析阶段的 RAM 状态动态刷入最终的 `html/` 和 `json/` 导出格式中。
*有关深入的架构逻辑和已解决的导入错误,请参阅 [ARCHITECTURE.md](ARCHITECTURE.md) 中的内部文档。*
## 节点、属性与指标说明
LogHound 原生过滤六个明确的 Windows 安全事件 ID:**4624、4634、4648、4768、4769、4776**。
利用这些事件,LogHound 通过 `Properties` 块将以下自定义属性直接绑定到生成的 **User** 节点,从而增强 BloodHound CE:
### BloodHound CE 合并架构
- **ObjectIdentifier SIDs**:LogHound 确保 `ObjectIdentifier` 映射与现有的 SharpHound 摄取完全一致。AD 域用户接收其原生的 Windows SID(`S-1-5-21-...`)。为了防止 BloodHound 节点撕裂,本地机器账户准确地维护了回退标准 `USER@HOSTNAME`。
- **计算机会话**:生成的 `computers.json` 利用精确的原生 `SessionAPIResult` 数据结构,在机器和用户之间绘制真实的“HasSession”边。
### 自定义 LogHound 用户指标
分析引擎根据跟踪到的登录/注销事件计算工作时间运作小时数,并忽略异常情况(如跨越多天的会话)。
| 属性名称 | 类型 | 指标描述 |
|---|---|---|
| `loghound_avg_start_time` | String | 计算为该用户在所有观察到的有效天数中记录的平均**首次登录**时间(00:00 HH:MM)。 |
| `loghound_avg_end_time` | String | 计算为每天记录的平均**最后活动**(注销或最后触碰)时间。 |
| `loghound_active_days` | Integer | 用于计算平均时间数组的有效天数(至少包含一次正常会话)的总计数。 |
| `loghound_outside_hours` | Boolean | True/False。专门用于识别**夜猫子**。如果用户计算出的活跃开始到结束时间窗口与 **22:00 到 06:00** 的夜间范围重叠,则评估为 `True`。 |
| `Avg Hours per Day` | Float | 内部计算为用户的 `average start time` 和 `average end time` 之间的确切时间差。(显示在文本/HTML 报告中)。 |
### 机器所有权指标
分析通过计算最频繁的交互式登录来确定任何工作站或 IP 地址的明确所有者。这会将主要的 `Owner` 以及次要 `Other Users` 数组绑定到原始节点。
## 免责声明
本软件仅用于教育、授权的渗透测试和取证调查目的。请勿在您未获得明确授权操作的网络中使用此工具。
## 许可证
本项目基于 Apache License 2.0 授权 - 详见 LICENSE 文件。
## 致谢
- 由 https://github.com/Nelkmen 创建
- 灵感来源于 https://github.com/specterops/bloodhound, https://github.com/fortra/impacket标签:BloodHound, PE 加载器, 内网横向移动分析, 逆向工具