Cybermini/threat-hunting-foothold
GitHub: Cybermini/threat-hunting-foothold
一个基于 Elastic SIEM 的 SOC 威胁狩猎实战演练项目,通过完整的跨阶段攻击链模拟训练安全分析师的日志调查和攻击归因能力。
Stars: 0 | Forks: 0
# 🔍 SOC 调查:完整攻击链分析
## 🎯 概述
这是一场在企业环境中进行的跨阶段攻击模拟——从最初的边界突破到活跃的 C2 通信——完全通过 **Elastic SIEM 日志分析**进行调查。该场景不包含任何预先生成的告警或引导式分流队列。检测、关联和归因完全依靠跨网络、端点和身份验证遥测数据(涵盖四台受感染主机)的原始 KQL 查询来驱动。
攻击面涵盖 SSH 暴力破解、Web 应用程序漏洞利用、钓鱼载荷传递、进程注入、防御规避、持久化机制以及三个同时运行的 C2 通道——这使得它成为在生产级 SOC 环境中进行真实横向移动调查的典型样本。
攻击者采用了分层攻击策略:SSH 暴力破解 → Web Shell → 恶意 LNK 文件 → 进程注入 → 防御规避 → 持久化 → 多通道 C2 (DNS 隧道 + Discord + CDN 滥用)。每个阶段都需要在日志源之间进行切换,并跨主机串联证据。
## 🗺️ 攻击链概述
```
[External Attacker: 167.71.198.43]
│
│ 1. SSH Brute Force (1,133 attempts → 1 success as "dev")
▼
JUMPHOST
│
│ 2. Web Directory Enumeration (gobuster → 6,742 probes)
│ 3. PHP Web Shell deployed → Remote Code Execution
▼
WEB01
│
│ 4. Malicious email → update.lnk (via Outlook on WKSTN-2)
│ update.zip extracted → installer.exe executed
▼
WKSTN-2 (bill.hawkins / clifford.miller)
│
├─ 5. installer.exe → cmd → PowerShell → mshta.exe → Python
├─ 6. Process Injection: chrome.exe → ThreatHunting.exe
├─ 7. Defense Evasion: Disable Windows Defender
├─ 8. Anti-Forensics: Clear Security Event Logs
├─ 9. Persistence: Scheduled Task + Registry Modification
├─ 10. C2 Channel 1: DNS Tunneling (PowerShell)
├─ 11. C2 Channel 2: Discord (installer.exe)
└─ 12. C2 Channel 3: cdn.golge.xyz (HTTP beaconing)
```
## 🛠️ 工具与技术
| 工具 | 用途 |
|------|---------|
| **Elastic SIEM (Kibana)** | 主要的调查和日志分析平台 |
| **KQL (Kibana Query Language)** | 搜索、过滤和关联日志事件 |
| **Filebeat** | 转发 SSH 身份验证和 HTTP 访问日志 |
| **Packetbeat** | 网络连接和 DNS 查询遥测 |
| **Winlogbeat + Sysmon** | Windows 事件日志 — 进程创建 (EID 1)、网络 (EID 3)、文件创建 (EID 11)、CreateRemoteThread (EID 8)、注册表 (EID 12/13) |
| **Surrounding Documents** | Kibana 中用于查看特定事件前后记录的功能 — 对时间线重建至关重要 |
## 📋 调查演练
### 任务 1 — SSH 暴力破解:查找成功的身份验证时间戳
**问题:** 攻击者在 Jumphost 服务器上成功进行身份验证的时间戳是什么?
**调查:**
第一个调查切入点是跳板机的 SSH 身份验证日志。我过滤了所有已接受/失败的 SSH 事件,以了解攻击的范围。
**KQL 查询(初始范围):**
```
host.name: jumphost AND event.category: authentication AND system.auth.ssh.event: Accepted
```
广泛的过滤结果显示,有两个攻击 IP 正在猛烈扫描服务器:`167.71.198.43` 针对 `dev` 账户进行了 1,133 次尝试,而 `218.92.0.115` 针对 `root` 进行了 746 次尝试。缩小范围至来自这两个 IP 的成功(`Accepted`)身份验证:
**KQL 查询(仅成功身份验证):**
```
host.name: jumphost AND event.category: authentication AND system.auth.ssh.event: Accepted AND source.ip: (167.71.198.43 OR 218.92.0.115)
```
这返回了 **1 条结果** — 攻击者成功地从 `167.71.198.43` 以用户 `dev` 的身份通过了身份验证。展开该事件显示了确切的时间戳。

*所有 SSH 事件,显示了两个攻击 IP 及其尝试次数*

*过滤出已接受的事件 — 1 条结果,攻击者 IP 167.71.198.43,用户 dev*

