8-BitQuest
菜单
[威胁情报]

摩诃草组织以巴基斯坦相关政府机构文件为诱饵的攻击活动分析

· 3 分钟阅读 · @admin

摩诃草组织以巴基斯坦相关政府机构文件为诱饵的攻击活动分析 像素封面

  摩诃草,又名Hangover、Patchwork、白象等,该APT组织被广泛认为来自南亚地区某国,其最早攻击活动可以追溯到2009年11月,从2015年开始变得更加活跃。该组织主要针对Windows系统进行攻击,同时也会针对Android、MacOS系统进行攻击。其攻击活动中使用了大量漏洞,其中至少包括一次 0day 漏洞利用攻击。   摩诃草组织攻击目标所涉及的国家和地区分布非常广泛,除了中国和巴基斯坦等主要目标,还包括以色列、孟加拉国、美国、英国、日本、韩国等国以及中东和东南亚地区。该组织以鱼叉攻击为主,以少量水坑攻击为辅,针对目标国家的政府、军事、电力、工业、外交和经济进行网络间谍活动,窃取敏感信息。

流程图

{% asset_img 0f985c101d3027b893b6ce2d62cd2a84.png example %}

3. 详细分析

1. 钓鱼文档分析

  钓鱼文档为RTF类型文件,打开如下图,内容为巴基斯坦旁遮普政府劳动和人力资源部相关。该文档包含CVE-2017-11882公式编辑器漏洞,受害者一旦打开文档便会触发漏洞并执行shellcode。在shellcode中释放恶意文件。

{% asset_img e8fb1f1ab921921f7318664ced02cd87.png example %}

2.shellcode分析

1.硬编码函数地址调用

  该shellcode与其他恶意程序使用的shellcode不同,它并没有使用从peb结构体获取函数地址的访问,而是从公式编辑器中窃取API函数地址,由于公式编辑器编译时并没有开启ASLR地址随机化,因此与公式编辑器处于同一地址空间的shellcode代码能够直接通过函数地址来调用函数而不会引发各种异常。 {% asset_img 9cc1529615d4d5cb002e8e8c31afab30.png example %}

  如果要使用一些在公式编辑器内并没有使用的API函数时,手动通过LoadLibrary和GetProcessAddress来获取对应的函数地址,当然这两个函数使用的是硬编码的函数地址。 {% asset_img ea8faa620fc531b8cd816100f08a7a8a.png example %}

2.获取函数地址

  Shellcode从公式编辑器中窃取函数LoadLibrary和GetProcessAddress的函数地址来获取shellcode用到的所有函数的地址。 {% asset_img 230746b0fe261623e71c1bc698834783.png example %}

3.获取操作系统版本

  由于windows系统的不同版本的系统目录有些不同,shellcode获取操作系统版本号用于在执行释放的恶意程序时针对不同版本号使用不同的操作。 {% asset_img ed921d528aa3ec59ba71ba76f5a644fb.png example %}

4.检测AVP进程

  Shellcode通过枚举进程的方式来判断当前所有运行的进程是否包含”avp”和”AvastSvc”,shellcode会根据是否包含这两个进程来确定如何执行释放的恶意程序。 {% asset_img fce01d2d641876b48e0de1119ac81c29.png example %}

  进程检测代码如下图,使用函数CreateToolhelp32Snapshot创建进程快照对象,通过ProcessFirst和ProcessNext来遍历所有的进程并与要查找的进程名进行匹配,如果匹配成功返回1,否则返回0。 {% asset_img d1c8f2f8b631c77f32cd8259cb6fe29b.png example %}

5.创建计划任务

  如果检测到受害者机器上存在进程”AvastSvc”则创建计划任务。创建计划任务时,恶意程序OneDriver还未被释放,因此延迟1分钟后执行。使用函数ShellExecuteA执行cmd命令创建计划任务。 {% asset_img 8b365572d170d969e65acb1fd2032f0e.png example %}

