omarbabba779xx/network-traffic-monitoring-lab
GitHub: omarbabba779xx/network-traffic-monitoring-lab
基于真实恶意软件流量的SOC网络取证实验室,涵盖五个完整调查案例并配套MITRE ATT&CK映射、Sigma检测规则和IOC导出。
Stars: 0 | Forks: 0
# 网络流量监控与分析实验室
网络流量是攻击者一旦接入网络就无法轻易伪造的数据源——
进程可以被杀掉,日志可以被清空,但数据包捕获(pcap)是确凿的事实。本项目是一个
SOC 分析师风格的工作成果,完全基于真实的数据包捕获构建:一份我自己的“正常”流量基线,
以及五个从
[malware-traffic-analysis.net](https://www.malware-traffic-analysis.net/) 提取的真实恶意软件样本,
每一个都进行了端到端的完整调查——包括受感染主机识别、C2 基础设施、数据窃取时间线、
MITRE ATT&CK 映射、Sigma 检测规则以及机器可读的 IOC 导出——使用了 SOC 实际运行的相同四款工具:
**Wireshark、tcpdump、Zeek 和 NetworkMiner**。
**快速链接:** [SUMMARY.md](SUMMARY.md)(案例面板) · [rules/](rules/)(Sigma 检测) ·
[iocs/](iocs/)(IOC 导出) · [captures/SHA256SUMS](captures/SHA256SUMS)(完整性清单) ·
[MALWARE_HANDLING.md](MALWARE_HANDLING.md)(解压任何 pcap 前请阅读) ·
[LICENSE](LICENSE)
本实验中的两个独立案例([C2 beacon](reports/investigation-c2-beacon-2026-02-28.md) 和
[NetSupport RAT](reports/investigation-netsupport-rat-2024-11-26.md))被发现共享一个
逐字节完全相同的 C2 beacon 协议,尽管它们的日期、IP 和受害者环境各不相同——
这是一次真实的跨案例关联,而不是为了写文章而刻意捏造的。
## 演练:本实验室是如何一步步构建的
本节记录了带有证据的实际方法论,就像我在面试中向招聘
经理展示我的工作一样。
### 第 1 步 — 建立正常流量基线
在寻找恶意软件之前,我捕获了 25 秒自己的真实流量(`dumpcap -i 1 -a
duration:25`),在此期间我浏览了 GitHub/Python.org/Cloudflare 并进行了 DNS 查询——共计 11,430
个数据包。这为每一个恶意软件案例提供了可供对比的参照:在这个网络上,*正常*的
协议分布是什么样的?

*基线捕获上的 Wireshark Protocol Hierarchy——以 TLS/HTTPS 为主导,包含真实的 DNS、QUIC、NTP、
ARP 以及 3 个无害的明文 HTTP 请求(一个 OCSP 证书吊销检查和一个 HTTP→HTTPS
重定向——两者都是正常的浏览器/操作系统后台流量,而非用户可见的浏览)。没有可疑
域名,没有 C2 形态的流量。这就是“正常”状态,下文的每一个恶意软件案例都与它形成鲜明对比。*
### 第 2 步 — 提取真实的恶意软件样本并在 Wireshark 中加载
样本来自 malware-traffic-analysis.net,通过有据可查的
`infected_YYYYMMDD` 方案进行密码保护。第一个深入分析的案例:一个 2026-01-31 的练习,
因被标记为存在 **Lumma
Stealer** C2 流量而备受关注。

*51,181 个数据包,真实的 HTTP/TLS/Kerberos/LDAP/SMB 流量——一个完整的小型办公 AD 环境
在感染过程中被捕获。*
### 第 3 步 — 统计信息 → 对话,找出谁在和谁通信

*一个对话格外显眼:`10.1.21.58 ↔ 153.92.1.49`,明文 HTTP,非 Microsoft/非云端 IP——
这是第一条真实的线索。*
### 第 4 步 — 过滤出可疑对话

*`ip.addr==153.92.1.49 && http` 隔离出了 12 个数据包:一个发往 `/api/set_agent?id=...&token=...`
的 GET 请求,随后跟着一个带有 `&act=log` 的 POST 请求——在每个浏览器(先 Chrome 后 Edge)中各重复一次。这是
Lumma Stealer 的机器人注册 + 数据窃取模式。*
### 第 5 步 — 跟踪 HTTP Stream 以阅读完整对话

*请求发往 `Host: whitepepper.su`。响应并不是一个简单的 ack——它是一个带有内嵌
JavaScript 的 HTML 页面,会在执行数据采集 POST 之前对浏览器进行指纹识别(`navigator.platform`、`hardwareConcurrency`、
`deviceMemory`...)。捕捉到这个细节(而不是假设“仅仅是一个
ack”)正是阅读数据包摘要与真正阅读数据流之间的区别。*
### 第 6 步 — 切换到 NetworkMiner 进行主机/文件重构

*同一个 pcap,不同的工具:NetworkMiner 重构了受感染主机的完整身份——
主机名 `DESKTOP-ES9F3ML`、MAC(Intel Corporate 网卡)、操作系统指纹、TTL——这些均独立于
Wireshark 的发现。*

*从 pcap 中提取了 875 个文件,包括与 `whitepepper.su` 交换的实际
`set_agent_*.html`/`.w` 载荷——这是真正的被采集数据工件,而不仅仅是关于它们的日志行。*
### 第 7 步 — 使用 tcpdump 和 Zeek 进行交叉验证(独立工具,同一个 pcap)

*真实的终端会话(WSL Ubuntu)运行 `tcpdump` 进行原始 TCP 验证,并运行 `Zeek 8.2.1`
生成完整的协议日志(`conn.log`、`http.log`、`dns.log`、`kerberos.log`、`x509.log` 等
另外 13 个日志)。Zeek 的 `http.log` 独立复现了在 Wireshark 中发现的所有 6 个 C2 请求——
三种不同的工具,得出同一个结论。可通过 `analysis/run_demo.sh` 复现。*
### 第 8 步 — 像真实调查一样撰写报告,而不仅仅是倾倒数据包
`reports/` 中的每一份报告都遵循相同的结构:攻击链图、受影响的系统、
C2 基础设施、**MITRE ATT&CK 映射**、IOC 表格、建议的防御措施,以及——同样
重要的是——一个明确的**“这个捕获文件没有告诉我们的信息”**部分,以确保没有任何内容
被夸大到超出证据实际显示的范围。
### 第 9 步 — 在另外 4 个真实的独立案例中重复此过程
相同的方法论(Wireshark → 在有用的地方使用 NetworkMiner → tcpdump/Zeek 交叉验证 →
附带 MITRE 映射和 IOC 的报告),应用于另外 4 个真实样本,以涵盖不同的攻击
技术:一个硬编码的 C2 beacon、一个通过滥用 Cloudflare Tunnel 构建的多域 C2、一个
通过滥用 TeamViewer 交付 PowerShell 推送的 RAT,以及一个 NetSupport RAT 安装。有关完整的案例表和 MITRE 覆盖范围,请参阅
[SUMMARY.md](SUMMARY.md),或直接跳转到下方的任意
报告。各案例的证据:
**案例:周期性 C2 beacon (2026-02-28)**

*恶意软件的 HTTP 客户端将自己标识为 `User-Agent: NetSupport Manager/1.3`,并且 C2
面板以 `Server: NetSupport Gateway/1.92` 响应——考虑到与下方
[2024-11-26 的 NetSupport RAT 案例](reports/investigation-netsupport-rat-2024-11-26.md)共享了相同的
`CMD=POLL`/`CMD=ENCD` 协议,这绝非巧合。
这个细节将一个独立的 beacon 案例变成了一次跨案例关联。*

*与第 7 步相同的跨工具验证,针对此案例的 pcap 运行:
`tcpdump` 检查发往 `45.131.214.85` 的原始 TCP 会话,`Zeek` 生成完整的协议日志集,
并通过 `http.log` grep 确认了全部 5 个 `fakeurl.htm` POST beacon。可通过
`analysis/run_demo_case3.sh` 复现。*
**案例:通过滥用 Cloudflare Tunnel 实现的多域 C2 (2025-06-13)**

*跨三个轮换的 C2 域名的显示过滤器
(`http.host contains "msgas" or "microsoft.live" or "trycloudflare" or "microsoft.org"`)——64
个匹配的数据包。十六进制窗格显示一个 PowerShell User-Agent 访问了伪造的
`eventtime-microsoft.org` 主机,这是为了伪装成合法 Microsoft 遥测而精心制作的几个域名之一。
`*.trycloudflare.com`——Cloudflare 的免费 Quick Tunnel 服务——托管了部分 C2
基础设施,特别是因为 Cloudflare 的共享 IP 空间能够击败简单的基于 IP 的封锁。*
**案例:通过滥用 TeamViewer 交付 PowerShell 推送的 RAT (2025-01-22)**

*`ip.addr==5.252.153.241 && http.request` 上有 594 个匹配的数据包——完整的分阶段序列:
首先获取 PowerShell 加载器(`29842.ps1`),然后是 TeamViewer RAT 组件
(`TeamViewer`、`Teamviewer_Resource_fr`、`TV`)通过同一个通用的
`/api/file/get-file/` API 进行部署,随后是第二个 PowerShell 脚本(`pas.ps1`)。TeamViewer——
一款合法的远程访问工具——被部署以供攻击者控制,而不是由真正的
软件供应商部署。*
**案例:NetSupport RAT 安装 (2024-11-26)**

*过滤器 `http.request and (ip.addr==194.180.191.64 or http.host contains "netsupport")` 显示了
真实的 NetSupport Manager 签入(`geo.netsupportsoftware.com/location/loca.asp`),随后是
上述 2026-02-28 案例中出现的相同 `fakeurl.htm` `CMD=POLL`/`CMD=ENCD` beacon 循环——
从两个方向确认的跨案例关联。*
### 第 10 步 — 将发现转化为可重用的检测,而不仅仅是文字描述
每个案例的检测逻辑都被编写成了实际的 [Sigma rule](rules/)(总计 7 条规则),而不仅仅
是在段落中进行描述——这正是“我知道该寻找什么”与“这是一条 SIEM
今天就能运行的规则”之间的区别。
## 使用的工具
| 工具 | 作用 | 证据 |
|---|---|---|
| **Wireshark 4.6.7** (GUI) | Protocol Hierarchy、Conversations、显示过滤器、Follow HTTP Stream | `screenshots/` 中的 9 张截图 |
| **tshark / dumpcap / capinfos** | CLI 捕获,在真实的 WiFi 接口上进行实时捕获,捕获文件取证(SHA256、计时) | `captures/SHA256SUMS`,内嵌于每份报告中 |
| **tcpdump** (WSL Ubuntu) | 对每个 C2 会话进行独立的原始 TCP 验证 | `analysis/tcpdump-*.txt`(5 个文件,每个案例一个) |
| **Zeek 8.2.1** (WSL Ubuntu) | 生成完整的协议日志集(conn、http、dns、ssl、kerberos、ldap、x509、dce_rpc、smb、weird...) | `analysis/zeek-logs*/`(5 套日志,每个案例一套) |
| **NetworkMiner 3.1** (GUI, Community Edition) | 主机/操作系统/会话重构及文件提取 | `screenshots/` 中的 2 张截图 |
## 结构
```
SUMMARY.md one-page case dashboard — start here
README.md this file — full walkthrough with evidence
rules/ 7 Sigma detection rules, one or more per case
analysis/detection-validation.md all 7 rules run against a real Sigma engine (Zircolite),
including a zero-false-positive check against the baseline
iocs/ IOC exports per case (.csv + .json) + all-indicators combined feed
captures/
SHA256SUMS integrity manifest for every pcap in this project
own/ real traffic captured on my own machine (baseline)
malware-samples/ 5 real malicious pcaps from malware-traffic-analysis.net
analysis/
tcpdump-*.txt tcpdump verification, one per case
zeek-logs*/ full Zeek log sets, one per case
run_demo.sh reproducible tcpdump+Zeek demo (Lumma case)
run_demo_all_cases.sh reproducible demo script covering all 5 cases
screenshots/ 9 Wireshark + 2 NetworkMiner + 2 terminal-run screenshots (13 total)
reports/ 5 full investigation write-ups, one per malware case (baseline is
documented in this README's "Real baseline capture" section)
```
## 报告
| 案例 | 报告 | Sigma rule(s) |
|---|---|---|
| Lum Stealer 信息窃取器 (DESKTOP-ES9F3ML) | [investigation-lumma-stealer-2026-01-31.md](reports/investigation-lumma-stealer-2026-01-31.md) | [lumma_stealer_c2_uri.yml](rules/lumma_stealer_c2_uri.yml) |
| 周期性 C2 beacon,DarkGate/NetSupport 风格协议 | [investigation-c2-beacon-2026-02-28.md](reports/investigation-c2-beacon-2026-02-28.md) | [netsupport_style_cmd_poll_beacon.yml](rules/netsupport_style_cmd_poll_beacon.yml), [generic_http_beacon_interval.yml](rules/generic_http_beacon_interval.yml) |
| 通过滥用 Cloudflare Tunnel 实现的多域 C2 | [investigation-multidomain-c2-2025-06-13.md](reports/investigation-multidomain-c2-2025-06-13.md) | [typosquatted_microsoft_domain.yml](rules/typosquatted_microsoft_domain.yml), [cloudflare_tunnel_c2_beacon.yml](rules/cloudflare_tunnel_c2_beacon.yml) |
| 通过滥用 TeamViewer 交付 PowerShell 推送的 RAT | [investigation-rat-deployment-2025-01-22.md](reports/investigation-rat-deployment-2025-01-22.md) | [rat_staging_fileget_api.yml](rules/rat_staging_fileget_api.yml) |
| NetSupport RAT + 匹配的 C2 beacon(跨案例) | [investigation-netsupport-rat-2024-11-26.md](reports/investigation-netsupport-rat-2024-11-26.md) | [netsupport_rat_checkin.yml](rules/netsupport_rat_checkin.yml), [netsupport_style_cmd_poll_beacon.yml](rules/netsupport_style_cmd_poll_beacon.yml) |
### 关于 `iocs/` 内容的说明
`iocs/` 中的每个导出文件都是一个位于单一 `indicators` 数组下的扁平列表,特意混合了多种
不同类型的条目,而不是将它们分类到不同的数据源中:
- **真实威胁指标** — 用于黑名单屏蔽的、由攻击者控制的基础设施
(C2 域名/IP、恶意 URI 模式、协议标记)。
- **事件观测数据** — 关于*受害者*环境的事实(受感染主机的 IP/主机名/MAC,
已登录的用户名),对内部关联/隔离有用,但不用于屏蔽。
- **上下文基础设施** — 诸如 `geo.netsupportsoftware.com` 之类的内容,这是一个*合法的*
供应商端点,因为合法工具被滥用而碰巧出现在流量中;它的记录是为了提供调查上下文,
而不是作为需要加入黑名单的内容。
除了现有的 `confidence: high/medium` 字段之外,这些条目均不包含有效期、TLP 标记或
置信度评分规范——请将此导出文件视为每个案例的调察记录,
而不是一个受维护的、去重的、生产级别的威胁情报源。如果您要将此处
的数据提取到黑名单或 SIEM 监视列表中,请过滤出真正属于攻击者
基础设施的 `type` 值,并首先重新验证其时效性。
有关结论、严重程度、IOC 数量、时间线以及一目了然的 MITRE ATT&CK
覆盖范围,请参阅 [SUMMARY.md](SUMMARY.md)。
## 真实基线捕获
`captures/own/own_traffic_capture_01.pcap` — 在真实的 WiFi 接口上进行 25 秒的实时捕获,
同时产生真实的混合流量(发往 GitHub/Python.org/Cloudflare 的 HTTPS,针对
8.8.8.8 的 DNS 查询)。11,430 个数据包。协议分布:以 TLS/HTTPS 为主导,包含真实的 DNS(26 个帧)、QUIC
(HTTP/3)、NTP、ARP — 这是一个用于与每个恶意软件样本进行对比的“正常”流量的真实基线。
以经典的 PCAP 格式存储(不是 PCAPNG,尽管之前的文件名看起来像)。
关于 TCP checksum 的说明:此捕获中约 95% 的*出站*数据包显示其 TCP checksum 无法
通过重新计算验证——这是预期行为,并非数据损坏。这是直接在发送主机的自身接口上启用
了 TX checksum offload 进行的实时捕获,因此 Wireshark/tcpdump 在 NIC 填入真实的
checksum 之前就看到了数据包(这是本地捕获普遍常见的现象,并非
此文件特有)。*入站*数据包(checksum 由远程发送方计算并完整到达)显示
0% 的不匹配率,这正是表明没有任何内容损坏的真实信号。
所有五个在网络上观察到的真实硬件 MAC 地址——不仅仅是生成我自身流量的
以太网帧的那两三个端点,还包括同一 LAN 网段上的其他设备(网关和另外两个本地主机)
在 ARP 请求/回复负载中宣告的额外真实厂商 MAC
地址——在发布前都被匿名化为占位符
(`02:00:00:00:00:01` 到 `02:00:00:00:00:05`)。对捕获中的每个以太网和 ARP 硬件地址字段
(不仅仅是本次捕获“涉及”的两台主机)进行的全面匿名化后扫描
确认没有其他唯一的 MAC 残留。对于本项目的任何分析来说,都不需要永久的
硬件标识符,它也不应该出现在公开的代码库中。在一个 HTTP 重定向中观察到的一个 Cloudflare
`__cf_bm` 机器人管理 cookie 值也出于同样的原因被原位编辑
(随后正确地重新计算了其 TCP checksum,没有留下过时的结果)。IP 被保留为真实的
(我这边的 RFC1918 私有地址范围,另一端的公共服务器 IP),因为它们具有实际的
分析价值,且本身不具备唯一
识别性。
针对 malware-traffic-analysis.net 样本的 Zip 密码方案:`infected_YYYYMMDD`(博客文章的
日期),根据其发布的[关于页面](https://www.malware-traffic-analysis.net/about.html)而定。
## 安全设置 / 验证(各一条命令)
```
# 1. Verify everything actually stored in git matches its recorded hash
# (--ignore-missing: the manifest also lists post-extraction pcap hashes,
# which don't exist yet at this point — that's expected, not a failure)
cd captures && sha256sum -c --ignore-missing SHA256SUMS; cd ..
# 2. Extract all five malware-sample zips (each password is infected_YYYYMMDD
# for that case's date, e.g. infected_20260131 for the 2026-01-31 case)
for z in captures/malware-samples/*.zip; do
d=$(basename "$z" .pcap.zip)
unzip -P "infected_${d:0:4}${d:5:2}${d:8:2}" -o "$z" -d captures/malware-samples/
done
# 3. Re-verify the newly-extracted pcaps against the same manifest
cd captures && sha256sum -c SHA256SUMS; cd ..
```
请在一次性的/离线环境中针对恶意软件样本 pcap 运行此操作——它们包含活跃的
恶意流量,在某些情况下,其中的 C2 IP 目前或近期仍处于活跃状态。不要在与
生产网络连接的机器上解压它们。
标签:DAST, IP 地址批量处理, SOC分析, 威胁情报, 开发者工具, 恶意软件分析, 网络安全, 隐私保护