互联网|对红队利器Cobalt Strike一个历史遗留漏洞的研究( 五 )


if __name__ == "__main__":
SHARED_KEY = binascii.unhexlify("441bbd3de3d52997298a8625def8f40c")
HMAC_KEY = binascii.unhexlify("1ede48669d4346c0b0cf2ca15e498c10")
with open(sys.argv[1], "rb") as f:
enc_data = http://news.hoteastday.com/a/f.read()
signature = enc_data[-16:]
iv_bytes = bytes("abcdefghijklmnop")
encrypted_data = http://news.hoteastday.com/a/enc_data[:-16]
dec = decrypt(encrypted_dat
Beacon任务

到目前为止 , 我们已经介绍了分段 , 元数据 , 载入 , 非对称(RSA)和对称(AES)加密 。 现在 , 我们可以暂存假Beacon , 并解密从Team Server发送到Beacon的任务 。 接下来 , 我们将介绍如何将Beacon输出解密/加密回Team Server 。
Beacon载入后(通过在请求中包括我们先前覆盖的加密元数据) , 如果Team Server拥有Beacon任务 , 它将以加密响应的形式发送 。 如前所述 , 这是使用协商的AES会话密钥解密的 。
对任务分配的反应是什么样的?简而言之 , 该响应也以与从服务器发送任务相同的方式用AES加密 , 但是Beacon响应数据前面带有一个长度字段 。
以下图片显示了Beacon响应“ ps”任务发送的加密数据的示例:
互联网|对红队利器Cobalt Strike一个历史遗留漏洞的研究
本文插图

加密回包响应
解密数据后 , 我们可以看到它前面有12个字节 , 表示输出的各种属性 。
00 00 00 02
00 00 0D 1B
00 00 00 11
5B 53 79 73
74 65 6D 20
以下python代码显示了如何解密和解码Beacon输出
# NOTE: insert decryption functions
if __name__ == "__main__":
SHARED_KEY = binascii.unhexlify("bca4caea1b3172aa979a5eac6c813184")
HMAC_KEY = binascii.unhexlify("94b64efcf87b13c6828bcf14373bb2f9")
with open(sys.argv[1], "rb") as f:
enc_data = http://news.hoteastday.com/a/f.read()

encrypted_data, data_length = readInt(enc_data)
print "Encrypted data should be: %d" % data_length
signature = encrypted_data[-16:]
iv_bytes = "abcdefghijklmnop"
encrypted_data = http://news.hoteastday.com/a/encrypted_data[:-16]
dec = decrypt(encrypted_data, iv_bytes, signature, SHARED_KEY, HMAC_KEY)
dec, counter = readInt(dec)
dec, decrypted_length = readInt(dec)
dec, output_type = readInt(dec)
print "Decrypted length: %s" % decrypted_length
print "Output type: %d" % output_type
print "Beacon data: %s" % dec
运行以下代码将解密输出 , 并显示“ ps”命令的结果:
互联网|对红队利器Cobalt Strike一个历史遗留漏洞的研究
本文插图

解密Beacon输出
因此 , 在这一点上 , 我们可以提取所需的密钥 , 对通信进行加密和解密 , 以进行漏洞利用 。
0x04 漏洞分析
该漏洞本身是Beacon内部IP地址中的目录遍历漏洞 , 该漏洞用于构建文件路径 。
https://blog.cobaltstrike.com/2016/09/28/cobalt-strike-rce-active-exploitation-reported/

在处理“下载”响应时 , Team Server将通过在工作目录内“ downloads”文件夹下的Team Server文件系统上重新创建目标系统路径 , 将这些响应写入文件系统 。 以下截图显示了通常情况下的示例 。 如图所示 , 下载的文件存储在以Beacon IP地址命名的文件夹中 。 在此文件夹中是下载文件的重新创建的文件系统结构 。


推荐阅读