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实例)
安装步骤
-
安装Python依赖:
pip install requests -
下载检测脚本:
git clone <项目仓库地址> cd kibana-cve-2025-25014-detector -
设置执行权限(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 | -u | Kibana认证用户名 | 是 |
-p, --password | -p | Kibana认证密码 | 是 |
--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"
典型使用场景
- 安全审计:在安全审计过程中快速扫描Kibana实例
- 漏洞验证:验证已修复的系统是否真正安全
- 渗透测试:在授权测试中验证漏洞存在性
- 安全监控:定期检查生产环境中的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