在帖子中,我们将描述OceanLotus网络组(APT32和APT-C-00)最近如何使用
CVE-2017-11882的公共漏洞之一,Microsoft Office中的内存损坏漏洞,以及该组的恶意软件如何在被破坏的系统中提供持久性而不会留下任何痕迹。 接下来,我们描述从2019年初开始,该小组如何使用自解压档案来运行代码。
OceanLotus专门从事网络间谍活动,其首要目标是在东南亚。 攻击者伪造吸引潜在受害者注意的文档,以说服他们执行后门程序,并致力于工具的开发。 创建诱饵的方法在不同的攻击中有所不同-从具有“双扩展名”的文件,自解压缩的存档,具有宏的文档到著名的漏洞利用。
在Microsoft Equation Editor中使用漏洞利用
在2018年中,OceanLotus使用CVE-2017-11882漏洞发起了一项活动。 360威胁情报中心的专家(该
研究为中文 )分析了该网络组织的恶意文件
之一 ,其中包括对该漏洞的详细描述。 在下面的文章中,概述了这种恶意文档。
第一阶段
FW Report on demonstration of former CNRP in Republic of Korea.doc
的
FW Report on demonstration of former CNRP in Republic of Korea.doc
(SHA-1:
D1357B284C951470066AAA7A8228190B88A5C7C3
)与上述研究中提到的报告相似。 有趣的是,它针对的是对柬埔寨政治感兴趣的用户(CNRP-柬埔寨国家救助党,于2017年底解散)。 尽管扩展名为.doc,该文档仍具有RTF格式(请参见下图),包含垃圾代码,并且也失真。
图1. RTF中的垃圾尽管存在变形的元素,Word仍成功打开了此RTF文件。 从图2可以看出,这是EQNOLEFILEHDR结构,其偏移量为0xC00,其后是MTEF标头,然后是字体的MTEF条目(图3)。
图2. FONT记录值
图3. FONT记录格式名称字段可能会溢出,因为在复制之前不会检查其大小。 名称太长会触发漏洞。 从RTF文件的内容(图2中的偏移量0xC26)可以看到,缓冲区中填充了shell代码,后跟一个虚拟命令(
0x90
)和返回地址
0x402114
。 该地址是
EQNEDT32.exe
中指向
RET
语句的对话框项。 这将导致EIP指向包含shellcode的
名称字段的开头。
图4.漏洞利用shellcode的开始地址
0x45BD3C
存储一个已取消引用的变量,直到到达当前加载的
MTEFData
结构的指针为止。 这是其余的shellcode。
Shell代码的目的是执行嵌入在打开的文档中的Shell代码的第二个片段。 首先,源shellcode尝试找到打开文档的文件描述符,
NtQuerySystemInformation
所有系统描述符(使用
SystemExtendedHandleInformation
参数的
NtQuerySystemInformation
),并检查描述符
PID和
WinWord
处理
PID是否 WinWord
以及是否使用访问掩码
0x12019F
打开了文档。
为了确认检测到正确的描述符(而不是另一个打开的文档的描述符),使用
CreateFileMapping
函数显示文件的内容,并且外壳程序代码检查文档的最后四个字节是否匹配“
yyyy
”(Egg Hunting方法)。 一旦找到匹配项,文档就会以
GetTempPath
形式复制到一个临时文件夹(
GetTempPath
)中。 然后读取文档的最后12个字节。
图5.文档结束标记AABBCCDD
和
yyyy
标记之间的32位值是下一个
AABBCCDD
的偏移量。 使用
CreateThread
函数调用它。 提取之前与OceanLotus相同的shellcode。 我们在2018年3月发布
的Python仿真脚本仍然可以转储第二阶段。
第二阶段
组件检索
文件和目录名称是动态选择的。 该代码在
C:\Windows\system32
随机选择可执行文件或DLL文件的名称。 然后,他向他的资源发出请求,并检索
FileDescription
字段以用作文件夹名称。 如果这不起作用,则代码将从
%ProgramFiles%
或
C:\Windows
目录(从GetWindowsDirectoryW)中随机选择文件夹名称。 它避免使用可能与现有文件冲突的名称,并确保它不包含以下单词:
windows
,
Microsoft
,
desktop
,
system
,
system32
或
syswow64
。 如果目录已经存在,则将“ NLS_ {6个字符}”添加到名称中。
0x102
分析资源
0x102
并将文件以
%ProgramFiles%
或
%AppData%
形式转储到随机选择的文件夹中。 创建时间更改为具有与
kernel32.dll
相同的值。
例如,这是一个文件夹和文件列表,通过选择可执行文件
C:\Windows\system32\TCPSVCS.exe
作为数据源创建。
图6.提取各种成分0x102
资源的结构非常复杂。 简而言之,它包含:
-文件名
-文件大小和内容
-压缩格式(
RtlDecompressBuffer
函数使用的
COMPRESSION_FORMAT_LZNT1
)
第一个文件被重置为
TCPSVCS.exe
,这是合法的
AcroTranscoder.exe
(根据
FileDescription
,SHA-1:
2896738693A8F36CC7AD83EF1FA46F82F32BE5A3
)。
您可能已经注意到某些DLL文件大于11 MB。 这是因为较大的连续随机数据缓冲区位于可执行文件内部。 这可能是避免某些安全产品检测到的方法。
坚持不懈
放置器中的
0x101
资源包含两个32位整数,这些整数确定如何维护持久性。 first的值表示在没有管理员权限的情况下恶意软件将如何保持持久性。
表1.没有管理员权限的持久性机制第二个整数的值表示恶意软件在以管理员身份工作时应如何确保持久性。
表2.具有管理员权限的持久性机制服务名称是不带扩展名的文件名; 显示名称是文件夹的名称,但是如果该名称已经存在,则会在其中添加字符串“
Revision 1
”(数字增加,直到找到未使用的名称为止)。 操作员确保通过服务的持久性是稳定的-如果发生故障,则应在1秒钟后重新启动服务。 然后,新的服务注册表项的
WOW64
值设置为4,表示它是32位服务。
通过几个COM接口创建计划的任务:
ITaskScheduler
,
ITask
,
ITaskTrigger
,
IPersistFile
和
ITaskScheduler
。 本质上,恶意程序会创建一个隐藏任务,设置帐户信息以及有关当前用户或管理员的信息,然后设置触发器。
这是一项日常任务,持续时间为24小时,两次运行之间的间隔为10分钟,这意味着它将连续执行。
恶意位
在我们的示例中,可执行文件
TCPSVCS.exe
(
AcroTranscoder.exe
)是合法的软件,可下载与之一起转储的DLL。 在这种情况下,
Flash Video Extension.dll
很有用。
它的
DLLMain
函数只是调用另一个函数。 存在一些模糊谓词:
图7.模糊谓词这些误导性检查之后,代码将接收
TCPSVCS.exe
文件的
.text
部分,将其保护更改为
PAGE_EXECUTE_READWRITE
并覆盖它,并添加伪指令:
图8.指令序列最后,将
CALL
指令添加到
Flash Video Extension.dll
导出的
FLVCore::Uninitialize(void)
函数的地址中。 这意味着在加载了恶意DLL之后,当运行时在
TCPSVCS.exe
调用
WinMain
时,指令指针将指向NOP,从而导致
FLVCore::Uninitialize(void)
调用
FLVCore::Uninitialize(void)
。
该函数仅创建一个互斥锁,其开头为
{181C8480-A975-411C-AB0A-630DB8B0A221}
后跟当前的用户名。 然后,她读取扩展名为* .db3的转储文件,该文件包含与位置无关的代码,并使用
CreateThread
执行内容。
* .db3文件的内容是OceanLotus组常用的shellcode。 再次,我们使用
在GitHub上发布的仿真器脚本成功解压缩了其有效负载。
该脚本检索最后阶段。 该组件是我们在
先前的OceanLotus研究中已经分析过的后门。 这可以由二进制文件的GUID
{A96B020F-0000-466F-A96D-A91BBF8EAC96}
。 PE资源中的恶意软件配置仍处于加密状态。 它的配置大致相同,但是C&C服务器与以前的服务器不同:
- andreagahuvrauvin[.]com
- byronorenstein[.]com
- stienollmache[.]xyz
OceanLotus再次展示了不同技术的组合来避免检测。 他们返回时带有感染过程的“精炼”轮廓。 通过选择随机名称并用随机数据填充可执行文件,它们减少了受信任的IoC的数量(基于哈希和文件名)。 此外,由于使用了第三方DLL加载,攻击者只需要删除合法的
AcroTranscoder
二进制文件即可。
自解压档案
使用RTF文件后,该组切换到带有公共文档图标的自解压(SFX)存档,从而进一步使用户感到困惑。 这是由Threatbook(
中文链接 )撰写的。 启动后,将解压缩自解压缩的RAR文件,并执行扩展名为.ocx的DLL,其最终有效载荷先前已记录在
{A96B020F-0000-466F-A96D-A91BBF8EAC96}.dll
。 自2019年1月中旬以来,OceanLotus已重复使用此技术,但随着时间的流逝,某些配置已更改。 在本节中,我们将讨论技术和变化。
诱饵创作
文件
THICH-THONG-LAC-HANH-THAP-THIEN-VIET-NAM (1).EXE
(SHA-1:
AC10F5B1D5ECAB22B7B418D6E98FA18E32BBDEAB
)首次发现。 这个SFX文件是明智创建的-描述(
Version Info )说这是JPEG图像。 SFX脚本如下:
图9. SFX命令恶意软件重置
{9ec60ada-a200-4159-b310-8071892ed0c3}.ocx
(SHA-1:
EFAC23B0E6395B1178BCF7086F72344B24C04DCC
)以及图片
2018 thich thong lac.jpg.
诱饵图像如下:
图10.诱饵图像您可能已经注意到,SFX脚本中的前两行两次调用OSX文件,但这不是错误。
{9ec60ada-a200-4159-b310-8071892ed0c3} .ocx(ShLd.dll)
OSX文件控制流程与其他OceanLotus组件非常相似-JZ
JZ/JNZ
和
PUSH/RET
命令的许多序列与垃圾代码交替出现。
图11.混淆的代码过滤垃圾代码后,
regsvr32.exe
调用的
DllRegisterServer
导出看起来像这样:
图12.基本的安装程序代码实际上,第一次调用
DllRegisterServer
导出将设置注册表值
HKCU\SOFTWARE\Classes\CLSID\{E08A0F4B-1F65-4D4D-9A09-BD4625B9C5A1}\Model
DLL中加密偏移量的
HKCU\SOFTWARE\Classes\CLSID\{E08A0F4B-1F65-4D4D-9A09-BD4625B9C5A1}\Model
(
0x10001DE0
)。
当第二次调用一个函数时,它将读取相同的值并在该地址运行。 从这里开始,读取并执行资源,并在RAM中执行许多操作。
shellcode与先前的OceanLotus活动中使用的PE加载器相同。 可以使用
我们的脚本进行仿真。 结果,他转储了
db293b825dcc419ba7dc2c49fa2757ee.dll
,将其加载到内存中并运行
DllEntry
。
DLL提取其资源的内容,解密(AES-256-CBC)并解压缩(LZMA)。 该资源具有易于反编译的特定格式。
图13.安装程序配置结构(KaitaiStruct Visualizer)配置已明确设置-根据特权级别,二进制数据将写入
%appdata%\Intel\logs\BackgroundUploadTask.cpl
或
%windir%\System32\BackgroundUploadTask.cpl
(或对于64位系统为
SysWOW64
)。
然后,通过创建名为
BackgroundUploadTask[junk].job
的任务来确保持久性,其中
[junk]
是一组字节
0x9D
和
0xA0
。
任务的应用程序名称为
%windir%\System32\control.exe
,并且参数值是卸载的二进制文件的路径。 隐藏的任务每天运行。
从结构
ac8e06de0a6c4483af9837d96504127e.dll
,CPL文件是一个内部名称为
ac8e06de0a6c4483af9837d96504127e.dll
的DLL,它将导出
CPlApplet
函数。 此文件解密其唯一资源
{A96B020F-0000-466F-A96D-A91BBF8EAC96}.dll
,然后加载此DLL并调用其唯一的
DllEntry
导出。
后门配置文件
后门配置已加密并嵌入其资源中。 配置文件的结构与上一个非常相似。
图14.后门配置结构(KaitaiStruct Visualizer)尽管结构相似,但许多字段的值都与
我们以前的报告中提供的数据进行了比较。
二进制数组的第一个元素包含
由腾讯识别的DLL(
HttpProv.dll
MD5:
2559738D1BD4A999126F900C7357B759
)。 但是,由于已从二进制文件中删除了导出名称,因此哈希值不匹配。
附加研究
收集样本时,我们提请注意一些特征。 刚刚描述的样本出现在2018年7月左右,其他类似的样本则出现在最近的1月中旬-2019年2月初。 SFX存档用作感染媒介,转储合法的诱饵文档和恶意的OSX文件。
尽管OceanLotus使用伪造的时间戳,但我们注意到SFX和OCX文件的时间戳始终相同(
0x498BE80F
(08/14/2016 @ UTC 7:15 pm)和
0x498BE80F
(2009年6月6日UTC上午7:34 ))。 这可能表明作者具有使用相同模板并仅更改某些特征的特定“构造函数”。
自2018年初以来我们研究的文件中,有各种名称表示攻击的国家/地区:
-柬埔寨媒体的新联系信息(新).xls.exe
-李建香(个人简历).exe(伪造的pdf文件)
-反馈,2018年7月28日至29日在美国拉力赛.exe自从发现后门
{A96B020F-0000-466F-A96D-A91BBF8EAC96}.dll
并由数名研究人员发布其分析以来,我们已经观察到恶意软件配置数据的某些变化。
首先,作者开始从辅助DLL DLL(
DNSprov.dll
和
DNSprov.dll
两个版本)中删除名称。 然后,操作员停止打包第三个DLL(
HttpProv.dll
的第二个版本),选择仅嵌入一个。
其次,由于许多IoC可用,许多后门配置字段已更改,可能是为了避免检测。 作者修改的重要领域包括:
- AppX注册表项已更改(请参阅IoC)
- 互斥体编码字符串(“ def”,“ abc”,“ ghi”)
- 端口号
最后,在所有新分析的版本中,新的C&C在IoC部分中列出。
结论
OceanLotus继续发展。 该网络小组专注于工具和诱饵的完善和扩展。 作者借助与被指控的受害者有关的引人注目的文档掩盖了恶意负载。 他们开发了新的设计,还使用了公开可用的工具,例如“公式编辑器”漏洞。 此外,它们是完善的工具,可以减少受害者机器上残留的工件数量,从而减少防病毒软件检测到的机会。
折衷指标
折衷指标以及MITER ATT&CK属性可
在Welivesecurity和
GitHub上获得 。