WPAD 协议分析及内网渗透利用

本文将会阐述 WPAD 协议的工作原理、实现方式以及在内网渗透中的应用思路。

0x00 前言

WPAD 这项技术已经诞生了近十年的时间,其最大的优势就在于在一个或多个局域网中,当需要为内网中的用户设置不同的代理服务器去连接互联网或者企业内网时,利用 WPAD 就能够灵活方便的进行配置。由于配置代理服务器的方式对于用户来说是透明的,因此,攻击者就容易利用 WPAD 进行内网的渗透。

可能是由于常规的内网渗透,如 Windows 域的渗透中,攻击者只需拿到域控的权限即可控制域中的任何机器,所以攻击者往往只关注如何抓到域管理员的 Hash,而即使在工作组的渗透中,也有着比 WPAD 更有效的攻击方式。因此,虽然利用 WPAD 进行内网渗透的技术已经出现了很多年了,但一直没有变得像 ARP Spoof 等攻击方式那么流行。但是在攻击者“无计可施”的时候,也会采用一些“非主流”的方式进行内网渗透,WPAD 可能造成的安全隐患,不容我们忽视。

0x01 WPAD 简介

WPAD(Web Proxy Auto-Discovery Protocol,网络代理自动发现协议),可以使局域网中用户的浏览器自动发现内网中的代理服务器,并使用已发现的代理服务器连接互联网或者企业内网。WPAD 支持所有主流的浏览器,从 IE 5.0 开始就已经支持了代理服务器自动发现/切换的功能,而苹果公司考虑到 WPAD 的安全风险,在包括 OSX 10.10 及之后版本的操作系统中的 Safari 浏览器将不再支持 PAC 文件的解析。

注:默认情况下,在所有 Windows 操作系统和 IE 浏览器上都启用了 WPAD,而 Mac OS X 和 Linux 操作系统,以及 Safari、Chrome 和 Firefox 等浏览器,虽然支持 WPAD,但默认情况下不会启用。

WPAD 工作原理

当系统开启了代理自动发现功能后,用户使用浏览器上网时,浏览器就会在当前局域网中自动查找可以加载 PAC 文件的服务器,之后下载 PAC 配置文件(通过 80 端口),并执行特定的 JavaScript 脚本将相应的代理服务器设置到用户的浏览器中。

WPAD 查询步骤如下:

  • 如果 DHCP 服务器配置了 wpad,那么直接从 DHCP 服务器获取 wpad.dat 文件,如果成功则下载 wpad.dat 文件并配置,否则执行下一步;
  • 向 DNS 服务器发送请求查找 wpad.test.local,然后获取代理配置文件,如果成功下载 wpad.dat 文件并配置,否则执行下一步;
  • 发送 LLMNR 查询 wpad.test.local,如果成功则下载 wpad.dat 文件并配置,否则代理设置失败。

PAC 文件

PAC(Proxy Auto-Config,代理自动配置文件),定义了浏览器和其他用户代理在访问一个 URL 时所应该使用的代理服务器(完成自动选择),使用 Javascript 进行 URL 和代理服务器的描述。通常使用 proxy.pac 作为文件名,WPAD 标准则要求使用 wpad.dat 作为 PAC 文件的文件名。

要使用 PAC,则应当在网页服务器上发布一个 PAC 文件,并且通过浏览器的代理链接设置页面输入这个 PAC 文件的 URL 或者使用 WPAD 协议告知用户代理去使用这个文件。

一个 PAC 文件至少定义了一个名为 FindProxyForURL(url, host) 的 JavaScript 函数,该函数的返回值是一个字符串,指定了 URL 的访问方式,两个参数分别代表了要指定设置的 URL 和 该 URL 所对应的主机名。

PAC 文件内容示例如下:

1
2
3
4
5
6
7
function FindProxyForURL(url, host) {
if (url== 'http://example.org/') return 'DIRECT';
if (shExpMatch(host, "*.wooyun.org")) return "DIRECT";
if (host== 'wooyun.com') return 'SOCKS 127.1.1.1:8080';
if (dnsResolve(host) == '10.0.0.100') return 'PROXY 127.2.2.2:8080;DIRECT';
return 'DIRECT';
}

