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分析, 云资产清单, 入侵检测规则, 威胁情报, 开发者工具, 恶意软件分析, 数字取证, 自动化脚本, 逆向工程