Windows下的令牌窃取

MSF
https://blog.csdn.net/zzlx123/article/details/104789819
令牌(token)是系统的临时秘钥,相当于”账号”和”密码”,用来决定是否允许这次请求和判断这次请求是属于哪一个用户的。它允许你在不提供密码或其他凭证的前提下,访问网络和系统资源,这些令牌将持续存在于系统中,除非系统重新启动。令牌最大的特点就是随机性,不可预测,黑客或软件无法猜测出令牌。

假冒令牌可以假冒一个网络中的另一个用户进行各类操作。所以当一个攻击者需要域管理员的操作权限时候,需要通过假冒域管理员的令牌进行攻击。

知识前置

在学习土豆家族的一些原理时,需要知道如下原理

知识点0:Token

令牌(token)是系统的临时秘钥,相当于”账号”和”密码”,用更恰当的比喻就是类似web服务里的SESSION。用户登录后就会产生Token,创建新的进程时,这个Token会被不断的复制。
有两种令牌种类:
1、主令牌
2、模拟令牌。
一个令牌的构成

  1. 用户账户SID
  2. 用户账户所属组G-SID
  3. 用于标识当前会话登录SID
  4. 用户或用户组所拥有的权限列表
  5. 所有者SID
  6. 所有者组的G-SID
  7. 访问控制列表
  8. 访问令牌
  9. 标识主令牌/模拟令牌
  10. 限制SID的列表(可选)

其实还是百度百科说的最好:https://baike.baidu.com/item/%E8%AE%BF%E9%97%AE%E4%BB%A4%E7%89%8C/16846911

我在这里总结并举个通俗的例子:
每一个进程都有一个主令牌来对其进行描述,一个普通的应用进程相关的用户是启动该应用的人为用户,但是对于服务进程来说,服务(sqlserver)在自己的账号下运行,在自己的权限内充当用户。与操作系统一起安装的系统服务在本地系统账号下运行。而计算机此时也可以让给其他用户访问该服务(sqlserver),此时就会利用模拟令牌来对这个服务进行访问,此时其他用户对于这个服务来说,就是一个客户。
例如一家之主是小A,家里基本所有关系都围绕小A进行,此时小A就是主令牌,家里还有小A-1,小A-1。还有邻居家小B,小A-1去小B家玩的时候,就会启动模拟令牌,来访问小B家的服务(吃饭,玩游戏)。

知识点1:PAC文件

许多代理软件都会存在PAC文件,
image.png
代理自动配置(Proxy auto-config,PAC),该文件定义浏览器如何自动选择适当的代理服务区来访问一个网站。一个PAC文件包含一个JavaScript形式的函数“FindProxyForURL(url,host)”,该函数可返回一个包含一个或者多个访问规则的字符串。浏览器或者其他应用可根据该字符串确定使用哪个代理服务器。

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

  1. function FindProxyForURL(url, host) {
  2. if (url== 'http://www.baidu.com/') return 'DIRECT';
  3. if (host== 'twitter.com') return 'SOCKS 127.0.0.10:7070';
  4. if (dnsResolve(host) == '10.0.0.100') return 'PROXY 127.0.0.1:8086;DIRECT';
  5. return 'DIRECT';
  6. }

知识点2:WPAD

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

2、原理简述
当系统开启了代理自动发现功能后,用户使用浏览器上网时,浏览器就会在当前局域网中自动查找代理服务器,如果找到了代理服务器,则会从代理服务器中下载一个名为 PAC(Proxy Auto-Config) 的配置文件。该文件中定义了用户在访问一个 URL 时所应该使用的代理服务器。浏览器会下载并解析该文件,并将相应的代理服务器设置到用户的浏览器中。

3、关闭WPAD
方法 1:修改注册表
可以使用下面的注册表项禁用“自动代理结果缓存”:
HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\CurrentVersion\Internet Settings
EnableAutoproxyResultCache(如果不存在请手动创建,类型为 REG_DWORD) 设置为 0 或者 1
0 = 禁用缓存;1 = 启用自动代理缓存(这是默认设置)

方法 2:修改组策略设置
在组策略对象编辑器中的—用户配置 — 管理模板—Windows 组件 — Internet Explorer中 启用 “禁用缓存自动代理脚本”即可。
image.png

知识点3:NBNS和NBNS欺骗

windows 解析域名的顺序是
Hosts
DNS (cache / server)
LLMNR
NBNS

