揭秘网络设备版本:渗透测试的起点
引言:网络设备版本探测在安全评估中的关键作用
在当今快速发展的网络安全领域,渗透测试和网络安全评估已成为保护数字基础设施的重要手段。其中,准确识别目标设备的软件版本是发现漏洞和评估风险的关键步骤。不同版本的软件可能存在独特的安全漏洞,因此版本探测直接影响到安全评估的深度和准确性。
然而,网络设备版本探测并非易事。各厂商的设备在标识版本信息时方式各异:有些设备直接在网页或接口响应中以明文形式呈现版本号作为正常业务功能展示,而另一些产品并没有明显的版本特征,但在我们研究的过程中发现网页源代码或静态文件名中存在一些加密字符串或时间戳可以与版本信息呈现映射关系,对于版本探测目前并没有通用型的方法,现在的识别更多属于一种知识库积累,针对不同产品我们要寻找不同的方法,本文主要研究如何在远程无认证的情况下获取到产品的具体版本号。
产品类型与识别思路
我们对网络设备版本探测进行了深入研究,并将其分为两大“门派”:
Web资产类通常指开放了Web服务对外(如VPN网关、防火墙管理后台)对于Web资产,版本信息可能被无意识的呈现在HTML源码、静态资源路径或API接口响应中;
协议资产类(如开放SNMP、Telnet、SSH等协议产品)这里指非常规开发Web协议类的资产,则需要通过协议交互(如抓取Banner、发送特定协议的握手报文)来获取。
为了应对不同厂商的多样化版本标识方式,我们总结了以下版本探测方法:
1. SNMP信息库读取:通过SNMP协议查询特定OID获取版本信息。
2. 静态文件文件名hash或时间戳比对:利用文件路径中的时间戳或文件名hash与版本对应关系进行识别。
3. 加密字符串映射:通过构建“版本-哈希”映射表来获取版本信息。
4. 网页源代码分析:从HTML标签、ja vasc ript或CSS文件中提取版本号。
5. SSL证书字段识别:从证书的Subject或OU字段中提取版本信息。
6. HTTP Header特征:通过Server或X-Powered-By等字段识别版本。
7. 常见协议发包获取版本信息:构造协议请求数据包,分析响应内容来提取版本信息。
8. 特定接口获取版本信息:通过未授权或服务预设的接口获取版本信息。
这些方法的多样性反映了版本探测的挑战,也为安全工具的系统性改进提供了方向。通过理解和应用这些技术,安全专业人员可以更好地发现潜在漏洞,提升网络防御能力。
常见版本识别方法分类
·SNMP 信息库读取版本信息
SNMP(Simple Network Management Protocol)是一种应用层协议,用于管理网络设备,如路由器、防火墙、交换机、服务器等。通过 SNMP,我们可以远程查询设备运行状态,包括系统版本、设备型号、内存状态等关键信息,目前市面上多数的网络设备产品默认拥有该功能。
在使用SNMP 信息库读取版本信息时需要了解OID 、 MIB及企业编号(Enterprise ID):
OID(ob ject Identifier,对象标识符) 是 SNMP 中用于唯一标识设备信息的编号结构,由一串数字组成,例如:
1.3.6.1.4.1.12356.101.4.1.1.0
管理信息库(MIB)是一种格式化的文本文件,它将数字化的OID映射为人类可读的标识符。这样,管理员在使用SNMP工具查询设备时,可以更容易地理解返回的数据。MIB文件通常包含了设备支持的所有OID及其描述,使得管理者能够不必记住复杂的数字序列,而是通过更直观的名称来访问设备信息。
企业编号(Enterprise ID)是 MIB 树的一部分,用于区分不同厂商的设备。结构如下:
1.3.6.1.4.1:这是所有企业的标准前缀(代表 private enterprises)
12356:这是 Fortinet 的企业编号(Enterprise ID)
常见企业编号包括:
厂商 | Enterprise ID |
---|---|
Cisco | 9 |
Huawei | 2011 |
H3C | 25506 |
Fortinet | 12356 |
Ubiquiti | 41112 |
以 FortiGate 为例,获取系统版本信息的 OID 是:
1.3.6.1.4.1.12356.101.4.1.1.0
OID 获取方式有以下几种:
(1) 官方 MIB 文件
各大厂商通常提供自己的 MIB 文件供下载和使用:
Fortinet: https://support.fortinet.com/
Cisco: https://software.cisco.com/download/home/
Huawei: https://support.huawei.com/enterprise/
H3C: https://www.h3c.com/
下载后可使用解析工具加载。
MIB 浏览/解析工具:snmptranslate、iReasoning MIB Browser、ManageEngine MIB Browser等
(2)SNMP Walk 工具扫描
通过 SNMP 工具扫描设备可以获取所有当前设备开放的 OID
示例命令:
snmpwalk -v2c -c public <IP地址> 1.3.6.1
(3)在线 OID 查询平台
https://github.com/lextudio/mibs.pysnmp.com/tree/master/asn1
输入 OID 即可查看归属、描述等信息。
协议类设备如 FortiGate 支持 SNMP 查询,可使用 snmpwalk 工具探测:
执行命令:
snmpwalk -v 2c -c public <目标IP>:161 1.3.6.1.4.1.12356.101.4.1.1.0
【不支持外链图片,请上传图片或单独粘贴图片】
SNMPv2-SMI::enterprises.12356.101.4.1.1.0 = STRING: "v7.4.7,build2731,250120 (GA.M)"
【不支持外链图片,请上传图片或单独粘贴图片】
·静态文件文件名hash或时间戳比对识别版本
为什么静态资源文件能用于分析版本?
静态资源文件(如CSS、ja vasc ript、图像)可以帮助分析版本,因为许多Web应用和网络设备会通过在文件名中添加版本号或哈希值来管理缓存和确保用户获取最新文件。这种做法被称为“版本化”,可以让安全评估人员通过检查这些文件来推断软件版本。例如,Fortinet防火墙的版本信息可能通过MD5哈希值来标识,这在渗透测试中非常有用。
是否每次发布版本都会生成唯一哈希?
并非每次产品发布新版本都会打包前端并生成唯一的哈希作为文件名。虽然这是现代Web开发的常见做法,但具体实现因产品而异。一些产品可能使用固定的版本号(如v1.0.0),而非动态生成的哈希值,尤其是较旧的系统或小型应用可能不采用这种方法。
Webpack是ja vasc ript 应用程序的静态模块打包工具,webpack 内置了三种 hash 计算方法,对生成的文件可以在输出的文件中添加 hash 字段:
hash:每次构建会生成一个 hash。和整个项目有关,只要项目有文件更改,就会改变 hash。
contenthash:和单个文件的内容有关。指定文件的内容发生改变,就会改变 hash。
chunkhash:和 webpack 打包生成的 chunk 相关。每一个 entry ,都会有不用的 hash。
因此静态文件的问今名中的hash对获取版本信息有一定的借鉴意义。
示例:
RoundCube Webmail 页面中:
<img src="/cPanel_magic_revision_1732575982/unprotected/cpanel/images/notice-error.png" alt="Error" align="left"/>
时间戳1732575982对应的日期时间是2024-11-26 07:06:22
那距离这个时间最近发布的版本最有可能为此产品的版本
通过github REST api 进行查找发现Roundcube Webmail 1.6.9最为接近
进一步对源代码进行研究
在RoundCube Webmail源代码中我们发现存在对静态文件路径进行处理的函数
检查后缀是不是常见的前端资源(JS、CSS、图片等)。
如果是,就调用 $this->file_mod($file) 给它加个时间戳(比如style.css?v=123456),起到缓存更新控制的作用。那这块提到的file_mod方法就是对给前端资源文件自动加上版本参数(文件最后修改时间对应的Unix 时间戳)
使用了filemtime(string $filename)返回指定文件的最后修改时间并拼接到静态文件后,这也确定了此方法的可行性。
通过研究发现每个版本对应的文件时间戳都不相同,因此可以通过计算静态资源文件最后修改时间并生成版本映射库来实现静态文件时间戳识别版本,对于更新迭代较为缓慢的产品也可以采用资源文件最后修改时间对应产品版本发布时间来判断,当然这样不是非常准确,但也为我们提供了可参考价值。
·加密字符串识别版本信息
部分网络产品在出于安全考虑或架构设计上,并不会在前端页面或接口中直接呈现版本号,所以思路是可以分析产品设备中暴露的一些固定的加密字符串、哈希值或某些特定标识来代表版本(建立对应关系库)。这种情况下,单纯的页面分析或接口调用难以直接还原真实版本号。为了解决这个问题,可以通过对照厂商安装包中的静态资源(如 JS 文件、CSS 路径、favicon 文件等)或分析源码的方式,提取出特定版本下的哈希特征,构建“版本号 - 哈希值”的映射表。
示例:Fortinet 防火墙
Fortinet 防火墙目录中存在静态加密字符串,在返回包的Header中也存在Etag对应的值与目录中的加密字符串相同。
通过搜索加密字符串发现具有相同特征的资产并不唯一,判断此加密字符串可能与版本信息有关,再进一步确认发现每个版本对应的静态加密字符串并不相同,因此可以确定此静态加密字符串与版本信息有关;
通过研究和已公开信息中获取到一些加密字符串与版本号之间的对应关系:
加密字符串 | 版本号 |
---|---|
97a9a8eadad35e7c450cd9aae0848ee7 | 7.2.3 |
df91004ba8e5e244e7af97a888494774 | 7.2.2 |
4885e9396f0d5f343a31e82c0bc37c91 | 7.2.1 |
b911aeb68426644df64811a094b12f98 | 7.0.6 |
·网页源代码识别版本信息
在我们正常访问某网页时会看到网页中存在产品的版本信息,这些版本信息出现的原因是产品默认安装、开发习惯、默认配置、第三方依赖或运维疏忽,而版本信息的泄露会在渗透测试过程中露出马脚,攻击者很轻易通过版本信息得到对应的历史漏洞,从而使系统沦陷。
示例:
Sophos VPN 登录页面的源代码中包含:
src="/ja vasc ript/validation/JavaConstants.js?version=x.x.x.x"></sc ript>
·SSL 证书字段识别版本
许多设备厂商(如路由器、防火墙)会在SSL证书的Subject或OU(组织单位)字段中标注固件版本,目的是便于内部管理或技术支持。
示例:
OU=TP-LINK Router Firmware v4.0.2
CN=FortiGate SSL VPN, O=Fortinet, OU=FortiOS 7.2.1
命令示例:
openssl s_client -connect target:443 2>/dev/null | openssl x509 -noout -subject -issuer
命令返回示例:
subject=CN = tplinkmodem.net
issuer=CN = TP-LINK SOHO Router CA, O = TL-MR6400, OU = 3C52A1DCDE70CF7F7FC9C2BCAF2D65DF1E1E
·HTTP 响应头中的版本特征
部分产品的版本信息会在 HTTP 响应头中体现,常见字段包括:
- Server
- X-Powered-By
- X-OWA-Version(Exchange)
- X-F5-Product-Info(F5)
示例:
Microsoft Exchange 在访问 /owa 目录时,响应头中包含:
X-OWA-Version: 15.2.1118.12
·常见协议发包获取版本信息
根据某个服务所使用的协议标准(如 Imap、FTP、SSH、Redis 等),主动构造并发送协议请求数据包,然后分析响应内容来提取版本信息,大多数网络服务在接收到符合协议规范的连接请求或特定命令后,会根据协议标准返回一段响应数据,其中通常包含了服务的基本信息,如名称、版本号、构建信息等。
常见协议与示例:
协议 | 默认端口 | 发包方式 | 返回信息示例 |
---|---|---|---|
HTTP | 80/443 | 构造 GET / HTTP/1.1 请求 | Server: nginx/1.18.0 |
SSH | 22 | 建立 TCP 连接即返回 banner | SSH-2.0-OpenSSH_7.6p1 |
FTP | 21 | 建立连接获取 welcome banner | 220 vsFTPd 3.0.3 |
MySQL | 3306 | 建立连接获取握手包 | 5.7.31-log |
Redis | 6379 | 发送 INFO 命令 | redis_version:6.0.9 |
SMTP | 25/587 | 建立连接返回欢迎信息 | 220 mail.example.com ESMTP |
Memcached | 11211 | 发送 version\r\n 命令 | VERSION 1.5.22 |
工具支持:
Nmap:支持 -sV 参数进行协议识别与版本探测。
Socket 脚本:使用 Python、Go 等语言构造 socket 请求并解析响应。
Netcat / Telnet:手动发包测试协议响应内容。
FOFA支持对将近800个协议进行默认探测并读取返回信息
示例:
Zimbra-邮件系统
通过imap协议返回版本信息
命令示例:
nc <ip> <port>
命令返回示例:
Zimbra-邮件系统还涉及到web资产,获取版本信息的方式包括Zimbra SOAP API、特定url(https://<ip>:<port>/js/zimbraMail/share/model/ZmSettings.js)
Zimbra SOAP API获取版本信息的条件是zimbraSoapExposeVersion属性设置为TRUE
发送的SOAP格式示例:
返回结果示例:
·特定接口获取版本信息
通过访问系统或服务中预设的公开接口(如 /version、/status、/api/info 等)或使用目录扫描工具获取可能未授权访问的路径来获取其版本号、构建号或组件名称等信息。这类接口常见于 Web 服务、微服务架构、IoT 设备管理页面及各类后台系统中,返回内容通常为结构化的 JSON 或 xm l 格式。通过这些接口,攻击者或运维人员可以在无需认证的情况下快速识别系统版本,从而用于漏洞确认或资产管理。
示例:
Ruijie-EG易网关
访问路径“/login.php?a=version”即可返回版本信息
研究结论
在网络攻防实战中,版本探测是渗透测试、漏洞挖掘和资产测绘的关键第一步!不同厂商设备的版本信息呈现方式大不相同——有的直接明文展示,有的可以通过研究文件中的特殊字符串使版本信息有迹可循,有的在接口或文件路径里。
我们着重对加密字符串识别版本信息、静态文件文件名hash或时间戳比对、SNMP 信息库读取三个部分进行分析,解决了无明显版本特征产品无法标识版本的问题,这种方式需要收集产品每个版本的对应关系。
主要突破点:
1、 解决信息分散问题:针对版本特征分布在网页源码、静态文件、协议交互等不同位置的情况,我们系统整理了8类提取方法(如SSL证书字段解析、SNMP OID查询等)。
2、 建立特征映射关系:例如对Fortinet等设备中的哈希字符串、文件时间戳等特征,通过构建版本对照表实现识别。
3、 降低技术门槛:将原本依赖经验的探测过程标准化,例如提供常见厂商的SNMP OID清单、静态文件特征库等。
遗留挑战:
动态更新的文件哈希、部分产品版本对照表缺失等问题仍需持续完善,需要大量的收集整理产品版本对照表,但当前方案已能覆盖大多数产品的版本探测需求。
绝大多数网络设备在默认配置下都存在版本信息泄露风险,攻击者可借此快速定位漏洞,而防守方则能通过系统化的版本识别策略,提升安全检测效率!
以上是目前搜集的常见识别版本的方法场景,如还有其他也欢迎大家补充!
最新评论