Fidus 的研发团队发现了 Virgin Media Super Hub 3 (维珍宽带)路由器中的一个漏洞,该漏洞允许远程泄露敏感信息,这些信息可以用来确定VPN用户的实际ISP发布的IP地址。
DNS重绑定攻击是通过简单地访问一个网页几秒钟来揭示用户的实际IP地址。出于概念证明的目的,这已经被做成了图形化,但需要注意的是,这可以默默地执行。在我们的测试过程中,可以通过多个流行的 VPN 提供商揭露用户的真实 IP 地址,从而实现完全去匿名化。
路由器的底层模型(ARRIS TG2492)和相关模型是一系列DOCSIS光纤路由器,已被全球多个ISP使用,其中许多属于Liberty Global,该公司还拥有Virgin Media。
初步调查
路由器的网页可以给我们提供很多关于设备如何工作的线索,只需登录页面并在浏览器的开发人员工具中查看网络流量,我们就可以发现一些有用的东西。
查看这些请求,我们就可以看到它使用了 SNMP 的 Web 包装器。我们可以使用这些终端获取和遍历对象标识符 (OID)。通过这两个参数我们可以看到有一个 5 位随机数和一个基于时间的变量。要调用这些,我们还需要一个有效的凭证 cookie,这部分内容稍后会谈到。
通过查看一个walk命令的响应,它将执行我所期望的操作,找到请求的OID的所有子节点并返回它们的值,其中还包括一个finish值。有了这些知识,我们应该能够使用这个端点来寻找我们感兴趣的对象。
调用 OID 为 1.3 的 walk 终端会返回大约 16000 个值。虽然我们不知道大多数指的是什么,但我们可以根据它们的值进行猜测,甚至可以自己设置值来看看有什么变化。然而,页面 JavaScript 有一个OID 列表和它们的描述性名称。
可以看到有一个内置函数来解码 OID,所以我们可以通过它运行列表,而不是从 JavaScript 中获取它。并非所有对象都有描述性名称,有相当多的对象根本没有我们可以访问的名称,但它有助于我们了解了解各个对象的用途。
现在我们有一个完整的对象列表,包括它们的名称和示例值,这样我们就可以查找感兴趣的对象,但也希望有一个不需要身份验证的对象列表(甚至是我们稍后发现的nonce值)。获取它的一个简单方法是编写一个快速脚本来尝试获取每个对象的值,如果成功则记录它。
我们得到大约 60 个值,可以在没有身份验证的情况下读取这些值。将这些与我们的名单对照,绝大多数都不是那么有趣,但其中有一小部分值得关注。
漏洞利用
可以立即注意到的是一个名为“WanCurrentIPAddr.1”的解码值,顾名思义,它包含我们的十六进制格式的外部 IP 地址。
从脚本中我们知道只要加载这个页面,就能获得外部IP,如果外部网页可以访问这些信息,比如当连接到VPN的时候,它可以实现去匿名化连接。现在我们需要一种既调用内部网页又检索数据的方法,同时又是一个外部对象,这就是我们的DNS重新绑定攻击变得有用的地方。
DNS重绑定是一种攻击,当来自该域的页面仍在加载时,域更改了它的IP地址。为了进行配置,我们的域的TTL非常短,因此浏览器需要在几秒钟后再次发出DNS请求以再次获得IP (DNS重新绑定攻击中使用的一种方法)。当这种情况发生时,浏览器将使用JavaScript有效载荷加载页面。JavaScript再次请求我们的域,但路径为“/snmpGet?oid=1.3.6.1.4.1.4115.1.20.1.1.1.7.1.3.1”,它将获取外部 IP(来自 SNMP OID)。由于 TTL 太短,它再次向 DNS 服务器询问服务器的 IP 地址。这次我们将它设置为返回我们的攻击 IP(在示例中是 192.168.0.1),所以当我们的 JavaScript 请求页面时,它会得到路由器的响应。
整个攻击只需要几秒钟的时间,因此只需访问一个 URL,就可以揭开用户实际的底层 IP 地址的掩码,如下所示。
概念验证
我们使用了一些 VPN 测试了该漏洞,以确认其有效性,虽然一些 VPN 提供商默认阻止对本地 IP 地址的访问,但许多提供商并没有这样做。如上图所示,我们的 PoC 适用于一个非常知名的 VPN 服务,但需要注意的是,这并不是唯一一个遇到这个问题的VPN提供商。在右边的窗口和VPN客户端里面,你可以看到我们的VPN IP地址,在左边你可以看到真实的,去匿名化的 IP 地址。
出于 PoC 目的,视频具有交互式 GUI,但在实践中,这种攻击可以在用户不知情的情况下,在看起来完全合法的网页上悄悄运行。
本文翻译自:https://fidusinfosec.com/silently-unmasking-virgin-media-vpn-users-in-seconds-cve-2019-16651/如若转载,请注明原文地址