本文先容了在Chrome、Edge和Safari中实现可靠的DNS重绑定的新技能,并谈论了绕过本地网络限定的技能。通过剖析慢缓存的根本缘故原由,提出了新的办理技能。本文研究了利用DNS重绑定在Chrome、Edge和Safari中实现瞬间DNS重绑定的攻击技能。
本文是关于DNS重新绑定系列文章中的第二篇。第一篇文章先容了一个利用DNS重新绑定落后击的案例。在这篇文章中,我先容了在IPv6可用时在Chrome, Edge和Safari中实现可靠的,瞬间DNS重新绑定的新技能,以及一种绕过本地网络限定的技能,该技能适用于基于Chrome的浏览器的获取API。
浏览器中的DNS重绑定传统上被视为攻击者通过诱骗受害者加载恶意网站来访问内部网络做事的一种办法,但随着许多当代web运用程序现在在其部分功能上驱动无头浏览器,它已成为攻击web运用程序的有用工具。无头浏览器,即 Headless Browser,是一种没有界面的浏览器。它拥有完全的浏览器内核,包括 JavaScript 解析引擎、渲染引擎等。与普通浏览器最大的不同是,无头浏览器实行过程中看不到运行的界面,但是我们依然可以用 GUI 测试框架的截图功能截取它实行中的页面。在上一篇文章中,我先容了一个利用可能是最大略的重新绑定方法的例子。在这种情形下,我有很长的韶光让漏洞运行,但这在许多web运用程序中不太可能,须要更快的技能。