该文件定义了当用户访问 http://example.org 时,将不使用任何代理服务器直接(DIRECT)访问 URL。也可以使用 shExpMatch 函数对 host 或者 url 进行匹配设置,SOCKS 127.1.1.1:8080 指定了使用 127.1.1.1:8080 的 SOCKS 代理进行 URL 的访问,PROXY 127.2.2.2:8080;DIRECT 指定了使用 127.2.2.2:8080 的 HTTP 代理进行 URL 的访问,如果连接 127.2.2.2:8080 的 HTTP 代理服务器失败,则直接(DIRECT)访问 URL。

注:FF 和 IE 只支持系统默认的编码类型的 PAC 文件,并且不支持 Unicode 编码,如 UTF-8。

0x02 Windows 中的 WPAD

IE 浏览器中默认开启 WPAD

在 Windows 系统中,从 IE 5.0 开始就支持了 WPAD,并且是默认开启 WPAD 功能的,如下图所示:

Windows 中 IE 浏览器的 WPAD 设置

另外,Windows 系统从 IE 5.5 开始支持“自动代理结果缓存”功能,并默认设置为开启。因为每次客户端浏览器成功连接 HTTP 代理服务器时都会更新 ARP 缓存,开启此功能后,当客户端浏览器再次连接代理服务器,即再次调用 FindProxyForURL() 函数时,会先检查 ARP 缓存列表中是否存在要连接的 HTTP 代理服务器地址,再选择是否需要代理,以缩减系统获取分配对象的开销。

WinHTTP 的 WPAD 支持

在 Windows 系统中,有一个服务名为 WinHTTP Web Proxy Auto-Discovery Service,其描述信息为 “WinHTTP 实现了客户端 HTTP 堆栈并向开发人员提供 Win32 API 和 COM 自动化组件以供发送 HTTP 请求和接收响应。此外,通过执行 Web 代理自动发现(WPAD)协议,WinHTTP 还提供对自动发现代理服务器配置的支持。”,如图所示:

Windows 中的 WinHttpAutoProxySvc 服务

出于安全性考虑,建议禁用。

注:WPAD 并不是 IE 浏览器的功能,而是属于WinHTTP 库中的功能,有一个单独的 WinHttpAutoProxySvc 服务。WinHTTP 是Windows系统下提供 autoproxy 服务的独立的网络库,专门为提供 HTTP/HTTPS 服务的。
网上很多文章说,防止 WPAD 攻击就是禁用浏览器的 WPAD,这个方法只能说治标不治本。单单禁用浏览器的 WPAD 功能只能保证浏览器的访问数据没法通过 WPAD 劫持了,但是这种禁用方式不会影响 WinHTTP 的功能。在 WIN 系统下,处理 HTTP 的请求基本都用 WinHTTP 的库,如果其他程序使用 WinHTTP,WPAD 照样还是可以攻击。

0x03 WPAD 实现方式

WPAD 通过让浏览器自动发现代理服务器,使代理服务器对用户来说是透明的,进而轻松访问互联网。WPAD 可以借助 DHCP 服务器、DNS 服务器和 WINS 服务器,来查询代理自动配置(PAC)文件的位置,如图所示:

WPAD 查询 PAC 文件的方式

使用 DHCP 配置 WPAD

DHCP(Dynamic Host Configuration Protocol,动态主机配置协议),是一个用于局域网的网络管理协议,可以为进入网络的任何新节点进行动态分配,主要功能是分配 IP 地址,此外还包含一些其他信息,如子网掩码、 WPAD 等,这些额外的信息都是通过 DHCP 协议中的 Options 字段传输的。

DHCP 的工作流程有 4 个步骤:

DHCP 工作流程

上图即为客户端与 DHCP 服务器进行交互的过程。其中前两个流程主要是客户端发送广播包,DHCP 服务器进行响应并客户端进行单播通讯,后面的两个流程即为客户端从 DHCP 服务器获取 IP 地址的过程。

