Cylance 近日发布了一个利用图片隐写术来加载恶意载荷的报告。
报告已经发布至github,欢迎加星。
https://github.com/blackorbird/APT_REPORT/blob/master/Oceanlotus/OceanLotus-Steganography-Malware-Analysis-White-Paper.pdf
正文
报告介绍了两种隐写术loader,区别如下表
下面详细分析
第一个案例使用的是一个伪装成macfee的mcvsocfg.dll
MD5:c55f1145ecc9ea52b2872a99a3f04eb4
分析如下:
恶意DLL导出与原始mcvsocfg.dll库相同的函数名称。所有导出都包含完全相同的代码,它将解密payload,将其注入内存并执行它:
通过隐写术的技术在单独的.png文件中编码。 payload使用AES-128加密,最后用0x3B进行异或编码。
其中0x3B这个值是从C:Windows system.ini文件的第一个字节读取
其中一个藏恶意payload的图片是怪盗基德的,所以说越南哥们喜欢看漫画啊。
要提取有效负载,其将首先初始化GDI + API并获取图像宽度和高度值
payload的大小在图像的前四个像素内编码。
获得大小后,恶意软件将分配一个适当的内存缓冲区并继续逐字节解码剩余的payload
payload的编码方式与大小相同:
每个字节都是根据每个字节的ARGB颜色代码计算出来的图像中的后续像素:
如果payload大于用于存储它的图像,则剩余的payload字节简单地附加到图像之后的IEND标记,并直接从标志位后面读取:
像素编码算法相当简单,旨在与原始图像相比最小化视觉差异
仅修改红色,绿色和蓝色字节值的最低有效位。 alpha通道字节保持不变。
为了编码有效载荷的一个字节,前三位(0-2)以红色存储,接下来的三位(3-5)以绿色存储颜色,最后两位(6-7)以蓝色存储。 解码是一个简单的逆操作:
Windows通过GdpiBitmapGetPixel API将.png像素RGBA值转换为ARGB编码
例如,ARGB像素值0xFF4086DB将产生解码的字节0xF0:
为了帮助恢复加密的payload,可以使用以下Python脚本解码.png图像中的像素颜色。
(脚本已经上传至github)
https://github.com/blackorbird/APT_REPORT/blob/master/Oceanlotus/png_decode.py
在解码.png图像之后,加载器然后继续初始化密钥,并且IV用于执行加密的AES解密payload。
这两个值都是由二进制文件.rdata部分中硬编码的256个伪随机字节数组提供的。 前两个该数组的字节分别指定键和IV的相对偏移量:
加载器使用来自开源Crypto ++ 2库的AES128实现,该库以下列方式实例化:
恶意软件作者似乎修改了大部分原始代码。 SimpleKeyringInterface类用于初始化key,而IV传递给SetCipherWithIV函数:
后面继续解就完事了,需要看详情请看原报告。
具体按下面的参数配置就能完全解开后门。
第二个案例使用的是一个名为wsc.dll的样本
MD5:ec52a11625bdb4aad3740ff8cc6d8c0f
此DLL不包含导出表,其整个功能驻留在DllMain例程中:
执行时,恶意软件将首先从其资源中解密字符串,并将其与父进程的名称进行比较。
如果名称不同,恶意软件只会退出而不会触及有效负载。
包含预期进程名称的资源(ICON / 1)与合法C:Windowssystem.ini文件的第一个字节进行异或运算0x3B
如果父名称匹配,恶意软件将遍历堆栈以查找落入内存的返回地址
接下来,从.png封面文件中读取有效负载,该封面文件似乎取自鼓舞人心的报价网站。 这里和第一段payload有区别。其完全包含在图像的像素颜色代码中,不会留下IEND标记之外的剩余数据:
最后,加载器将有效负载解密到内存缓冲区,并用指针覆盖先前找到的返回地址到该缓冲区,确保在DLL尝试返回调用时将执行恶意shellcode:
嵌入在有效载荷中的加载器似乎是Veil “shellcode_inject”payload的变种,以前由OceanLotus使用加载旧版本的Remy后门。
在这种情况下,shellcode被配置为从内部加载编码后门
流程如下:
最后是解开后的后门分析,和之前遇到的分析差不多,ESET也提到了不少,需要看的可以去看原文或者看下面这个链接,因为主要是为了看海莲花组织的新动态,所以其他的就不多说了。
https://github.com/blackorbird/APT_REPORT/blob/master/Oceanlotus/ESET_OceanLotus.pdf
噢,C2通讯模块还得提一下
此模块存储在启动程序的资源中,并使用LZMA进行压缩。 它也被严重混淆,但比后门的方式略有不同。 虽然它不包含内部名称,但认为它是HttpProv库的变体,在与C2服务器的HTTP / HTTPS通信期间,后门使用此模块,并具有代理绕过功能。
IOC
均已上传至github,欢迎自取,别忘加个星星哦老板
https://github.com/blackorbird/APT_REPORT/tree/master/Oceanlotus
声明:本文来自黑鸟,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。