Kibana原型污染漏洞检测工具

25 阅读4分钟

Kibana原型污染漏洞检测工具

项目标题与描述

CVE-2025-25014 Kibana漏洞检测器

这是一个专门用于检测CVE-2025-25014漏洞的Python工具。该漏洞是Kibana中的一个严重原型污染漏洞,可导致远程代码执行(RCE),影响Kibana 8.3.0至8.17.5版本,以及8.18.0和9.0.0版本。本工具通过向Kibana的特定API端点发送精心构造的HTTP请求,验证目标系统是否存在该安全漏洞。

功能特性

  • 漏洞检测:通过向Kibana的__proto__端点发送PUT请求检测原型污染漏洞
  • 身份认证支持:支持使用Basic认证进行身份验证
  • 代理支持:可通过代理服务器进行漏洞检测
  • 详细输出:提供彩色终端输出,清晰显示检测结果
  • 错误处理:包含完整的异常处理和SSL证书验证跳过功能
  • 灵活配置:支持通过命令行参数灵活配置目标URL、认证信息和代理设置

安装指南

系统要求

  • Python 3.6+
  • requests库
  • 网络访问权限(能够访问目标Kibana实例)

安装步骤

  1. 安装Python依赖

    pip install requests
    
  2. 下载检测脚本

    git clone <项目仓库地址>
    cd kibana-cve-2025-25014-detector
    
  3. 设置执行权限(Linux/macOS):

    chmod +x CVE-2025-25014.py
    

依赖项

  • requests:用于发送HTTP请求
  • urllib3:用于处理URL和HTTP连接
  • argparse:用于解析命令行参数

使用说明

基础使用

最基本的检测命令格式:

python3 CVE-2025-25014.py https://target-kibana-server:5601 -u username -p password

参数详解

参数简写说明必选
url-目标Kibana服务器的URL
-u, --user-uKibana认证用户名
-p, --password-pKibana认证密码
--proxy-代理服务器URL

使用示例

示例1:基础检测

python3 CVE-2025-25014.py https://192.168.1.100:5601 -u admin -p password123

示例2:通过代理检测

python3 CVE-2025-25014.py https://kibana.company.com -u elastic -p securepass --proxy http://proxy-server:8080

输出说明

  • 目标存在漏洞:显示红色文字"Target is vulnerable"
  • 目标不存在漏洞:显示"Target is not vulnerable"

典型使用场景

  1. 安全审计:在安全审计过程中快速扫描Kibana实例
  2. 漏洞验证:验证已修复的系统是否真正安全
  3. 渗透测试:在授权测试中验证漏洞存在性
  4. 安全监控:定期检查生产环境中的Kibana实例

漏洞背景信息

CVE-2025-25014是一个严重的原型污染漏洞,影响Kibana的Machine Learning和Reporting功能:

  • CVSS评分:9.1/10(严重)
  • 影响范围:Kibana 8.3.0至8.17.5,以及8.18.0和9.0.0
  • 利用条件:需要高权限认证且Machine Learning或Reporting功能已启用
  • 修复版本:8.17.6、8.18.1、9.0.1或更新版本

核心代码

主检测函数

def check(url: str, auth: str, proxies: dict | None = None) -> bool:
    """
    检测目标Kibana实例是否存在CVE-2025-25014漏洞
    
    参数:
        url: 目标Kibana的URL
        auth: Basic认证字符串(base64编码)
        proxies: 代理服务器配置字典
    
    返回:
        bool: True表示存在漏洞,False表示不存在漏洞
    """
    # 构造目标URL,指向__proto__端点
    url = urljoin(url, "__proto__")

    # 设置请求头,包含认证信息和内容类型
    headers = {
        "Authorization": f"Basic {auth}",  # Basic认证
        "Content-Type": "application/json",  # JSON格式请求体
        "Connection": "close"  # 请求后关闭连接
    }

    # 构造请求数据,模拟正常的索引映射创建请求
    data = {
        "mappings": {
            "properties": {
                "timestamp": {"type": "date"},
                "test_field": {"type": "keyword"},
                "by_field": {"type": "keyword"},
                "value": {"type": "float"}
            }
        }
    }

    # 发送PUT请求到目标端点
    response = requests.put(
        url, 
        headers=headers, 
        json=data, 
        verify=False,  # 跳过SSL证书验证
        proxies=proxies
    )

    # 检查响应状态码,正常情况应该返回400错误
    if response.status_code != 400:
        return False
    
    # 检查响应内容是否包含特定错误信息
    # 如果包含'Invalid index name [__proto__]'说明系统正确处理了恶意请求
    if '"reason":"Invalid index name [__proto__]' not in response.text:
        return False
    
    # 只有同时满足上述两个条件才判断为不存在漏洞
    return True

命令行参数解析

if __name__ == "__main__":
    """
    主程序入口点,处理命令行参数并执行漏洞检测
    """
    # 创建参数解析器,设置工具描述
    parser = argparse.ArgumentParser(description='Check Kibana vulnerability')
    
    # 定义必需参数
    parser.add_argument('url', help='Target Kibana URL (https://ip:port)')
    parser.add_argument('-u', '--user', required=True, help='Username for authentication')
    parser.add_argument('-p', '--password', required=True, help='Password for authentication')
    parser.add_argument('--proxy', help='Proxy URL (optional)')  # 可选代理参数
    
    # 解析命令行参数
    args = parser.parse_args()

    # 将用户名和密码编码为Basic认证格式
    basic_auth = b64encode(f"{args.user}:{args.password}".encode()).decode()
    
    # 配置代理设置(如果提供了代理参数)
    proxies_dict = None
    if args.proxy:
        proxies_dict = {
            'http': args.proxy,
            'https': args.proxy
        }
    
    # 执行漏洞检测并输出结果
    if check(args.url, basic_auth, proxies=proxies_dict):
        # 使用红色文字输出漏洞存在警告
        print("\033[91mTarget is vulnerable\033[0m")
    else:
        # 正常输出无漏洞信息
        print("Target is not vulnerable")

初始化代码

import argparse
from urllib.parse import urljoin
from base64 import b64encode
import requests
import urllib3

# 禁用SSL警告,避免证书验证干扰输出
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

安全说明:本工具仅用于授权的安全测试和教育目的。禁止未经授权对任何系统进行测试。使用前请确保已获得目标系统的测试授权。 6HFtX5dABrKlqXeO5PUv/ydjQZDJ7Ct83xG1NG8fcAPELBDEtksiPi2p7hvmwL/d