记攻防中的钓鱼样本分析
字数 2624
更新时间 2026-04-29 12:09:25
钓鱼样本分析技术文档
1. 样本识别与基础静态分析
1.1 样本初步识别
- 初始附件文件名为“xxx集团数字供应链平台--数字签名服务重要更新补丁包”,通过解压获得可执行文件。
- 实际样本包含以下文件:
xxx....docx.exe数字签名服务重要更新补丁.exe- 隐藏的恶意DLL文件
- 此样本为典型的“白加黑”钓鱼木马,利用伪装为文档或补丁的可执行文件诱骗用户点击。
- 关键识别点:在未开启“文件扩展名显示”和“隐藏文件显示”的系统设置下,样本伪装性较强。安全分析时应确保系统已开启这两项设置,以显示真实扩展名和隐藏文件。
1.2 基础静态分析工具与结果
- 微步在线沙箱分析:上传样本压缩包后,检测结果为0告警,检出率为0/28,表明该样本具有较好的静态免杀效果。
- 查壳工具 (DIE - Detect It Easy) 分析:分析结果显示样本未加壳,为原生编译文件。
- CFF Explorer 分析:通过分析PE结构,确认其中包含的DLL文件由Go语言编译。这与常见的C/C++编译的恶意DLL在结构上有所区别。
1.3 静态分析简要总结
- 样本类型:白加黑EXE钓鱼木马。
- 编译语言:核心恶意DLL为Go语言编译。
- 免杀效果:对导入表等静态特征进行了处理,在初步沙箱检测中表现良好。
2. 基础行为分析与导入表分析
- 通过对恶意DLL的导入表进行分析,发现其导入了多个高危Windows API函数。
- 关键高危API函数组合包括:
VirtualAllocVirtualProtectWaitForSingleObject
- 此函数组合是加载与执行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->VirtualAllocntdll.dll->RtlCopyMemory
- 解析出的函数地址被保存到全局变量(如示例中的
qword_2481F5030)中,供后续代码调用。
3.3 恶意代码执行流定位
定位执行Shellcode加载的代码主要有两种方法:
- 交叉引用追踪:在
init函数中找到保存VirtualAlloc地址的变量,利用逆向工具的“交叉引用”(Xrefs to)功能,追踪所有调用该变量的位置,从而找到加载器代码。 - 导出函数分析:检查DLL的导出函数表。该样本包含三个导出函数:
GetInstallDetailsPayloadSignalInitializeCrashReporting_cgo_dummy_export- 经逐一分析,恶意代码位于
GetInstallDetailsPayload导出函数中。合法的“白程序”会调用此导出函数触发恶意行为。
3.4 核心功能 (GetInstallDetailsPayload) 分析
该函数执行流程清晰,是标准的Shellcode加载器:
- 隐藏窗口:首先执行隐藏程序窗口的操作,避免引起用户注意。
- Shellcode解密:对存储在二进制文件中的加密Shellcode进行多层解码:
- 十六进制解码
- RC4流解密
- ASCII85解码
- 经过这些步骤后,得到明文的Shellcode。
- 内存操作与执行:
- 调用
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. 防御与检测建议
- 用户教育:提醒用户注意文件扩展名,在系统中开启“显示文件扩展名”和“显示隐藏的文件”选项。
- 静态检测增强:
- 关注由Go语言编译的、体积较小的DLL文件。
- 检测包含
VirtualAlloc、VirtualProtect、RtlCopyMemory特定组合的导入表。
- 动态/行为检测:
- 监控进程对具有PAGE_EXECUTE_READWRITE属性的内存分配请求。
- 监控对
GetInstallDetailsPayload等非常见导出函数的调用。
- 网络层检测:屏蔽并监控IOC中的C2地址。
- 逆向分析重点:面对此类样本,应重点分析
init函数和所有导出函数,并追踪对高危API的交叉引用。
相似文章
相似文章