概述

由于golang的跨平台性,以及golang框架的复杂性所带来的免杀效果,现在越来越多的攻击者/红队开始使用golang开发恶意样本,这里做一个小结,记录下

此文章总结了hvv期间攻击者利用golang加载cs的一些样本,故也可以称之为“CobaltStrike的多种加载方式”

样本分析

golang反调试

还原golang符号之后,在main_main入口的地方看到有一个main_sandbox_CheckForPass函数,很明显这是一个检测虚拟环境的函数。
image.png

该函数里面的第一个函数checkThreadBook疑似判断是否在微步沙箱中:
image.png

此外,程序还有可能进行CPU检查、内存检测、启动检测、启动时间检测等
image.png

若经过检测代码运行在虚拟环境中,程序则会直接退出:
image.png

手动调试之后,将这个验证过掉,然后F9运行,同时监控该文件行为
image.png

程序在tmp目录下释放并加载了两个PE,其中_install.exe是恶意模块,TencentMeeting是带有签名的正常腾讯会议安装包。
image.png

程序加载恶意模块的时候同时会启动腾讯会议的安装包以迷惑用户:
image.png

恶意模块依旧由golang编译而成,和第一层的Dropper类似,该组件执行时也会先进行虚拟环境检测:
image.png

接着解码一段base64的数据得到后续的shellcode
image.png

重新开辟内存空间,并将解密之后的shellcode拷贝过去:
image.png

解密后的shellcode是CobaltStrike的远控模块,直接尝试在shellcode头部设置执行断点,成功命中:
image.png

开辟内存空间,填充shellcode之后修改该片内存的可执行属性
image.png

解密多个C2循环请求
image.png

关于CobaltStrike远控模块的详细分析,可以参考笔者之前的文章

golang加载CS

087b3490d320adb9d719139dd521e934
WeChat1.exe

原始样本由golang编写,样本运行后,首先将会解析并请求一个干净的地址:http://www.shibor.org/shibor/web/DataService.jsp 以判断网络是否连通:
hvv样本总结分析-golang篇 - 图14

循环请求该地址,直到请求成功才会跳转到后面执行:
hvv样本总结分析-golang篇 - 图15

若请求成功,程序则会将预定义的base64字符串作为参数传递到main_build中,并且在该函数中解码加载该段base64字符串
hvv样本总结分析-golang篇 - 图16

解码之后的shellcode由CobaltStrike生成,请求C2:www.microport.com
hvv样本总结分析-golang篇 - 图17
hvv样本总结分析-golang篇 - 图18

golang白加黑

23aaa6e9c289f61737e12671c70a098a
五一劳动节职工福利名单(1)(1).zip

一个比较经典的golang加载器,原始程序为压缩包,内含了一个exe文件和两个”jpg”文件,且在hvv一开始,就同时被传到了微步和vt,可以说是打响了hvv的第一枪。
image.png

压缩包解压之后可见exe文件还仿冒了WORD图标
image.png

通过十六进制查看工具可知这里的两个jpg文件实则都是PE文件
image.png

五一劳动节职工福利名单.exe运行之后,首先会判断 c:/windows/tapi/crashreport.dll 是否存在,若存在则说明已经感染,若不存在,则会分别将当前目录的name.jpg和name2.jpg拷贝为yyexternal.exe和crashreport.dll
image.png

通过搜索引擎可知yyexternal.exe为YY客户端程序,这里很明显是一个白加黑的执行逻辑
image.png
程序在将文件拷贝到tapi目录下并重命名之后,则会加载yyexternal.exe,由该程序去调用恶意dll
image.png

在白exe加载该恶意dll时,会调用名为 InitBugReport 的导出函数:
image.png

在InitBugReport函数中,首先会从byte_100277A8开始的地方,步长为4取值赋值给esi所指的内存,取出来的数据总长度为0x0f97
image.png

将待解密的数据取出来之后,程序将会对前0x7cc的数据进行异或计算,然后开辟一个7cc的内存空间,将解密之后的shellcode拷贝过去,最后通过call eax的方式加载到shellcode中执行。
image.png

调试器加载YY主程序,并直接对LoadLibrary设置断点,找到加载crashreport.dll的地方
image.png

返回回来找到InitBugReport函数的入口点并F7进入
image.png
成功解密shellcode,这里可以看出来是CobaltStrike的shellcode
image.png

连接C2并尝试从C2下载后续cs远控组件实现对用户主机的完全控制。
image.png

golang硬编码

c54eb668cf76a37bf28f95c173770adf
skylarinst-winc(10.199.1.19_80).exe

样本最早由4月2日上传到微步社区,应该属于hvv开始前的试探
image.png

此样本依旧由golang编写,逻辑较为简单,在入口点,程序会将rdata段的部分数据拷贝过来,将其转换为byte之后再格式化为hex数据
image.png

拷贝过去的数据其实就是cs payload的hex形式,攻击者将其编码为了字符串并存储在文件中以躲避检测
image.png

直接将这部分数据拷贝出来解码即可到的完整的cs shellcode,并且在末尾看到C2:149.248.18.93
image.png

hvv样本总结分析-golang篇 - 图36

虽然该样本比较简单,但是根据微步的信息,可知样本最开始上传到VT的时候,报毒是很少的。

笔者根据cs的加载方式,关联到了一个类似的恶意样本:131e4a3511e4e8e5f9436da4d45484d6
image.png

不同的是,此样本用了阿里云的cdn进行通信,暂时无法确定此类加载是统一框架生成还是同一个攻击者/队伍使用
1745003471876288.cn-hangzhou.fc.aliyuncs.com
image.png