1. 概述
摩诃草(360安全),别名白象(安天)、Patchwork(Cymmetria)、Dropping Elephant(Kaspersky)、Chinastrats(Kaspersky)、APT-C-09(360)、Monsoon(Forcepoint)、Quilted Tiger(CrowdStrike)、ATK 11(Thales)、ZINC EMERSON、Hangover(PaloAltoNetworks)、Neon(PaloAltoNetworks)、APT-Q-36(奇安信)、Viceroy Tiger(PaloAltoNetworks)。
摩诃草于2013年被首次发现,其最早攻击活动可以追溯到2009年11月。虽然该组织没有被明确地归属,但间接证据表明,该组织可能来自印度或印度实体。与外交和政府机构相关的行业是该组织的攻击目标。该组织使用的大部分代码都是从网上论坛复制粘贴的,所以命名为Patchwork。从2015年开始变得更加活跃,2018年3月和4月,该组织还针对美国智库组织进行了网络钓鱼攻击。摩诃草主要针对Windows系统进行攻击,同时也会针对Android、Mac OS系统进行攻击。其攻击活动中使用了大量漏洞,其中至少包括一次 0day 漏洞利用攻击。
摩诃草组织攻击目标所涉及的国家和地区分布非常广泛,除了中国和巴基斯坦等主要目标,还包括以色列、日本、中东、英国、美国、韩国、孟加拉国、斯里兰卡以及中东和东南亚地区。该组织以鱼叉攻击为主,以少量水坑攻击为辅,针对目标国家的航空、国防、能源、金融、政府、IT、媒体、非政府组织、制药、智库进行网络间谍活动,窃取敏感信息。
白泽安全实验室在对日常APT狩猎中发现的摩诃草样本梳理的时候,发现其使用的BADNEWS样本在2023年1月份上传到VT的一个样本,如图2-1所示。这是继2022年6月奇安信发布的《摩诃草组织以巴基斯坦相关政府机构文件为诱饵的攻击活动分析》、本实验室2022年10月24日完成《摩诃草组织最新BADNEWS木马变种分析报告》,以及2022年10月27日奇安信的《APT-Q-36:南亚摩诃草组织近期武器库迭代更新分析》后再次更新的一个版本。如图1-1所示。
图 1-1 2023年1月份BADNEWS样本
本次分析的样本较之前的版本有如下特点:
与22年10月样本相比,整体执行逻辑、加密算法、通信协议无变化;
22年6月份样本为一个仓促版本,其中有多处逻辑不严谨,造成代码运行出现异常;
22年10月份样本修复了部分错误,通信中依旧留有固定错误;
23年1月份样本修改了部分指令;
2. BADNEWS木马对比分析
2.1 样本基本信息
表2-1 样本基本信息
2.2 样本执行流程
图 2-1 样本执行流程
如图 2-1所示,木马启动后首先检查当前系统的时区是否为目标首都标准时间(样本中检查的都为巴基斯坦时区),否则结束运行。
2.3 收集信息功能分析
当木马启动后,首先使用管道以无回显的方式隐蔽执行cmd命令,如图2-2所示,收集目标计算机的基本运行信息,并写入到%AppData%LocalTempRTYgjfdg.sys文件中,如图 2-3所示,收集的具体内容和使用的指令如表2-2所示。使用的文件名“RTYgjfdg.sys”与22年6月、10月样本完全一致。
图 2-2 使用管道隐蔽执行指令
图 2-3 RTYgjfdg.sys文件内容
表 2-2 收集信息的内容和使用的指令
值得一提的是,根据样本中出现的字符串,在收集系统信息时,收集安装包信息使用的完整指令应该为“wmic product get name 2>&1”。但是样本在调用执行指令的函数时未有效传入参数,造成实际指令为“e 2>&1”,如图2-4和图2-5所示。样本中收集其它信息时都传入了正确的参数,以收集网卡信息指令为例,如图2-6所示。
图 2-4 木马开发中存在的错误函数调用
图 2-5 错误的指令结果
图 2-6 木马正确执行指令时的函数调用
摩诃草组织也被命名为Patchwork,以大量拷贝和利用开源代码来开发工具著称。因此,分析人员猜测负责BADNEWS木马开发的人员未对开源代码做细致修改,也未对样本进行充分测试就投入了使用。
2.4 木马功能和指令码
此次分析的样本与之前各厂商报告中提到BADNEWS木马功能基本一致,仅仅修改了指令码为5的指令功能。指令码和对应功能如表2-3所示。
表 2-3 BADNEWS指令码和功能
2.5 通信协议分析
2.5.1 通信过程分段分析
木马完成基本信息的收集后,就会与C2通信。本次样本依旧使用HTTP与域名为bingoplant[.]live的C2进行通信。通信具体使用的URI与以往BADNEWS样本相似,都使用了非常长且看似无意义的路径名称,并且这些URI路径都不是通过配置加载,而是硬编码在代码中,如图2-7所示。
图 2-7 通信使用的URL
根据通信逻辑和具体传输数据的作用,可以将木马与C2的通信过程划分为三个阶段:上线通知—>上线结束—>心跳维持。
1、上线通知
木马的上线通知中发送的信息为收集到的受害机基本信息文件“RTYgjfdg.sys”,数据经过AES-CBC-128加密再进行Base64编码后发送到C2。示例数据如图2-8所示。
图 2-8 上线通信内容
上线通信内容由uuid、收集到的数据以及一些固定取值的字段组合而成,其中具有固定取值的字段如图2-9所示。
图2-9 上线通信中的固定字段
2、上线结束
上线数据发送完毕后,木马会专门发送一个上线结束的数据包,如图2-10所示。数据包中包含的字符串“ZG9uZQ==”是“done”经过Base64编码后的结果,如图2-11所示。此外,上线结束包还包含一个固定的取值的字段“olmn=huik”如图2-12所示。
图 2-10 发送done 用于通知上线数据发送完毕
图2-11 done的Base64编码结果
图2-12 硬编码的上线结束标志
3、心跳维持
上线数据发送完毕后,木马样本与以往BADNEWS木马操作流程一致,将进入心跳维持及接收指令分发和执行具体功能的阶段。木马会首先通过访问第三方服务(myexternalip.com)获取受害机的外网IP,如图2-13所示。该第三方服务是托管在Google上的一个专门获取外网IP的网站,如图2-14所示。当网络或服务出现问题时,木马将无法从第三方服务页面获取到受害机的外网IP。
图 2-13 获取受害机外网IP的流程
图2-14 第三方获取外网IP服务
心跳包的具体内容如图2-15所示。需要说明的是字段“SL”指示的是外网IP地址,当无法从第三方服务获取外网IP地址时,其字段取值将固定为“iXqPW+TBw16qYnKAFkByrg==”。字段“qcsnry”的内容“8e++MknuYQKU0S15hAX0lw==”来源为一个字符“1”经过Base64编码、AES加密、Base64编码后再使用“_”替换掉“+”的结果。请求头“User-Agent”字段的内容为:“E6 BD 8D E6 A5 BA E6 B1 AC E2 BD A1 E2 B8 B5 30”,其来源为调用InternetOpenW函数传入了错误的参数造成的,具体成因将在第4节进行讨论。
图2-15 心跳数据包内容
2.5.2 全部通信字段和含义
表2-4 样本通信中全部字段含义
2.6 加密解密流程及算法分析
此次分析的样本在发送数据前通常会把数据进行多次加密,具体加密流程为,首先使用Base64对内容进行编码,再使用AES算法进行加密,之后把AES加密后的数据再次进行Base64编码发送。接收到数据后执行相反的流程,首先将内容先进行Base64解码操作,再使用AES解密,最后使用Base64再次解码,还原出真实的内容,如图2-16所示。
图 2-16 数据包加密解密过程
1、简单异或算法
此次分析的样本对少量字符串使用了简单异或加密算法,比如“POST”使用的就是对0xA进行异或解密得到,如图2-17所示。
图2-17 简单异或加解密算法
2、AES加密解密算法
研究人员通过对此次样本的分析,发现BADNEWS的木马开发者使用了CryptoPP(https://github.com/weidai11/cryptopp)开源加密库中的AES-CBC-128加密算法,加密使用的KEY为字符串“b14ca5898a4e4133bbce2ea2315a191”,IV值为“1234567891234567”,如图2-18所示。
图 2-18 AES加密算法
根据以往各大安全厂商对摩诃草组织的研究,此次摩诃草在攻击中又再次使用了AES加密算法。与以往报告中提出的“放弃AES,转向使用轻便的RC4加密算法”不太相符,分析人员认为木马开发者可能在做更多免杀尝试,在以后的攻击中,很可能会交替使用这两种甚至更多种类的加密算法。
3. BADNEWS变种分析
历史BADNEWS样本分析
本次分析的样本与在22年10月底捕获到的样本基本一致,与2022年6月奇安信报告中披露的BADNEWS木马样本有很多相似之处,其具体的异同如下。
整体运行逻辑基本一致,只不过22年6月份的样本没有判断受害机所在时区,应该为通用攻击样本,如图 3-1所示。
图 3-1 此次样本与22年6月份样本执行流程
两者运行时的功能和指令多数一致,不同的是22年10月样本分析的木马样本新增了指令“8”,功能为从指定URL下载dll文件并保存,23年1月份木马修改了指令5。
两者运行时收集信息、键盘记录文件、运行日志文件使用的路径一致,均为为“Temp”目录,文件名几乎一致,区别为22年6月份样本键盘记录信息不记录时间和窗口信息;23年1月样本使用的文件名与22年10月样本一致。各功能及指令创建使用的文件具体如表3-1所示。
表 3-1 木马使用的文件名总览
此次分析的样本与去年6月份样本下发的指令格式一致,为“‘指令编号(最多两个字符)’[+‘指令内容’+‘|’]”,如收集指定目录文件列表的指令为:“1 c:windowssystem32|”,屏幕截图的指令为“2”。
两者的加密和解密流程存在一些区别,去年6月份样本中在上线通信中对部分字段值使用了RC4加密(比如uuid值),而部分字段值先通过RC4进行加密再使用Base64进行编码(比如收集信息的文件大小);心跳通信过程中,对要发送的数据仅对字段值进行了RC4加密,在收到远程指令后只对指令进行了RC4解密,而本次分析的样本却进行了Base64、AES、Base64多次加密解密过程。需要说明的是,去年6月份样本中由C2下发的命令,在经过RC4解密后有可能会丢失最后一个“|”符号,导致一个内存访问异常,样本将会终止运行。如控制端传来的指令为“1 c:windows|”时,加密内容为十六进制值“886c6c615b756e6a879f344700”。RC4解密函数并没有传入待解密缓冲区的长度,而是在RC4解密函数内部使用strlen求缓冲区的长度。这样就错误的将buffer当做字符串使用,获取buffer长度时,将“0x00”作为字符串结尾,导致解密结果将会丢失原文结尾处的“|”,研究人员猜测这应该也是摩诃草放弃使用RC4又用回AES算法的原因,如图3-4和图3-5所示。
图3-4 RC4解密出现的BUG
图3-5 RC4字符串解密函数对输入缓冲区当作了字符串
去年6月份的样本中除了API传参错误和RC4解密错误外,也存在着逻辑错误,比如指令4 从指定URL下载exe到本地执行时,无论是否下载成功都会为“TGJdbkds.exe”创建一次进程。当然,这种错误不会影响木马的后续运行,如图3-6所示。
图3-6 6月份样本存在的逻辑错误
去年6月份BADNEWS木马与此次分析的木马在数据包格式上大致相同,不同的是,去年6月份的样本的参数名都使用了明文字段,而本次分析的样本使用的是看似无规律的字段,对比如表3-2所示。根据各字段的对比,研究人员暂未发现客户端生成木马时使用了什么样的加密算法将明文字段进行了变化,不过根据其长度和大小写来看,应该是使用了对称加密算法。根据数据包中体现出来的内容,有三组键值对疑似相同,分别为键“fact”与键“ghjk”疑似相同,键“zqxwce”与键“Status”疑似相同、键“flag”与键“olmn”疑似相同,如图3-7所示。
表 3-2 对比通信数据各含义的字段在不同样本中使用的键
图3-7 两次样本中疑似相同的键值对
两者在收集受害机信息使用的指令几乎一致,都是使用了匿名管道无回显的方式执行PowerShell命令或cmd命令,不过去年6月份样本在搜集软件安装信息时使用的查询注册表的方式,而本次分析的使用了wmic命令,并且在此次分析的样本中增加了三条收集的信息,分别是网卡信息、服务信息和系统信息,如表3-3所示,这表明摩诃草组织还在积极的开发和完善着BADNEWS木马。
表3-3 收集信息使用的指令对比
4. 木马开发者技术功底分析
研究人员在对样本进行分析过程中,发现代码中存在非常多的错误之处,这些错误让研究人员在分析过程中曾一度陷入死胡同,不得不说“拿来我用”这种做法实在是不可取。
1、错误的参数传递
除了在2.3节提到的给指令执行函数错误传参这种低级BUG外,还有一处在InternetOpenW函数调用时传递了错误的参数造成了2.5.1节中心跳数据包中的固定请求头“User-Agent”。分析人员猜测木马开发者使用了指针对参数进行了强制类型转换,实验代码和测试结果如图4-1所示。
图 4-1 异常“User-Agent”验证测试
根据研究人员对InternetOpenW的分析,其参数需要一个宽字符版的szAgent,但是木马传递的却是多字节的szAgent,如图4-2所示。这样导致在函数内部调用WideCharToMultiByte函数对传入的szAgent参数转换时发生错误,出现使用默认字符串进行替换的结果,如图4-3所示。这样就出现了2.5.1节中心跳包中固定的“User-Agent”请求头内容。
图 4-2 InternetOpenW调用时的错误参数传递
图 4-3 InternetOpenW函数代码片断
2、逻辑错误
在心跳通信过程中,木马样本每次在请求C2服务器时会休眠1秒。但是当函数InternetReadFile执行失败后,代码执行流程会进入休眠2秒的无限循环中。虽然这种情况发生的概率很低,但是如果一旦网络突然出现中断,木马将处于无限循环不工作状态,这应该也是木马开发者因未充分测试留下的BUG,如图4-4所示。
图 4-4 执行流程中隐含的BUG
3、未模块化设计的功能函数
木马样本在上线信息发送完毕用后,只使用了一个函数来完成所有剩下的所有功能(创建收集信息线程,获取外网IP,获取用户名,发送心跳包,接收指令,指令分发),如图4-5所示。这种未经过模块化设计的代码中使用了非常多的局部变量,着实让分析人员在分析过程中倍感焦虑,分析人员猜测如果不是开发者刻意与分析人员进行对抗,那么这种未经过模块化设计的函数只能表明木马开发者技术功底有限。
图 4-5 木马后续功能全部在一个函数内实现
4、无处不在的重复使用局部变量
分析人员在对样本分析过程中使用IDA备注完一处局部变量名后,在后文中发现该局部变量又被用作其它用途。导致在分析过程中,需要不断添加注释的来标注变量的最新作用。这种操作如果不是开发者在与IDA以及分析人员对抗的话,就是使用了大量的多级指针存储和操作局部变量,如图 4-6所示。
图 4-6 局部变量重复使用,疑为多级指针
5、一个“零”引发的心跳特征
在通过第三方服务获取外网IP时,由于没有加入延时设置(此次也是代码逻辑错误),当第三方服务提供的外网IP获取失败,会神奇的出现一个固定心跳特征“SL= iXqPW+TBw16qYnKAFkByrg==”。根据研究人员对代码的深入分析,开发者在对一个局部变量置0的操作中,把应该对四个字节置0的代码写成了对一个字节置0,从而导致后续代码将指针指向一个字符串“is cipher mode”的地址,如图 4-7所示。
通过对这个字符串的来源进行跟踪,研究人员发现,这个字符串完整的内容应该为“CipherModeBase: feedback size cannot be specified for this cipher mode”,而这个字符串正是CryptoPP开源加密库代码中的字符串。
图 4-7 一个“零”造成的字符串错误
需要指出的是,即使上述问题不存在,AES加密函数内部也会检查能否对深入的内存数据进行加密,如果不能加密则返回一个16字节的固定值“89 7A 8F 5B E4 C1 C3 5E AA 62 72 80 16 40 72 AE”。对这16字节内容进行Base64编码就将会是固定心跳特征“iXqPW+TBw16qYnKAFkByrg==”。
6、木马开发者的信息
木马样本一开始就使用ShowWindow函数来对控制台窗口进行隐藏。分析研究人员修改API的传入参数后发现,该样本的开发人员在开发时使用控制台输出的调试信息的方式来指示代码的执行进度。如图4-8所示.。在收集数据发送的阶段还很“贴心”的输出了域名,发送完毕会输出一个“…end…”,这为分析人员的掌握代码的整体运行逻辑提供了极大方便。
图 4-8 开发者输出的调试信息
5. 总结
摩诃草组织是一个长期针对巴基斯坦、中国等目标发起攻击活动。其通常使用社会工程学、鱼叉邮件、水坑攻击等手段投递恶意软件。在此次对样本的分析及追溯中可以看出该组织木马开发者能力有限,武器库不经常变化,拥有明显的攻击战术方案、一般的技术能力以及详细的操作过程,算是一个攻击能力一般但仍在不断进步完善的APT团伙。2023年年初我们已经捕获了疑似摩诃草组织BADNEWS新样本的情况,其使用的是HTTPS协议。除了代码执行逻辑上算是同源外,其余几乎进行了重写,我们猜测如果项目进行重写的话,其有可能自此不再更新HTTP通信的BADNEWS了。白泽实验室也将重点关注摩诃组织的最新动向。
6. IOCs
样本MD5:
3573fb365cb90f54324ed47ed2bfdfdb
729dd4604fda4b19146d8f33509a43f6
84f41114b0b9cbd4fd809dcef586e923
C2域名/IP:
housingpanel[.]info
dayspringdesk[.]xyz
bingoplant[.]live
恶意URL:
http[:]//housingpanel.info/vwnykzjzy2si478c7a2w/terncpx8yr2ufvisgd2j/x8jb9g97kkexor5ihnbq/d91ng62l00hc4vgaxkf.php
http[:]//dayspringdesk.xyz/wfgkl/cvrkaf/xkj/test.php
http[:]//bingoplant.live/vwnykzjzy2si478c7a2w/terncpx8yr2ufvisgd2j/x8jb9g97kkexor5ihnbq/d91ng62l00hc4vgaxkf.php
转载来源:https://mp.weixin.qq.com/s/IOBCV0hUVjFUrEbbYnRW-w
图片来源网络侵权可联系删除