关键词:Cobalt Strike,逃逸,后漏洞利用阶段,元数据

1. 概述

Cobalt Strike是一款商业的威胁模拟软件,可在网络中模拟一个安静的、长期嵌入的Beacon。它能与外部的服务器通信以模拟命令和控制(C2)流量。由于其多功能性,Cobalt Strike通常被红队使用,但也被攻击者广泛用于现实世界的攻击活动中。Cobalt Strike的多功能性体现于其多样化的组件,包括对发送到C2服务器的元数据进行混淆的编码算法。

攻击者或红队可以在Malleable C2配置文件中为HTTP传输定义元数据编码标准。当Cobalt Strike进行C2流量通信时,它会将元数据(有关受感染系统的信息)编码,并与HTTP请求一起发送到Cobalt Strike的TeamServer。

接下来,本文将详细介绍编码算法,描述Cobalt Strike框架中使用的编码类型的定义和差异,并涵盖一些常见的恶意攻击。具体地,演示了编码和解码算法如何在C2流量通信期间工作的,以及为什么Cobalt Strike的这种多功能性,使其难以被传统的防火墙防御。

2.元数据编码算法

Cobalt Strike支持五种编码方案。RSA加密后的元数据经过编码处理后,可以方便地在网络协议中传输。

表1 Cobalt Strike配置文件中的编码方案

Base64

Base64编码

Base64解码

Base64url

URL-safe Base64编码

URL-safe Base64解码

Mask

XOR Mask(使用随机密钥)

XOR Mask(使用随机密钥)

NetBIOS

NetBIOS +‘a’编码

NetBIOS -‘a’解码

NetBIOSU

NetBIOS+‘A’编码

NetBIOS -‘A’解码

3. Base64 编码和解码

Base64编码和解码是一种标准的RFC算法实现。下面是用于编码和解码数据的字符集列表。

