一、概述
近日,天穹沙箱在日常样本狩猎时发现一个针对某集团的钓鱼样本,该样本经天穹沙箱综合判定为CobaltStrike家族。在针对CobaltStrike样本进行分析时,天穹沙箱的提取模块并未成功获取到该样本的威胁配置信息。尽管天穹沙箱在之前已经针对各种魔改的Beacon和Stager进行了适配,但该样本成功绕过了提取模块的扫描机制。在排除了内存转储等可能引起问题的因素后,可以初步确定该样本加载了经过深度魔改的Beacon。
样本的深度魔改手法引起了星图分析人员极大的兴趣,因为它显示出攻击者对CobaltStrike的定制和改进能力。深度魔改后的Beacon可能具有更高的隐蔽性和抗检测性,使其更难以被传统安全防御机制所察觉。这意味着攻击者可以更有效地在目标系统上执行恶意活动,并持续保持对受感染系统的控制。
为了更好地理解该样本的魔改手法,我们从代码结构、行为特征和使用的技术等方面进行研究分析。这将有助于揭示攻击者的策略、目的以及可能的后续行动,为防御人员提供更有效的应对措施和安全建议。
二、样本信息
样本的基本信息如下:
- SHA1:5a00bd57de75430d129d84584f3b7cad9fbb145c
- 文件名:****-纪查〔2023〕188号-通知及组件-1.zip
- 文件类型:zip
- 文件大小:2.47 MB
三、样本分析
1. 样本投递
天穹沙箱开箱即用,只需将样本拖进投递窗口,等待报告结果即可。
2. 静态分析
该样本是一个zip格式的压缩包,包含两个文件:
- ****-纪查〔2023〕188号-协助人员安装组件.exe
- 个人协助调查通知.docx
通过查看报告的完全解压列表,可以看到压缩包两个文件分别为危险和安全:其中****-纪查〔2023〕188号-协助人员安装组件.exe
为64位的高危可执行程序,个人协助调查通知.docx
为安全文件。
3. 木马分析
3.1 沙箱报告
通过查看天穹沙箱报告,压缩包解压的PE文件使用了Windows 7 64位 分析环境,经过多维度检测引擎鉴定,样本被判定为恶意;通过查看标签信息,静态引擎识别样本为木马,网络行为亦捕获到了CobaltStrike的HTTP通信流量。同时,天穹沙箱为用户提供了恶意样本威胁处置建议。其中,网络行为标签如下:
- Targeted Malicious Activity was Detected(检测到有针对性的恶意活动)
- Domain Observed Used for C2 Detected(检测到C2主机)
- CobaltStrike
进一步,查看网络流量威胁检测,可以看到C2部分显示服务101[.]35[.]172[.]163:8080
为CobaltStrike,此信息来源于沙箱C2主动探测,该功能会探测样本访问的可疑主机,并分析该主机家族等信息。
IDS部分则匹配到了两条流量规则,分别为CobaltStrike HTTP beacon url
和ET MALWARE Cobalt Strike Beacon Observed
,两条规则表示匹配到CobaltStrike Beacon常用url和Beacon通信流量特征,由此可定性样本为CobaltStrike。
3.2 人工分析
使用DIE检测该可执行文件,显示为Go语言编写:
同时该文件的编译信息和符号信息被全部抹除,字符串被完全混淆:
通过调试发现,此程序实际是一个ShellcodeRunner,其加载shellcode流程如下:
- 调用VirtualAlloc分配内存,并设置内存属性为可执行
- 拷贝Shellcode到内存
- 调用CreateThread创建子线程执行Shellcode
- 调用WaitForSingleObject等待线程结束
Dump内存中的Shellcode,会得到一个DLL文件:
通过文件头("MZARU"
)可以发现,这明显是一个Beacon RAW文件,这便是魔改后的Beacon,接下来我们会重点分析魔改手法:
3.3 魔改手法分析
Beacon的威胁配置提取实际主要依赖于Beacon的config数据,该数据通常存储于栈上,固定长度为4096字节,为了防止被静态规则扫描,因此Beacon会对此数据加密,加密方式为单字节异或加密,对于4.x版本的CobaltStrike,该值固定为0x2e,而3.x为0x69,加密算法类似以下形式:
for (i = 0; i < 4096; i++) {
byte_config[i] ^= 0x2e;
}
显然,若秘钥固定,则意味着每次config加密结果相同,那么加密将形同虚设,因此魔改手法之一即是修改异或秘钥,此样本不仅修改了秘钥,还连续异或了两次,然而位运算的知识告诉我们,异或两数等价于异或一数,因此该样本同时异或0xC3和0xD9,实际等价于异或0x1A:
而配置提取模块针对此手法早已使用秘钥爆破手段应对,在之前的HVV中魔改秘钥的样本层出不穷,但都能成功提取配置,显然还有别的魔改手段。
接着对解密后的config数据进行Dump,在正常情况下,config特征头为00 01 00 01 00 02
,这也是用于判断秘钥是否爆破成功的依据,但此样本的config却以00 65 00 07 00 02
开头,这与常规config文件完全不同,继续比对后面的数据,也与常规config差异巨大:
Beacon config数据结构实际是经过严格设计,每段数据都会对应字段,该字段用于控制beacon中的各项参数。每段数据以pos+datatype+len+data
构成,即符合以下结构:
{
int16_t pos;
int16_t datatype;
int16_t len;
int8_t data[len]; // 实际数据,长度由len决定
}
变量含义如下:
- pos:映射的字段,例如1对应BeaconType,2对应Port等
- datatype:数据类型,0对应TYPE_NONE,1对应TYPE_SHORT,2对应TYPE_INT,3对应TYPE_STR
- len:数据长度
- data:数据,长度由len决定,含义由对应字段决定,例如字段为BeaconType时,data=0表示值为HTTP
以00 01 00 01 00 02 00 00
为例,解析后则表示BeaconType=HTTP
, 具体内容如下:
- pos [00 01]: 1,即BeaconType
- datatype [00 01]: 1,即TYPE_SHORT
- len [00 02]: 2,即len=2
- data [00 00]: 0,即HTTP
有关完整的pos、datatype等映射关系,请参见CobaltStrikeParser项目中的BeaconSettings
类,该项目已对Beacon配置信息字段进行了完整的逆向:
再回到魔改的config数据,与普通config数据对比差异:
00 |01| 00 |01| 00 02 00 00 ; 普通config数据
00 |65| 00 |07| 00 02 00 00 ; 魔改config数据
观察到pos和datatype数据发生变化,这是否意味着样本作者魔改了pos和datatype的值,即将原本的pos值统一加0x64,将原本的datatype统一加0x6?我们接着对比下一组数据:
00 |02| 00 |01| 00 02 1F 90 ; 普通config数据
00 |66| 00 |07| 00 02 1F 90 ; 魔改config数据
这两段数据是用来设置Port=8080
,观察后发现仍是pos和datatype数据发生变化,而此时魔改pos=普通pos+0x64
,差值仍为0x64,由此我们确定作者正是魔改了pos和datatype宏定义值。
原始pos和修改后的对应关系如下:
- BeaconType: 0x1 → 0x65
- Port: 0x2 → 0x66
- SleepTime: 0x3 → 0x67
- …
原始datatype与修改后的对应关系如下:
- TYPE_NONE: 0x0 → 0x6
- TYPE_SHORT: 0x1 → 0x7
- TYPE_INT: 0x2 → 0x8
- TYPE_STR: 0x3 → 0x9
此魔改方法的优点是破坏了原本的值映射关系,让特征码和配置提取功能失效,但同时又无需修改Beacon代码结构,仅需要修改pos和datatype宏定义值,堪称绝妙。
随后天穹沙箱立刻对配置提取模块进行了升级,并顺利拿到了该样本的配置信息:
{
"Family": "CobaltStrike",
"BeaconType": "HTTP",
"Port": 8080,
"SleepTime": 60000,
"MaxGetSize": 1048576,
"Jitter": 0,
"MaxDNS": "Not Found",
"PublicKey": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCBnnH1pOhGZGLsKd8anYkXxhRScID6ZQyLCvEcLzV5VZV1vy9BKPZgv97yf4YjX+z7RHaZHsHqAbrAVIyu+4hvkfpRlz5CYh6wbaZigkgdUyRi+sNnCfszv/1LdNk0zKC7PfouB6MyBvnScza87ak/TwxgJfVhVOiESAeEU9H4SQIDAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"PublicKey_MD5": "db31551a18b7554733ce25bdafe69c27",
"C2Server": "101.35.172.163,/dot.gif",
"UserAgent": "Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:16.0.1) Gecko/20121011 Firefo\r",
...
3.4 C2溯源
由于此样本的魔改手法之前还未遇到过,我们对C2溯源(101.35.172[.]163),发现其自2022年11月就开始活跃:
2022/12/02的记录关联到样本5acccbc18ccd15491520b2c6ce539481
,分析发现这是一个使用CobaltStrike生成的Stager,没有任何防护:
可以看出,同为CobaltStrike家族,样本开发者从去年到今年开发水平提升明显,在二进制方面加入更多反检测技巧,想出了新的魔改手段,但在流量方面却欠缺思考,没有规避任何CS特征,最终导致被IDS检出,功亏一篑。
四、IOC
6c7d2c8cbede3b583feb2e05ad9dd291: ****-纪查〔2023〕188号-通知及组件-1.zip:
8f51910b9b4e27e45037471fec8ed7e5: ****-纪查〔2023〕188号-协助人员安装组件.exe
F6A323F7D5824399BB87CABF564745B0: 魔改Beacon RAW
101[.]35.172.163[:]8080: 样本C2
http[:]//101[.]35.172.163:8080/dot.gif: Beacon上线url
注意:截止发稿时,样本C2服务已死亡,考虑到此IP后续可能会被重复使用,请注意防护。
参考案例链接:天穹沙箱分析报告 (内部访问)
五、 技术支持与反馈
星图实验室深耕沙箱分析技术多年,致力于让沙箱更好用、更智能。做地表最强的动态分析沙箱,为每个样本分析人员提供便捷易用的分析工具,始终是我们追求的目标。各位同学在使用过程中有任何问题,欢迎联系我们。
天穹沙箱支持模拟14种CPU架构的虚拟机,环境数量50+,全面覆盖PC、服务器、智能终端、IoT设备的主流设备架构形态。在宿主机方面,除了Intel/AMD的x86架构CPU和CentOS操作系统之外,天穹沙箱支持海光、飞腾、鲲鹏等x86、ARM架构国产CPU和银河麒麟、中科方德等信创操作系统。
天穹沙箱系统以云沙箱、引擎输出、数据接口等多种形式服务于公司各个业务部门,包括天眼、终端安全、态势感知、ICG、锡安平台、安服等。
天穹内网地址(使用域账号登录):https://sandbox.qianxin-inc.cn
天穹公网地址(联系我们申请账号):https://sandbox.qianxin.com