▌引言:网络设备版本探测在安全评估中的关键作用
在当今快速发展的网络安全领域,渗透测试和网络安全评估已成为保护数字基础设施的重要手段。其中,准确识别目标设备的软件版本是发现漏洞和评估风险的关键步骤。不同版本的软件可能存在独特的安全漏洞,因此版本探测直接影响到安全评估的深度和准确性。
然而,网络设备版本探测并非易事。各厂商的设备在标识版本信息时方式各异:有些设备直接在网页或接口响应中以明文形式呈现版本号作为正常业务功能展示,而另一些产品并没有明显的版本特征,但在我们研究的过程中发现网页源代码或静态文件名中存在一些加密字符串或时间戳可以与版本信息呈现映射关系,对于版本探测目前并没有通用型的方法,现在的识别更多属于一种知识库积累,针对不同产品我们要寻找不同的方法,本文主要研究如何在远程无认证的情况下获取到产品的具体版本号。
▌产品类型与识别思路
我们对网络设备版本探测进行了深入研究,并将其分为两大“门派”:
Web资产类:通常指对外开放了Web服务(如VPN网关、防火墙管理后台),版本信息可能被无意识的呈现在HTML源码、静态资源路径或API接口响应中;
协议资产类(如开放SNMP、Telnet、SSH等协议产品):这里指非常规开发Web协议类的资产,则需要通过协议交互(如抓取Banner、发送特定协议的握手报文)来获取。
为了应对不同厂商的多样化版本标识方式,我们总结了以下版本探测方法:
1.SNMP信息库读取:通过SNMP协议查询特定OID获取版本信息。
2.静态文件文件名hash或时间戳比对:利用文件路径中的时间戳或文件名hash与版本对应关系进行识别。
3.加密字符串映射:通过构建“版本-哈希”映射表来获取版本信息。
4.网页源代码分析:从HTML标签、JavaScript或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(Object 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) 常见企业编号包括:
|
|
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://oidref.com/
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、JavaScript、图像)可以帮助分析版本,因为许多Web应用和网络设备会通过在文件名中添加版本号或哈希值来管理缓存和确保用户获取最新文件。这种做法被称为“版本化”,可以让安全评估人员通过检查这些文件来推断软件版本。例如,Fortinet防火墙的版本信息可能通过MD5哈希值来标识,这在渗透测试中非常有用。
是否每次发布版本都会生成唯一哈希?
并非每次产品发布新版本都会打包前端并生成唯一的哈希作为文件名。虽然这是现代Web开发的常见做法,但具体实现因产品而异。一些产品可能使用固定的版本号(如v1.0.0),而非动态生成的哈希值,尤其是较旧的系统或小型应用可能不采用这种方法。
Webpack是JavaScript 应用程序的静态模块打包工具,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 |
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 |
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 |
发送versionrn 命令 |
VERSION 1.5.22 |
nc<ip> <port>
▌End
欢迎各位白帽师傅们加入我们的社区大家庭,一起交流技术、生活趣事、奇闻八卦,结交无数白帽好友。
也欢迎投稿到 FOFA,审核通过后可获得F点奖励,快来加入微信群体验吧~~~
微信群:扫描下方二维码,加入 FOFA 社群!获取更多一手信息!
原文始发于微信公众号(FOFA):揭秘网络设备版本:渗透测试的起点
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论