渗透技巧——Windows 九种权限的利用
0x00 前言
普通用户(或者 LocalService 用户) 的特殊 Token 有哪些可利用方法呢?能否提权?如何判断?本文将要结合自己的经验,参考多个开源工具和资料,尝试对这个技巧做总结,分享学习心得
参考的开源工具和资料:
- 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/
0x01 简介
本文将要介绍以下内容:
- 简要利用思路
- SeImpersonatePrivilege 权限对应的利用思路和开源代码
- SeAssignPrimaryPrivilege 权限对应的利用思路和开源代码
- SeTcbPrivilege 权限对应的利用思路和开源代码
- SeBackupPrivilege 权限对应的利用思路和开源代码
- SeRestorePrivilege 权限对应的利用思路和开源代码
- SeCreateTokenPrivilege 权限对应的利用思路和开源代码
- SeLoadDriverPrivilege 权限对应的利用思路和开源代码
- SeTakeOwnershipPrivilege 权限对应的利用思路和开源代码
- SeDebugPrivilege 权限对应的利用思路和开源代码
0x02 简要利用思路
1、取得了目标的访问权限后,查看可用权限
whoami /priv
例如,普通用户具有的权限如下图
管理员用户具有的权限如下图
iis 用户具有的权限如下图
Privilege Name 项表示具有的权限,State 表示权限的状态,我们可以通过 WinAPI AdjustTokenPrivileges 将权限设置为 Disabled 或者 Enabled
代码实现了开启指定权限(SeDebugPrivilege),并且查看当前用户名称和具有的权限
2、如果包含以下九个权限,我们就可以对其进一步利用
- SeImpersonatePrivilege
- SeAssignPrimaryPrivilege
- SeTcbPrivilege
- SeBackupPrivilege
- SeRestorePrivilege
- SeCreateTokenPrivilege
- SeLoadDriverPrivilege
- SeTakeOwnershipPrivilege
- SeDebugPrivilege
注:
iis 或者 sqlserver 的用户通常具有 SeImpersonatePrivilege 和 SeAssignPrimaryPrivilege 权限
Backup service 用户通常具有 SeBackupPrivilege 和 SeRestorePrivilege 权限
0x03 SeImpersonatePrivilege 权限的利用思路
参考资料:https://github.com/hatRiot/token-priv/blob/master/abusing_token_eop_1.0.txt#L327
SeImpersonatePrivilege
身份验证后模拟客户端(Impersonatea client after authentication)
拥有该权限的进程能够模拟已有的 token,但不能创建新的 token
以下用户具有该权限:
- 本地管理员组成员和本地服务帐户
- 由服务控制管理器启动的服务
- 由组件对象模型 (COM) 基础结构启动的并配置为在特定帐户下运行的 COM 服务器
通常,iis 或者 sqlserver 用户具有该权限
利用思路
- 利用 NTLM Relay to Local Negotiation 获得 System 用户的 Token 可使用开源工具 Rotten Potato、lonelypotato 或者 Juicy Potato
- 通过 WinAPI CreateProcessWithToken 创建新进程,传入 System 用户的 Token 具有 SeImpersonatePrivilege 权限才能创建成功
- 该 Token 具有 System 权限
可供参考的测试代码:https://github.com/3gstudent/Homework-of-C-Language/blob/master/EnableSeImpersonatePrivilege.cpp
代码实现了开启当前进程的 SeImpersonatePrivilege 权限,调用 CreateProcessWithToken,传入当前进程的 Token,创建一个进程,配合 RottenPotato,可用来从 LocalService 提权至 System 权限
0x04 SeAssignPrimaryPrivilege 权限的利用思路
参考资料:https://github.com/hatRiot/token-priv/blob/master/abusing_token_eop_1.0.txt#L359
SeAssignPrimaryPrivilege
向进程(新创建或者挂起的进程) 分配 token
通常,iis 或者 sqlserver 用户具有该权限
利用思路 1
- 利用 NTLM Relay to Local Negotiation 获得 System 用户的 Token
- 通过 WinAPI CreateProcessAsUser 创建新进程,传入 System 用户的 Token
- 该 Token 具有 System 权限
代码实现了开启当前进程的 SeAssignPrimaryTokenPrivilege 权限,调用 CreateProcessAsUser,传入当前进程的 Token,创建一个进程,配合 RottenPotato,可用来从 LocalService 提权至 System 权限
利用思路 2
- 利用 NTLM Relay to Local Negotiation 获得 System 用户的 Token
- 通过 WinAPI CreateProcess 创建一个挂起的新进程,参数设置为 CREATE_SUSPENDED
- 通过 WinAPI NtSetInformationProcess 将新进程的 Token 替换为 System 用户的 Token
- 该 Token 具有 System 权限
0x05 SeTcbPrivilege 权限的利用思路
参考资料:https://github.com/hatRiot/token-priv/blob/master/abusing_token_eop_1.0.txt#L418
SeTcbPrivilege
等同于获得了系统的最高权限
利用思路
- 调用 LsaLogonUser 获得 Token
- 将该 Token 添加至 Local System account 组
- 该 Token 具有 System 权限
可供参考的测试代码:https://github.com/3gstudent/Homework-of-C-Language/blob/master/EnableSeTcbPrivilege.cpp
代码实现了开启当前进程的 SeTcbPrivilege 权限,登录用户 test1,将其添加至 Local System account 组,获得 System 权限,创建注册表项 HKEY_LOCAL_MACHINE\SOFTWARE\testtcb
0x06 SeBackupPrivilege 权限的利用思路
参考资料:https://github.com/hatRiot/token-priv/blob/master/abusing_token_eop_1.0.txt#L495
SeBackupPrivilege
用来实现备份操作,对当前系统任意文件具有读权限
利用思路
- 读取注册表
HKEY_LOCAL_MACHINE\SAM
、HKEY_LOCAL_MACHINE\SECURITY
和HKEY_LOCAL_MACHINE\SYSTEM
- 导出当前系统的所有用户 hash mimikatz 的命令如下:
lsadump::sam /sam:SamBkup.hiv /system:SystemBkup.hiv
可供参考的测试代码:https://github.com/3gstudent/Homework-of-C-Language/blob/master/EnableSeBackupPrivilege.cpp
代码实现了开启当前进程的 SeBackupPrivilege 权限,读取注册表,将其保存成文件 C:\\test\\SAM
、 C:\\test\\SECURITY
和 C:\\test\\SYSTEM
0x07 SeRestorePrivilege 权限的利用思路
参考资料:https://github.com/hatRiot/token-priv/blob/master/abusing_token_eop_1.0.txt#L528
SeRestorePrivilege
用来实现恢复操作,对当前系统任意文件具有写权限
利用思路 1
- 获得 SeRestorePrivilege 权限,修改注册表
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
- 劫持 exe 文件的启动
- 实现提权或是作为后门
利用思路 2
- 获得 SeRestorePrivilege 权限,向任意路径写入 dll 文件
- 实现 dll 劫持
- 实现提权或是作为后门
可供参考的测试代码:https://github.com/3gstudent/Homework-of-C-Language/blob/master/EnableSeRestorePrivilege.cpp
代码实现了开启当前进程的 SeRestorePrivilege 权限,创建注册表项 HKEY_LOCAL_MACHINE\SOFTWARE\testrestore
0x08 SeCreateTokenPrivilege 权限的利用思路
参考资料:https://github.com/hatRiot/token-priv/blob/master/abusing_token_eop_1.0.txt#L577
SeCreateTokenPrivilege
用来创建 Primary Token
利用思路
- 通过 WinAPI ZwCreateToken 创建 Primary Token
- 将 Token 添加至 local administrator 组
- 该 Token 具有 System 权限
可供参考的测试代码:https://github.com/3gstudent/Homework-of-C-Language/blob/master/EnableSeCreateTokenPrivilege.cpp
代码实现了开启当前进程的 SeCreateTokenPrivilege 权限,创建 Primary Token,将其添加至 local administrator 组,开启 SeDebugPrivilege 和 SeTcbPrivilege 权限
0x09 SeLoadDriverPrivilege 权限的利用思路
参考资料:https://github.com/hatRiot/token-priv/blob/master/abusing_token_eop_1.0.txt#L626
SeLoadDriverPrivilege
用来加载驱动文件
利用思路
- 创建驱动文件的注册表
reg add hkcu\System\CurrentControlSet\CAPCOM /v ImagePath /t REG_SZ /d "\??\C:\test\Capcom.sys"
reg add hkcu\System\CurrentControlSet\CAPCOM /v Type /t REG_DWORD /d 1
- 加载驱动文件 Capcom.sys
- Capcom.sys 存在漏洞,系统加载后,可从普通用户权限提升至 System 权限,利用代码可参考: https://github.com/tandasat/ExploitCapcom
- 获得 System 权限
可供参考的测试代码: https://github.com/3gstudent/Homework-of-C-Language/blob/master/EnableSeLoadDriverPrivilege.cpp
代码实现了开启当前进程的 SeLoadDriverPrivilege 权限,读取注册表项 hkcu\System\CurrentControlSet\CAPCOM
,加载驱动文件 Capcom.sys
0x0A SeTakeOwnershipPrivilege 权限的利用思路
参考资料:https://github.com/hatRiot/token-priv/blob/master/abusing_token_eop_1.0.txt#L688
SeTakeOwnershipPrivilege
同 SeRestorePrivilege 类似,对当前系统任意文件具有写权限
利用思路 1
- 获得 SeTakeOwnershipPrivilege 权限,修改注册表
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
- 劫持 exe 文件的启动
- 实现提权或是作为后门
利用思路 2
- 获得 SeTakeOwnershipPrivilege 权限,向任意路径写入 dll 文件
- 实现 dll 劫持
- 实现提权或是作为后门
可供参考的测试代码:https://github.com/3gstudent/Homework-of-C-Language/blob/master/EnableSeTakeOwnershipPrivilege.cpp
代码实现了开启当前进程的 SeTakeOwnershipPrivilege 权限,修改注册表项 hklm\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
的权限,普通用户权限对其具有完整操作权限
后续的写操作:
reg add "hklm\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options" /v takeownership /t REG_SZ /d "C:\\Windows\\System32\\calc.exe"
0x0B SeDebugPrivilege 权限的利用思路
参考资料:https://github.com/hatRiot/token-priv/blob/master/abusing_token_eop_1.0.txt#L736
SeDebugPrivilege
用来调试指定进程,包括读写内存,常用作实现 dll 注入
利用思路
- 找到 System 权限的进程
- dll 注入
- 获得 System 权限
可供参考的测试代码:https://github.com/3gstudent/Homework-of-C-Language/blob/master/EnableSeDebugPrivilege.cpp
代码实现了开启当前进程的 SeDebugPrivilege 权限,向指定进程注入 dll
0x0C 小结
本文总结了普通用户(或者 LocalService 用户)Token 中九种权限的利用方法,分析利用思路,完善实现代码
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: 结束进程导致 BSOD 的利用分析
下一篇: Covenant 利用分析
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论