阅读: 9
一、概述
前段时间,伏影实验室发现一起利用聊天工具传播恶意软件的攻击事件。在该次攻击事件中,攻击者利用Skype聊天工具进行恶意代码投递。
事件调查显示,攻击者伪装昵称为财务主管,通过即时聊天工具Skype,向目标投递了名称为“七月份公司重要通知.xlxs.exe”的文件。在聊天界面中,完整的后缀并没有显示,同时如果本地开启已知文件后缀隐藏的设置,在本地浏览文件过程中也可能会错误地认为该文件是一个通知文档。
Skype聊天工具在Win10上默认自启动,可以与目标用户聊天和发送文件。通过分析了解到,攻击者也有可能会利用QQ、Wechat、telegram进行恶意代码投递。
一旦受害者运行该文件,恶意代码便进入到了一段比较复杂的攻击流程,并最终加载执行远控木马程序,实现对受害者计算机的完整控制。
攻击流程:
二、技术分析
2.1 第一阶段
攻击者通过聊天工具将第一阶段攻击载荷以文件形式发送给目标,并赋之以诱惑性的文件名称,吸引用户去打开文件。
第一阶段攻击载荷是一个名称伪装成Excel文档的exe文件。在聊天界面下,没有显示完整的文件名称,目标用户为了查看文件内容,可能会直接下载并双击运行恶意代码。
第一阶段恶意程序运行之后,首先会检查当前进程文件名称是否包含geek.jpg,根据判断结果分别执行两种操作。
如果没有包含,恶意程序会自拷贝到C:\Windows\Temp\geek.jpg,并使用cmd.exe启动geek.jpg,然后退出自身进程。
如果包含geek.jpg,恶意程序会解密出一个url地址http://qcvnwc27e.bkt.clouddn.com/load.xml:
url指向的内容是一个XML格式的SCT文件,包含执行脚本。执行过程中首先从自身base64加密硬编码中解密出序列化的文件流,并进行反序列化获得C#编写的攻击载荷。然后执行TestClass方法,并将变量HappyDay作为参数传入。
2.2 第二阶段
将对应的C#代码转储到本地,借助分析工具进行分析。恶意程序首先将参数HappyDay通过Base64解码获得一段字符串:
字符串以@作为分隔符,保存为长度为4的参数列表。然后恶意程序会下载前面两个URL参数指向的文件到目录c:\\ProgramData\\$2SJ32,文件名称会更换为时间格式MMddHHmmss的字符串,扩展名分别保存为.exe和.rar。
Temp.png ——— MMddHHmmss.exe
Load.rar ——— MMddHHmmss.rar
Temp.png其实是一个正常签名的winrar程序,主要任务是后面解压load.rar文件:
Load.rar压缩包内包含三个文件,从名称上分别为pdf文件、exe文件和dll文件:
C#恶意代码会使用下载的winrar程序解压load.rar到目录c:\\ProgramData\\$2SJ32,并删除下载的winrar程序和压缩包。
然后去执行参数列表最后一项指定名称的文件qqhxsj.exe,进入到下一阶段。在C#代码中,会判断参数列表最后有一个还是两个文件名,并执行对应的程序启动操作。可想而知,攻击者可能构造了多个攻击载荷和多个在线SCT文件,还有更多的恶意代码没有被发现。
恶意程序启动文件进程的方式有两种。一种是直接调用ShellExecute启动,另外一种是使用base64解码出一段powershell命令,去打开文件:
$ee=$(([System.Activator]::CreateInstance([Type]::GetTypeFromCLSID(“9BA05972-F6A8-11CF-A442-00A0C90A8F39″,”127.0.0.1”))).item()).Document.Application;
$ee.Open(‘$filename‘)
其中9BA05972-F6A8-11CF-A442-00A0C90A8F39是ShellWindows的Class ID(CLSID)。
2.3 第三阶段
前一阶段最后启动的进程文件名称为qqhxsj.exe,这个文件主要用途是进行DLL-sideloading。值得关注的是,该文件为腾讯一款游戏客户端主文件,而且其导入表只有一个导入函数,当程序执行的时候,会加载对应DLL执行该导入函数:
通过对该公司其他游戏客户端分析,发现该公司多个游戏都符合这种特点,是一个特别适合进行DLL-sideloading的目标,攻击者构造在这里构造对应的qqhxsjBase.dll:
qqhxsj.exe具有正常的文件签名,启动过程中会申请管理员权限,在对DLL函数调用过程中没有对DLL进行签名校验,导致未签名的恶意DLL也会以管理员权限执行恶意代码。
qqhxsjBase.dll内部名称为common.dll,该DLL会遍历当前运行目录下的文件,在内容中找到一段字符串“01234567890”的偏移。最终会在压缩包解压的pdf文件中发现对应标识:
然后从标识位结束开始在内存中解密出一个PE文件,解密的算法是按字节遍历数据以当前字节数据减去下一字节数据获得字节数据。以图中紧接着的CD 80 26为例,计算结果位PE文件的magic值“MZ”:
0xCD- 0x80 = 0x4D
0x80 – 0x26 = 0x5A
通过解密之后的PE文件是一个DLL,内部称为MainDll.dll。qqhxsjBase.dll利用一系列API实现在内存中加载MainDll并调用导出函数ShowPopupFunction:
2.4 第四阶段
将MainDll转储到本地进行分析。其唯一的导出函数ShowPopupFunction 按照不同的命令行参数执行不同的功能。通过分析发现,MailDll似乎是经过修改的gh0st RAT木马,本次分析对具体的远控功能不再进行赘述:
MainDll启动过程针对不同的命令行参数,会有不同的操作。
-Protect
创建命名Mutex “ProtectThread2016”,表示进入了保护线程。
然后进入死循环,保护进程,当发现进程关闭时,重新运行运行进程。检查的办法是打开另外一个名称为“AABBCCDD “的互斥体,当发现互斥体不存在时候,则试图以管理员权限和命令行参数”run“执行dll旁路加载的主进程,然后继续进行循环:
-run
如果当前非管理员权限首先会尝试以管理员权限重新运行运行。
然后创建创建互斥体” AABBCCDD”,表示程序主功能运行。通过线程创建保护进程,然后进入RAT主线程,执行后续操作。
-svc
注册服务“ServiceName1111”,并在回调函数中创建event:” Global\\SvcBootMutex-859B3809-6FF6-49A4-A57A-84CFCB9BF0B7”:
然后在服务的上下文中以“-boot”参数启动进程
然后按照boot参数的逻辑运行。
-boot
Boot参数运行时,与run参数运行区别不大,只是没有启动保护进程,同时创建了命名事件:“Global\\SvcBootMutex-859B3809-6FF6-49A4-A57A-84CFCB9BF0B7”
当所有参数都没有的时候,MainDll会通过遍历进程检查qq.exe、wechat.exe、Telegram.exe、skype.exe进程是否存在。如果不存在这些进程,当前程序就会退出,这里可能是一种逃避自动化分析的方式:
如果存在这些进程,首先提升到管理员权限运行。然后将下载解压出来的三个文件拷贝到c:\ProgramData\目录,然后以run参数重新运行。
从恶意代码对于聊天程序进程名称检测的逻辑上来看,攻击者可能会利用其他聊天工具来传播攻击载荷。
三、总结与建议
攻击者利用即时聊天工具传播恶意软件,以伪装的昵称和文件名称,诱使用户去打开恶意程序。另外一方面,利用游戏客户端缺少DLL签名校验,进行恶意DLL旁路加载,进行UAC提权。如果用户电脑安装或者正在运行对应的游戏客户端,又或者只是基于对游戏内容的好奇,给与程序管理员权限,使得攻击者成功运行恶意代码,获得目标设备完整的控制权限。
基于此次分析,用户要提高警惕,在充分确认之前,不要轻易打开和运行陌生人发来的文件,同时不要点击未知或者莫名出现的UAC窗口。另外应该尽量避免从非官方途径下载软件程序,给予攻击者可乘之机。
四、IOC
Hash:
BC0F26975DFD617D87CD110C43B0417B53ED80AD5C4BC97AE7E8BCCB4431E56E
39C0F7E4EC9F8DBF2D52A6296CA7D1525042D3AD169BE7BC4754DB8BCD74D6BB
2578C51F4A9CDC06FDB6412375BC2C8ECBC74CE0BF9B493E1659BA74D3D16A1B
url:
http://qcvnwc27e.bkt.clouddn.com/load.xml
http://qcvnwc27e.bkt.clouddn.com/temp.png
http://qcvnwc27e.bkt.clouddn.com/load.rar
C2:
23.248.234.250:1888