BadTunnel超级漏洞CVE-2016-3213技术与防护方案

  2016年6月15日,微软发布了6月安全更新,微软修复了一个影响Windows 95到Windows10所有版本的操作系统漏洞,可能成为Windows漏洞史上影响范围最广的漏洞。不要慌张,听绿盟君带你进行技术分析和相应防护措施。

  据信此漏洞由腾讯玄武实验室发现,并被命名为BadTunnel。

  此漏洞编号为CVE-2016-3213,CVSS评分为高级,微软给出的等级为重要。

  相关CVE的披露地址如下:

  根据微软的描述,BadTunnel源于WPAD(Web Proxy Auto Discovery,网络代理自动发现)协议产生的漏洞。当WPAD协议回退到目标系统上易受攻击的代理发现进程时,该漏洞可能会允许特权提升,但这个漏洞的精髓实则是利用NetBIOS的协议缺陷实现跨网段的广播协议劫持。

  文章目录

  影响的版本 目前所有的Windows版本。不受影响的版本 无。技术分析

  Windows系统在访问带有UNC路径的文件时,会发送NetBIOS的Node Status Request(节点状态请求)请求,确认访问节点的状态。而同时Windows默认开启WPAD协议,在查询本地LMHOSTS(本地名称解析)和DNS(域名系统)失败后,会通过NetBIOS在局域网中广播Name Query Request(名称查询请求)请求解析WPAD的IP地址。如下图所示:

  对于局域网中劫持NetBIOS,进而毒化WPAD协议进行中间人攻击,已不新鲜。但BadTunnel关键在于穿透了网络边界,在有NAT(Network Address Translation,网络地址转换)的情况下仍然有效,实现了跨网段的劫持。下面就来详细看一下这究竟是怎么做到的?

  根据NetBIOS的RFC1002协议,可以看到NetBIOS的Node Status Request(节点状态请求)和Name Query Request(名称查询请求)仅有Query Type(查询类型)的差异(下图所示)。而微软在协议实现时,对NAME_TRN_ID采取的是递增的操作。

  虽然Name Query Request(名称查询请求)只能在局域网中广播,网关不会将其转发到外网,但Node Status Request(节点状态请求)本身是不限制在局域网中的,那么如果Node Status Request(节点状态请求)请求在前,Name Query Request(名称查询请求)请求在后,我们就可以根据前一个Node Status Request(节点状态请求)请求中的NAME_TRN_ID预测下一个Name Query Request(名称查询请求)中的NAME_TRN_ID,伪造一个Name Query Response(名称查询响应),紧跟着前一个Node Status Response(节点状态响应)返回,由于二者都使用相同的端口,网关同样会将外网的Name Query Response(名称查询响应)转发回内网,这样就实现了跨网段的NetBIOS劫持。

  攻击的示意图如下:

  1) 攻击者诱骗用户点击包含指向自生地址的UNC文件路径。

  2) 攻击者在外网也可以收到Node Status Request(节点状态响应)的请求,并知道了NetBIOS的NAME_TRN_ID。

  3) 由于用户机器默认WPAD配置或者再次诱骗用户访问包含WPAD名称的链接,NetBIOS会广播WPAD 查询地址,如下:

  但此广播数据包不会被转播到外网。

  4) 攻击者根据之前获得的NAME_TRN_ID,可以猜测出之后的WPAD查询请求的NAME_TRN_ID为之前的数值加1,因此攻击者伪造一个WPAD的Name Query Response(名称查询响应)。

  5) 由于NetBIOS的Node Status(节点状态)和Name Query(名称查询)使用相同的端口,加之前面Node Status Request(节点状态请求)和 Response(节点状态响应)已经建立过连接。所以网关对外网攻击者发来的伪造Name Query Response(名称查询响应)会转发到内网。用户收到伪造的WPAD的Response,同时在没有检查Response是否来自内网的情况下接受了此Response,使得自身的WPAD被毒化。之后用户的流量就会走WPAD协议,重定向到了攻击者里。

  防护方案 微软已经向用户推送了安全更新,不过需要注意的是,用户需要结合MS16-063和MS16-077才能完全修复漏洞。

  微软安全更新地址:

  MS16-063:

  

  MS16-077:

  

  禁用 WINS/NetBT 名称解析。

  1) 打开网络连接。

  2) 单击要静态配置的“本地连接”,然后从“文件”菜单中,单击“属性”。

  3) 在组件列表中,单击“Internet 协议 (TCP/IP)”,然后单击“属性”。

  4) 单击“高级”,单击“WINS”选项卡,然后单击“禁用 TCP/IP 上的 NetBIOS”。如果您正在使用 DHCP 服务器(它可以在所有 DHCP 选项类型中有选择地启用和禁用 NetBIOS 配置),您也可以在 DHCP 服务器上选择“使用 NetBIOS”设置。

  取消WPAD自动检测设置

  设置防火墙,阻止外部访问主机的137端口。

发表评论