NBNS类似于DNS,DNS是通过域名来寻找IP然后来进行访问资源的。
NBNS在全称NetBios Name Service 每个计算机在网络中都有一个NetBIOS名称和一个IP地址,NBNS就是用来通过NetBIOS名称来找IP地址的。
image.png

在渗透测试过程中,我们通常会对本地网络中的网络流量和NBNS请求的应答信息进行嗅探和观察。我们将会伪装成网络中的主机,并使用我们自己的IP地址对所有的请求进行应答,我们希望能够得到一些有趣的信息。

为了实现权限提升这一目的,我们不能想当然地认为我们能够嗅探到网络流量信息。为什么呢?因为这需要本地管理员权限。那么,我们怎样才能实现NBNS欺骗呢?

如果我们能够提前知道NBNS请求所对应的目标主机的主机名(在此环境下,我们的目标主机IP为127.0.0.1),我们就可以创建一个虚假的应答信息,并快速地使用NBNS应答信息来对目标主机进行泛洪攻击(因为它是一个UDP协议)。其中有一个比较复杂的地方,即NBNS数据包中有一个长度为2子节的数据域-TXID。TXID必须与请求和应答信息相匹配,问题就在于我们无法读取到请求信息。但是我们可以通过快速泛洪攻击并对总共65536个可能值进行快速遍历。
如果目标网络中保存有主机的DNS记录呢?我们可以使用一种名为UDP端口exhaustion(枯竭)的技术来迫使目标系统中所有的DNS查询失败。我们所做的一切都是为了使每一个UDP端口失效。因为这会使得系统在进行DNS查询时没有可用的UDP端口资源,所以DNS将会失效,而此时NBNS请求也将会回退。
在我们的测试过程中,这一方法是百分之百有效的。

知识点4:SMB NTLM Relay(NTLM中继)

首先SMB NTLM Relay 和 NTLM Relay有什么区别?区别就是为何要叫SMB NTLM Relay是因为进行这种攻击的时候NTLM 的上层是SMB协议,假设如果上层协议是HTTP ,那么它就叫HTTP NTLM。比如从 http relay 至 smb,从 smb relay 至 ldap/mssql 等等。我们只需要将一个协议中的 NTLM 消息取出来,然后原样不动的地放入另一个协议,就完成了上层协议转换的过程。

想要实现NTLM Relay攻击,一是获取受害者的Net-NTLMhash,二是重放攻击。

首先说一下NTLM Relay的攻击流程
基本流程如上图所示,在客户端的视角里,攻击者就是他要访问的服务端,它在与攻击者这台主机进行NTLM认证,而整个流程也只有攻击者这台主机与其进行交互。
在服务端的视角里,攻击者是客户端,是攻击者在向服务端证明自己的身份。通过中间人攻击的方法,攻击者可以伪造成客户端来完成身份验证

NTLM Relay 其实就是一个中间人欺骗的过程。

土豆家族

potato家族在内网渗透提权过程中非常常见,常用的的提权Potato有很多,例如sweetpotato,badpotato,hotpotato等等等,因此简单学习并理解下这些土豆的原理和不同之处。

土豆系列的提权原理主要是通过各种方法诱导高权限访问低权限的系统对象,这样导致可以在在本地NTLM中继获取SYSTEM令牌,此时的低权限的对象可以模拟高权限对象的访问令牌(Access Token),进而可以用访问令牌创建进程,达到代码执行,我们把这种类型的提权叫做potato提权,(不管是否基于原potato-exp提权修改)。就像SQL注入,通过特定SQL语句注入获取特定数据库信息统称为SQL注入,而不管如何编写的SQL语句,是否基于别人的SQL语句修改

使用范围广

首先是测试该程序的使用范围和实际效果:
Potato的说明里写到可以在Windows 7,8,10, Server 2008, Server 2012上完成权限提升。看着挺唬人,试试看,以下只列出测试过的系统。

  • Windows 7 x86和x64 系统上能够稳定立即提权(后面在分析其机制中会解释立即这词)
  • Server 2008 R2 x64 系统上可以提权,但需要时间等待(约30分钟左右,跟Windows Updata时间有关)
  • Server 2012 x64 系统上可以提权,但需要时间等待(更长,跟Windows更新证书列表时间有关)
  • Windows 8和10等有机会测试下。

