duaa-adnan/Zeus-Malware-Analysis-
GitHub: duaa-adnan/Zeus-Malware-Analysis-
该项目对一例银行木马样本进行了完整的静态与动态分析,覆盖样本获取、行为分析、IOC 提取、Suricata 自定义规则开发及事件响应规划等全流程。
Stars: 1 | Forks: 0
# Zeus 恶意软件分析(静态与动态)
## 概述
本项目记录了作为 SOC Analyst 实习的一部分,在一个隔离的、断网的虚拟实验室中对 Zeus 银行木马样本进行的全面恶意软件分析调查。工作涵盖了从受信任的研究仓库安全获取样本、对可执行文件的结构和字符串进行静态分析、在本地 VM 和 ANY.RUN 沙箱中对其运行时行为进行动态分析、网络流量分析、整合的 IOC 表、自定义 Suricata 规则的开发与验证,以及事件响应计划。调查的一个关键发现是,尽管该样本被获取并标记为“Zeus”,但大多数威胁情报来源实际上将其归类为 **ZeroAccess (Sirefef)**——报告对这一差异进行了调查和记录,而不是将其忽略。
## 目标
- 从受信任的研究仓库安全地获取真实的恶意软件样本
- 建立并验证完全断网的分析环境
- 执行静态分析,以在不运行的情况下识别文件结构、元数据、字符串和导入的 API
- 执行动态分析,以观察执行期间的进程、注册表、文件系统和网络行为
- 使用本地工具和 ANY.RUN 云沙箱交叉验证分析结果
- 将所有发现整合到一个结构化的妥协指标表中
- 基于观察到的网络 IOC 开发并验证自定义 Suricata 检测规则
- 制定基于调查结果的事件响应计划
## 实验室架构
| 主机 | 角色 | 操作系统 |
|---|---|---|
| Ubuntu Server | 托管 Wazuh Manager(本阶段未使用) | Linux |
| Kali Linux | 主要分析工作站——获取、哈希计算、静态/动态分析、数据包捕获 | Linux |
在开始处理任何恶意软件之前,Kali VM 的两个网络适配器在 hypervisor 层面(而不仅仅是在操作系统内)被断开,以创建一个完全断网的环境。连接测试确认完全丢包,验证了真正的物理隔离。
## 使用的技术
- **VMware Workstation Pro** —— 隔离的虚拟实验室环境
- **theZoo** —— 受信任的恶意软件样本仓库
- **file, ExifTool, Binwalk, strings** —— 静态分析工具
- **VirusTotal** —— 基于哈希的威胁情报查询
- **Process Monitor, Process Explorer** —— 进程、注册表和文件系统监控
- **Wireshark, tcpdump** —— 网络流量捕获和分析
- **FakeNet-NG, INetSim** —— 用于安全动态分析的模拟互联网服务
- **ANY.RUN** —— 基于云的交互式恶意软件沙箱
- **Suricata** —— 网络 IDS,默认规则集 + 自定义规则开发,PCAP 重放
- **MD5/SHA256/SHA1 哈希** —— 样本完整性验证
## 环境
- 在处理任何样本之前,Kali Linux 已在 hypervisor 层面完全断网
- 创建了专用的 `malware_samples` 目录,并设置了 `chmod 700` 权限(仅所有者可访问)
- 恶意软件样本和归档文件通过 `chmod 600` 受到进一步限制
- 样本存储并传输于受密码保护的 ZIP 压缩包(`itsimplera_zeus_sample.zip`)中,使用了标准的 `infected` 密码约定
- 在每次运行动态分析之前恢复了干净的 VM 快照,以消除样本之间的交叉污染
- 使用 ANY.RUN 教育帐户,通过云沙箱行为报告补充本地分析
## 实施过程
1. **样本选择** —— 选择 Zeus 是因为它有丰富的公开文档,便于与现有研究进行比较。
2. **安全获取** —— 从 theZoo 下载受密码保护的压缩包;最初尝试通过 `curl` 从 GitHub 下载返回的是 HTML 页面而不是压缩包,这通过 `file` 命令被发现了。切换到 `raw.githubusercontent.com`,解决了一个无关的 pfSense WAN/DHCP 故障,并成功完成了下载。
3. **解压与识别** —— 使用标准的 `infected` 密码解压压缩包,发现了一个伪装有双重扩展名的单个可执行文件:`invoice_2318362983713_823931342io.pdf.exe`。
4. **哈希计算与验证** —— 解压后立即生成 MD5/SHA256 哈希值,并与独立的公开分析进行交叉核对,确认这是一个未经修改的、正确识别的样本。
5. **重新保护样本** —— 将解压后的文件重新打包到受密码保护的 ZIP 中,以便在后续操作中安全处理。
6. **断网处理** —— 在 hypervisor 层面断开了两个 Kali 网络适配器,并通过向 Google DNS 执行失败的 ping 测试确认了隔离。使用 `chmod 600` 进一步限制了文件权限。捕获了干净的基准 PCAP,确认没有后台流量。
7. **静态分析** —— 使用 `file` 确认它是一个 32 位的 PE32 Windows 可执行文件,尽管文件名具有欺骗性;使用 `ExifTool` 恢复了编译时间戳(2013 年 11 月 25 日)并确认没有数字签名;使用 `Binwalk` 识别出嵌入的 XML 清单(并排除了误报的“StuffIt”签名匹配);使用 `Strings` 恢复了 `GetAsyncKeyState` API(键盘记录器指标);以及基于哈希的 `VirusTotal` 查询(61/69 家供应商检测),这表明该样本主要被归类为 **ZeroAccess**,而不是 Zeus。
8. **动态分析准备** —— 恢复了干净的快照,启动了 Process Monitor/Explorer、Wireshark、FakeNet-NG 和 INetSim,并将样本上传到 ANY.RUN 进行并行的云沙箱分析。
9. **动态执行与行为分析** —— 执行样本并追踪了进程链:`explorer.exe` → `invoice_...exe` → `InstallFlashPlayer.exe` → `cmd.exe`。识别出对 `services.exe` 的进程注入,通过伪造的 **Google Update Service (gupdate)** 实现的持久性,以及相关的注册表/文件系统痕迹。
10. **网络分析** —— 在 Wireshark 中捕获了 275 个数据包,其中 48 个是恶意的;识别出端口 16471 上的点对点 UDP 通信和格式错误的 DNS 数据包(Opcode 10),这与 ZeroAccess 的去中心化僵尸网络通信模型一致。
11. **证据保存** —— 保存了 ANY.RUN 公开会话链接,导出了 PCAP,并保留了沙箱报告作为调查记录的一部分。
12. **IOC 整合** —— 将所有静态和动态发现编译到一个结构化的 IOC 表中(文件身份、恶意软件识别、持久性、进程行为、网络指标)。
13. **Suricata 规则开发** —— 验证了 Suricata 的安装,针对默认的 Emerging Threats 规则集重放了捕获的 PCAP(在零自定义规则的情况下检测到了 15 个 ZeroAccess 警报),然后编写并验证了两条自定义规则,分别针对格式错误的 DNS 事务 ID 和 UDP/16471 点对点流量。
14. **事件响应规划** —— 基于调查结果记录了检测、遏制、根除、恢复和经验教训指导。
## 检测工作流
```
Sample executed (explorer.exe → invoice_...exe)
│
▼
InstallFlashPlayer.exe spawned (primary malicious process)
│
├──▶ Process injection into services.exe
│ │
│ ▼
│ Outbound network traffic disguised as trusted process
│ │
│ ▼
│ UDP/16471 peer-to-peer traffic + malformed DNS (Opcode 10)
│ │
│ ▼
│ Captured via Wireshark / ANY.RUN network panel
│ │
│ ▼
│ PCAP replayed offline through Suricata
│ │
│ ┌─────┴─────┐
│ ▼ ▼
│ Default ET Custom rules
│ ruleset (SID 9000001 DNS,
│ (15 alerts) SID 9000002 UDP/16471)
│
└──▶ Persistence via spoofed "Google Update Service (gupdate)"
│
▼
Registry + file system artifacts confirm persistence
```
## 调查过程
- 使用 `file` 工具验证了每个下载的工件,而不是信任已完成的下载,从而在继续之前捕获了失败的获取(HTML 而不是 ZIP)
- 将生成的哈希值与独立的公开恶意软件分析进行交叉比对,以在投入更多分析时间之前确认样本的真实性
- 使用静态分析(API、元数据、嵌入的资源)形成假设,然后使用动态分析来确认或反驳它们——例如,静态分析未发现持久性/注入证据,但两者均在动态分析中得到确认
- 将进程树、注册表、文件系统和网络证据关联在一起,而不是孤立地处理每个工具的输出,以确认观察到的活动源自恶意的进程链
- 调查了样本来源标签(“Zeus”)与其在 VirusTotal/ANY.RUN/Suricata 中实际分类之间的差异,而不是忽略相互冲突的证据
- 通过使用 `grep` 计算警报出现次数,并将这些计数与在 Wireshark 中独立观察到的数据包计数进行交叉比对,验证了自定义 Suricata 规则的有效性
## 挑战与故障排除
| 问题 | 根本原因 | 解决方案 |
|---|---|---|
| 恶意软件压缩包解压失败 | 从 GitHub 通过 `curl` 下载返回的是 HTML 页面,而不是实际的 ZIP | 使用 `file` 进行了验证,将下载源切换至 `raw.githubusercontent.com` |
| 第二次下载尝试也失败了 | pfSense 防火墙丢失了其 WAN IP 地址,切断了出站互联网访问 | 通过 DHCP 恢复了 WAN 接口,随后成功重新下载 |
| 样本仓库标签与威胁情报分类不匹配 | 获取的样本被标记为“Zeus”,但 VirusTotal、ANY.RUN 和 Suricata 主要将其归类为 ZeroAccess (Sirefef) | 明确记录了该差异,并将多来源威胁情报视为权威,而非仓库命名 |
| 自定义 Suricata 规则加载失败 | 规则语法跨多行断开 / 格式不正确 | 将每条规则重写为具有正确选项语法的单行 |
| Binwalk 中出现误报的“StuffIt Deluxe Segment”签名 | 模式匹配产生的伪影,并非实际嵌入的压缩包 | 进行了进一步调查并将其作为误报排除,而不是将其作为隐藏的 payload 进行报告 |
## 妥协指标
**文件身份**
- 文件名:`invoice_2318362983713_823931342io.pdf.exe`(双重扩展名社会工程学诱饵)
- MD5: `EA039A854D20D7734C5ADD48F1A51C34`
- SHA1: `9615DCA4C0E46B8A39DE5428AF7DB060399230B2`
- SHA256: `69e966e730557fde8fd84317cdef1ece00a8bb3470c0b58f3231e170168af169`
- 编译时间戳:2013 年 11 月 25 日 10:32:03 UTC
- 文件大小:252,928 字节
**恶意软件识别**
- 被 VirusTotal、ANY.RUN 和 Suricata 归类为 ZeroAccess (Sirefef)(61/69 家供应商检测)
- ANY.RUN 行为标签:ZeroAccess,规避
**持久性**
- Windows 服务:`Google Update Service (gupdate)`(伪装成合法服务)
- 注册表项:`HKLM\SYSTEM\ControlSet001\Services\gupdate`
- 服务配置为 SYSTEM 权限、自动启动(`Start` 值为 2)
- 恶意二进制文件丢弃在伪造的 `Google\Desktop\Install` 路径下
**进程行为**
- 进程链:`explorer.exe` → `invoice_...exe` → `InstallFlashPlayer.exe` → `cmd.exe`
- 进程注入:`InstallFlashPlayer.exe` → `services.exe`
- 伪造的应用程序诱饵:“Adobe Flash Player Installer”
- API: `GetAsyncKeyState`(键盘记录功能)
**网络指标**
- UDP 端口 16471(点对点僵尸网络通信)
- 格式错误的 DNS 流量,事务 ID 为 `0x222b`,Opcode 10
- 节点 IP: 85.114.128.127, 207.191.243.130, 71.11.140.115, 114.39.95.144, 176.61.195.55, 218.186.205.90
- 域名:`corect.com`
- 发往 `j.maxmind.com/app/geoip.js` 和 `fpdownload.macromedia.com` 的 HTTP 请求
## MITRE ATT&CK 映射
| 行为 | 技术ID | 技术 |
|---|---|---|
| 欺骗性的双重扩展名文件名 | T1036 | 伪装 |
| 注入 `services.exe` 的进程注入 | T1055 | 进程注入 |
| 通过伪造的 Windows 服务实现持久性 | T1543.003 | 创建或修改系统进程:Windows Service |
| 通过 `GetAsyncKeyState` 进行键盘记录 | T1056.001 | 输入捕获:键盘记录 |
| 点对点 / 格式错误的 DNS C2 | T1071 / T1071.004 | 应用层协议 / DNS |
| 规避 / 调试器检测、延迟执行、自删除(ANY.RUN 标签) | T1497 / T1070 | 虚拟化/沙箱规避 / 指标移除 |
## 结果
- Zeus 样本在完全断网的实验室环境中被安全获取、验证和分析,没有发生任何证据处理失败
- 静态分析正确地识别可执行文件的真实文件类型、时间戳以及与键盘记录相关的 API,尽管文件名经过了伪装
- 动态分析证实了进程注入、基于服务的持久性以及静态分析预测的文件系统痕迹
- 网络分析在捕获的 275 个数据包中识别出 48 个恶意数据包,揭示了点对点 UDP 和格式错误的 DNS 通信
- 默认的 Suricata Emerging Threats 规则集检测到了 15 个与 ZeroAccess 相关的警报,无需任何自定义规则
- 开发、调试并验证了两条自定义 Suricata 规则(SID 9000001、9000002),分别生成了 14 个和 48 个警报——与独立观察到的数据包计数一致
- 威胁情报交叉验证表明,尽管该样本带有仓库标签,但它主要被归类为 ZeroAccess 而不是 Zeus
## 展现的技能
- 安全的恶意软件获取、哈希计算和监管链实践
- 断网实验室环境的设计和验证
- 静态恶意软件分析(PE 结构、元数据、字符串、嵌入的资源)
- 使用本地工具和云沙箱(ANY.RUN)进行动态恶意软件分析
- 进程树、注册表和文件系统的关联
- 网络流量分析和协议级异常检测
- 威胁情报验证和分类差异调查
- 检测工程——针对真实 PCAP 数据编写和验证自定义 Suricata 规则
- 结构化的 IOC 文档和事件响应规划
- MITRE ATT&CK 技术映射
## 经验教训
- 下载成功并不保证内容正确——在信任工件之前务必验证文件类型,尤其是对于不受信任的来源
- 仓库或样本标签并不具有权威性——有必要针对多个威胁情报来源(VirusTotal、沙箱标签、IDS 检测)交叉检查哈希值和行为,以正确对样本进行分类
- 仅靠静态分析无法确认运行时行为(例如,持久性、注入)——它形成的是假设,必须通过动态分析来确认或反驳
- 对于在分析期间控制恶意软件,hypervisor 层面的网络隔离比操作系统层面的隔离更可靠
- 默认的社区 IDS 规则集已经可以提供强大的基准检测——当针对默认规则集可能会遗漏的特定、独特的 IOC 时,自定义规则最具价值
- 将多个独立的工具(Process Monitor、Wireshark、ANY.RUN)相互关联,比依赖任何单一来源更能显著提高置信度
## 未来改进
- 将自定义 Suricata 的覆盖范围扩展到分析期间识别出的额外节点 IP 地址和 `corect.com` 域名
- 调查与标准的 Zeus 预案相比,ZeroAccess 分类是否会改变适当的事件响应指导
- 将针对多个威胁情报来源的哈希和分类交叉验证自动化,作为未来样本的标准第一步
- 建立可重复的 IOC 到检测规则的流水线,以减少未来恶意软件家族手动编写规则的时间
## 资源
- 带有截图的技术报告
- LinkedIn 帖子
标签:DAST, Metaprompt, SOC分析, 云资产清单, 入侵检测规则, 威胁情报, 开发者工具, 恶意软件分析, 数字取证, 自动化脚本, 逆向工程