*展开事件显示的准确身份验证时间戳*
### 任务 2 — Web 漏洞利用:web01 上的 PHP Web Shell
**问题:** 攻击者在 web01 上成功获取代码执行权限后,通过 `cat` 命令访问的 PHP 文件名是什么?
**调查:**
在获取了跳板机的 SSH 访问权限后,攻击者转向了对 `web01` 的 Web 侦察。我首先查看了来自攻击者 IP 的 HTTP 流量和响应码。
**KQL 查询(HTTP 流量概览):**
```
host.name: web01 AND network.protocol: http AND destination.port: 80
```
状态码分布立刻说明了问题:来自 `167.71.198.43` 的 **6,746 个 HTTP 400 范围响应** — 典型的目录暴力破解。

*HTTP 响应码分布 — 攻击者引发了 6,746 个 404 响应*
**KQL 查询(gobuster 扫描):**
```
host.name: web01 AND network.protocol: http AND destination.port: 80 AND source.ip: 167.71.198.43 AND http.response.status_code: 404
```
user-agent 字段暴露了其使用的工具:**gobuster 2.0.1** — 一款自动化目录枚举工具。攻击者运行了 6,742 次探测,寻找隐藏的目录和文件。

*6,742 次命中 — 全是 404 — user-agent 确认为 gobuster 2.0.1*
接下来,我过滤了成功的响应 (200/301/302),看看攻击者实际找到了什么:
**KQL 查询(成功响应):**
```
host.name: web01 AND network.protocol: http AND destination.port: 80 AND source.ip: 167.71.198.43 AND http.response.status_code: (200 OR 301 OR 302)
```
`url.query` 字段揭示了正在运行的 PHP Web Shell:
```
```

*以 cmd.exe PID 为根的进程树,显示所有子进程,包括禁用 Defender 的 PowerShell*

*执行 Set-MpPreference -DisableRealtimeMonitoring $true 的特定 cmd.exe PID*
### 任务 8 — 反取证:用于清除事件日志的 PowerShell 命令
**问题:** 用于清除 WKSTN-1 事件日志的 PowerShell 命令行参数是什么?
**调查:**
在禁用了 Defender 之后,攻击者清除了事件日志以删除其活动痕迹。我在已知事件上使用了 Surrounding Documents 来查找 Clear-EventLog 命令。

*显示 PowerShell Clear-EventLog 命令的周边文档 — 针对 Security 和 System 日志*
使用的 PowerShell 命令是:
```
powershell Clear-EventLog -LogName Security
```
攻击者专门针对 Windows Security 事件日志 — 其中包含所有身份验证、权限使用和对象访问事件。清除它就等于删除了 SOC 分析师所依赖的关键证据。
### 任务 9 — 进程注入:chrome.exe 目标 PID
**问题:** `chrome.exe` 进程注入目标的 PID 是什么?
**调查:**
一个伪造的 `chrome.exe`(由攻击者下载,而非真正的 Google Chrome)使用 `CreateRemoteThread` 技术执行了进程注入。Sysmon Event ID 8 捕获了此操作。
**KQL 查询(CreateRemoteThread 事件):**
```
host.name: WIN7% AND winlog.event_id: 8
```
但首先,Zone.Identifier 文件表明伪造的 chrome.exe 是从互联网下载的(通过 Google 安装程序安装):

*Sysmon EID 11 — chrome.exe.Zone.Identifier 确认它是下载的而非安装的 — 伪造的 Chrome*
**KQL 查询(chrome.exe Sysmon 文件事件):**
```
host.name: WKSTN-N* AND process.name: chrome.exe AND winlog.event_id: 11
```

*Sysmon EID 8 (CreateRemoteThread) — chrome.exe 注入 ThreatHunting.exe — 高亮显示目标 PID*
位于 `C:\Users\clifford.miller\Downloads\chrome.exe` 的伪造 `chrome.exe` 注入到了 `ThreatHunting.exe` 中。目标进程 PID 可在高亮行的 `winlog.event_data.TargetProcessId` 字段中看到。
### 任务 10 — 持久化:计划任务创建的父进程
**问题:** 执行计划任务创建的 `cmd.exe` 进程的父进程名称是什么?
**调查:**
计划任务是一种经典的持久化机制。获取执行权限后,攻击者注册了一个任务以便在重启后存活。
**KQL 查询(计划任务事件):**
```
host.name: WKSTN* AND winlog.event_id: (4698 OR 12 OR 13) OR "Register-ScheduledTask"
```

*计划任务创建事件 — 在 process.parent 字段中可见 cmd.exe 的父进程*
结果显示 `cmd.exe` 执行了计划任务注册,其父进程在 `process.parent.command_line` 和 `process.parent.executable` 字段中被识别出来。
### 任务 11 — 持久化:注册表修改命令
**问题:** 使用恶意 `reg.exe` 执行的进程 ID,执行注册表修改所使用的进程命令行值是什么?
**调查:**
注册表修改是另一种持久化技术 — 写入 Run 键或其他自启动位置可确保恶意软件在每次 Windows 启动时执行。
**KQL 查询(注册表路径):**
```
host.name: WKSTN* AND winlog.event_id: 13 AND registry.path: *Fax*
```

