概述
Lazarus组织是来自朝鲜的APT组织,该组织长期针对韩国、美国进行渗透攻击,Lazarus经常使用社会工程学攻击来接近目标,并以提供工作机会为由进一步将诱饵文件发送给目标。
最近发现,Lazarus假装来自Coinbase,想要找到适合”产品安全工程经理”的候选人。Coinbase是世界上最大的加密货币交易平台之一,这使 Lazarus能够为一家享有盛誉的组织提供丰厚且诱人的工作机会奠定基础。
诱饵文件将图标替换成PDF图标,并告知受害者该文件是关于工作职位的PDF文件。当受害者执行文件时,该文件会从网络上下载诱饵PDF或DOC文件,同时还会加载恶意DLL。
流程图
2. 详细分析
1. Coinbase_online_careers_2022_07.exe
检测自身模块路径和文件名
恶意程序伪装成使用PDF图标的可执行文件, 并将文件名改成与Coinbase相关的命名。通过社会工程学、钓鱼等方式将恶意程序发送给受害者。
恶意程序第一次被执行时会判断恶意程序的当前工作目录与文件名是否是”%Music%\Microsoft Edge.exe”,如果不是则需要先创建快捷方式和将文件拷贝到指定目录。
创建快捷方式
拷贝自身到%Music%目录,并将文件名设置为”Microsoft Edge.exe”,以调用com接口的方式在%Music%目录创建快捷方式。创建进程名为”esentutl”的进程将快捷方式从目录%Music%移动到%Startup%来达到持久化的目的。
恶意程序使用com接口CLSID_Shortcut创建快捷方式,设置运行快捷方式时启动的程序为”explorer”,这样可以让快捷方式的图标显示为程序explorer的图标。设置exeplorer的命令行为恶意程序的路径,这样执行快捷方式时最终会启动恶意程序。
打开PDF诱饵文件
如果恶意程序是在受害者机器上第一次执行,调用浏览器打开为受害者精心准备的PDF诱饵文件。
PDF诱饵文档如下, 内容如下:
下载payload
恶意程序从链接” hxxps://docs.mktrending.com/marrketend.png”下载payload,payload伪装为图片,下一阶段恶意程序位于图片数据偏移0x1A610处。
如果没有下载成功,则等待900秒后再次下载payload,当下载失败的次数达到3451次时退出程序。
恶意程序将下载payload的请求伪装成访问图片数据的请求,请求头中的cookie字段被当作机器标识符用于识别受害者。
cookie键长度为5~10,值为随机的字母,对应的键值使用AES256+base64加密,未加密前的格式为”{键}>{用户名}”,在C&C服务器中,可以通过解密cookie字段来获取受害者的用户名。
恶意程序使用字符串”d$f92&^$#FESAfaSDage#FDa”的sha256值作为AES加密的密钥,加密算法如下图:
恶意程序下载payload时使用固定的请求头,其中cookie用于机器标识符,接收的类型设置为img, 当使用网络抓包工具抓包时会将该流量识别为图片数据。读取到图片数据后从偏移0x1A610读取PE数据。
AdobeNotification.exe
样本与前一个样本实现的功能类似,不同的是该样本使用ollvm混淆技术,干扰分析人员分析,所有字符串都是加密状态, 安全软件检测该软件比较困难。
1.ollvm混淆
以函数sub_7ff6e32BC20为例,混淆情况下代码如下:
去混淆后代码如下图。
2.注册窗口回调
与Lazarus以前的某个样本相似,从资源中读取要使用的窗口名和窗口类名,然后注册窗口回调。该样本由于使用ollvm混淆时破坏了资源数据,因此用LoadStringW获取的字符串为空。
创建窗口和窗口回调函数代码如下,由于窗口名和类名为空,因此创建窗口肯定会失败,下图中的窗口回调函数不会被创建,而该样本也利用这一点在窗口创建失败时执行下载器功能。
3.字符串解密
恶意程序对字符串加密使用了两种方法:由ollvm提供的加密方法和恶意程序开发者自己实现的加密方法。由ollvm提供的字符串加密的解密方法在程序执行winMain函数之前开始解密,大量使用SIMD指令来对加密字符进行操作,每次解密0x10字节大小的字符串。
另一种解密方法用来解密dll字符串。
4. API地址解析
与大部分恶意程序解析API地址使用的技术一样,使用指令” mov r8,gs:60h”获取PEB地址,然后从peb中的字段ldr获取链表”InLoadOrderModuleList”,该链表指向的结构为”LDR_DATA_TABLE_ENTRY_x64”,为加载的dll的详细信息。恶意程序通过遍历该链表并遍历dll文件的导出表,然后计算导出函数的哈希值并比较,如果匹配成功则返回对应的函数地址。
5.与C&C通信
恶意程序与C&C服务端进行通信时使用固定的请求头,将Accept伪装成图片流量绕过防火墙对流量的检测。
1 | Proxy-Connection: keep-alive |
恶意程序使用cookies作为机器标识符来识别受害者,其中键值为长度为3~9的随机字母,生成方法如下:
将生成的随机数与受害者机器的用户名拼接成字符串”{随机数}>{用户名}”,然后将其加密。加密方法如下:
1 | 计算字符串d$f92&^$#FESAfaSDage#Fda的sha256值 |
代码如下;
Cookies中的键名同样使用随机数,与键值的生成方式一样。
下载诱饵文件和shellcode
恶意程序从链接”hxxps://yourblogcenter.com/logo.jpg”下载加密的shellcode文件,从链接”
hxxps://allinfostudio.com/manual.pdf”下载诱饵文档。当诱饵文档下载完成后调用函数WinExec打开文档。下载的文件”logo.jpg”为伪装成图片的shellcode。
Shellcode使用AES来加密,使用的密钥为”93/G&h:=Qi9@+)rT660I60-Dx4gEd{=a”,解密后在内存中执行恶意文件。
6. 提升权限
将权限字符串”SeDebugPrivilege”转换成luid格式。
调用函数LookupPrivilegeValueW和AdjustTokenPrivileges提升权限。
7. 在内存中执行文件
恶意程序不使用加载dll或者创建进程的方式来执行文件,而是通过手动将文件映射到内存的方式来执行文件。这样做可以绕过安全软件对dll文件和exe文件操作的相关API的hook。在执行前判断解密后的文件架构是否是x86,如果不是则设置错误码为0x57(文件未找到),否则就将文件映射到内存。
分配足够大小的内存存放映射后的文件。
内存分配成功后, 从解密后的文件中读取PE文件的DOS头部和NT头部并拷贝到内存中。
当分配的地址与PE文件内定义的地址不一样时还需要进行重定位。
如果存在导入表则调用LoadLibraryA来加载导入表中使用的dll。
将所有区段映射到内存中,并修改对应区段的内存属性,比如代码段修改成只读可执行数据,数据段修改成读写属性等等。
将解密后的文件映射到内存完成后,开始执行程序入口点代码。
由于对应的链接已经下线,只能够分析到如何将文件映射到内存部分,不能对其进行进一步的分析。
4. IOC
0dab8ad32f7ed4703b9217837c91cca7
770d0b25057f5afd3611324d4fda1bcd
hxxps://yourblogcenter.com/logo.jpg
hxxps://docs.mktrending.com/marrketend.png
d$f92&^$#FESAfaSDage#FDa(第一个样本使用的密钥)
d$f92&^$#FESAfaSDage#Fda(第二个样本使用的密钥)
93/G&h:=Qi9@+)rT660I60-Dx4gEd{=a(第二个样本解密文件使用的密钥)
hxxps://allinfostudio.com/manual.pdf
5. ATT&CK矩阵
Tactic | ID | Name | Description |
---|---|---|---|
Command and Control | T1105 | Ingress Tool Transfer | 下载恶意程序 |
T1001 | Encrypted Channel | 传输加密后的数据 | |
T1071 | Application Layer Protocol | 使用http协议进行通信 | |
Persistence | T1547.001 | Registry Run Keys / Startup Folder | 使用注册表启动项 |
Execution | T1204 | User Execution | 恶意程序需要受害者手动执行 |
Initial Access | T1566 | Phishing | 使用鱼叉式网络钓鱼 |
最后更新: 2024年04月07日 11:43:48
本文链接: http://shxi.cc/post/becb71b0.html
版权声明: 本作品采用 CC BY-NC-SA 4.0 许可协议进行许可,转载请注明出处!