安全研究

News information

NAT Slipstreaming——泄露内网信息的新型攻击浅析

<<返回

2020年12月03日 17:58

1.NAT Slipstreaming 简介 

2020 年 10 月 31 日 Samy Kamka 发布了一种被称为 NAT Slipstreaming 的新式攻击手段,可以无视防火墙的 NAT 获得内网中主机的信息。 

NAT Slipstreaming 通过钓鱼邮件中的链接或是互联网中部署的恶意网站(也可能是加载 了恶意链接的合法网站),当Victim 访问了相关链接后,就会触发网关打开受害者设备上的 任意 TCP/UDP 端口,绕过基于浏览器的端口限制。 

NAT Slipstreaming 利用了用户浏览器和 NAT、路由器、防火墙中内置的Application Level Gateway (ALG) 连接追踪机制,通过 Web 时序攻击、WebRTC、自动远程 MTU 和 IP 分段 发现、TCP 包大小消息、TURN 认证滥用、精确的包边界控制、通过浏览器滥用的协议混 淆等手段实现内部 IP 提取。 


2.环境搭建和流量抓取 

由于使用了 Samy 提供的 Poc 验证网站 http://samy.pl/slipstream/server 因此搭建了两套环 境以分别测试拥有 ALG 的防火墙和不包含 ALG 的开源防火墙 pfSense 的环境中此攻击如何 进行,网络拓扑如下:

image001.jpg   

 

图 1 pfSense 验证环境


  

 image002.jpg

图 2 出口墙直连验证环境

 

a)环境 1 

从虚拟机 Ubuntu 上访问 Samy 搭建的 Poc 页面,并使用 Wireshark 开始抓包,页面输出如图 3 所示:

image003.jpg   

 图 3 Poc 的输出

 

图 4 中显示了在连接到 Poc 站点后(数据包 17)开始从数据包 35 建立 WebRTC 通道的 过程。但是此连接中并没有通过 WebRTC 获取到内部的 IP 地址,因此后面执行了 Web TCP 定时攻击。

image004.jpg   

 图 4 已建立的 WebRTC 通道

 

通过图 5 可以看出,当网站尝试将隐藏的 HTML <img>标签作为 PoC 的一部分加载时, 192.168.211.132 向大量内部网关常用 IP 地址发出了请求用以探测存活的内网网关。在图 6 中我们可以看到 2 个 IP 地址 192.168.2.1 和 192.168.44.1 首先响应了 192.168.211.132 发出的 请求并返回了响应包(数据包 337、361 和 366)。在测试设置中,192.168.2.1 是我们所使用 的网关,而 192.168.44.1 是 VMware Net Adapter 虚拟网关。在识别 NAT IP 的最后一步中, 会在已发现的存活网关子网中再次执行定时攻击,进而发现物理主机 IP 地址 192.168.2.122。

image005.jpg 

图 5 遍历内部常用网关 IP 地址

image007.jpg

图 6 收到请求并回应的 192.168.2.1 和 192.168.44.1

 

b)环境 2 

依然使用 Samy 搭建的 Poc 验证网站作为远端数据服务器。在 Win10 机器上使用 IE11 访问了 http://samy.pl/slipstream/server,同样开始建立 WebRTC 通道并执行了 Web TCP 定时攻 击以探测内网的存活网段,如图 7 所示:

image008.jpg   

 图 7 环境 2 中执行 Web TCP 定时攻击

 

但不同于环境 1 中的情况,在环境 2 中多出了 SIP 和 TCP+TLS 的包,后面的分析中 会对原因进行分析解释。

image009.jpg   

 图 8 探测到的存活网关节点

 

3.流量和攻击原理分析 

首先简单了解一下 NAT 和 SIP 是什么。 

NAT(Network address translation,网络地址转化)是网络设备在传输消息过程中对包 的 IP header 部分的网络地址信息进行修改实现 IP 地址空间的映射。NAT 的主要优势是可 以减少组织内部网络中公网 IP 地址的使用和改善安全性。