*Sysmon EID 13 注册表值设置 — 高亮显示恶意的注册表路径*
使用 `reg.exe` 的 PID,我通过 Surrounding Documents 查看了完整命令:

*周边文档显示了完整的 reg.exe 命令行及正在写入的注册表键和值*
`reg.exe` 命令行显示了被设置的确切注册表路径和值 — 写入了一个在系统启动时执行攻击者载荷的持久化条目。
### 任务 12 — C2 over DNS:PowerShell 下载链接
**问题:** 使用 PowerShell 下载以建立 C2 over DNS 的链接是什么?
**调查:**
攻击者使用 DNS 作为隐蔽的 C2 通道。我过滤了从工作站到攻击者 IP 的出站 DNS 连接:
**KQL 查询(DNS C2 连接):**
```
host.name: WKSTN* AND destination.ip: 167.71.198.43 AND destination.port: 53
```

*nslookup.exe 和 cmd.exe 在端口 53 上向攻击者 IP 发起 DNS 查询*
随后,周边文档揭示了建立 DNS 隧道的 PowerShell 命令:

*周边文档显示的 PowerShell -enc(编码)命令 — 解码后的载荷包含来自 GitHub 的 C2 下载链接*
使用的 PowerShell 命令带有 `-noni -nop -w hidden -enc` 标志 — 一种经典的编码载荷执行模式。解码后的 base64 命令包含一个从 GitHub 仓库下载 C2 植入程序的 URL:`https://raw.githubusercontent.com/jakeleviathan/shared/master/`,其后是载荷文件名。
### 任务 13 — Discord C2:下载 dev.py 的命令
**问题:** 在调查了 C2 over Discord 事件后,用于下载恶意 `dev.py` Python 脚本的命令是什么?
**调查:**
Discord 被用作辅助 C2 通道 — 这是一种常见的攻击者技术,因为 Discord 流量可以混入合法的企业使用中,且很少被阻断。
**KQL 查询(Discord 连接):**
```
host.name: WKSTN-1* AND *discord.gg*
```

*installer.exe 连接到 discord.gg — 与 Discord C2 关联的进程*

*完整的 cmd.exe 命令树 — 在 process.command_line 中可见 dev.py 的下载命令*
Discord C2 通道通过 Discord bot API 传递命令。`dev.py` 的下载命令使用了 `curl` 或 `Invoke-WebRequest` 指向攻击者的文件托管站点,这在进程命令行字段中清晰可见。
### 任务 14 — CDN 滥用:与 cdn.golge.xyz 关联的进程
**问题:** 同样与 `cdn[.]golge[.]xyz` 关联的进程名称是什么?
**调查:**
最后一个 C2 通道滥用 CDN 域名,将恶意流量伪装成合法的 Web 请求。
**KQL 查询(带目标域名的 HTTP 流量):**
```
network.protocol: http AND network.direction: egress AND destination.domain: *
```

*显示目标域名的出站 HTTP 流量 — 可见 cdn.golge.xyz 查询*

