Potato家族本地提权分析

 

0x00 前言

在实际渗透中,我们用到最多的就是Potato家族的提权。本文着重研究Potato家族的提权原理以及本地提权细节

 

0x01 原理讲解

1.利用Potato提权的是前提是拥有SeImpersonatePrivilegeSeAssignPrimaryTokenPrivilege权限,以下用户拥有SeImpersonatePrivilege权限(而只有更高权限的账户比如SYSTEM才有SeAssignPrimaryTokenPrivilege权限):

本地管理员账户(不包括管理员组普通账户)和本地服务账户

由SCM启动的服务
PS:本机测试时即使在本地策略中授予管理员组普通用户SeImpersonatePrivilege特权,在cmd.exe中whoami /priv也不显示该特权,且无法利用;而SeAssignPrimaryTokenPrivilege特权则可以正常授予普通用户
2.Windows服务的登陆账户

Local System(NT AUTHORITY\SySTEM)

Network Service(NT AUTHORITY\Network Service)

Local Service(NT AUTHORITY\Local Service)
也就是说该提权是

Administrator——>SYSTEM

Service——>SYSTEM
服务账户在windows权限模型中本身就拥有很高的权限
在实际渗透过程中,拿到webshell下,用户权限是IIS或者apache,或通过SQLi执行xp_cmdshell,此时手里的服务账户在进行操作时是低权限账户,而使用该提权手法可以直接获取SYSTEM权限
3.windows token
windows token是描述安全上下文的对象,用户登陆后系统就会生成token,创建新进程或新线程时这个token会不断口碑
Token成员

用户账户的(SID)
用户所属的组的SID
用于标识当前登陆会话的登陆SID
用户或用户组所拥有的权限列表
所有者SID
所有者组的SID
访问控制列表
访问令牌的来源
主令牌/模拟令牌
限制SID的可选列表
模拟等级:
     Anonymous: server无法模拟或识别client
     Identification: 可识别client的身份和特权,不能模拟
     Impersonation: 可在本地系统模拟
     Delegation: 可在远程系统上模拟
C:\WINDOWS\system32>whoami /priv

PRIVILEGES INFORMATION
----------------------

Privilege Name                  Description                                 State  
=============================== =========================================== =======
SeAssignPrimaryTokenPrivilege   Replace a process level token               Enabled
SeImpersonatePrivilege          Impersonate a client after authentication   Enabled

当用户具有SeImpersonatePrivilege特权,则可以调用CreateProcessWithTokenW以某个Token的权限启动新进程
当用户具有SeAssignPrimaryTokenPrivilege特权,则可以调用CreateProcessAsUserWhToken权限启动新进程

 

0x02 历史土豆解析

1.HOT Potato(需要等待windows update)
repo: https://github.com/foxglovesec/Potato
DBNS欺骗,WPAD和Windows update服务
原理:
(1)通过HOST-DNS使UDP端口耗尽——NBNS
(2)通过fake WPAD prxy Server(劫持http)
IE –http://Wpad/Wpaddat 刷新WPAD文件可能需要30-60分钟
(3)HTTP>SMB NTML Relay(302-http://127.0.0.1/GETHASHSxxxx& #8221;-响应401是NTML身份验证请求,当是Windows Update服务请求时候,此命令将以“NT AUTHORITY \ SYSTEM”特权运行)

2.Rotten Potato
repo: https://github.com/foxglovesec/RottenPotato
它是通过DCOM call来使服务向攻击者监听的端口发起连接并进行NTLM认证,需要SelmpersonatePrivilege权限

3.Jucy Potato(Rotten Potato的加强版)
repo: https://github.com/ohpe/juicy-potato
需要Selmpersonate、SeAssignPrimaryToken 两个权限

  • 本地支持RPC或远程服务器支持RPC并能成功登陆
  • 用户支持Selmpersonate或SeAssignPrimaryToken权限
  • 开启DCOM
  • 可用的COM对象
    常用:
    JuicyPotato -p "whoami /priv"
    

4.Ghost Potato
repo: https://github.com/Ridter/GhostPotato
利用CVE-2019-1384(Ghost Potato) Bypass MS-08068
原理:
(1)主机A向主机B(访问|\B)进行SMB认证的时候,将pszTargetName设置为cifs/B,然后在type 2拿到主机B发送Challenge之后,在lsass里面缓存(Challenge,cifs/B).

(2)然后主机B在拿到主机A的type 3之后,会去lsass里面有没有缓存(Challenge,cifs/b),如果存在缓存,那么认证失败。

(3)这种情况底下,如果主机B和主机A是不同的主机的话,那Isass里面就不会缓存 (Challenge,cifs/B).如果是同- -台主机的话,那Isass里面肯定有缓存,这个时候就会认证失败。
(4)绕过了缓存的限制,因为lsass中的缓存,在300s后会自动消失,315s后在发送Type3

5.Pipe Potato
攻击者通过pipeserver.exe注册一个名为pipexpipespoolss的恶意的命名管道等待高权限用户来连接以模拟高权限用户权限,然后通过spoolssClient.exe迫使system用户来访问攻击者构建的恶意命名管道,从而模拟system用户运行任意应用程序
原理:
(1)调用CreateN amedPipe()创建一个命名管道
(2)调用ConnectNamedPipe() 接受该命名请求连接
(3)迫使高权限进程连接该命名管道并写入数据
(4)调用ImpersonateNamedPipeClient()派生 一个高权限进程的客户端

衍生版本:

PrintSpoofer
repo:
https://github.com/itm4n/PrintSpoofer
利用spoolsv.exe进程的RPC服务器强制Windows主机向其他计算机进行身份证验证
需要SelmpersonatePrivilegeSeAssignPrimaryToken权限

6.Sweet Potato(Juicy土豆的重写)
repo: https://github.com/CCob/SweetPotato
COM/WinRM/Spoolsv的集合版,也就是Juicy/PrintSpoofer
从Windows 7到windows10/windows server2019的本地服务到system特权升级

 

0x03 小结

Potato提权原理简单来说就是如下三条:
(1)诱使 “SYSTEM” 账户通过NTLM向控制的TCP节点进行身份验证
(2)以本地协商 “NT AUTHORITY \ SYSTEM” 账户的安全令牌进行NTLM Relay
(3)模拟刚刚协商的令牌,达到提权的目的

 

0x04参考链接:

https://www.anquanke.com/post/id/204510
https://www.t00ls.net/articles-56281.html
https://docs.ioin.in/writeup/tools.pwn.ren/_2016_01_17_potato_windows_html/index.html
https://foxglovesecurity.com/2016/01/16/hot-potato/

(完)