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。