当使用 DHCP 服务器配置 WPAD 时,DHCP 协议将会有所改变,增加了 DHCPINFORM 消息(具体的改变可以在 RFC 2131 中看到),用于客户端请求本地配置参数。所以客户端在请求 WPAD 主机时就会发送 DHCPINFORM 请求消息,查询 PAC 文件位置;之后 DHCP 服务器会应答 DHCPINFORM 请求,返回 DHCPACK 确认消息,此消息中的 DHCP Options 字段里包含的 DHCP 252 选项即为 WPAD 代理服务器的 PAC 文件地址。

注:在目前的大多数内网中已经不再使用 DHCP 服务器进行客户端 WPAD 的配置了,而是采用较为简单的 DNS 服务器进行配置,关于 DHCP Options 的其他定义可以查看 DHCP 的 RFC 1531

利用 DNS 配置 WPAD

利用 DNS 配置 WPAD 的方式本质上还是利用了 Windows 系统的名称解析机制,其过程如下:

  • 如果客户端主机是处于域环境下时,客户端主机向 DNS 服务器发起的 WPAD+X 的查询请求为 “WPAD.当前域的域名”,DNS 服务器对 WPAD 主机的名称进行解析返回 WPAD 主机的 IP 地址,客户端 Web 浏览器通过 WPAD 主机的 IP 的 80 端口下载并解析 PAC 文件;

  • 如果客户端主机是在工作组环境中,客户端主机向 DNS 服务器发起的 WPAD+X 的查询时,则会遵循 Windows 系统的名称解析顺序,查询请求的名称均为 “WPAD”,OS 版本为 Vista 之后的(包括 Vista)顺序为:DNS => LLMNR => NBNS,反之则为 DNS => NBNS。

通过 NBNS 配置 WPAD

如果 DHCP 服务器和 DNS 服务器均没有响应,同时当前缓存没有所请求的主机名,就会发起如下名称解析:

  • 如果当前系统支持 LLMNR,先发起 LLMNR 广播查询;

  • 如果没有响应,再发起 NBNS 广播查询;

  • 如果有主机回应 PAC 文件位置,Web 浏览器通过该 IP 的 80 端口下载 wpad.dat文件。

注:Windows 2K,XP,2K3 只支持 DNS 和 NetBIOS
Windows Vista 之后(包括 2K8,Win7,Win8.x,Win 10)支持DNS、NetBIOS、LLMNR

0x04 使用 MSF 进行 WPAD 内网渗透

对照 WPAD 的原理,不难发现其中存在漏洞,可以利用 Windows 系统名称解析机制的缺陷,进行 WPAD 的“恶意”配置,从而进行内网的渗透。一种常见的利用方式是在被攻击用户发起 NBNS 查询时伪造 NBNS 响应,那么就可以控制其通过伪造的代理服务器上网,达到会话劫持的目的,如下图所示:

利用 WPAD 进行内网渗透

使用 MSF 对以上过程进行测试,进行 WPAD 内网渗透:

  • 测试环境:

    • 被攻击用户:

      Windows 7、192.168.16.191

    • 攻击用户:

      Kali Linux、192.168.16.245

1. 监听 NBNS 查询请求

use auxiliary/spoof/nbns/nbns_response
set regex WPAD
set spoofip 192.168.16.245
run

监听 NBNS 查询请求

2. 伪造 WPAD 服务器

use auxiliary/server/wpad
set proxy 192.168.16.245
run

伪造 WPAD 服务器

3. 伪造被攻击用户发起查询

构造广播 NBNS 查询,前提是需要使当前 DHCP 和 DNS 服务器均无法提供的 PAC 文件位置。

注:关闭上述服务器后浏览器访问任意网页即可。

4. 响应被攻击用户的广播 NBNS 查询

攻击主机响应广播 NBNS 查询并指定 PAC 文件位置,被攻击主机访问指定的 PAC 位置请求下载。

攻击者发起恶意响应

5. 使用 Burp 配置代理服务器

配置 Burp 代理 IP 为 192.168.253.131:8080,使受害者通过攻击者的代理服务器访问互联网。

配置 Burp 代理服务器

6. 被攻击用户使用伪造的代理配置上网

受害者通过代理访问网页

查看受害者主机 NetBIOS缓存

