记攻防中的钓鱼样本分析
字数 2624
更新时间 2026-04-29 12:09:25

钓鱼样本分析技术文档

1. 样本识别与基础静态分析

1.1 样本初步识别

  • 初始附件文件名为“xxx集团数字供应链平台--数字签名服务重要更新补丁包”,通过解压获得可执行文件。
  • 实际样本包含以下文件:
    • xxx....docx.exe
    • 数字签名服务重要更新补丁.exe
    • 隐藏的恶意DLL文件
  • 此样本为典型的“白加黑”钓鱼木马,利用伪装为文档或补丁的可执行文件诱骗用户点击。
  • 关键识别点:在未开启“文件扩展名显示”和“隐藏文件显示”的系统设置下,样本伪装性较强。安全分析时应确保系统已开启这两项设置,以显示真实扩展名和隐藏文件。

1.2 基础静态分析工具与结果

  1. 微步在线沙箱分析:上传样本压缩包后,检测结果为0告警,检出率为0/28,表明该样本具有较好的静态免杀效果。
  2. 查壳工具 (DIE - Detect It Easy) 分析:分析结果显示样本未加壳,为原生编译文件。
  3. CFF Explorer 分析:通过分析PE结构,确认其中包含的DLL文件由Go语言编译。这与常见的C/C++编译的恶意DLL在结构上有所区别。

1.3 静态分析简要总结

  • 样本类型:白加黑EXE钓鱼木马。
  • 编译语言:核心恶意DLL为Go语言编译。
  • 免杀效果:对导入表等静态特征进行了处理,在初步沙箱检测中表现良好。

2. 基础行为分析与导入表分析

  • 通过对恶意DLL的导入表进行分析,发现其导入了多个高危Windows API函数。
  • 关键高危API函数组合包括:
    • VirtualAlloc
    • VirtualProtect
    • WaitForSingleObject
  • 此函数组合是加载与执行Shellcode的典型模式:
    • VirtualAlloc:用于在进程内存中分配一段可读写执行(RWX)的内存区域。
    • VirtualProtect:用于修改内存区域的保护属性(例如,改为可执行)。
    • WaitForSingleObject:常用于等待创建的线程或进程完成。
  • 分析结论:导入表特征明确指向该DLL为“黑DLL”,核心功能是加载Shellcode并连接C2服务器。

3. 样本详细逆向分析

3.1 入口点定位

  • Go语言编译的DLL具有特殊的初始化机制。Go提供了一个init()函数,它会在DLL被加载时、任何导出函数执行之前自动运行。
  • 在IDA Pro等逆向工具中,应首先定位init函数作为分析的起点。

3.2 初始化函数 (init) 分析

  • init函数中,样本通过GetProcAddress从以下系统DLL动态解析关键函数地址:
    • kernel32.dll -> VirtualAlloc
    • ntdll.dll -> RtlCopyMemory
  • 解析出的函数地址被保存到全局变量(如示例中的qword_2481F5030)中,供后续代码调用。

3.3 恶意代码执行流定位

定位执行Shellcode加载的代码主要有两种方法:

  1. 交叉引用追踪:在init函数中找到保存VirtualAlloc地址的变量,利用逆向工具的“交叉引用”(Xrefs to)功能,追踪所有调用该变量的位置,从而找到加载器代码。
  2. 导出函数分析:检查DLL的导出函数表。该样本包含三个导出函数:
    • GetInstallDetailsPayload
    • SignalInitializeCrashReporting
    • _cgo_dummy_export
    • 经逐一分析,恶意代码位于GetInstallDetailsPayload导出函数中。合法的“白程序”会调用此导出函数触发恶意行为。

3.4 核心功能 (GetInstallDetailsPayload) 分析

该函数执行流程清晰,是标准的Shellcode加载器:

  1. 隐藏窗口:首先执行隐藏程序窗口的操作,避免引起用户注意。
  2. Shellcode解密:对存储在二进制文件中的加密Shellcode进行多层解码:
    • 十六进制解码
    • RC4流解密
    • ASCII85解码
    • 经过这些步骤后,得到明文的Shellcode。
  3. 内存操作与执行
    • 调用VirtualAlloc分配一段具有“可读、可写、可执行”(PAGE_EXECUTE_READWRITE)属性的内存空间。
    • 调用RtlCopyMemory将解密后的Shellcode复制到该内存区域。
    • 通过函数指针或系统调用(syscall)直接跳转到该内存地址执行,从而上线C2。

3.5 攻击链总结

白程序 (合法EXE) 调用 -> 黑DLL中的 `GetInstallDetailsPayload()` 导出函数
                                ↓
                        隐藏自身窗口
                                ↓
                对加密的Shellcode进行多层解密(Hex -> RC4 -> ASCII85)
                                ↓
                使用 VirtualAlloc 分配可执行内存
                                ↓
                使用 RtlCopyMemory 将Shellcode写入内存
                                ↓
                直接执行内存中的Shellcode,连接C2服务器

4. 动态分析与Shellcode提取

  • 动态调试可在Shellcode解密后、执行前将其捕获。
  • 方法一:动态调试提取
    • 在调试器中对VirtualAlloc函数下断点。
    • 当分配内存后、Shellcode被写入时,直接从相应内存地址转储数据,即可得到解密后的明文Shellcode。
  • 方法二:静态还原提取
    • 通过逆向分析完全理解解密算法(Hex、RC4、ASCII85)及密钥。
    • 编写Python脚本模拟整个解密流程,从样本文件中直接提取并解密出Shellcode。
  • 提取出的Shellcode中,末尾通常包含明文的C2服务器IP地址(本例中为82.157.118.84)。

5. 威胁指标 (IOC)

  • C2服务器地址82.157.118.84
  • 相关文件哈希 (MD5/SHA256,文档中未提供,实际分析时应补充):应在分析时计算并记录样本文件的哈希值。
  • 战术、技术与程序 (TTP):使用“白加黑”技术、Go语言编译DLL、多層加密Shellcode、通过导出函数触发、无文件内存执行。

6. 防御与检测建议

  1. 用户教育:提醒用户注意文件扩展名,在系统中开启“显示文件扩展名”和“显示隐藏的文件”选项。
  2. 静态检测增强
    • 关注由Go语言编译的、体积较小的DLL文件。
    • 检测包含VirtualAllocVirtualProtectRtlCopyMemory特定组合的导入表。
  3. 动态/行为检测
    • 监控进程对具有PAGE_EXECUTE_READWRITE属性的内存分配请求。
    • 监控对GetInstallDetailsPayload等非常见导出函数的调用。
  4. 网络层检测:屏蔽并监控IOC中的C2地址。
  5. 逆向分析重点:面对此类样本,应重点分析init函数和所有导出函数,并追踪对高危API的交叉引用。
相似文章
相似文章
 全屏