6.释放恶意程序

  恶意程序Onedriver嵌入在shellcode内,shellcode使用指令pop和指令push组合使用获取函数jmp_return_addr的返回地址即0x12F,减去0xE获取当前函数所在地址0x121。 {% asset_img 3f0a324f21c2f61c91b5d105543340c7.png example %}

  恶意程序OneDriver 位于偏移当前函数地址+0xAF2中,从下图中可以看出MZ字符和PE字符被抹去,这样做可以有效防止一些工具直接将文件dump出来。 {% asset_img 765a19cda71c0a58f9a2b5aed194527d.png example %}

  获取恶意程序所在位置,然后将头部’MZ’写入。 {% asset_img 936a9dd6af83558aa384e857b562c0f1.png example %}

  当操作系统版本号为6时,并不直接通过函数地址来调用函数CreateFile,而是模拟CreateFile的序言,然后跳转到序言后的代码并执行。由于安全软件对一些关键函数的hook一般都是修改函数头部5字节代码,shellcode跳过函数序言可以绕过HOOK。 {% asset_img 516713ed129c46fcd530ddcf5714cd12.png example %}

  Shellcode写入恶意程序文件代码如下,文件被写入到%programdata%目录中,文件名为”oneDriver.exe”。 IDA反编译后的伪代码第38行由于IDA优化的原因没有反编译成正确的代码。 {% asset_img 4b629a09850760a0af587e1c02087cbc.png example %}

7.执行恶意程序

  如果受害者机器上存在avsvc进程则直接退出程序,等待计划任务触发时执行恶意程序。在其他情况下,shellcode会创建注册表启动项以便在受害者机器开机启动时执行恶意程序。 {% asset_img d2b34a8365e1a26496a71909c571676f.png example %}

  在注册表启动项创建成功后,还会根据是否存在进程”avp”来使用不同的方法来创建进程来绕过安全防护进程的检测。如果不存在进程”avp”,则使用使用CreateProcess来执行释放的恶意文件。 {% asset_img 92228ada2544331ac83aedcfffb676d4.png example %}

  如果存在进程”avp”则开启shutdown权限,发送HARDERROR_MSG消息使受害者机器触发蓝屏,然后等待受害者系统启动时执行释放的恶意程序。 {% asset_img 9987726547038d4561170819da9a3a31.png example %}

3.Bannew木马

数据加密

  在以往版本的Banner木马中,与C&C通信时使用的加密算法为AES-CBC-128,这次发现的样本开始使用更为轻量的RC4加密算法来对通信数据进行加密。部分字段在使用RC4加密后还会采用Base64对其进行编码。 {% asset_img 2210c31394a86eb5199a5ac7e6c8a5b2.png example %}

泄露数据

  使用工具nslookup来查询受害者机器的外网IP地址。 {% asset_img 5faa91db7100178e591eb5ee4d73f092.png example %}

  使用函数GetUserName获取受害者机器当前用户。 {% asset_img 1d11009121cc757b63c940c464a490d3.png example %}

  使用powershell命令获取受害者机器上所有已安装的服务,并将结果保存到文件RTYgjfdg.sys中。 {% asset_img a2210c88d1a10accab670d8e8085b37b.png example %}

  通过命令tasklist获取操作系统正在运行的所有进程信息,命令执行后输出的数据同样保存到文件RTYgjfdg.sys中。 {% asset_img 11c5a02b116513169ebb6e1a320737ef.png example %}

  从注册表中获取在受害者机器上所有已安装的软件,同样将结果写入RTYgjfdg.sys。 {% asset_img 832cacad6ec58e7db1f8601efd1d39ef.png example %}

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”文件。 {% asset_img 918004f9dfba24d06106c5e52e52c41e.png example %}

  恶意程序上传文件时采用分段上传,每次最多上传0x400字节大小的文件数据,其中文件大小和文件名加密后分别作为参数传递给post请求的字段fsize和fname。 {% asset_img 0f3af2e44c0d1feb831fba96730dc9c2.png example %}

  将文件数据base64编码后作为字段fdata的参数,分段上传时post的字段fdata对应不同段的文件数据,其他字段保持不变,其中fcat的值为”10”,表示该上传的文件主要用于保存从受害者机器上泄露的系统信息。 {% asset_img ec1394a1052e9714d9d2191cb22910ce.png example %}

  文件上传完成后,发送文件上传成功的请求并将文件删除,字段fdata的值为”done”的base64值,字段flag值为done,其他参数保持不变, {% asset_img d8d070c10c438ee2033c80164822fc81.png example %}

