APT组织海莲花最新“隐写术”系列活动总结(附报告下载链接) – 作者:黑鸟

Cylance 近日发布了一个利用图片隐写术来加载恶意载荷的报告。

image.png

报告已经发布至github,欢迎加星。

https://github.com/blackorbird/APT_REPORT/blob/master/Oceanlotus/OceanLotus-Steganography-Malware-Analysis-White-Paper.pdf

正文

报告介绍了两种隐写术loader,区别如下表

image.png

下面详细分析

第一个案例使用的是一个伪装成macfee的mcvsocfg.dll

MD5:c55f1145ecc9ea52b2872a99a3f04eb4

分析如下:

恶意DLL导出与原始mcvsocfg.dll库相同的函数名称。所有导出都包含完全相同的代码,它将解密payload,将其注入内存并执行它:

image.png

通过隐写术的技术在单独的.png文件中编码。 payload使用AES-128加密,最后用0x3B进行异或编码。 

其中0x3B这个值是从C:\Windows \system.ini文件的第一个字节读取

image.png

其中一个藏恶意payload的图片是怪盗基德的,所以说越南哥们喜欢看漫画啊。

image.png

要提取有效负载,其将首先初始化GDI + API并获取图像宽度和高度值

image.png

payload的大小在图像的前四个像素内编码。

 获得大小后,恶意软件将分配一个适当的内存缓冲区并继续逐字节解码剩余的payload

image.png

payload的编码方式与大小相同:

每个字节都是根据每个字节的ARGB颜色代码计算出来的图像中的后续像素:

image.png

如果payload大于用于存储它的图像,则剩余的payload字节简单地附加到图像之后的IEND标记,并直接从标志位后面读取:

image.png

像素编码算法相当简单,旨在与原始图像相比最小化视觉差异

仅修改红色,绿色和蓝色字节值的最低有效位。 alpha通道字节保持不变。

为了编码有效载荷的一个字节,前三位(0-2)以红色存储,接下来的三位(3-5)以绿色存储颜色,最后两位(6-7)以蓝色存储。 解码是一个简单的逆操作:

image.png

Windows通过GdpiBitmapGetPixel API将.png像素RGBA值转换为ARGB编码

image.png

例如,ARGB像素值0xFF4086DB将产生解码的字节0xF0:

image.png

为了帮助恢复加密的payload,可以使用以下Python脚本解码.png图像中的像素颜色。

(脚本已经上传至github)

https://github.com/blackorbird/APT_REPORT/blob/master/Oceanlotus/png_decode.py

image.png

在解码.png图像之后,加载器然后继续初始化密钥,并且IV用于执行加密的AES解密payload。 

这两个值都是由二进制文件.rdata部分中硬编码的256个伪随机字节数组提供的。 前两个该数组的字节分别指定键和IV的相对偏移量:

image.png

加载器使用来自开源Crypto ++ 2库的AES128实现,该库以下列方式实例化:

image.png

恶意软件作者似乎修改了大部分原始代码。 SimpleKeyringInterface类用于初始化key,而IV传递给SetCipherWithIV函数:

image.png

后面继续解就完事了,需要看详情请看原报告。

具体按下面的参数配置就能完全解开后门。

image.png

第二个案例使用的是一个名为wsc.dll的样本

MD5:ec52a11625bdb4aad3740ff8cc6d8c0f

此DLL不包含导出表,其整个功能驻留在DllMain例程中:

image.png

执行时,恶意软件将首先从其资源中解密字符串,并将其与父进程的名称进行比较。

如果名称不同,恶意软件只会退出而不会触及有效负载。 

包含预期进程名称的资源(ICON / 1)与合法C:\Windows\system.ini文件的第一个字节进行异或运算0x3B

image.png
image.png

如果父名称匹配,恶意软件将遍历堆栈以查找落入内存的返回地址

image.png

接下来,从.png封面文件中读取有效负载,该封面文件似乎取自鼓舞人心的报价网站。 这里和第一段payload有区别。其完全包含在图像的像素颜色代码中,不会留下IEND标记之外的剩余数据:

image.png

最后,加载器将有效负载解密到内存缓冲区,并用指针覆盖先前找到的返回地址到该缓冲区,确保在DLL尝试返回调用时将执行恶意shellcode:

image.png

嵌入在有效载荷中的加载器似乎是Veil “shellcode_inject”payload的变种,以前由OceanLotus使用加载旧版本的Remy后门。 

在这种情况下,shellcode被配置为从内部加载编码后门

流程如下:

image.png

最后是解开后的后门分析,和之前遇到的分析差不多,ESET也提到了不少,需要看的可以去看原文或者看下面这个链接,因为主要是为了看海莲花组织的新动态,所以其他的就不多说了。

https://github.com/blackorbird/APT_REPORT/blob/master/Oceanlotus/ESET_OceanLotus.pdf

https://mp.weixin.qq.com/s?__biz=MzAxOTM1MDQ1NA==&mid=2451174688&idx=1&sn=bb558ebf1014e2896da62de41dc4fff5&chksm=8c2503f9bb528aeffec9dc9be63177ccf93c91b51e3d6419460eb59b707af974be060964f304&scene=21#wechat_redirect

噢,C2通讯模块还得提一下

此模块存储在启动程序的资源中,并使用LZMA进行压缩。 它也被严重混淆,但比后门的方式略有不同。 虽然它不包含内部名称,但认为它是HttpProv库的变体,在与C2服务器的HTTP / HTTPS通信期间,后门使用此模块,并具有代理绕过功能。

IOC

均已上传至github,欢迎自取,别忘加个星星哦老板

https://github.com/blackorbird/APT_REPORT/tree/master/Oceanlotus

image.pngimage.png

来源:freebuf.com 2019-04-04 12:16:55 by: 黑鸟

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论