0x05 WPAD 内网渗透深入研究

  • 利用 NetBIOS 名称解析进行基于 WPAD 的中间人攻击

    利用 NBNS 协议缺陷进行 WPAD 中间人攻击

  • 利用 LLLMNR 名称解析缺陷进行基于 WPAD 的中间人攻击

    利用 LLMNR 名称解析缺陷劫持内网指定主机会话

  • 利用 DHCP 本地网络进行基于 WPAD 的中间人攻击

    在本地网络中,攻击者可以通过 ARP 欺骗等方式伪装成 DHCP 服务器,然后在 DHCP 响应包的 DHCP 252 选项中提供一个恶意 PAC 文件所在的 URL。

  • 通过特权地位(privileged position)和 DNS 进行远程攻击

    除了本地网络攻击外,WPAD 攻击也可能通过外部 DNS 查询发生。由于许多用户将他们的计算机配置了公共的 DNS 服务器(如 8.8.8.8、8.8.4.4、208.67.222.222 和 208.67.220.220)来执行 DNS 域名解析,在这种情况下,用户机器会发送 DNS 查询(如 wpad.local)到本地网络之外的服务器,处于网络特权位置的攻击者(例如网关或任何其他上游主机)可以监视 DNS 查询并伪造应答,从而指示客户端下载并执行恶意的 PAC 文件。

  • 通过恶意的 wpad.tld 远程访问 Internet

    WPAD 的特殊之处在于会递归地遍历本地机器名称以查找要查询的域,如果一台机器被称为“laptop01.us.division.company.com”,则按照以下方式查询以下域名:

    1. wpad.us.division.company.com
    2. wpad.division.company.com
    3. wpad.company.com
    4. wpad.com

    利用这个漏洞,攻击者可以通过恶意的 wpad.tld 域名,将用户的浏览器指向自己的代理,拦截并修改所有的 HTTP 流量。

0x06 威胁实例 —— Flame 病毒

超级火焰(Flame)病毒利用 WPAD 进行中间人攻击,其工作模式如下:

  • SNACK:NetBIOS 名称服务器欺骗(NBNS spoofing)

    SNACK 模块会为所有网络接口或预设网络接口创建一个 RAW 网络套接字,并监听当前网络接收所有的网络数据包,如果收到了 NBNS 查询会将其写入加密的日志文件中(“%windir%\temp~DEB93D.tmp”),当 NBNS 查询请求中包含“WPAD”“MSHOME-F3BE293C” 字符,立即伪造 NBNS 响应,返回自己的 IP 地址。

  • MUNCH:代理检测欺骗和 Windows 更新请求欺骗(Spoofing proxy detection and Windows Update request)

    “MUNCH”是 FlameHTTP 服务器模块的名称,用于提供 WPAD 服务,它会收到来自受感染计算机中的 SNACK 提供的 IP 地址,并通过由 MUNCH 提供的 “wpad.dat” 文件将受感染计算机用作代理服务器。当其成功作为被攻击主机的代理后,会劫持特定的 Windows 更新请求到 MUNCH 服务器,并提供带有后门的 Windows 更新文件给受害者下载。

0x07 总结

在利用 WPAD 进行攻击时,实际的效果很可能没有想象的那么好,不过一旦奏效,就可以拿到受害者主机权限。在很多内网中,管理员不会对这些攻击方式做防御措施,除了部分桌面安全产品,如防火墙可能会做严格的过滤拦截,大部分情况下,此类攻击方式还是很有效的。尤其是可以在做名称解析响应时,可以筛选受害者主机,对 HTTP 数据包进行更改插入恶意代码,进行针对性的定点打击。

预防和修复

对于 WPAD 攻击,唯一 能够阻止这类漏洞的方法就是完全禁用 WinHttpAutoProxySvc 服务。有时由于其他服务依赖 WPAD,所以在“服务”设置中无法禁用它(选项变灰),但可以通过修改相应的注册表项来完成:

在注册表 “HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinHttpAutoProxySvc” 位置下,将 “Start” 的值从3(手动)更改为4(禁用)。

参考文章:
https://xz.aliyun.com/t/1739
https://www.cnblogs.com/studyskill/p/8532566.html
https://blog.csdn.net/zy_strive_2012/article/details/53196482