0x00 前言
在实际渗透中,我们用到最多的就是 Potato 家族的提权。本文着重研究 Potato 家族的提权原理以及本地提权细节。
0x01 原理讲解
1. 利用 Potato 提权的是前提是拥有SeImpersonatePrivilege或SeAssignPrimaryTokenPrivilege权限,以下用户拥有 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特权,则可以调用CreateProcessAsUserW以Token权限启动新进程
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 主机向其他计算机进行身份验证
需要SelmpersonatePrivilege、SeAssignPrimaryToken权限
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/
来源:freebuf.com 2020-09-15 09:30:27 by: zhao9170
请登录后发表评论
注册