本帖最后由 gclome 于 2020-9-3 20:30 编辑
原文链接:potato家族本地提权分析
0x01 前言在实际渗透中,我们用到最多的就是Potato家族的提权。本文着重研究Potato家族的提权原理以及本地提权细节 本文来自团队成员Polar bear的原创文章,如需转载请联系告知并注明出处
0x02 原理讲解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以hToken权限启动新进程
0x03 历史土豆解析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特权升级
0x04 小结:Potato提权原理简单来说就是如下三条:
(1)诱使 "SYSTEM" 账户通过NTLM向控制的TCP节点进行身份验证
(2)以本地协商 "NT AUTHORITY \ SYSTEM" 账户的安全令牌进行NTLM Relay
(3)模拟刚刚协商的令牌,达到提权的目的
0x05 参考链接:https://www.anquanke.com/post/id/204510
https://www.t00ls.net/articles-56281.html
https://docs.ioin.in/writeup/too ... ows_html/index.html
https://foxglovesecurity.com/2016/01/16/hot-potato/
|