*WKSTN-1 和 WKSTN-2 都在信标通信至 cdn.golge.xyz — 查询 /admin/get.php、/login/process.php、/news.php*
表格显示 WKSTN-1 和 WKSTN-2 都向 `cdn.golge.xyz` 发起了数千个 HTTP 请求 — 具体查询包括:
- `GET /admin/get.php`(来自 WKSTN-2 的 5,475 次请求)
- `GET /login/process.php`(5,335 次请求)
- `GET /news.php`(5,268 次请求)
通过主机名和时间戳将网络事件与进程日志进行关联,识别出了发起这些连接的进程。
## 📊 IOC 汇总
| 指示器 | 类型 | 描述 |
|-----------|------|-------------|
| `167.71.198.43` | IP | 主要攻击者 IP — SSH 暴力破解、反向 Shell、DNS C2 |
| `218.92.0.115` | IP | 辅助扫描 IP |
| `cdn.golge.xyz` | 域名 | 伪装成 CDN 的攻击者控制 C2 域名 |
| `installer.exe` | 文件 | 投放在 `C:\Windows\Temp\` 的恶意载荷 |
| `chrome.exe` | 文件 | 用于进程注入的伪造 Chrome 二进制文件 (`C:\Users\clifford.miller\Downloads\`) |
| `update.lnk` | 文件 | 通过钓鱼邮件投递的恶意 LNK 快捷方式 |
| `update.zip` | 文件 | 包含 LNK 载荷的压缩包 |
| `dev.py` | 文件 | 通过 Discord C2 下载的基于 Python 的恶意软件 |
| `bootstrap.php` | 文件 | web01 上的 PHP Web Shell |
| `discord.gg` | 域名 | installer.exe 使用的 Discord C2 通道 |
## 🔍 关键检测查询 (可直接使用)
```
# SSH 爆破与成功关联
host.name: jumphost AND event.category: authentication AND system.auth.ssh.event: Accepted
# 通过 URL query 执行 Web shell
host.name: web01 AND url.query: *system($_GET*
# 通过电子邮件客户端创建恶意 LNK
process.name: OUTLOOK.EXE AND winlog.event_id: 11 AND file.path: *.lnk
# Defender 篡改检测
process.command_line: *DisableRealtimeMonitoring* OR process.command_line: *RemoveDefinitions*
# Event log 清除(始终是 IOC)
winlog.event_id: 1102 OR winlog.event_id: 104
# Process injection(CreateRemoteThread)
winlog.event_id: 8 AND NOT process.name: (svchost.exe OR MsMpEng.exe)
# 编码 PowerShell 执行
process.name: powershell.exe AND process.command_line: (*-enc* OR *-EncodedCommand*)
# 可疑 scheduled task 创建
winlog.event_id: 4698 AND NOT process.parent.name: (services.exe OR svchost.exe)
# DNS C2 到非标准 resolver
destination.port: 53 AND NOT destination.ip: (8.8.8.8 OR 1.1.1.1 OR 192.168.*)
```
## 💡 我学到了什么
这个房间是我做过的最具挑战性和回报的练习之一。以下是我的主要收获:
**1. 真实的威胁狩猎没有预设路径。** 与带有逐步提示的 CTF 挑战不同,这个房间要求我提出假设、选择日志源、编写查询、评估结果并进行切换。当查询返回无结果时,我不得不重新考虑我的方法 — 这与真实的 SOC 工作完全一致。
**2. Surrounding Documents 功能被低估了。** 几乎一半的答案并非直接来自查询本身,而是通过在匹配事件上点击“Surrounding Documents”并阅读其前后 30 秒内发生的事情得出的。时间线重建通常比初始告警更有价值。
**3. 攻击者通过链式调用合法工具来逃避检测。** 执行链 `installer.exe → cmd → PowerShell → mshta → Python → cmd → net.exe` 使用的全部都是 Windows 内置工具和常见运行时。该链条中没有任何单个进程是本质恶意的 — 只有父子和兄弟关系暴露了攻击。
**4. 多通道 C2 正在成为标准。** 攻击者同时使用了 DNS 隧道、Discord 和伪造的 CDN 域名。如果其中一个通道被阻断,其他通道仍会继续工作。防御方必须能够检测全部三个 — 这就是为什么跨所有协议的网络监控(而不仅仅是 Web 流量)如此重要。
**5. 反取证现在已成为攻击链的一部分。** 在同一会话中禁用 Defender 并清除事件日志,是攻击者试图确保即使后来被检测到,取证证据也已不复存在。集中式的 SIEM 日志记录可以挫败这种企图 — 日志在攻击者本地清除之前就已经被发送到 Elastic 了。
**6. Zone.Identifier 文件是金矿。** 当我看到 `chrome.exe.Zone.Identifier` 时,我立刻知道它是从互联网下载的 — 而非由 Google 安装程序安装。这个小细节证实了伪造的 Chrome 二进制文件。在调查下载文件时,务必检查 Zone.Identifier (Sysmon EID 11)。
## 📚 参考
- [TryHackMe — Threat Hunting: Foothold](https://tryhackme.com/room/threathuntingfoothold)
- [Elastic KQL 文档](https://www.elastic.co/guide/en/kibana/current/kuery-query.html)
- [Sysmon Event ID 参考](https://learn.microsoft.com/en-us/sysinternals/downloads/sysmon)
- [MITRE ATT&CK — 初始访问:有效账户](https://attack.mitre.org/techniques/T1078/)
- [MITRE ATT&CK — 执行:命令和脚本解释器](https://attack.mitre.org/techniques/T1059/)
- [MITRE ATT&CK — 防御规避:进程注入](https://attack.mitre.org/techniques/T1055/)
- [MITRE ATT&CK — C2: DNS](https://attack.mitre.org/techniques/T1071/004/)
- [SwiftOnSecurity Sysmon 配置](https://github.com/SwiftOnSecurity/sysmon-config)
*作者:[Yamini Savalia](https://www.linkedin.com/in/yamini-savalia-387ab6100/) · SOC Analyst · CompTIA Security+ · CKA · 金牌得主*
*作品集:[cybermini.com](https://cybermini.com)*
标签:CISA项目, Elastic Stack, 子域名变形, 安全运营, 扫描框架, 攻击模拟, 流量重放, 越狱测试, 驱动签名利用