流量解密

NVISO Labs

Cobalt Strike: Using Known Private Keys To Decrypt Traffic – Part 1

Cobalt Strike:使用已知私钥解密流量——第 1 部分

Cobalt Strike: Using Known Private Keys To Decrypt Traffic – Part 2

Cobalt Strike:使用已知私钥解密流量——第 2 部分

Cobalt Strike: Using Process Memory To Decrypt Traffic – Part 3

Cobalt Strike:使用进程内存解密流量——第 3 部分

Cobalt Strike: Decrypting Obfuscated Traffic – Part 4

Cobalt Strike:解密混淆流量——第 4 部分

Cobalt Strike: Cobalt Strike: Decrypting DNS Traffic – Part 5

Cobalt Strike:Cobalt Strike:解密 DNS 流量——第 5 部分

国内安全厂商翻译:威胁棱镜 - 破解版密钥相同,部分CobaltStrike加密流量可解

NVISO Labs研究人员发现6个私钥为Cobalt Strike打击软件,使C2网络流量解密。 Cobalt Strike攻击信标(Beacon,客户端)和Cobalt Strike攻击团队服务器(C2)之间的通信使用AES加密(即使发生在HTTPS上)。AES密钥由信标生成,并使用加密的元数据块(默认情况下是cookie)传递给C2。 RSA加密用于加密此元数据信标有C2的公钥,C2有私钥。 image.png 图1:C2流量 Beacon 使用 RSA 公钥加密元数据块(默认为 Cookie),C&C 服务器通过私钥进行解密。 公钥和私钥都存在 .cobaltstrike.beacon_keys 文件中,该文件是在第一次使用 Cobalt Strike Team Server 时生成的。 通过对公网暴露的 Cobalt Strike 服务器进行分析识别,发现许多服务器使用相同的公钥,这意味着他们使用的 .cobaltstrike.beacon_keys 文件相同,公私钥都相同。 因为这些人使用的都是 Cobalt Strike 的破解版,而在第一次使用时生成的 .cobaltstrike.beacon_keys 文件也被包含在破解版中共享出去了。 通过 VirusTotal 进行样本检索,发现了 10 个破解版 Cobalt Strike 的 ZIP 压缩包,这些压缩包中根据 .cobaltstrike.beacon_keys 提取了 6 个 RSA 密钥对。其中有 2 个密钥对被广泛使用,发现的 Cobalt Strike 服务器中有 25%(1500 余个)使用的都是这二者之一。 通过 1768.py 提取 Cobalt Strike Beacon 的配置时会显示是否为已知的私钥。 image.png 图2:1768.py从信标中提取配置 至少,这些信息进一步证实了示例来自Cobalt Strike攻击服务器(而不是红队服务器)。 使用选项详细,还会显示私钥: image.png 图3:使用选项详细显示私钥 通过这些私钥可以用来解密元数据和 C&C 流量: image.png 图4:解密元数据 对于此分析,我们使用的是捕获文件。2021-02-02-Hancitor-with-Ficker-Stealer-and-Cobalt-Strike-and-NetSupport-RAT.pcap.zip,这是BradDuncan在他的网站上共享的许多恶意软件流量捕获文件之一。Malware-Traffic-Analysis.net. 我们从最少的知识开始:捕获文件包含与其团队服务器通信的Cobalt Strike攻击信标的加密HTTP通信量。 如果您想了解更多有关Cobalt Strike罢工及其组件的信息,我们强烈建议以下博客文章. 第一步:我们用Wireshark打开捕获文件,并通过stager外壳代码查找完整信标的下载。 虽然信标可以以多种形式出现,但我们可以确定两大类:

  1. 下载完整信标的一小块shell代码(几百字节),也称为stager外壳代码。
  2. 完整的信标:可以反射加载的PE文件。