5.键盘记录

  恶意程序在每一次将上线包发送到C&C服务器后,开始执行C&C指令前创建一个新的线程来实现键盘记录功能,记录的信息保存到临时目录下的文件”atapi.sys”中。   与一般的键盘记录不同,恶意程序采用循环遍历每一种vkey,使用函数GetAsyncKeyState来判断vkey是否被按下,当该函数返回值为0x8001时表示vkey对应的按键被按下,接着检测对应的按键是否在需要记录的范围内,比如功能键F1~F12之类的按键就恶意程序就不会记录并写入到文件。 {% asset_img 99f9ee0e443ddab2aff27be231c66ba5.png example %}

  恶意程序记录并写入到文件的vkey键值包括0~9的数字、a~z和A~Z的字符,还有shift、caplock和ctlr按键。其中特殊按键使用格式”#{键名}#”的形式写入到文件中。 {% asset_img b22913d7d35a00ddb673a7944af4efb3.png example %}

键盘记录支持的特殊键如下表:

键名 描述
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指令。 {% asset_img dd1a80ebf4e526f8e846e5e2ed4b78fb.png example %}

恶意程序使用的所有C&C指令如下表:

C&C指令 描述
2 屏幕截图
3 退出当前执行的指令,等待C&C服务器下发指令
1 收集文件信息
5 创建文件
6 上传键盘记录文件
7 执行远程shell

7.屏幕截图

  获取当前屏幕的大小,并计算左上、左下、右上和右下的坐标,在函数Create_SceenSnap对计算出的坐标范围内的屏幕截图。 {% asset_img bb7a0ec21a00ae484cdacbfbb5c3f6cb.png example %}

  创建Bitmap对象,然后调用函数GdipSaveImageToFile将Bitmap对象保存为JPG格式的图片文件,保存的图片文件保存在临时目录下的s.sys文件。 {% asset_img b7d411b77e10ef3dfeabebeff7539a49.png example %}

  创建屏幕截图成功需要将图片文件加密后上传到C&C服务器上,上传屏幕截图图片时与上传键盘记录数据相似,其中字段fname固定为tprk.enc使用RC4加密后的值;同样使用分段上传,每次上传0x5000字节的数据,所有分段上传完成后发送上传成功的post请求。 {% asset_img 686e2c733c752db155e6accf625b2e35.png example %}

8.收集文件信息

  调用FindFIrstFileW和FindNextFileW遍历指定目录下所有的文件,并将其文件名写入临时目录的的文件__TDSYU。与上传屏幕截图发送的post请求类似,分段上传时每段的大小为0x4000字节大小。 {% asset_img e7288ddb36c55449a50128e1a530b46c.png example %}

9.远程shell执行

  恶意程序要执行的命令shell命令由C&C服务器下发,当执行的命令为cd使用,调用函数SetCurrentDirectoryW将cd命令的参数设置为当前进程的工作目录。 {% asset_img 148c0fddea76918aa214a0eb1de7b96a.png example %}

  为其他指令时,调用_popen执行命令。 {% asset_img ea74c00790790314864a539a6cb74202.png example %}

10.下载文件并执行

  C&C服务器下发文件下载链接,恶意程序下载该文件并保存到临时目录下,保存文件名为“TGJdbkds.exe”,随后调用函数CreateProcessA执行该文件。 {% asset_img a1abf87a5a28e8b7e9fe04668d2b774d.png example %}

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. 参考

https://ti.qianxin.com/blog/articles/analysis-of-the-attack-activities-of-patchwork-using-the-documents-of-relevant-government-agencies-in-pakistan-as-bait/

更多文章