SIP(Session Initiation Protocol,会话发起协议)是用来为声音、视频和消息应用发 起、维护和终止实时多媒体会话的通信协议。 

SIP Register 格式(eg:192.168.2.161 发送注册消息给服务器 192.168.2.89):

 

REGISTER sip:192.168.2.89 SIP/2.0 

Via: SIP/2.0/UDP 192.168.2.161:10586 

Max-Forwards: 70 

From: <sip:01062237496@192.168.2.89>;tag=ca04c1391af3429491f2c4dfbe5e1b2e;epid=4f2e395931 

To: <sip:01062237496@192.168.2.89> 

Call-ID: da56b0fab5c54398b16c0d9f9c0ffcf2@192.168.2.161 

CSeq: 1 REGISTER 

Contact: <sip:192.168.2.161:10586>;methods="INVITE, MESSAGE, INFO, SUBSCRIBE, OPTIONS, BYE, CANCEL, NOTIFY, ACK, REFER" 

User-Agent: RTC/1.2.4949 (BOL SIP Phone 1005) 

Event: registration 

Allow-Events: presence 

Content-Length: 0

 

当注册成功(回送 200 OK)时,服务器发送的 res 消息参考如下:

 

SIP/2.0 200 OK 

Via: SIP/2.0/UDP 192.168.2.161:10586 

From: <sip:01062237496@192.168.2.89>;tag=ca04c1391af3429491f2c4dfbe5e1b2e;epid=4f2e395931 

To: <sip:01062237496@192.168.2.89>;tag=-00834-14d0805b62bc026d 

Call-ID: da56b0fab5c54398b16c0d9f9c0ffcf2@192.168.2.161 

CSeq: 1 REGISTER 

Allow: 

INVITE,ACK,OPTIONS,BYE,CANCEL,REGISTER,INFO,UPDATE,PRACK,REFER,SUBSCRIBE,NOTIFY,MESS 

AGE 

Contact: sip:192.168.2.161:10586 

Content-Length: 0 

Expires: 3600 

NAT Slipstreaming 主要由包边界控制、TCP 定时攻击/子网和内部 IP 发现以及浏览器 协议混淆三个部分组成。

 

a)包边界控制 

在网络的更高层中无法人为控制 TCP 数据包头,NAT Slipstreaming 攻击为了达成获取 内网 IP 的目的必须要精确控制数据包的大小,因此在攻击的开始会存在调整数据包大小的 过程,如图 9 所示,此攻击将带有 ID 的大(6000 字节)HTTP POST 和带有隐藏 Web 表单 的填充数据发送到攻击者服务器 http://samy.pl/slipstream:5060/pktsize。在攻击服务器 上,攻击者运行一个数据包嗅探器,查找数据包的边界以确定 MTU(最大传输单元)大 小,IP 报头大小,潜在的 IP 选项,TCP 报头大小,数据包大小以及发送什么内容(具体代 码实现见附件 max_pkt_size.pl) 

在图 10 中可以看出攻击在初始的 SYN 响应期间发送最大段大小(mss)来控制 TCP 数据包大小。

image011.jpg   

 图 9 NAT Slipstreaming 攻击在调整发送的包的大小以适配目标浏览器

 image012.jpg

 图 10 发送设定 mss 选项的 TCP 包以控制数据包大小

 

攻击者还滥用了 TURN (Traversal Using Relays around NAT,使用中继穿越 NAT) 中的 认证函数。TURN 协议允许一台主机使用中继服务与对端进行报文传输。攻击者滥用 TURN 协议中的认证函数来引发包溢出,使得 IP 包分段。即通过 padding 填充来溢出 TCP 或 UDP 包,使得其分割成 2 部分,因此 SIP 数据包就会在第二个包边界的开始部 分。 

b)TCP 定时攻击/子网和内部 IP 发现 

如果 Victim 使用了例如 Safari,IE <= 11 或其他不支持 WebRTC/故意不泄露内部 IP (Safari)的浏览器,NAT Slipstreaming 会使用 Web 定时攻击来泄露受害者的内部 IP 地 址。 

