概述
摩诃草,又名Hangover、Patchwork、白象等,该APT组织被广泛认为来自南亚地区某国,其最早攻击活动可以追溯到2009年11月,从2015年开始变得更加活跃。该组织主要针对Windows系统进行攻击,同时也会针对Android、MacOS系统进行攻击。其攻击活动中使用了大量漏洞,其中至少包括一次 0day 漏洞利用攻击。
摩诃草组织攻击目标所涉及的国家和地区分布非常广泛,除了中国和巴基斯坦等主要目标,还包括以色列、孟加拉国、美国、英国、日本、韩国等国以及中东和东南亚地区。该组织以鱼叉攻击为主,以少量水坑攻击为辅,针对目标国家的政府、军事、电力、工业、外交和经济进行网络间谍活动,窃取敏感信息。
流程图
3. 详细分析
1. 钓鱼文档分析
钓鱼文档为RTF类型文件,打开如下图,内容为巴基斯坦旁遮普政府劳动和人力资源部相关。该文档包含CVE-2017-11882公式编辑器漏洞,受害者一旦打开文档便会触发漏洞并执行shellcode。在shellcode中释放恶意文件。
2.shellcode分析
1.硬编码函数地址调用
该shellcode与其他恶意程序使用的shellcode不同,它并没有使用从peb结构体获取函数地址的访问,而是从公式编辑器中窃取API函数地址,由于公式编辑器编译时并没有开启ASLR地址随机化,因此与公式编辑器处于同一地址空间的shellcode代码能够直接通过函数地址来调用函数而不会引发各种异常。
如果要使用一些在公式编辑器内并没有使用的API函数时,手动通过LoadLibrary和GetProcessAddress来获取对应的函数地址,当然这两个函数使用的是硬编码的函数地址。
2.获取函数地址
Shellcode从公式编辑器中窃取函数LoadLibrary和GetProcessAddress的函数地址来获取shellcode用到的所有函数的地址。
3.获取操作系统版本
由于windows系统的不同版本的系统目录有些不同,shellcode获取操作系统版本号用于在执行释放的恶意程序时针对不同版本号使用不同的操作。
4.检测AVP进程
Shellcode通过枚举进程的方式来判断当前所有运行的进程是否包含”avp”和”AvastSvc”,shellcode会根据是否包含这两个进程来确定如何执行释放的恶意程序。
进程检测代码如下图,使用函数CreateToolhelp32Snapshot创建进程快照对象,通过ProcessFirst和ProcessNext来遍历所有的进程并与要查找的进程名进行匹配,如果匹配成功返回1,否则返回0。
5.创建计划任务
如果检测到受害者机器上存在进程”AvastSvc”则创建计划任务。创建计划任务时,恶意程序OneDriver还未被释放,因此延迟1分钟后执行。使用函数ShellExecuteA执行cmd命令创建计划任务。
6.释放恶意程序
恶意程序Onedriver嵌入在shellcode内,shellcode使用指令pop和指令push组合使用获取函数jmp_return_addr的返回地址即0x12F,减去0xE获取当前函数所在地址0x121。
恶意程序OneDriver 位于偏移当前函数地址+0xAF2中,从下图中可以看出MZ字符和PE字符被抹去,这样做可以有效防止一些工具直接将文件dump出来。
获取恶意程序所在位置,然后将头部’MZ’写入。
当操作系统版本号为6时,并不直接通过函数地址来调用函数CreateFile,而是模拟CreateFile的序言,然后跳转到序言后的代码并执行。由于安全软件对一些关键函数的hook一般都是修改函数头部5字节代码,shellcode跳过函数序言可以绕过HOOK。
Shellcode写入恶意程序文件代码如下,文件被写入到%programdata%目录中,文件名为”oneDriver.exe”。
IDA反编译后的伪代码第38行由于IDA优化的原因没有反编译成正确的代码。
7.执行恶意程序
如果受害者机器上存在avsvc进程则直接退出程序,等待计划任务触发时执行恶意程序。在其他情况下,shellcode会创建注册表启动项以便在受害者机器开机启动时执行恶意程序。
在注册表启动项创建成功后,还会根据是否存在进程”avp”来使用不同的方法来创建进程来绕过安全防护进程的检测。如果不存在进程”avp”,则使用使用CreateProcess来执行释放的恶意文件。
如果存在进程”avp”则开启shutdown权限,发送HARDERROR_MSG消息使受害者机器触发蓝屏,然后等待受害者系统启动时执行释放的恶意程序。
3.Bannew木马
数据加密
在以往版本的Banner木马中,与C&C通信时使用的加密算法为AES-CBC-128,这次发现的样本开始使用更为轻量的RC4加密算法来对通信数据进行加密。部分字段在使用RC4加密后还会采用Base64对其进行编码。
泄露数据
使用工具nslookup来查询受害者机器的外网IP地址。
使用函数GetUserName获取受害者机器当前用户。
使用powershell命令获取受害者机器上所有已安装的服务,并将结果保存到文件RTYgjfdg.sys中。
通过命令tasklist获取操作系统正在运行的所有进程信息,命令执行后输出的数据同样保存到文件RTYgjfdg.sys中。
从注册表中获取在受害者机器上所有已安装的软件,同样将结果写入RTYgjfdg.sys。
3.C&C通信
恶意程序与C&C服务器通信时使用post请求来发送数据,其中post请求使用的所有参数如表,C&C服务器地址为”dayspringdesk.xyz”, post请求的路径为”wfgkl/cvrkaf/xkj/test.php”。
字段 | 描述 | 加密算法 |
---|---|---|
uuid | 机器序列号 | 在发送准备接收指令执行的请求中不加密,其他情况下加密 |
fname | 文件名 | RC4+base64 |
command | ||
fcat | 文件类型 “10”表示文件名为RTYgjfdg.sys | |
fsize | 文件大小 | 将文件大小转成字符串再加密,加密方式为RC4+base64 |
Fdata | 文件数据 | Base64 |
Isping | 在发送准备接收指令执行的请求中使用RC4加密,其他情况不加密 | |
Status | 状态 | 无加密 |
Found | 无加密 | |
flag | 标志 | 无加密 |
ip | 受害者机器的外网IP | 无加密 |
User | 受害者机器用户名 | RC4加密 |
4.发送上线包
恶意程序在第一次运行时检测临时目录下的”THYdbjks”文件是否存在,如果不存在则收集受害者机器上的系统信息,包括已安装服务、当前运行的进程、所有已安装的软件等等,收集的信息保存在临时目录下的”RTYgjfdg.sys”文件。
恶意程序上传文件时采用分段上传,每次最多上传0x400字节大小的文件数据,其中文件大小和文件名加密后分别作为参数传递给post请求的字段fsize和fname。
将文件数据base64编码后作为字段fdata的参数,分段上传时post的字段fdata对应不同段的文件数据,其他字段保持不变,其中fcat的值为”10”,表示该上传的文件主要用于保存从受害者机器上泄露的系统信息。
文件上传完成后,发送文件上传成功的请求并将文件删除,字段fdata的值为”done”的base64值,字段flag值为done,其他参数保持不变,
5.键盘记录
恶意程序在每一次将上线包发送到C&C服务器后,开始执行C&C指令前创建一个新的线程来实现键盘记录功能,记录的信息保存到临时目录下的文件”atapi.sys”中。
与一般的键盘记录不同,恶意程序采用循环遍历每一种vkey,使用函数GetAsyncKeyState来判断vkey是否被按下,当该函数返回值为0x8001时表示vkey对应的按键被按下,接着检测对应的按键是否在需要记录的范围内,比如功能键F1~F12之类的按键就恶意程序就不会记录并写入到文件。
恶意程序记录并写入到文件的vkey键值包括0~9的数字、a~z和A~Z的字符,还有shift、caplock和ctlr按键。其中特殊按键使用格式”#{键名}#”的形式写入到文件中。
键盘记录支持的特殊键如下表:
键名 | 描述 |
---|---|
shift | |
backspack | 后退键 |
r_click | 鼠标右击 |
caps_lock | 大写键 |
Tab | |
up_arrow | 向上的方向键 |
down_arrow | 向下的方向键 |
left_arrow | 向左的方向键 |
Right_arrow | 向右的方向键 |
Contrl | |
ALT |
6.C&C通信
恶意程序需要发送指定的post请求来从C&C服务器获取要执行的指令,post请求中包含uuid、user参数,C&C服务器会根据字段来对不同用户名的受害者下发不同的C&C指令数据,下发的数据使用RC4算法加密,加密密钥与恶意程序使用的RC4加密密钥一致,解密后的数据第一个字节表示恶意程序要执行的C&C指令。
恶意程序使用的所有C&C指令如下表:
C&C指令 | 描述 |
---|---|
2 | 屏幕截图 |
3 | 退出当前执行的指令,等待C&C服务器下发指令 |
1 | 收集文件信息 |
5 | 创建文件 |
6 | 上传键盘记录文件 |
7 | 执行远程shell |
7.屏幕截图
获取当前屏幕的大小,并计算左上、左下、右上和右下的坐标,在函数Create_SceenSnap对计算出的坐标范围内的屏幕截图。
创建Bitmap对象,然后调用函数GdipSaveImageToFile将Bitmap对象保存为JPG格式的图片文件,保存的图片文件保存在临时目录下的s.sys文件。
创建屏幕截图成功需要将图片文件加密后上传到C&C服务器上,上传屏幕截图图片时与上传键盘记录数据相似,其中字段fname固定为tprk.enc使用RC4加密后的值;同样使用分段上传,每次上传0x5000字节的数据,所有分段上传完成后发送上传成功的post请求。
8.收集文件信息
调用FindFIrstFileW和FindNextFileW遍历指定目录下所有的文件,并将其文件名写入临时目录的的文件__TDSYU。与上传屏幕截图发送的post请求类似,分段上传时每段的大小为0x4000字节大小。
9.远程shell执行
恶意程序要执行的命令shell命令由C&C服务器下发,当执行的命令为cd使用,调用函数SetCurrentDirectoryW将cd命令的参数设置为当前进程的工作目录。
为其他指令时,调用_popen执行命令。
10.下载文件并执行
C&C服务器下发文件下载链接,恶意程序下载该文件并保存到临时目录下,保存文件名为”TGJdbkds.exe”,随后调用函数CreateProcessA执行该文件。
5. IOC
cb50c0650b32911daeb17217ac258afe
26991e42f4fa6dfab84cfa886b4d51f0
729dd4604fda4b19146d8f33509a43f6
6. ATT&CK矩阵
Tactic | ID | Name | Description |
---|---|---|---|
Exfiltration | T1041 | Exfiltration Over C2 Channel | 通过C&C上传泄露数据 |
T1030 | Data Transfer Size Limits | 使用分块的方式上传数据 | |
Command and Control | T1105 | Ingress Tool Transfer | 下载恶意程序 |
T1573 | Encrypted Channel | 使用RC4和base64对流量进行加密 | |
T1071 | Application Layer Protocol | 使用http协议进行通信 | |
Collection | T1113 | Screen Capture | 屏幕截图 |
T1056 | Input Capture | 键盘记录 | |
Discovery | T1033 | System Owner/User Discovery | 获取系统用户 |
T1518 | Software Discovery | 获取所有已安装软件 | |
T1057 | Process Discovery | 获取进程列表 | |
T1007 | System Service Discovery | 获取所有已注册服务 | |
T1083 | File and Directory Discovery | 收集文件信息 | |
Privilege Escalation | T1053 | Scheduled Task/Job | 创建计划任务执行恶意程序 |
T1547 | Boot or Logon Autostart Execution | 创建注册表启动项 |
7. 参考
最后更新: 2024年04月15日 19:24:35
本文链接: http://shxi.cc/post/f6888581.html
版权声明: 本作品采用 CC BY-NC-SA 4.0 许可协议进行许可,转载请注明出处!