Hot Potato提权

作者 f0zz 日期 2022-04-02
Hot Potato提权

It start with…

image.png
image.png

Hot Potato 提权

原理: 利用potato的前提条件是拥有身份验证后模拟客户端(SeImpersonatePrivilege)或者替换进程级令牌(SeAssignPrimaryTokenPrivilege)。

以下用户拥有SeImpersonatePrivilege权限
本地管理员账户(不包括管理员组普通账户)和本地服务账户
由SCM启动的服务
原理简单来说就是如下三条:
(1)诱使 “SYSTEM” 账户通过NTLM向控制的TCP节点进行身份验证
(2)以本地协商 “NT AUTHORITY \ SYSTEM” 账户的安全令牌进行NTLM Relay
(3)模拟刚刚协商的令牌,达到提权的目的
利用 Windows 中的已知问题在默认配置中获得本地权限提升  

即 NTLM 中继(特别是 HTTP->SMB 中继)和 NBNS 欺骗  

通过这种技术,我们可以将 Windows 工作站上的特权从最低级别提升到“ NT AUTHORITY SYSTEM”—— Windows 机器上可用的最高级别特权。  
首先我们来复习一下NTLM Relay  
Relay Attack就是将截获的Net NTLM Hash重放进行攻击,从而实现对其他机器的控制。  

影响范围

Windows 7 8 10 Server 2008 2012

原理

  1. 本地NBNS欺骗

    - NBNS 是一个广播 UDP 协议,用于在 Windows 环境中通常使用的域名解析。  
    	在Windows执行DNS查找时首先查找本地hosts文件 -> 如果失败后就尝试DNS查找 -> 如果再次失败就尝试NBNS查找  
    	NBNS协议就会在域中广播,询问:谁知道xxxx的ip地址(听起来很愚蠢)  
    	
    - 如果我们响应目标主机并进行欺骗的话,我们就可以将目标主机所要访问的页面重定向到我们指定的ip地址,甚至向目标主机索要身份验证。  
    
    - 在本地提权时,我们并不能直接去嗅探网络流量(需要管理员权限)。如果我们提前知道目标主机(127.0.0.1)即将发送NBNS包进行查询,我们就可以针对目标主机进行假响应,迅速向目标主机发送NBNS响应。但是NBNS包中有一个二字节的字段:TXID(可能有65535个值)   必须在请求和响应包内对应,我们就需要去快速迭代所有可能的65535个值,从而克服这个问题  
    
    - 如果目标主机所在网络中存在对应域名的正确解析记录怎么办? 
    此时我们需要考虑使其DNS查找失败。此时就需要用到端口耗尽技术。这样就会使其进行NBNS查找。  
    在同一浏览器创建与多个网站的大量连接的情况下,对于浏览器尝试的任何新连接,使用临时端口。   一段时间之后,你会注意到连接将开始失败,并且出现此故障的可能性很高,因为浏览器已使用所有可用端口进行外部连接,并且建立连接的任何新尝试都将失败,因为没有更多的端口可用。 当使用计算机上所有端口时,我们将它视为 端口耗尽。  
    动态端口的数量为16384个 (从49152起始,到65536结束)  
  2. 伪装WPAD代理服务器

    - 仅将目标主机进行NBNS欺骗是不够的,我们只是对它进行了欺骗,但是并没有将其欺骗到我们的主机上。因此,我们还需要伪造WPAD代理服务器对它提供服务。因为我们是在目标本地上进行提权,所以我们需要在本地主机即127.0.0.1上启动WPAD代理服务器。二者相结合达到提权的目的。  
    - 在 Windows 中,Internet Explorer 默认会通过访问 URL:http://wpad/wpad.dat 自动尝试检测网络代理设置配置。它同样适用于Windows Update  

    并且我们在本地运行一个http服务器,如果接收到urlhttp://wpad/wpad.dat的请求就会返回以下内容

    FindProxyForURL(host,port){
    if(dnsDomainIs(host,"localhost")){	return "DIRECT"	}
    	return "PROXY 127.0.0.1:80"	}

    这就会导致目标上所有流量都会在127.0.0.1运行的服务器上进行重定向。

  3. NTLM Relay

    微软修复了该问题,通过禁止同协议的NTLM认证使用已经处理过的Challenge,这意味着从一个主机到该主机本身的 SMB->SMB 的 NTLM 重放再也行不通了。但是,类似 HTTP -> SMB 这样的跨协议攻击仍然起作用。  
    
    假设现在所有的HTTP流量都经过我们控制的HTTP服务器,我们就可以将它们进行重定向,从而要求进行NTLM认证。之后NTLM凭证会被重放给本地的SMB Listener,以创建一个新的运行用户定义的命令的系统服务。当HTTP请求来自于高权限账户时,例如是来自 Windows Update 服务的请求,命令就会以 NT AUTHORITY\SYSTEM 权限运行。  

    image.png

    1.本地NBNS Spoofer:冒充名称解析,强制系统下载恶意WAPD配置  
    
    2.伪造WPAD代理服务器:部署malicios WAPD配置,强制系统进行NTLM认证  
    
    3.HTTP -> SMB NTLM 中继:将 WAPD NTLM 令牌中继到 SMB 服务以创建提升的进程  

    利用方法

    项目:[https://github.com/foxglovesec/Potato](https://github.com/foxglovesec/Potato)
    image.png
    此时我们已经上传了Potato.exe文件并且我们的权限是普通用户
    payload:Potato.exe -ip 192.168.252.157 -cmd "C:\\Windows\\System32\\cmd.exe /k net localgroup administrator user /add" -disable_exhaust true
    image.png
    如果在此处遇到了报错,可能是未上传SharpCifs.dll和NHttp.dll
    image.png
    如果在重定向的位置循环无法继续执行,可能是端口冲突问题

    修补方案

    更新安全补丁KB3164038