文章目录
- 1.前言
- 2.常见的权限集合
- 可被进一步利用的权限
- 3.补充:权限的状态到底有什么意义
- 4.利用
- 4.1 SeImpersonatePrivilege
- 4.2 SeAssignPrimaryPrivilege
- 4.3 SeTcbPrivilege
- 4.4 SeBackupPrivilege
- 4.5 SeRestorePrivilege
- 4.6 SeCreateTokenPrivilege
- 4.7 SeLoadDriverPrivilege
- 4.8 SeTakeOwnershipPrivilege
- 4.9 SeDebugPrivilege
- 5.参考文章
- 参考的开源工具和资料
1.前言
一直对windows的各种权限理解的很模糊,于是决定写这篇文章来加深自己的理解与记忆。
2.常见的权限集合
一般情况下我们能拿到权限的用户有三种,administrator,普通user,iis用户。他们拥有的权限集合如下:
1.administrator
2.普通user
3.IIS用户
可被进一步利用的权限
如果我们在测试的过程中发现某用户拥有以下几种权限中的任意一个,那我们就能进一步进行利用:
如果包含以下九个权限,我们就可以对其进一步利用
- SeImpersonatePrivilege
- SeAssignPrimaryPrivilege
- SeTcbPrivilege
- SeBackupPrivilege
- SeRestorePrivilege
- SeCreateTokenPrivilege
- SeLoadDriverPrivilege
- SeTakeOwnershipPrivilege
- SeDebugPrivilege
iis或者sqlserver的用户通常具有SeImpersonatePrivilege和SeAssignPrimaryPrivilege权限
Backup service用户通常具有SeBackupPrivilege和SeRestorePrivilege权限
3.补充:权限的状态到底有什么意义
如上图所示,我们可以看到权限的状态是disabled,这个disabled并不代表用户不能去使用这些特权,disabled只代表当前程序没有这个特权,但是只要特权显示出来了,那么用户就拥有来这些特权,如果仅仅作为用户的角度的话我们可以直接忽略掉这些权限的状态,因为在必要的时候系统会为我们自动开启。
那disabled这种状态为什么会存在呢?那就是为了限制程序的执行了。
举个例子,SeShutdownPrivilege权限的状态是disabled,我们用户还是可以在cmd窗口中执行shutdown命令关闭主机,但是其他程序就不可以调用windows的api来关闭主机,如果其他程序想调用windowsapi关闭主机的话就得先调用一个名为AdjustTokenPrivileges的api来将SeShutdownPrivilege的状态转变为enable,之后才能进行关闭主机。总的来说权限的状态对于用户态的我们毫无影响,对于一些程序会有一定的影响。
设置权限状态为enable方式可参考代码:EnablePrivilegeandGetTokenInformation.cpp
4.利用
4.1 SeImpersonatePrivilege
拥有此权限的用户:
- 管理员或者本地的服务账户
- 由服务控制管理器启动的服务
- 由组件对象模型 (COM) 基础结构启动的并配置为在特定帐户下运行的COM服务器
- IIS与SqlServer用户
当我们拥有这个权限的时候,代表了我们可以将当前计算机上的其他令牌盗取过来自己使用,具体操作可见通过token窃取实现降权或者提权。
利用场景:
拿到iis或者sqlserver用户的权限,使用juicypotato工具进行提权到system。
4.2 SeAssignPrimaryPrivilege
拥有这个权限的进程可以向其他进程分配token。
拥有此权限的用户:
- iis与sqlserver
利用原理跟SeImpersonatePrivilege权限的利用原理类似,都是通过NTLM Relay to Local Negotiation来获取system权限的token,区别是获取token后利用system权限的token创建新的进程,如果开启SeImpersonate权限,调用CreateProcessWithToken,传入System权限的Token,创建的进程为System权限,或者如果开启SeAssignPrimaryToken权限,调用CreateProcessAsUser,传入System权限的Token,创建的进程为System权限。
利用场景:
拿到iis或者sqlserver用户的权限,使用juicypotato工具进行提权到system。
4.3 SeTcbPrivilege
拥有它就等同于获得了系统的最高权限。
利用思路:
- 调用LsaLogonUser获得Token
- 将该Token添加至Local System account组
- 该Token具有System权限
测试代码:
https://github.com/3gstudent/Homework-of-C-Language/blob/master/EnableSeTcbPrivilege.cpp
4.4 SeBackupPrivilege
拥有此权限的用户:
- backup service
- 管理员
这个权限用来实现备份操作,对当前系统任意文件具有读权限。
利用思路:
读取注册表中HKEY_LOCAL_MACHINE\SAM、HKEY_LOCAL_MACHINE\SECURITY和HKEY_LOCAL_MACHINE\SYSTEM文件,然后放在mimikatz里面进行破解得到密码。
mimikatz命令:
lsadump::sam /sam:SamBkup.hiv /system:SystemBkup.hiv
具体操作细节参考:sam文件获取与解密
4.5 SeRestorePrivilege
对当前系统任意文件具有写的权限。
利用思路:
- 参考映像劫持,不过在win10中不能用。
映像劫持参考文章:https://cloud.tencent.com/developer/article/1672598
4.6 SeCreateTokenPrivilege
可以创建windows令牌或者说token,win10中一般用户没有这个权限。
利用思路:
- 通过WinAPI ZwCreateToken创建Primary Token
- 将Token添加至local administrator组
- 该Token具有System权限
4.7 SeLoadDriverPrivilege
加载驱动文件。
利用思路:
- msf中的capcom_sys_exec模块即可
原理:
- 加载驱动文件Capcom.sys
- Capcom.sys存在漏洞,系统加载后,可从普通用户权限提升至System权限,利用代码可参考: https://github.com/tandasat/ExploitCapcom
- 获得System权限
4.8 SeTakeOwnershipPrivilege
与SeRestorePrivilege相同,对系统上的任何文件具有写的权限。
4.9 SeDebugPrivilege
用来调试指定进程,包括读写内存,常用作实现dll注入。
利用思路:
- 找到system权限的进程
- dll注入
- 获得权限
5.参考文章
渗透技巧-Windows-Token九种权限的利用abusing_token_eop
参考的开源工具和资料
Hot Potato: https://github.com/foxglovesec/Potato
powershell版本Hot Potato: https://github.com/Kevin-Robertson/Tater
Rotten Potato: https://github.com/breenmachine/RottenPotatoNG
lonelypotato: https://github.com/decoder-it/lonelypotato
Juicy Potato: https://github.com/ohpe/juicy-potato
https://github.com/hatRiot/token-priv https://foxglovesecurity.com/2017/08/25/abusing-token-privileges-for-windows-local-privilege-escalation/ https://foxglovesecurity.com/2016/01/16/hot-potato/
https://foxglovesecurity.com/2016/09/26/rotten-potato-privilege-escalation-from-service-accounts-to-system/
https://foxglovesecurity.com/2017/08/25/abusing-token-privileges-for-windows-local-privilege-escalation/