渗透技巧——Windows 九种权限的利用

发布于 2024-10-03 08:15:17 字数 13288 浏览 6 评论 0

0x00 前言

普通用户(或者 LocalService 用户) 的特殊 Token 有哪些可利用方法呢?能否提权?如何判断?本文将要结合自己的经验,参考多个开源工具和资料,尝试对这个技巧做总结,分享学习心得

参考的开源工具和资料:

0x01 简介

本文将要介绍以下内容:

  • 简要利用思路
  • SeImpersonatePrivilege 权限对应的利用思路和开源代码
  • SeAssignPrimaryPrivilege 权限对应的利用思路和开源代码
  • SeTcbPrivilege 权限对应的利用思路和开源代码
  • SeBackupPrivilege 权限对应的利用思路和开源代码
  • SeRestorePrivilege 权限对应的利用思路和开源代码
  • SeCreateTokenPrivilege 权限对应的利用思路和开源代码
  • SeLoadDriverPrivilege 权限对应的利用思路和开源代码
  • SeTakeOwnershipPrivilege 权限对应的利用思路和开源代码
  • SeDebugPrivilege 权限对应的利用思路和开源代码

0x02 简要利用思路

1、取得了目标的访问权限后,查看可用权限

whoami /priv

例如,普通用户具有的权限如下图

Alt text

管理员用户具有的权限如下图

Alt text

iis 用户具有的权限如下图

Alt text

Privilege Name 项表示具有的权限,State 表示权限的状态,我们可以通过 WinAPI AdjustTokenPrivileges 将权限设置为 Disabled 或者 Enabled

可供参考的实现代码:https://github.com/3gstudent/Homework-of-C-Language/blob/master/EnablePrivilegeandGetTokenInformation.cpp

代码实现了开启指定权限(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 用户具有该权限

利用思路

  1. 利用 NTLM Relay to Local Negotiation 获得 System 用户的 Token 可使用开源工具 Rotten Potato、lonelypotato 或者 Juicy Potato
  2. 通过 WinAPI CreateProcessWithToken 创建新进程,传入 System 用户的 Token 具有 SeImpersonatePrivilege 权限才能创建成功
  3. 该 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

  1. 利用 NTLM Relay to Local Negotiation 获得 System 用户的 Token
  2. 通过 WinAPI CreateProcessAsUser 创建新进程,传入 System 用户的 Token
  3. 该 Token 具有 System 权限

可供参考的测试代码:https://github.com/3gstudent/Homework-of-C-Language/blob/master/EnableSeAssignPrimaryTokenPrivilege.cpp

代码实现了开启当前进程的 SeAssignPrimaryTokenPrivilege 权限,调用 CreateProcessAsUser,传入当前进程的 Token,创建一个进程,配合 RottenPotato,可用来从 LocalService 提权至 System 权限

利用思路 2

  1. 利用 NTLM Relay to Local Negotiation 获得 System 用户的 Token
  2. 通过 WinAPI CreateProcess 创建一个挂起的新进程,参数设置为 CREATE_SUSPENDED
  3. 通过 WinAPI NtSetInformationProcess 将新进程的 Token 替换为 System 用户的 Token
  4. 该 Token 具有 System 权限

0x05 SeTcbPrivilege 权限的利用思路

参考资料:https://github.com/hatRiot/token-priv/blob/master/abusing_token_eop_1.0.txt#L418

SeTcbPrivilege

等同于获得了系统的最高权限

利用思路

  1. 调用 LsaLogonUser 获得 Token
  2. 将该 Token 添加至 Local System account 组
  3. 该 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

用来实现备份操作,对当前系统任意文件具有读权限

利用思路

  1. 读取注册表 HKEY_LOCAL_MACHINE\SAMHKEY_LOCAL_MACHINE\SECURITYHKEY_LOCAL_MACHINE\SYSTEM
  2. 导出当前系统的所有用户 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\\SAMC:\\test\\SECURITYC:\\test\\SYSTEM

0x07 SeRestorePrivilege 权限的利用思路

参考资料:https://github.com/hatRiot/token-priv/blob/master/abusing_token_eop_1.0.txt#L528

SeRestorePrivilege

用来实现恢复操作,对当前系统任意文件具有写权限

利用思路 1

  1. 获得 SeRestorePrivilege 权限,修改注册表 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
  2. 劫持 exe 文件的启动
  3. 实现提权或是作为后门

利用思路 2

  1. 获得 SeRestorePrivilege 权限,向任意路径写入 dll 文件
  2. 实现 dll 劫持
  3. 实现提权或是作为后门

可供参考的测试代码: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

利用思路

  1. 通过 WinAPI ZwCreateToken 创建 Primary Token
  2. 将 Token 添加至 local administrator 组
  3. 该 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

用来加载驱动文件

利用思路

  1. 创建驱动文件的注册表
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
  1. 加载驱动文件 Capcom.sys
  2. Capcom.sys 存在漏洞,系统加载后,可从普通用户权限提升至 System 权限,利用代码可参考: https://github.com/tandasat/ExploitCapcom
  3. 获得 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

  1. 获得 SeTakeOwnershipPrivilege 权限,修改注册表 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
  2. 劫持 exe 文件的启动
  3. 实现提权或是作为后门

利用思路 2

  1. 获得 SeTakeOwnershipPrivilege 权限,向任意路径写入 dll 文件
  2. 实现 dll 劫持
  3. 实现提权或是作为后门

可供参考的测试代码: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 注入

利用思路

  1. 找到 System 权限的进程
  2. dll 注入
  3. 获得 System 权限

可供参考的测试代码:https://github.com/3gstudent/Homework-of-C-Language/blob/master/EnableSeDebugPrivilege.cpp

代码实现了开启当前进程的 SeDebugPrivilege 权限,向指定进程注入 dll

0x0C 小结

本文总结了普通用户(或者 LocalService 用户)Token 中九种权限的利用方法,分析利用思路,完善实现代码

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

余生共白头

暂无简介

0 文章
0 评论
21 人气
更多

推荐作者

忆伤

文章 0 评论 0

眼泪也成诗

文章 0 评论 0

zangqw

文章 0 评论 0

旧伤慢歌

文章 0 评论 0

qq_GlP2oV

文章 0 评论 0

旧时模样

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文