[ "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "+", "/" ]

接下来解释说明Base64算法的Malleable配置文件的使用。

3.1配置文件

在发送有关被感染系统的元数据信息之前,Havex.profile使用Base64编码对其进行编码转换。如下图所示,Base64编码算法对元数据进行编码,并将编码结果放在Cookie中。

图 1 Havex配置文件中的元数据编码选项

3.2 HTTP C2流量

图2显示了由配置文件生成的HTTP C2流量。突出显示的部分是Base64编码后的有关受感染机器的元数据。

图 2使用Havex配置文件的HTTP C2流量

3.3 Base64解码

  • 很多工具都可以解码加密的元数据,比如,使用Python的Base64库来解码。图3显示了一个示例脚本,用于解码数据并以十六进制格式打印。

  • 这是脚本中的解码数据,是RSA加密后的关于被感染系统的元数据:

751990bee317e74e4f2aa6f13078ef22dd884e065b738f8373f49dee401a069d5dfd1d3e39e94cc637e21364e1fd71ab3322fb9c7a987fc6aa27dfab981f077e7ddc2f20aba8e9d841250adc4edd4d15082445869278f2bbcf66e145aa74152a22b85c9b6c5f15d69f7d8b3708b33deea7198683d6468bd0424f537617f759b5”

图 3用于解码Base64数据的Python脚本示例

4. Base64URL编码和解码

Base64URL是Base64编码算法的修改版本。其使用URL和文件名的安全字符进行编码和解码。

这是字符集:

[ "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "-", "_" ]

与标准的Base64字符集相比,修改后的版本将“+”替换为“-”,将“/”替换为“_”。填充字符“=”从编码数据中被跳过,因为它通常在URI中按百分比编码。

下面通过一个例子来介绍Base64URL算法在Malleable配置文件中的使用。

4.1配置文件

Cnnvideo_getonly.profile使用Base64URL编码来转换元数据信息。(注意,此配置文件是模拟合法CNN HTTP流量的示例,与该组织没有任何联系)图4显示了使用Base64URL编码算法对元数据进行编码并将数据附加到参数g。

图 4 CNN视频配置文件中的元数据编码

4.2 HTTP C2流量

图5显示了Beacon生成的HTTP C2流量。参数值是Base64URL编码的受害者信息元数据。

图 5使用CNN视频配置文件生成的HTTP C2流量

4.3 Base64URL解码

用户有以下选项来解码数据。

  • 用户可以将“-”替换为“+”,将“_”替换为“/”,同时添加填充字符“=”。被替换的字符串成为标准的Base64编码数据。然后可以使用任何Base64解码工具来获取解码后的元数据。

  • 使用脚本语言来完成这项工作。图6显示了用于解码数据的Python脚本。在示例中,添加了“=”以使输出与Base64编码兼容。

  • 脚本的输出是RSA加密的元数据。

“60495dff002eddaa0c409aaaae0fda592810993ae0ae319c87d62b65c54d92447daf2c1bc84930c5d90ed3a023227e254d3a2c28763be372bb7444ef5719d5948b99d33ede3775f51c216bba97bc5fd4777e819517e89a737284c784bdc30b1d6b3b7debe2448c1dc28b00e3ac611fd5a8fd070502f3f7f672786f6b5787af51”

图 6解码Base64URL的Python脚本

5. NetBIOS编码和解码

NetBIOS编码用于对NetBIOS服务名称进行编码。Cobalt Strike工具在C2通信中传输受害者元数据时使用相同的算法对其进行编码。

在NetBIOS编码算法中,每个字节由两个字节的ASCII字符表示。输入字节的每4位(半字节)通过向右调整并经过高位填0后,被视为一个单独的字节。然后再加上ASCII字符“a”,结果存储为单独的字节。以下是用于编码的字符集:

["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p"]

图7演示了编码过程:

图 7 NetBIOS的编码过程

让我们通过一个例子来了解NetBIOS算法如何配置Malleable。

5.1配置文件

Ocsp.profile使用NetBIOS编码来转换受害者的元数据。图8显示了使用NetBIOS编码算法对元数据进行编码。结果数据将附加到URI。

图 8 OCSP配置文件中的元数据编码

5.2 HTTP C2流量

图9显示了Beacon使用OCSP配置文件生成的HTTP流量。

图 9使用OCSP配置文件生成的HTTP C2流量

5.3 NetBIOS解码

图10实现了Python脚本解码NetBIOS编码的元数据。

脚本输出的是受害者的RSA加密的元数据:

“5725245edcb589b305e33e02da1cda208ed083bed8a1ae0b3a87da0f9d6ebe31025ab67c58572acb9757288cc2e78bea414249fa8cb0783485a1b5a3c0863501fc1c89c6ac59b7129c51cacbfa197cc64eea31ec8ac204cbcdbefaecf19762f9efcc56280f3e9b183c37f98f371f5e1c08b645524646d7010af4408f4ebb8a2f”

图 10解码NetBIOS编码的Python脚本实现

6. NetBIOSU编码和解码

NetBIOSU算法是上面讨论的NetBIOS算法的改进版本。细微的变化体现于编码算法的字符集。在该算法中,字符集是NetBIOS算法中使用的字符集的大写版本。

[‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’, ‘G’, ‘H’, ‘I’, ‘J’, ‘K’, ‘L’, ‘M’, ‘N’, ‘O’, ‘P’]

NetBIOSU使用与NetBIOS算法相同的编码过程。有关详细信息,请参阅图8。

让我们通过一个例子来了解NetBIOSU算法在Malleable配置文件中的使用。

6.1配置文件

Asprox.profile使用NetBIOSU编码来转换受害者的元数据。图11显示了使用NetBIOSU编码算法对元数据进行编码。结果数据将附加到URI。

图 11 asprox配置文件中的元数据编码

6.2 HTTP C2流量

图12显示了Beacon使用asprox配置文件生成的HTTP流量,突出显示的部分是有关受害者的元数据。

图 12使用asprox配置文件生成的HTTP C2流量

6.3 NetBIOSU解码

图13为使用Python脚本实现解码NetBIOSU编码的元数据的例子。

脚本的输出是关于受害者的RSA加密元数据。

“722676e535f86ffc29ba1cafb9856d98d1f697a83b0afc5bb143e2cf2242152a351081fb837192da3e3b2d9021fab75ce32677b6299a24d15e28db883adb36c5fe448d5eb47014f6d2e72eff389f0176efced60380450c87e2015a8c5de6aa90dc8f105683ac5fd96dc33d4d63da62818facda595910cf9aee10f36fe54d4a6a”

图 13解码NetBIOSU编码的Python脚本

7. Mask编码和解码

Mask编码算法可以在Malleable C2配置文件中进行设置,并与其他编码算法组合,可以由TeamServer加载用作C2通信。Beacon会生成随机的四个字节作为Mask的XOR密钥,然后使用Mask密钥对加密后的128字节元数据进行XOR操作,并将Mask密钥和编码数据发送到TeamServer进行C2通信。

7.1配置文件

图14是带有由Mask和Base64URL编码的元数据的部分配置文件。配置文件将URI和元数据编码算法定义为Mask和Base64URL,编码后的元数据将附加到URI。

图 14随机化的配置文件中的元数据编码选项

7.2 HTTP C2流量

图15是基于图14配置的C2流量,可以通过以下步骤还原编码数据。

  • 从捕获的流量中,获取整个URI:/zChN7QMDhftv10Li9Cu-fm_T_3qDQawT-Z1GzNg1FWfAfSILT-u_rKLvXP-RE0ac-pxJTlGFCUIm4Aw9rGHPCIJVl0zNdCbM_G2VkYXJ5GGGtVh8S0LWMM4YLGZD9okLcFBc402j5zESK71HaR_owJb-AVBfFvAo8q0I2J74rmfGyIROyg

  • 删除前缀/zC,其余由Base64URL编码hN7QMDhftv10Li9Cu-fm_T_3qDQawT-Z1GzNg1FWfAfSILT-u_rKLvXP-RE0ac-pxJTlGFCUIm4Aw9rGHPCIJVl0zNdCbM_G2VkYXJ5GGGtVh8S0LWMM4YLGZD9okLcFBc402j5zESK71HaR_owJb-AVBfFvAo8q0I2J74rmfGyIROyg

图 15随机化的配置文件的C2流量

7.3数据的编码与解码

  • Base64URL编码

hN7QMDhftv10Li9Cu-fm_T_3qDQawT-Z1GzNg1FWfAfSILT-u_rKLvXP-RE0ac-pxJTlGFCUIm4Aw9rGHPCIJVl0zNdCbM_G2VkYXJ5GGGtVh8S0LWMM4YLGZD9okLcFBc402j5zESK71HaR_owJb-AVBfFvAo8q0I2J74rmfGyIROyg

  • Base64URL解码

84ded030385fb6fd742e2f42bbe7e6fd3ff7a8341ac13f99d46ccd8351567c07d220b4febbfaca2ef5cff9113469cfa9c494e5185094226e00c3dac61cf088255974ccd7426ccfc6d959185c9e46186b5587c4b42d630ce182c6643f6890b70505ce34da3e731122bbd47691fe8c096fe01505f16f028f2ad08d89ef8ae67c6c8844eca0

如图16中的代码所示,使用Python的Base64库,对Base64URL编码的数据进行解码,解码后的十六进制数据长度为132,前四个字节84ded030是Mask的XOR秘钥。剩下的128个字节是以Mask为密钥的XOR算法编码的元数据。

图 16 Base64URL解码的Python3代码

  • Mask编码

385fb6fd742e2f42bbe7e6fd3ff7a8341ac13f99d46ccd8351567c07d220b4febbfaca2ef5cff9113469cfa9c494e5185094226e00c3dac61cf088255974ccd7426ccfc6d959185c9e46186b5587c4b42d630ce182c6643f6890b70505ce34da3e731122bbd47691fe8c096fe01505f16f028f2ad08d89ef8ae67c6c8844eca0

  • Mask解码

bc8166cdf0f0ff723f3936cdbb2978049e1fefa950b21db3d588ac3756fe64ce3f241a1e71112921b0b71f99404a3528d44af25e841d0af6982e5815ddaa1ce7c6b21ff65d87c86c1a98c85bd1591484a9bddcd10618b40fec4e67358110e4eabaadc1123f0aa6a17a52d95f64cbd5c1ebdc5f1a545359df0e38ac5c0c9a3c90

使用图17中的Python代码对Mask编码的数据进行解码,解码后的数据长度为128字节。

图 17 Mask解码的Python3代码

8. 案例

接下来,展示了恶意软件使用的两种不同的Cobalt Strike有效载荷案例。一种使用Base64,另一种使用Base64URL编码。

8.1 Base64编码

SHA256:6b6413a059a9f12d849c007055685d981ddb0ff308d6e3c2638d197e6d3e8802

图 18 Base64编码

8.2 Base64URL编码

SHA256:f6e75c20ddcbe3bc09e1d803a8268a00bf5f7e66b7dbd221a36ed5ead079e093

图 19 Base64URL编码

9. 结论

Cobalt Strike是一个强大的后漏洞利用攻击模拟器。上面详述的五种编码算法是精心设计的,旨在逃避安全检测。单一安全设备无法阻止Cobalt Strike攻击,只有安全解决方案的组合——防火墙、沙箱、端点和集成所有这些组件的软件——才能帮助防止这种攻击。

10. 攻击指标

表 2 攻击指标列表

攻击指标

标签

6b6413a059a9f12d849c007055685d981ddb0ff308d6e3c2638d197e6d3e8802

CS样本

f6e75c20ddcbe3bc09e1d803a8268a00bf5f7e66b7dbd221a36ed5ead079e093

CS样本

fc95e7f4c8ec810646c16c8b6075b0b9e2cc686153cdad46e82d6cca099b19e7

/n9Rd

11b8beaa53353f5f52607e994849c3086733dfa01cc57fea2dae42eb7a6ee972

/flas

80.255.3[.]109

CS TeamServer IP

143.244.178[.]247

CS TeamServer IP

END

参考链接:https://unit42.paloaltonetworks.com/cobalt-strike-metadata-encoding-decoding/

编辑|延俊杰

审校|何双泽、金矢

本文为CNTIC编译整理,不代表本公众号观点,转载请保留出处与链接。

声明:本文来自国家网络威胁情报共享开放平台,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。