Havoc是开源的,使用简单,几乎没有以防御为重点的覆盖范围,这使它成为对手的热门选择。随着时间 的推移,它可能会变得更加流行,特别是像Cobalt Strike这样的其他工具已经有了广泛的防御覆盖范围。一些组织,如ZScaler、Critical Start和The Stack,已经分析了在野外积极使用的针对政府组织的哈弗恶 魔。
在2022年第四季度至2023年第一季度期间, Havoc的覆盖范围有所增加,因为它可以用来绕过最新版本 的Windows 11 Defender。此后,威胁行为者利用Havoc,利用第三方工具和插件绕过AV和EDR解决方 案,增强了他们在攻击中的灵活性。
在2023年第二季度至第四季度, Spamhaus发布了其僵尸网络威胁更新报告,显示在此期间, Havoc作 为后门的使用增加了22%。下图显示了整个2023年哈沃克使用量的总体变化。
2023年第二季度至第三季度,使用量下降了36%。这种下降可能归因于绕过Defender的新颖性减弱,因 为微软不断更新其安全措施,以保护用户免受新出现的威胁。到年底,哈沃克的使用量增加了22%。这 一趋势表明,随着对Havoc的不断更新和对其他C2框架的广泛研究, Havoc将不可避免地被威胁行为者 更多地使用。
该图是根据Spamhaus 2023年第2季度、第3季度和第4季度的威胁报告创建和提供的。
-
用于部署代理的外部主机(扮演攻击者角色) -
事件日志记录
-
网络日志记录
-
完整数据包捕获
-
重置/恢复
运行Havoc所需要的只是一个公共IP地址上的Kali Linux实例。Ubuntu 20.04/22.04、基于Debian的发行 版、 Arch发行版和MacOS也可以工作,不过安装和设置Havoc的步骤会因您使用的发行版而异。Havoc 安装文档涵盖了这些差异。只需要一个公共IP地址上的单个AWS EC2 (或类似)实例,就可以轻松地打 开所需的TCP、 HTTP/s和DNS端口。
Havoc C2框架分为两个组件:团队服务器和客户端。teamserver处理连接的攻击性操作员并管理侦听 器,以及回调解析和从demon(代理)下载屏幕截图和文件。客户端是操作员将看到的用户界面;操作 员可以指定代理任务并接收输出,例如命令输出或战利品。Loot是Havoc定义的一个术语,包括屏幕截 图和文件下载。
可以借鉴sjsjjs师傅的文章写的很细。
确定获得加密密钥的可靠和可重复的方法。对一个havoc进行逆向工程并没有产生可操作的结果。需要一 种方法来确定密钥是什么,这样它们就可以用来解密和检查内存和网络流量,为此,采用了与Sliver C2 研究相同的技术。由于Havoc是开源的,确定了负责生成加密密钥的源代码,并在代码中添加了打印语 句。
Figure 0-1
在修改aes.go、重新编译teamserver并运行demon后,密钥被打印为标准输出。
Figure 0-2
既然知道了密钥是什么,就利用这些知识开发了一种从数据包捕获和内存转储中获取密钥的方法,发现 的另一种方法是使用SQLite从数据库中获取密钥。这包括从teamserver.db运行sqlite3,并运行下面的查 询,将AgentID替换为您的demon的代理ID。
Figure 0-3
下面的输出显示了Key和IV,但它们是Base64编码的。
Figure 0-4
解码后,我们得到了密钥。
Figure 0-5
这些密钥与之前显示的密钥不同,因为我们使用了两个不同的demons来测试这些方法。然而,使用上述 方法将始终打印密钥。
在获得密钥后,我们开发了一种方法来帮助防御操作员从数据包捕获和内存中获取密钥,详细信息如 下。
设置好所有内容后,我们在启用Wireshark数据包捕获的情况下,在目标机器上运行demons。这使我们 能够监控demon和teamserver之间的所有HTTP和TCP流量。
在分析捕获中的第一个数据包时,我们注意到第一个字节,这是一个神奇的字节值,如下图中的红框所 示。
Figure 0-1
在检查Havoc C2 GitHub存储库后,我们确定了在Define.h文件中找到的0xDEADBEEF魔术值的定义。
Figure 0-2
Havoc使用一种称为beaconing的标准轮询技术,即代理定期与teamserver进行检查。该间隔由C2操作 员设置为睡眠时间值。在分组捕获中识别C2通信可以通过识别该信标行为来表征。
对于Havoc,对服务器的请求包含来自任何命令的响应或对任何作业的请求。从服务器到客户端的响应包 含指示植入执行的下一个任务,例如,运行shell命令,进一步浏览数据包,我们看到POST请求和HTTP 状态代码200确认的连续通信这些都是持续不断的要求;它们的节奏由代理上设置的睡眠时间决定,代理 在内存中对自己进行加密以避免被检测到。
Figure 0-3
默认睡眠值为两秒,但攻击者很容易更改此值。为了避免EDR在内存中检测到, Havoc实现了一种睡眠技 术,该技术对内存中自己的有效载荷进行加密。这些睡眠技巧包括:
-
Folage–创建一个新线程,使用NtApcQueueThread对面向返回的编程(ROP)链进行排队,加密 demon并延迟执行。 -
Ekko–使用RtlCreateTimer对ROP链进行排队,该ROP链对内存中的恶魔进行加密,从而延迟其执 行。这种技术有一个GitHub存储库。 -
WaitForSingleObjectEx–没有模糊处理,只是将执行延迟到设置睡眠的时间,默认为两秒。
通过查看捕获中的数据包,并使用Wireshark的过滤器功能,我们对十六进制进行了过滤,搜索之前从teamserver获得的加密密钥。我们还确定了代理ID,并根据teamserver中显示的ID进行关联。这种模式 与使用不同睡眠技术配置的不同代理的多次测试保持一致。
加密密钥似乎是在第一个非签入HTTP POST请求中从代理发送到teamserver的,如下图所示,以及魔术 字节头、代理长度和AgentID。
Figure 0-4
为了识别流量的位置,我们必须识别长度比签入或共享密钥更大的数据包。我们确定了一个长度为3673 字节的POST数据包,这是迄今为止最大的数据包。在这一点上,我们只能猜测这是一个命令。我们需要 一种方法来验证这一假设。
Figure 0-1
我们通过复制值并将其带到CyberChef中来实现这一点,这样我们就可以尝试使用密钥对其进行解密,并 可能看到命令输出。对于CyberChef,我们需要加密方法(AES256)、密钥IV和模式,我们知道这是CTR,因为Havoc的GitHub存储库中的AESCrypt.h文件也表明了这一点。
Figure 0-2
Figure 0-3
下图显示了基于CyberChef输出的输出起点的大致位置。
Figure 0-4
从这里开始的自然方向是尝试在pcap中发现命令;然而,这是不可能的,因为它们是通过信标对象文件 ( BOFS)发送的。发现攻击者使用的命令的唯一已知方法是捕获和解密输出,并从中推断,我们确定了 从标头字段发送的一些命令。然而,大量功能被实现为BOFS,并且都共享相同的command_id。这使得 在不分析BOF或响应的情况下很难理解正在执行的确切命令。我们发布了一个工具,可以在GitHub repos中找到,如果你有AES密钥,它可以提取并保存所有发送的BOFS及其响应。
我们通过使用sqlite3从teamserver.db获取密钥开始了这一过程,如前面“从teamserver和数据库获取加 密密钥”部分所述。我们还去了受害者的机器并丢弃了内存,然后,我们需要使用Volatility为我们的demon找到进程PID,称为chrome-updater.exe。我们使用下面的命令对内存转储文件执行此操作。
Figure 0-1
我们可以看到过程PID是5544。
Figure 0-2
有了进程PID,我们就可以转储chrome-updater.exe的进程内存。
Figure 0-3
Figure 0-5
该结构在内存和数据包捕获方面完全相同,具体如下。
Figure 0-6
通过建立一种可靠的方法来从数据包捕获和内存中获得加密和IV密钥,创建了一个YARA规则来专门检测 内存中的demon INIT请求。
Figure 0-1
我们还创建了一个用于检测内存中Havoc C2的Volatility插件,可以在我们的GitHub存储库中找到。下图 显示了预期输出的示例。此结构不会从内存中删除,因此可以追溯运行规则来识别Havoc代理操作。
Figure 0-2
如果攻击者选择从teamserver发送shell命令,例如下面的命令,您可以在启用PacketBeat的Elastic中获 取它。
Figure 0-1
广告
原文始发于微信公众号(影域实验室):对C2 Havoc的流量检测分析含检测脚本
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论