在这第一步中,我们在捕获文件中搜索stager外壳代码的标记:我们使用以下显示过滤器来完成此操作:Http.request.uri匹配“/…”.$“. image.png 图1:Cobalt Strike攻击流量的数据包捕获 我们有一次命中。GET请求中用于下载完整信标的路径,由4个满足条件的字符组成:字符值之和的字节值(又名校验和8)是一个已知常量。我们可以用工具检查这个Metatool.py就像这样: image.png 图2:使用metatool.py 有关此校验和过程的更多信息可以找到。这里.
该工具的输出显示,这是下载32位全信标(CSx86)的有效路径。
下载完整的信标也是如此: image.png 图3:完整信标下载 我们可以提取这个下载: image.png 图4:导出HTTP对象 image.png 图5:选择DownloadEbHm保存 image.png 图6:将选定的下载保存到磁盘 一旦整个信标被保存到磁盘上作为EbHm.vir,就可以用工具1768.py。Py是一个可以解码/解密Cobalt Strike攻击信标并提取其配置的工具。Cobalt Strike攻击信标有许多配置选项:所有这些选项都存储在编码和嵌入的表中。 以下是分析的结果: image.png 图7:提取信标配置 让我们仔细看看其中的一些选择。 首先,选项0x0000告诉我们这是一个HTTP信标:它通过HTTP进行通信。
它通过连接到端口8080(选项0x0002)上的192.254.79[.]71(选项0x0008)来实现这一点。
GET请求使用path/ptj(选项0x0008),而POST请求使用path/submit.php(选项0x000a)
对于我们的分析也很重要:这个信标使用的公钥有一个已知的私钥(已经知道私钥)(选项0x0007)。 因此,有了这些信息,我们知道信标将发送GET请求到团队服务器,以获得指令。如果团队服务器有要由信标执行的命令,它将用加密的数据回复GET请求。当信标必须将其命令的输出发送回团队服务器时,它将使用带有加密数据的POST请求。 如果团队服务器没有针对信标的命令,它将不会发送加密数据。这并不一定意味着GET请求的答复不包含任何数据:操作员可以通过概要文件伪装通信。例如,加密数据位于GIF文件中。但这座灯塔的情况并非如此。我们知道这一点,因为在这个概要中没有所谓的可延展性C2指令:选项0x000b等于0x00000004->这意味着在解密之前不应该对数据执行任何操作(我们将在稍后的博客文章中更详细地解释这一点)。 让我们创建一个显示过滤器来查看这个C2流量:Http和ip.addr=192.254.79[.]71 image.png 图8:完全信标下载和带有加密Cobalt攻击通信量的HTTP请求 这将显示进出团队服务器的所有HTTP通信量。注意,我们已经查看了这个视图中的前2个数据包(数据包6034和6703):这是信标本身的下载,并且通信没有加密。因此,我们将使用以下显示筛选器过滤这些数据包: Http和ip.addr=192.254.79.71和Fra.number>6703 这给了我们一个GET请求列表和他们的答复。注意,每分钟都有一个GET请求。在信标配置中也是如此:60.000 ms的睡眠(选项0x0003),变化率为0%(又名抖动,选项0x0005)。 image.png 图9:带有加密Cobalt攻击通信量的http请求 现在我们将遵循第一个HTTP流: image.png 图10:以下HTTP流 image.png 图11:第一个HTTP流 这是对/ptj的GET请求,它接收状态200应答,没有数据。这意味着目前还没有来自团队服务器的命令用于此信标:操作员在捕获文件的那个位置没有发出任何命令。 注意GET请求的Cookie标题。这看起来像base 64字符串:KN9zfIq31DBBdLtF4JUjmrhm0lRKkC/I/zAiJ+Xxjz787h9yh35cRjEnXJAwQcWP4chXobXT/E5YrZjgreeGTrORnj//A5iZw2TClEnt++gLMyMHwgjsnvg9czGx6Ekpz0L1uEfkVoo4MpQ0/kJk9myZagRrPrFWdE9U7BwCzlE= 该值是信标作为Base 64字符串发送给团队服务器的加密元数据。此元数据是RSA加密的,在信标配置中使用公钥加密(选项0x0007),团队服务器可以解密此元数据,因为它拥有私钥。请记住,有些私钥被“泄露”了,我们在我们的本系列的第一篇博客文章. 我们的信标分析表明,这个信标使用了一个公钥和一个已知的私钥。这意味着我们可以使用工具Cs-decrypt-metadata.py要像这样解密元数据(Cookie): image.png 图12:解密信标元数据 我们可以在这里看到解密的元数据。对我们来说非常重要的是原始键:caeab4f452fe41182d504a24966fbd0。我们将使用这个密钥来解密通信量(AES和HMAC密钥是从这个原始密钥派生出来的)。 我们在这里可以找到更多的元数据:计算机名、用户名、… 现在我们将使用数据包9379和9383来跟踪HTTP流:这是操作员(TeamServer)向信标发送的第一个命令: image.png 图13:带有加密命令的http流 在这里,我们可以看到回复包含48个字节的数据(内容长度)。这些数据是加密的: image.png 图14:带有加密命令的HTTP流的十六进制视图 像这样的加密数据,可以用工具解密。Cs-parse-http-traffic.py。由于数据是加密的,所以我们需要提供原始密钥(选项-r caeab4f452fe41182d504a24966fbd0),并且由于数据包捕获包含其他通信量,而不是纯Cobalt攻击C2通信量,所以最好提供一个显示筛选器(选项-Y http和ip.addr==192.254.79.71和Fra.number>6703),以便该工具可以忽略所有不是C2流量的HTTP通信量。 这将产生以下输出: image.png 图15:解密命令和结果 现在我们可以看到数据包9383中的加密数据是一个睡眠命令,睡眠时间为100 ms,抖动因子为90%。这意味着操作员指示信标进行交互。 解密的数据包9707包含一个未知的命令(Id 53),但是当我们查看包9723时,我们看到一个目录列表输出:这是未知命令53被发送回Team服务器的输出结果(注意post url/submit.php)。因此,可以安全地假设命令53是目录列表命令。 这个捕获文件中有许多命令和结果,工具cs-parse-http-transic.py可以解密,这里显示的太多了。但是,我们邀请您在这篇博客文章中复制这些命令,并查看该工具的输出。 捕获文件中的最后一个命令是一个进程列表命令: image.png 图16:解密过程列表命令和结果 结语 虽然我们在这里解密的数据包捕获文件是布拉德·邓肯(BradDuncan)半年前通过在沙箱内运行Cobalt Strike攻击信标而产生的,但我们今天可以解密它,因为操作人员使用了一个包含私钥的Cobalt Strike攻击包,我们从VirusTotal中恢复过来。 如果没有这个私钥,我们就无法解密通信量。 私钥不是解密通信量的唯一方法:如果可以从进程内存中提取AES密钥,我们也可以解密通信量。我们将在即将发布的博客文章中对此进行报道。