缓慢的缓存
大略的DNS重绑定技能依赖于对相同主机名的连续查找返回不同的DNS记录。对付这些攻击,所花费的最小韶光是浏览器实行两次连续DNS查找之间的韶光。这有时可以通过刷新浏览器缓存来加快速率,天生大量DNS查找以添补可用的缓存空间,并导致旧条款在过期之前被打消,从而使浏览器更快地对相同的主机名实行第二次查找。
当它事情时,它仍旧须要大约10秒的韶光,而且常日这种技能不会起浸染,由于中间缓存不能像浏览器的缓存那样随意马虎地被打消。例如,在测试期间,我创造在一个新创建的Ubuntu EC2实例上,由于系统解析的缓存,我只能每5分钟为同一域得到不同的相应。在VPN上,我看到DNS相应在默认解析器上至少缓存30分钟。让用户将页面打开这么永劫光以许可攻击者实现DNS重新绑定漏洞,常日是一件很困难的事情,更不用说将无头浏览器作为web运用程序的一部分驱动了。
为了加速漏洞利用,2010年Craig Heffner提出了通过在相同相应中回答同一域的多个A记录来实行DNS重新绑定的想法,Gerald Doussot和Roger Meyer在2019年的singularity 中利用了这种技能。Singularity 是一个开放源码容器平台,旨在简化、快速和安全。Singularity 是针对 EPC 和 HPC 事情负载进行优化的,许可不受信赖的用户以可信的办法运行不受信赖的容器。
返回的两条记录是攻击者掌握的公共做事器的IP地址和目标做事器的(常日是私有的)IP地址。
只有当浏览器试图首先与公共做事器通信并加载攻击者的恶意页面时,攻击才会起浸染。然后,攻击者的web做事器开始阻挡来自受害者浏览器的流量,导致浏览器退回到将所有要求发送到目标做事器。在这种情形下,攻击者页面中的JavaScript将能够向同一来源下的目标IP地址发送要求。
这种技能确实绕过了缓请安题,由于浏览器只须要实行一次DNS查找,只管在我的测试期间,所有紧张浏览器都会始终考试测验在公共IP地址之前与私有IP地址通信,这意味着这些技能不起浸染。虽然我不相信这种行为是为了防止DNS重新绑定,但它可以有效的阻挡这种技能。
这种新行为匆匆使我研究新的技能,可以用来在Safari和基于chrome的浏览器中实现瞬间DNS重新绑定。这些技能的关键是找到新的方法,使浏览器最初利用公共IP,然后在加载网站时切换到利用私有IP。打开Wireshark,我把稳到在当代浏览器中加载网站时,会同时发送A和AAAA查询。我开始调查这种行为是否可以用来可靠地实行DNS重新绑定。
攻击Safari:延迟DNS相应
当你在通过IPv6访问互联网的主机上加载Safari网页时,分别为IPv4和IPv6地址发送A和AAAA DNS查询。当返回多个IP地址时,Safari将优先考虑私有IP地址而不是公共IP地址。
当A或AAAA相应延迟时,Safari中许可快速DNS重新绑定的有趣行为会发生。在这种情形下,Safari不会等待所有DNS相应,而是在吸收到第一个DNS相应后立即发送HTTP要求。当收到延迟的DNS相应时,此相应中的IP地址将被添加到IP地址池中,Safari可以在将来要求该域时利用该IP地址池。
这意味着,如果第一个DNS相应是针对公共IP地址的,而延迟的DNS相应是针对私有IP地址的,Safari将向公共IP地址发送第一个要求,直到吸收到延迟的DNS相应,此时它将开始向私有IP地址发送要求。
这供应了一种在Safari中利用自定义DNS做事器实现DNS重新绑定的大略方法,该做事器可处理.r.inded.es的查询:
1.加载目标浏览器http://safari.r.intrud.es,触发safari.r.intrud.es的A和AAAA查找。
2.让DNS做事器立即返回AAAA记录,个中包含互联网长进击者掌握的web做事器的IPv6地址。暂时不要返回A相应。
3.一旦收到AAAA相应,Safari将向攻击者的web做事器发出第一个要求。从攻击者的web做事器返回一个带有JavaScript的页面来重复要求http://safari.r.intrud.es/secret.txt。
4.从DNS做事器发送包含本地网络上目标做事器的IP地址的A相应。
5.Safari现在将对http://safari.r.intrud.es/secret.txt的要求发送到本地网络上的目标做事器。从攻击者的做事器加载的页面可以读取这些要求的相应,而不会违反同源策略。
为了实现这一点,我编写了一个小型DNS做事器,可以利用命令行参数延迟DNS相应。在实践中,我创造将A相应延迟100毫秒险些总是足够的,只管可以利用200毫秒或更永劫光的延迟来使该技能更加可靠。可以在这里https://github.com/intruder-io/dns-delay-server找到这个做事器以及设置它的解释。
我用来利用它的PHP脚本会将用户重定向到r.introd.es的随机子域,以避免中间缓存滋扰利用。它还将JavaScript直接包含在页面中,以避免另一个资源负载。你可以在这里找到利用的代码。
该脚本在操作中的视频请点此,从本地web做事器检索文件的内容:
我在iOS上的Safari和Brave上进行了测试,创造同样的技能也可以用于访问内部网络上的做事。
攻击Chrome:利用AAAA优先级
Chrome将优先加载本地网络上的页面,而不是互联网上的页面,但在可用的情形下,它会优先加载IPv6而不是IPv4上的页面。以是紧张任务是:
1.本地IPv6(最高优先级);
2.公共IPv6;
3.当地IPv4;
4.公共IPv4(最低优先级);
这里的关键部分是Chrome会优先考虑公共IPv6地址而不是私有IPv4地址。此外,当Chrome知道一个域的多个IP地址时,一旦做事看重置连接,它就会考试测验不同的IP地址。
这给出了一个针对Chrome的快速DNS重绑定操持:
1.加载http://chrome.r.intrud.es,这将触发A和AAAA查找chrome.r.intrud.es。
2.让DNS做事器返回指向本地网络上目标web做事器的A记录和指向公共互联网长进击者掌握的web做事器的AAAA记录。
3.Chrome将优先考虑IPv6地址,并从攻击者掌握的web做事器发出第一个加载页面的要求,该做事器返回JavaScript以重复向http://chrome.r.intrud.es/secret.txt发出要求。
4.关闭攻击者掌握的做事器,以便重置所有连接。Chrome现在将把所有要求发送到本地网络上的目标做事器。
5.让加载的页面向http://chrome.r.intrud.es/secret.txt发出要求。可以在不违反同源策略的情形下读取对这些要求的相应。
这个操持险些成功了。从互联网加载的页面上的JavaScript试图向本地网络上的目标发出要求,但这些要求被阻挡,并在掌握台中显示以下缺点:
Access to fetch at 'http://chrome.r.intrud.es/secret.txt' from origin 'http://chrome.r.intrud.es' has been blocked by CORS policy: The request client is not a secure context and the resource is in more-private address space `local`.
涌现此缺点是由于Chrome部分实现了私有网络访问(PNA)https://wicg.github.io/private-network-access/规范中描述的保护。
绕过PNA
Private Network Access(以前称为 CORS-RFC1918 )限定了网站向私有网络上的做事器发送要求的能力。根据规范,此类要求只许可来自安全高下文。其余,该规范扩展了跨域资源共享(CORS)协议,因此网站现在必须在许可发送任意要求之前,必须显式要求私有网络上做事器的容许。
私有网络是指目标做事器的IP地址比从其获取要求做事器的IP地址更私有的要求。例如,从公共网站(https://example.com)向私有网站(http://router.local)的要求,或从私有网站向 localhost 的要求。
PNA保护阻挡通过普通HTTP从公共互联网加载的页面向私有网络发出要求。在Chrome中,这些保护是为fetch要求实现的,但还没有为iframe实现。不完全的实现以及DNS重新绑定许可绕过对获取要求的PNA限定。
我们可以重复利用到上面的步骤4,个中公共web做事器已经关闭,所有对http://chrome.r.intrud.es的要求现在都被定向到本地网络上的目标做事器。加载的首页不能向本地网络发出要求,由于它是通过HTTP从公共互联网加载的,但是我们可以在iFrame中加载http://chrome.r.intrud.es。这个iFrame中的页面将从目标web做事器加载。由于此做事器位于本地网络上,因此许可在iFrame中加载的页面向本地网络发出要求。
iFrame中的页面也与顶部页面处于相同的起源,这使得顶部页面可以完备掌握框架页面的DOM。这包括注入脚本,使获取要求进入框架页面。这些脚本可以用来访问目标web做事器并透露数据,就像如果PNA根本没有实现的话,它们可以从首页获取数据一样。
以是,把这些放在一起,我们终极得到了一个完全的步骤:
1.加载http://chrome.r.intrud.es,这将触发A和AAAA查找chrome.r. imports .es。
2.让DNS做事器返回一条A记录,指向本地网络中的目标web做事器,并返回一条AAAA记录,指向公网长进击者掌握的web做事器。
3.Chrome将首先要求从攻击者的web做事器加载顶部页面,该做事器返回一个页面以实行以下步骤。
4.关闭攻击者掌握的做事器,以便重置所有连接考试测验。5.Chrome现在将把所有要求发送到本地网络上的目标做事器。
6.从首页,将一个脚本注入框架页面以要求http://chrome.r.intrud.es/secret.txt并将相应发送到攻击者的web做事器。
这可以在Chrome中实现瞬间DNS重新绑定。
为了帮助实现这个漏洞,我编写了一个小型web做事器,当它吸收到/block要求时将停滞。你可以在这里找到运行它的源代码息争释。
当攻击自动浏览器时,你常日想要在页面中包含一个iFrame,这须要一些韶光来加载。这将阻挡浏览器认为页面已完备加载,直到iFrame已加载,并确保漏洞利用脚本有足够的韶光运行。下面的演示显示,当gowitness被用来从启用了IPv6的EC2上截取恶意网站的截图时,这个漏洞被用来从AWS元数据做事中提取凭据:
或者对付更可能在web运用程序中创造的场景,利用无头Chromium将网页转换为PDF:
这种绕过Chrome的PNA限定的行为通过他们的问题跟踪器报告给了Chrome团队。他们确定这不是安全问题,由于PNA的限定仍在履行过程中。
总结
DNS重新绑定是攻击web运用程序的一个武器。在本系列的第一篇文章中,我试图展示如何在不太繁芜的情形下实现针对web运用程序的重新绑定漏洞。在这篇文章中,我供应了一些工具和技能来构建可靠的漏洞攻击驱动自动浏览器的web运用程序,纵然它们只加载页面很短的韶光。
翻译自:https://www.intruder.io/research/split-second-dns-rebinding-in-chrome-and-safari