- A+
公式编辑器漏洞利用
2018年中,OceanLotus发起一个利用含有CVE-2017-11882漏洞的文档的国际活动。该漏洞位于启用和编辑数学公式的组件中。360安全对OceanLotus使用的恶意文档进行了分析。
stage 1
该恶意文档虽然是.doc扩展的,但是该文档实际上是一个RTF格式文档,如图1所示,其中含有很多无用的数据。
图1 — RTF无用域
虽然有很多无用的数据,word仍然可以成功打开该RTF文件。如图2所示,在offset 0xC00处,有一个EQNOLEFILEHDR结构,然后是MTEF header和MTEF记录。
图2 — FONT记录值
图3 — FONT记录格式
因为name域的在复制前并不会检查其大小,因此可能会溢出。名字太长的话就会触发该漏洞。如图2中的offset 0xC26所示,在RTF文件内容中,缓冲区全部是shellcode,0x90处是NOP,返回地址是0x402114。该地址在EQNEDT32.exe中指向的是RET指令,是无用的。这回导致指向含有shellcode的name域的开始的EIP。
图4 — 利用shellcode的开始
地址0x45BD3C保存了一个间接引用的变量,直到它到达一个当前加载MTEFData结构的指针,这也是剩余shellcode的位置。
Shellcode的目的是执行嵌入在打开文档中的第二段shellcode。首先,初始shellcode会尝试通过所有系统handle循环,检查handle PID与WinWord中进程的PID是否一致以及打开文档的access mask是否是0x12019F来找出打开文档的handle。为了确认找出的是正确的handle,文件的内容会用CreateFileMapping函数进行映射,shellcode会检查文档的最后4个字节是否是yyyy,该技术叫做Egg Hunting。一旦发现匹配,文档就会以ole.dll的形式复制到临时文件夹。然后最毒文档的最后12个字节。
图5 — 文档尾部的Markers
AABBCCDD和yyyy markers之间的32位值是与下一个shellcode的偏移量offset。是用CreateThread函数调用的。提取的shellcode与OceanLotus组织之前使用的是协同的。
Stage 2
提取组件
文件名和目录名都是动态选择的。代码会随机的选择位于C:\Windows\system32的可执行文件或DLL文件的名。然后查询其资源并提取FileDescription域作为文件夹名。如果不行,代码就从ProgramFiles%或C:\Windows目录中随机选择一个文件名。同时要确认文件名中不含有windows, Microsoft, desktop, system, system32, syswow64以确保不会与现有文件重名。如果目录已经存在,目录名就会驾驶NLS_{6个数字}。这一阶段的0x102资源会被分析,文件会释放到%ProgramFiles%或%AppData%。创建的时间会修改为与kernel32.dll相同。
比如,下面是将C:\Windows\system32\TCPSVCS.exe作为数据源创建的文件夹和文件列表:
图6 — 提取不同的组件
资源0x102的结构非常复杂,其中含有:
- 文件名filenames
- 文件大小和格式files’ size and content
- 压缩格式compression format (RtlDecompressBuffer 函数使用的是COMPRESSION_FORMAT_LZNT1)
完成驻留
释放器的0x101处含有2个32位的整数,来表明驻留是如何实现的。第一个值表明恶意软件如何在没有管理员权限的情况下完成驻留。
第二个整数表明恶意软件以提升后的权限完成驻留。
服务名就是不带扩展的文件名,展示的名字是文件名但是如何已经存在了就加一个字符串Revision 1。攻击者通过服务确保驻留是有弹性的:如果服务失败了,服务在1秒后就会重新开始。然后新服务key的注册表值WOW64会被设置为4,表明它是32位的服务。
计划任务是通过许多COM接口创建的,包括ITaskScheduler, ITask, ITaskTrigger, IPersistFile和ITaskScheduler。恶意软件要创建一个隐藏的任务,用当前用户或管理员信息设置账户信息,并设置触发条件。
这是一个每日任务,周期是24小时,两次执行中间的时间间隔为10分钟,也就是说该任务会一直运行。
恶意位
在本文的例子中,可执行文件TCPSVCS.exe (AcroTranscoder.exe)是合法的软件侧加载DLL。其DLL函数只调用一个函数,一些不透明谓词包括:
图7 —opaque predicate
在进行一些欺骗检查后,代码会获取 TCPSVCS.exe的.text 域,将保护机制修改为PAGE_EXECUTE_READWRITE,并用一些无关指令覆盖:
图8 — 没有副作用的指令序列
最后,会加入一个Flash Video Extension.dll导出的函数FLVCore::Uninitialize(void)的地址的CALL指令。也就是说,在加载恶意DLL后,当在TCPSVCS.exe运行时调用WinMain时,指令指针会执行NOP,最后在下一阶段调用FLVCore::Uninitialize(void)。
该函数简单创建一个以{181C8480-A975-411C-AB0A-630DB8B0A221}开头的mutex,后面是当前用户名。然后读取释放的.db3扩展的文件,其中含有与位置无关的代码,并使用CreateThread来执行其内容。
.db3文件的内容就是OceanLotus常用的shellcode。研究人员使用模拟器脚本成功的解压了其payload。
脚本会提取最后一个阶段的组件。该组件是之前分析过的一个的后门。恶意软件的配置文件在PE资源中是加密的。配置文件与之前分析的相同,但是C2服务器是不同的:
- andreagahuvrauvin[.]com
- byronorenstein[.]com
- stienollmache[.]xyz
OceanLotus使用的技术再一次绕过了AV。通过选择随机的文件名,并用随机数据填充可执行文件,减少了可靠的IoC数量。因为使用DLL侧加载,攻击者必须释放合法的AcroTranscoder二进制文件。
自解压文档
在使用RTF文件后,攻击者开始使用自提取技术。运行时,字体去的RAR文件会释放和执行含有final payload的DLL文件。2019年1月开始,OceanLotus开始重用自提取技术但是修改了一些配置。
诱饵文件
文档THICH-THONG-LAC-HANH-THAP-THIEN-VIET-NAM(1).EXE是2018年首次出现的。该SFX文件是伪造的,描述表明该文件是一个JPEG图像。SFX脚本如下所示:
图9 — SFX命令
恶意软件释放{9ec60ada-a200-4159-b310-8071892ed0c3}.ocx (SHA-1: EFAC23B0E6395B1178BCF7086F72344B24C04DCC) 和图片2018 thich thong lac.jpg.
诱饵图片如下所示:
图10 — 诱饵图片
OCX文件的控制流与其他OceanLotus组件类似:含有大量的JZ/JNZ和PUSH/RET指令序列。
图11 — 混淆的代码
在过滤了垃圾代码后,regsvr32.exe会调用export DllRegisterServer:
图12 — 安装器主代码
DllRegisterServer第一次调用时会将注册表值HKCU\SOFTWARE\Classes\CLSID\{E08A0F4B-1F65-4D4D-9A09-BD4625B9C5A1}\Model设定为DLL(0x10001DE0)中编码的偏移量。
该函数第二次调用时会读取许多相同的值,执行位于该地址的函数。然后该资源会被读取和执行,许多内存中的操作会被执行。
Shellcode与之前oceanlotus攻击活动中使用的PE loader相同。可以用miasm模拟脚本来模拟。最后释放 db293b825dcc419ba7dc2c49fa2757ee.dll,加载到内存中并执行DllEntry。
DLL会提取资源的内容,用AES-256-CBC解密,用LZMA解压缩。资源使用的是非常容易逆向的特定格式。
图13 — 安装器配置的结构
根据特权级别,二进制数据会被写入%appdata%\Intel\logs\BackgroundUploadTask.cpl 或%windir%\System32\BackgroundUploadTask.cpl。
然后,创建一个名为BackgroundUploadTask[junk].job的任务来完成驻留,其中[junk]是0x9D和0xA0字节的集合。
任务的应用名是%windir%\System32\control.exe,参数值是复制的二进制文件的路径。隐藏的任务被设定为每天运行。
从结构上看,CPL文件是一个DLL文件,其内部名为 ac8e06de0a6c4483af9837d96504127e.dll,会导出一个CPlApplet函数。该文件会解密其唯一的资源{A96B020F-0000-466F-A96D-A91BBF8EAC96}.dll,然后加载该DLL并调用DllEntry。
后门配置文件
后门中含有嵌入在资源中的加密的配置文件。配置文件的结构与之前的很像。
图14 — 后门配置结构
结论
OceanLotus仍然活跃,而且还在不断发展和进化。该组织使用不同的工具集和诱饵文件。攻击者将payload封装在当前热点事件相关的文档中,并且使用不同的技术,重用一些公开的漏洞利用代码。而且使用不同的技术来减少留在受害者机器中的痕迹,以降低被安全产品检测到的概率。从前面的例子中可以看出,文件名都是随机生成的,而且OceanLotus也修改了二进制文件来避免被检测到。
本文翻译自:https://www.welivesecurity.com/2019/03/20/fake-or-fake-keeping-up-with-oceanlotus-decoys/