#Potato Windows 7、8、10、Server 2008、Server 2012 上的权限提升
###工作原理 Potato 利用 Windows 中的已知问题来获取本地权限提升,即 NTLM 中继(具体为 HTTP->SMB 中继)和 NBNS 欺骗。
使用下面概述的技术,未提权用户可以在默认配置下获得对 Windows 主机的“NT AUTHORITY\SYSYTEM”级别访问权限。
该漏洞利用由 3 个主要部分组成,所有这些部分都可以通过命令行开关进行一定程度的配置:
#####1. 本地 NBNS 欺骗器 NBNS 是一种用于名称解析的广播 UDP 协议,常用于 Windows 环境。在渗透测试中,我们经常嗅探网络流量并响应在本地网络上观察到的 NBNS 查询。出于权限提升的目的,我们不能假设能够嗅探网络流量,那么如何实现 NBNS 欺骗呢?
如果我们能够提前知道目标机器(在本例中我们的目标是 127.0.0.1)将向哪个主机发送 NBNS 查询,我们就可以构造一个响应并用 NBNS 响应淹没目标主机(因为它是 UDP 协议)。一个复杂之处在于 NBNS 数据包中的 2 字节字段 TXID 必须在请求和响应中匹配。我们可以通过快速洪泛并遍历所有 65536 个可能值来克服这一点。
如果我们试图欺骗的主机已经有 DNS 记录怎么办?好吧,我们可以以一种有趣的方式强制 DNS 查找失败。使用一种称为“端口耗尽”的技术,我们绑定到每一个 UDP 端口。当你尝试执行 DNS 查找时,它会失败,因为 DNS 回复没有可用的源端口可以到达。
在测试中,这已被证明是 100% 有效的。
#####2. 伪造 WPAD 代理服务器 借助欺骗 NBNS 响应的能力,我们可以将 NBNS 欺骗器指向 127.0.0.1。我们用针对主机“WPAD”或“WPAD.DOMAIN.TLD”的 NBNS 响应数据包淹没目标机器(我们自己的机器),并声称 WPAD 主机的 IP 地址为 127.0.0.1。
同时,我们在 127.0.0.1 上本地运行一个 HTTP 服务器。当它收到对“http://wpad/wpad.dat”的请求时,它会响应类似以下内容:
FindProxyForURL(url,host){
if (dnsDomainIs(host, "localhost")) return "DIRECT";
return "PROXY 127.0.0.1:80";}
这将导致目标上的所有 HTTP 流量通过我们运行在 127.0.0.1 上的服务器重定向。
有趣的是,即使由低权限用户执行此攻击,也会影响机器上的所有用户。这包括管理员和系统账户。有关示例,请参见截图“egoldstein_spoofing.png”和“dade_spoofed.png”。
#####3. HTTP -> SMB NTLM 中继 现在所有 HTTP 流量都流经我们控制的服务器,我们可以做诸如请求 NTLM 身份验证之类的事情……
在 Potato 漏洞利用中,所有请求都通过 302 重定向到“http://localhost/GETHASHESxxxxx”,其中 xxxxx 是某个唯一标识符。对“http://localhost/GETHASHESxxxxx”的请求会响应 401 请求 NTLM 身份验证。
NTLM 凭据被中继到本地 SMB 监听器,以创建一个新的系统服务来运行用户定义的命令。此命令将以“NT AUTHORITY\SYSTEM”权限运行。
###使用漏洞利用 目前用法取决于操作系统。
由于 Windows 处理代理设置和 WPAD 文件的方式有些古怪,它有时也有点不稳定。通常当漏洞利用不起作用时,需要让它继续运行并等待。当 Windows 已经有 WPAD 的缓存条目,或者因为未找到 WPAD 而允许直接互联网访问时,可能需要 30-60 分钟才能刷新。有必要让漏洞利用继续运行,并在此时间过去后稍后再次尝试触发它。
此处列出的技术按从最简单到最复杂的顺序排列。列表中后面的任何技术都应该适用于之前的所有版本。每个都包含视频和截图。
#####Windows 7 - 参见 https://www.youtube.com/watch?v=Nd6f5P3LSNM Windows 7 可以通过 Windows Defender 更新机制相当可靠地被利用。
Potato.exe 具有自动触发此机制的代码。只需运行以下命令:
Potato.exe -ip <local ip> -cmd <command to run> -disable_exhaust true
这将启动 NBNS 欺骗器,将“WPAD”欺骗为 127.0.0.1,然后检查 Windows Defender 更新。
如果你的网络已经有“WPAD”的 DNS 条目,你可以尝试“-disable_exhaust false”。这应该会导致 DNS 查找失败,并且应该回退到 NBNS。我们已经测试过几次并且它有效
#####Windows Server 2008 - 参见 https://www.youtube.com/watch?v=z_IGPWgL5SY 由于 Windows Server 不附带 Defender,我们需要另一种方法。相反,我们只需检查 Windows 更新。另一个注意事项是,至少在我的域中,Server 2K8 需要 WPAD.DOMAIN.TLD 而不仅仅是 WPAD。以下是示例用法:
Potato.exe -ip <local ip> -cmd <command to run> -disable_exhaust true -disable_defender true --spoof_host WPAD.EMC.LOCAL
成功运行后,只需检查 Windows 更新。如果它没有触发,让漏洞利用继续运行约 30 分钟,然后再次检查。如果仍然不起作用,请尝试实际下载一个更新。
如果你的网络已经有“WPAD”的 DNS 条目,你可以尝试“-disable_exhaust false”。这应该会导致 DNS 查找失败,并且应该回退到 NBNS。我们已经测试过几次并且它有效
#####Windows 8/10/Server 2012 - 参见 https://www.youtube.com/watch?v=Kan58VeYpb8 在最新版本的 Windows 中,Windows Update 似乎可能不再遵循“Internet 选项”中设置的代理设置,或者检查 WPAD。相反,Windows Update 的代理设置使用“netsh winhttp proxy...”控制。
对于这些版本,我们改为依赖 Windows 的较新功能,即“不受信任证书的自动更新程序”。详细信息可在 https://support.microsoft.com/en-us/kb/2677070 和 https://technet.microsoft.com/en-us/library/dn265983.aspx 找到
来自 technet 文章:“Windows Server 2012 R2、Windows Server 2012、Windows 8.1 和 Windows 8 操作系统包含一种自动更新机制,每天下载证书信任列表 (CTL)。”
看来 Windows 的这一部分仍然使用 WPAD,即使 winhttp 代理设置被设置为直接。
在这种情况下,Potato 的用法如下:
Potato.exe -ip <local ip> -cmd <cmd to run> -disable_exhaust true -disable_defender true
此时,你需要等待最多 24 小时,或者找到另一种方式来触发此更新。
如果你的网络已经有“WPAD”的 DNS 条目,你可以尝试“-disable_exhaust false”。这应该会导致 DNS 查找失败,并且应该回退到 NBNS。我们已经测试过几次并且它有效
###缓解措施
在 Windows 中启用“身份验证的扩展保护”应该可以阻止 NTLM 中继攻击。
SMB 签名也可能缓解此类攻击,但是要确认这一点还需要我进行更多研究。
###广播外 NBNS 欺骗 使用与 Potato 漏洞利用相同的 NBNS 欺骗技术,我们可以对任何我们能够与其通信 UDP 137 的主机执行 NBNS 欺骗。我们只需要足够快地发送 UDP 数据包,以便在 NBNS 请求超时之前插入有效回复。
可以在 https://www.youtube.com/watch?v=Mzn7ozkyG5g 看到此演示视频
演示实验环境具有以下设置:
PFSense 防火墙 10.0.0.0/24 -> 企业 LAN 10.0.1.0 /24 -> 服务器网络
从企业网络,我们将攻击服务器网络上的机器。
用法:python Responder.py –I eth0 –spoof <target>:<spoof address>:<spoof host>