【天穹】CobaltStrike魔改新招:针对配置数据的反检测手段

一、概述

近日,天穹沙箱在日常样本狩猎时发现一个针对某集团的钓鱼样本,该样本经天穹沙箱综合判定为CobaltStrike家族。在针对CobaltStrike样本进行分析时,天穹沙箱的提取模块并未成功获取到该样本的威胁配置信息。尽管天穹沙箱在之前已经针对各种魔改的BeaconStager进行了适配,但该样本成功绕过了提取模块的扫描机制。在排除了内存转储等可能引起问题的因素后,可以初步确定该样本加载了经过深度魔改的Beacon。

样本的深度魔改手法引起了星图分析人员极大的兴趣,因为它显示出攻击者对CobaltStrike的定制和改进能力。深度魔改后的Beacon可能具有更高的隐蔽性和抗检测性,使其更难以被传统安全防御机制所察觉。这意味着攻击者可以更有效地在目标系统上执行恶意活动,并持续保持对受感染系统的控制。

为了更好地理解该样本的魔改手法,我们从代码结构、行为特征和使用的技术等方面进行研究分析。这将有助于揭示攻击者的策略、目的以及可能的后续行动,为防御人员提供更有效的应对措施和安全建议。

二、样本信息

样本的基本信息如下:

  • SHA1:5a00bd57de75430d129d84584f3b7cad9fbb145c
  • 文件名:****-纪查〔2023〕188号-通知及组件-1.zip
  • 文件类型:zip
  • 文件大小:2.47 MB

三、样本分析

1. 样本投递

天穹沙箱开箱即用,只需将样本拖进投递窗口,等待报告结果即可。

图1 样本投递

2. 静态分析

该样本是一个zip格式的压缩包,包含两个文件:

  • ****-纪查〔2023〕188号-协助人员安装组件.exe
  • 个人协助调查通知.docx

通过查看报告的完全解压列表,可以看到压缩包两个文件分别为危险和安全:其中****-纪查〔2023〕188号-协助人员安装组件.exe为64位的高危可执行程序,个人协助调查通知.docx为安全文件。

图2 完全解压文件列表

3. 木马分析

3.1 沙箱报告

通过查看天穹沙箱报告,压缩包解压的PE文件使用了Windows 7 64位 分析环境,经过多维度检测引擎鉴定,样本被判定为恶意;通过查看标签信息,静态引擎识别样本为木马,网络行为亦捕获到了CobaltStrike的HTTP通信流量。同时,天穹沙箱为用户提供了恶意样本威胁处置建议。其中,网络行为标签如下:

  • Targeted Malicious Activity was Detected(检测到有针对性的恶意活动)
  • Domain Observed Used for C2 Detected(检测到C2主机)
  • CobaltStrike
图3 综合评价
图4 处置建议

进一步,查看网络流量威胁检测,可以看到C2部分显示服务101[.]35[.]172[.]163:8080为CobaltStrike,此信息来源于沙箱C2主动探测,该功能会探测样本访问的可疑主机,并分析该主机家族等信息。

图5 C2主动探测

IDS部分则匹配到了两条流量规则,分别为CobaltStrike HTTP beacon urlET MALWARE Cobalt Strike Beacon Observed,两条规则表示匹配到CobaltStrike Beacon常用url和Beacon通信流量特征,由此可定性样本为CobaltStrike。

图6 IDS扫描

3.2 人工分析

使用DIE检测该可执行文件,显示为Go语言编写:

图7 DIE检测

同时该文件的编译信息和符号信息被全部抹除,字符串被完全混淆:

图8 静态混淆处理

通过调试发现,此程序实际是一个ShellcodeRunner,其加载shellcode流程如下:

  1. 调用VirtualAlloc分配内存,并设置内存属性为可执行
  2. 拷贝Shellcode到内存
  3. 调用CreateThread创建子线程执行Shellcode
  4. 调用WaitForSingleObject等待线程结束

Dump内存中的Shellcode,会得到一个DLL文件:

图9 内存加载Shellcode

通过文件头("MZARU")可以发现,这明显是一个Beacon RAW文件,这便是魔改后的Beacon,接下来我们会重点分析魔改手法:

图10 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:

图11 魔改异或算法

而配置提取模块针对此手法早已使用秘钥爆破手段应对,在之前的HVV中魔改秘钥的样本层出不穷,但都能成功提取配置,显然还有别的魔改手段。

接着对解密后的config数据进行Dump,在正常情况下,config特征头为00 01 00 01 00 02,这也是用于判断秘钥是否爆破成功的依据,但此样本的config却以00 65 00 07 00 02开头,这与常规config文件完全不同,继续比对后面的数据,也与常规config差异巨大:

图12 左图为普通的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配置信息字段进行了完整的逆向:

图13 BeaconSettings

再回到魔改的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月就开始活跃:

图14 IP活动记录

2022/12/02的记录关联到样本5acccbc18ccd15491520b2c6ce539481,分析发现这是一个使用CobaltStrike生成的Stager,没有任何防护:

图15 关联样本信息

可以看出,同为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