首先通过<img>在页面上生成隐藏的 HTML 标记(以及所有的常用网关如 192.168.*.1、10.0.0.1 等)以及 Javascriptonsuccess 和 onerror 事件,如图 11 所示代码部 分。

image013.jpg 

图 11 攻击者预设的一些常用内网 IP 地址

 image014.jpg

图 12 扫描常见网关的代码部分

 

每次将<img>写入页面时,都会启动 Web 定时攻击。如果 onsuccess 触发,则表示 IP 对 Web 服务器响应,表示这是一个存活的网关;如果是一个内网的开放 IP 但并没有开启 服务,它将发送 TCP RST(重置,表示端口未打开)响应包,触发 onerror;如果 IP 不存 在,则不发送 RST,且超时 1s 以上时,可以判断此 IP 在网络中不存在。 

通过上面的方式判断出存活网关后,就会对子网内的每个 IP(如 192.168.0.[2-255]) 再次执行相同的攻击方法,最终将判断出真实的内网存在的 IP 地址。 

并且在某些浏览器中(Chrome),无法在HTTP 中通过 WebRTC 获得 IP 地址(即上面 的扫描存活子网操作),然后攻击者会使用 HTTPS 尝试获取 IP 地址(如图 13),在拿到想 要的内部 IP 地址后,将 IP 附加在 URL 上重定向至 HTTP(如图 14),并绕过跨域限制。

image015.jpg 

图 13 使用 HTTPS 尝 试获取 IP 地址


   image016.jpg

图 14 将找的 IP 地址附加在 URL 上 重定向回 HTTP

 

c)浏览器协议混淆 

一旦客户端获取了包大小和内部 IP 地址,就会构造一个 Web 表单来填充 POST 数据 直到包被分段,此时加上包含内部 IP 地址的 SIP REGISTER 。然后该表单会通过 JS 在受害 者不知情的情况下提交。 

当包到达攻击者服务器后,如果 SIP 包没有用公网 IP 地址覆写,就会自动发送消息给 客户端,要求调整包大小为新的边界。

 如果包边界正确,NAT 会认为这是一个合法的 SIP 注册,并且来自受害者机器的 SIP 客户端,最终 NAT 会打开受害者发送的原始包的端口。 

然后,路由器/防火墙会转发攻击者选择的端口给内部受害者。攻击者现在可以连接到 在 Victim 上运行的任意 TCP/UDP 服务。

image017.jpg   

 图 15 攻击者通过伪造的 SIP 协议将内网 IP 发送出去


   4.攻击流程回顾

image018.jpg 

图 16 攻击流程图  

 

 5.防御与检测 


a)检测 

对于普通用户而言,如果所访问的网站似乎花费比通常更长的时间来完全加载(除了 正常的高延迟 Internet 连接),这可能是所访问的网站正在执行 NAT Slipstreaming 攻击。 

对于企业用户而言,对网络流量的持续监视可以发现 NAT Slipstreaming 攻击的明显迹象(例如:内部 IP 地址访问量的突然激增(因为 NAT Slipstreaming 执行 Web 定时攻击会 遍历可能的内网 IP 地址),单个内部主机的目标端口为 80,或者是 ALG 类型的协议出现 多 IP 多次端口协商的行为。 


b)防御

 

对于普通用户而言,除了正常的防御手段(例如避免打开或点击钓鱼邮件中的任何不 明链接,不访问不安全的网站)外,可以通过更换已屏蔽此攻击的浏览器来实现,目前 Google 的 Chrome 87 版本已修复了此漏洞。或者禁用未知的 Javascript 加载行为来防止此 问题的出现,但禁用 Javascript 可能会影响正常的网页访问。

 

对于企业用户而言,除了上面的方法外可以在企业出口防火墙禁用非必要的 ALG 协 议,如本文中的 NAT Slipstreaming 所使用的 SIP ALG,对于必须的 Volp 服务可以使用其他 方案进行替代。