Potato程序是用C#编写的,需要系统装有.Net Framework 3.5以上版本支持。

POTATO(MS16-07)

Potato利用已知的Windows中的问题,以获得本地权限提升,即NTLM中继(特别是基于HTTP > SMB中继)和NBNS欺骗。
使用下面介绍的技术,它有可能为一个非特权用户获得对Windows主机的默认配置”NT AUTHORITY \ SYSYTEM”级别的访问。
该漏洞的基本利用步骤是由3个主要部分组成,一些其他的变种土豆也都是基于这三个步骤上面的变形和修改绕过
0x01 本地NBNS欺骗器
0x02 伪造WPAD代理服务器
0x03 HTTP – > SMB NTLM中继

提权条件:
提权账户必须先拥有SelmpersonatePrivilege或SeAssignPrimaryTokenPrivilege权限
SeImpersonatePrivilege权限:

  1. 我们叫它身份验证后模拟客户端
  2. 拥有该特权时,可允许哪些程序可模拟用户或另一个指定账户可代表用户来执行操作

SeAssignPrimaryTokenPrivilege权限:

  1. 我们叫它替换进程级令牌
  2. 此特权可设置哪些父进程可以替换与子进程关联的访问令牌

当用户拥有SeImpersonatePrivilege权限时,可以调用CreateProcessWithTokenW以某个Token来启动某个进程
当用户拥有SeAssignPrimaryTokenPrivilege权限时,可以调用CreateProcessAsUserW以用户启动某个进程

以实际的情况来看看吧
1、用户administrator
image.png
2、普通管理员组内用户
image.png
3、IIS用户ceshi
服务用户权限较高,拥有SeImpersonatePrivilege权限
image.png

短暂总结:

1、administrator用户拥有SeImpersonatePrivilege权限
2、administrator组的其他用户啥权限没有
3、服务用户(iis,sqlserver等)拥有SeImpersonatePrivilege权限
4、只有system用户才有SeAssignPrimaryTokenPrivilege权限
5、在实际渗透过程中,拿到webshell下,用户权限是IIS或者apache,或通过SQLi执行xp_cmdshell,此时手里的服务账户在进行操作时是低权限账户,而使用该提权手法可以直接获取SYSTEM权限,不能是PC普通用户
也就是使用场景为:
administrator——->system
service账户———>system

土豆原理:

上文说到土豆家族提权需要高权限的用户来访问低权限的系统对象,那要怎么访问呢?
实际上土豆提权本质是中间人攻击,迫使某个SYSTEM权限对某个受控的系统对象发起NTLM认证,然后进行重放(smb relay)

1、hotpotato(16年)
版本:win7效果好一点
win7 win8/10 server 2008 server 2012
原理:
1、利用NBNS欺骗技术(UDP端口exhaustion(枯竭)的技术来迫使目标系统中所有的DNS查询失败)来使端口耗尽。
2、然后再使用WPAD代理来访问攻击者假冒的PAC文件设置恶意代理劫持http流量来访问DNS服务,利用特定的恶意html标签来发起一个net-ntlm-hash认证,这个发起Html流量的服务为windows Update,该服务的权限为system,因此发起的ntlm认证也是system权限
3、WPAD刷新时间为30——60分钟,因此我们可能等待的时间较长(win7可以立即激活更新)

2、Rotten Potato /Juice Potato 烂土豆(ms-16-075)(18年)
win7/win8/10 win server /2008/2012/2016
但是实际情况Windows 7 x86和x64系统上能够稳定立即提权,Windows Server 2008 R2 x64和Windows Server 2012 x64可以提权,成功率一般。而Windows 8和10的成功率非常低,
它是通过DCOM call来使服务向攻击者监听的端口发起连接并进行NET-NTLM-HASH认证
利用条件:
1、需要特定权限如SeImpersonatePrivilege
2、开启DCOM,并能找到可用的COM对象——sc query DcomLaunch 默认开启
3、开启RPC sc query RpcSs 默认开启
利用文章:
https://blog.csdn.net/qq_26091745/article/details/105091686

3、PrintSpoofer/PipePotato/BadPotato(高版本)
winserver 2016/winserver 2019 win10
利用Windows named pipi 的一个Windows API ImpersonateNamedPipiClient

原理:
pszLocalMachine参数需要传递UNC路径,传递\127.0.0.1时,服务器会访问\127.0.0.1\pipe\spoolss。
但这个管道已经被系统注册了,如果我们传递\127.0.0.1\pipe则因为路径检查而报错,但当传递\127.0.0.1/pipe/foo时,校验路径时会认为127.0.0.1/pipe/foo是主机名。
随后在连接named pipe时会对参数做标准化,将/转化为\,于是就会连接\127.0.0.1\pipe\foo\pipe\spoolss,攻击者就可以注册这个named pipe从而窃取client的token

条件:
sc query Spooler 查询是否启动

4、RoguePotat(针对juice土豆的绕过)
高版本Windows DCOM解析器不允许OBJREF中的DUALSTRINGARRAY字段指定端口号
为了绕过这个限制并能做本地令牌协商,作者在一台远程主机上的135端口做流量转发,将其转回受害者本机端口,并写了一个恶意RPC OXID解析器
相对于别的土豆鸡肋一点

5、RogueWinrm
利用winRM发起一个监听,再利用BITS服务向winRM请求NET-NTLM-HASH认证,最终获取到system权限
版本:
windows Service 2019 和Windows 10
条件:
Winrm必须关闭,netstat -ano |findstr 5985
BITS服务必须关闭 sc query BITS(实际测试不需要停止,但是需要实际比较长)
image.png

6、sweetPotato
相当于是DCOM\WinRM\PrintSpooler的集合版,默认是使用PrintSpooler漏洞使用
也就是juice potato + RogueWinrm + PrintSpoofer/PipePotato/BadPotato 的集合
命令

  1. sweetpotato.exe -p whoami -e PrintSpoofer

土豆的成长经历

2016-01-16 初代土豆
劫持wpad配合ntlm中继来进行提权
Hot Potato – Windows Privilege Escalation

2016-09-26 二代土豆
劫持系统com服务器地址到恶意服务器上,然后在NTLM Type 3时做AcceptSecurityContext调用去拿system的令牌
Rotten Potato – Privilege Escalation from Service

2018/01/13 土豆token细节
Potatoes and tokens – Decoder’s Blog

2018-08-10 整理了一些可用的CLSID
Juicy Potato (abusing the golden privileges) | jui…

2018/10/29 微软把土豆利用链修复
现在ntlm认证时句柄已不可控
No more rotten/juicy potato? – Decoder’s Blog

2019/03/06 提到了利用命名管道模拟客户端问题
Windows Named Pipes & Impersonation – Decoder’s Bl

2020/05/02 三代土豆
目前杀伤力最大的一个利用链,通过命名管道模拟来获取system的令牌
PrintSpoofer - Abusing Impersonation Privileges on

2020/05/11
劫持OXID解析器修改ResolveOxid2响应地址为恶意管道地址
No more JuicyPotato? Old story, welcome RoguePotat

2020/05/13 土豆提权集合
GitHub - CCob/SweetPotato: Local Service to SYSTEM…

名字疑惑
RottenPotato 升级版—》 JuicyPotato
sweetpotato == Juicy/PrintSpoofer 集合版
PrintSpoofer == PipePotato== BadPotato 三个名字 ?
最初公开POC的老外叫它PrintSpoofer,之后360的paper叫它PipePotato,然后GitHub一个国人的POC又叫它BadPotato。

编译

https://github.com/uknowsec/SweetPotato
下载源码
VSCODE打开
image.png
点击启动,能出现黑框说明项目可以成功运行没有问题,然后直接编译输出即可
image.png
image.png
这里选择生成解决方案,或者sweetpotato,即可编译成功
image.png
我们放入webshell里执行一下
证明脚本没有问题
image.png
换另外一个项目也可以生成成功
https://github.com/CCob/SweetPotato
image.png

PSEXEC降权

psexec64 -i -u “nt authority\network service” cmd.exe
(做实验演示用)

相关文章:
smb-ntlm relay 解释 http://www.91ri.org/9022.html
smb-ntlm relay 复现 https://www.jianshu.com/p/9627962db4da
WPAD 协议分析及内网渗透利用 https://xz.aliyun.com/t/1739#toc-1
Potato家族本地提权分析 https://www.freebuf.com/articles/web/249782.html
内网渗透测试:NTLM Relay攻击分析 https://blog.csdn.net/whatday/article/details/107698383
NTLM-relay攻击的原理与实现 https://blog.csdn.net/qq_41874930/article/details/108825010