Windows提权之访问令牌操纵

Windows提权之访问令牌操纵

0x00 简介

编号: T1134

战术: 防御逃避,特权升级

平台: Windows

所需权限: 用户,管理员

有效权限: SYSTEM

数据源: API监视,访问令牌,进程监视,进程命令行参数

CAPEC ID: CAPEC-633

Windows使用访问令牌来确定正在运行的进程的所有权。用户可以操纵访问令牌以使正在运行的进程看起来像它属于启动该进程的用户以外的其他人。发生这种情况时,该过程还将采用与新令牌关联的安全性上下文。例如,Microsoft提倡使用访问令牌作为安全性最佳实践。管理员应以标准用户身份登录,但要使用内置访问令牌操作命令以管理员特权运行其工具runas。[1]

攻击者可以使用访问令牌在不同的用户或系统安全性上下文下进行操作,以执行操作并逃避检测。对手可以使用内置的Windows API函数来复制现有进程中的访问令牌;这被称为令牌窃取。对手必须已经在特权用户上下文(即管理员)中才能窃取令牌。但是,攻击者通常使用令牌窃取来将其安全上下文从管理员级别提升到SYSTEM级别。如果帐户在远程系统上具有适当的权限,则对手可以使用令牌作为该令牌的帐户向远程系统进行身份验证。[2]

攻击者可以通过以下三种方法来利用访问令牌:[3]

令牌模拟/盗窃 -对手创建一个新的访问令牌,该令牌使用来复制现有令牌DuplicateToken(Ex)。然后可以将该令牌用于ImpersonateLoggedOnUser允许调用线程模拟已登录用户的安全上下文,或者SetThreadToken用于将模拟令牌分配给线程。当目标用户在系统上具有非网络登录会话时,这很有用。

使用令牌创建流程 -对手DuplicateToken(Ex)使用CreateProcessWithTokenW来创建新的访问令牌,并将其用于创建在模拟用户的安全上下文下运行的新流程。这对于在其他用户的安全上下文下创建新进程很有用。

制作和模拟令牌 -对手具有用户名和密码,但用户未登录到系统。然后,对手可以使用该LogonUser功能为用户创建登录会话。该函数将返回新会话的访问令牌的副本,并且对手可以SetThreadToken用来将令牌分配给线程。

任何标准用户都可以使用runas命令和Windows API函数来创建模拟令牌。它不需要访问管理员帐户。

Metasploit的Meterpreter有效负载允许任意令牌操作,并使用令牌模拟来提升特权。[4] Cobalt Strike信标有效载荷允许模拟任意令牌,也可以创建令牌。[5]

0x01 环境

攻击机:Kali

受害机:Windows 2008R2

0x02 利用过程

一、juicy-potato

条件限制:

  • 需要支持SeImpersonate或者SeAssignPrimaryToken权限(通常情况下IISMSSQL具有这两个权限)
  • 开启DCOM
  • 本地支持RPC或者远程服务器支持PRC并能成功登录
  • 能够找到可用的COM对象
  1. 获取权限后,使用whoami /priv查看具有的token权限

2. 使用Empire生成反弹shell的payload

3. 通过冰蝎上传

4. 运行c:\temp\JuicyPotato.exe -l 1337 -p c:\temp\launcher.bat -t *

  • -l是指定COM组件的监听端口,需要选择一个未被占用的端口。
  • juicy-potato依赖于系统的RPC服务,默认端口号为135,如果目标机器未开放RPC服务,则可以尝试找其他开启了RPC的机器,使用参数-k指定机器ip

受害者主机成功上线

Empire上线
获得system权限

需要理解的几个知识:

  1. 使用DCOM时,如果以服务的方式远程连接,那么权限为System,例如BITS服务
  2. 使用DCOM可以通过TCP连接到本机的一个端口,发起NTLM认证,该认证可以被重放
  3. LocalService用户默认具有SeImpersonate和SeAssignPrimaryToken权限
  4. 开启SeImpersonate权限后,能够在调用CreateProcessWithToken时,传入新的Token创建新的进程
  5. 开启SeAssignPrimaryToken权限后,能够在调用CreateProcessAsUser时,传入新的Token创建新的进程

Juicy Potato的实现流程如下:

1、加载COM,发出请求,权限为System

在指定ip和端口的位置尝试加载一个COM对象

RottenPotatoNG使用的COM对象为BITS,CLSID为{4991d34b-80a1-4291-83b6-3328366b9097}

可供选择的COM对象不唯一,Juicy Potato提供了多个,详细列表可参考如下地址:

github.com/ohpe/juicy-p

因为RottenPotatoNG默认使用的COM对象伟BITS,CLSID为{4991d34b-80a1-4291-83b6-3328366b9097},适用于Windows2008的服务器系统,如果目标系统为Windows2012这需要通过上面提供的地址,查找可用CLSID,通过-c可以指定新的CLSID。

2、回应步骤1的请求,发起NTLM认证

正常情况下,由于权限不足,当前权限不是System,无法认证成功

3、针对本地端口,同样发起NTLM认证,权限为当前用户

由于权限为当前用户[指定CLSID的登录用户],必须要是System,所以NTLM认证能够成功完成

RottenPotatoNG使用的135端口

Juicy Potato支持指定任意本地端口,但是RPC一般默认为135端口,很少被修改

4、分别拦截两个NTLM认证的数据包,替换数据,通过NTLM重放使得步骤1(权限为System)的NTLM认证通过,获得System权限的Token

重放时需要注意NTLM认证的NTLM Server Challenge不同,需要修正

5、利用System权限的Token创建新进程

如果开启SeImpersonate权限,调用CreateProcessWithToken,传入System权限的Token,创建的进程为System权限

或者

如果开启SeAssignPrimaryToken权限,调用CreateProcessAsUser,传入System权限的Token,创建的进程为System权限

利用的关键:

当前用户支持SeImpersonate或者SeAssignPrimaryToken权限

以下用户具有该权限:

  • 本地管理员组成员和本地服务帐户
  • 由服务控制管理器启动的服务
  • 由组件对象模型 (COM) 基础结构启动的并配置为在特定帐户下运行的COM服务器

针对提权的话,主要是第三类用户,常见的为LocalService用户,例如IIS和者sqlserver的用户

二、incognito

Windows有两种类型的Token:

  • Delegation token(授权令牌):用于交互会话登录(例如本地用户直接登录、远程桌面登录)
  • Impersonation token(模拟令牌):用于非交互登录(利用net use访问共享文件夹)

注:

两种token只在系统重启后清除

具有Delegation token的用户在注销后,该Token将变成Impersonation token,依旧有效

下载地址:

labs.mwrinfosecurity.com

参考手册:

labs.mwrinfosecurity.com

常见用法如下:

列举token:incognito.exe list_tokens -u

复制token:incognito.exe execute [options] <token> <command>

  1. 列举tokens
incognito list_tokens -u

2. 提权至system

incognito.exe execute -c "NT AUTHORITY\SYSTEM" cmd.exe

3. 降权至当前用户:

incognito.exe execute -c "WIN-R7MM90ERBMD\a" cmd.exe

4. 伪造用户:

其他工具:

Invoke-TokenManipulation.ps1

下载地址:github.com/PowerShellMa

0x03 延伸-Windows Token九种权限的利用

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

whoami /prive

管理员用户

普通用户

iis用户

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

可供参考的实现代码:

EnablePrivilegeandGetTokenInformation

代码实现了开启指定权限(SeDebugPrivilege),并且查看当前用户名称和具有的权限

二、如果包含以下九个权限,我们就可以对其进一步利用

  • SeImpersonatePrivilege
  • SeAssignPrimaryPrivilege
  • SeTcbPrivilege
  • SeBackupPrivilege
  • SeRestorePrivilege
  • SeCreateTokenPrivilege
  • SeLoadDriverPrivilege
  • SeTakeOwnershipPrivilege
  • SeDebugPrivilege

注:

iis或者sqlserver的用户通常具有SeImpersonatePrivilege和SeAssignPrimaryPrivilege权限

Backup service用户通常具有SeBackupPrivilege和SeRestorePrivilege权限

1 SeImpersonatePrivilege权限的利用思路

参考资料:

abusing_token_eop_1.0github.com/hatRiot/toke

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权限

可供参考的测试代码:

github.com/3gstudent/Ho

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

2 SeAssignPrimaryPrivilege权限的利用思路

参考资料:

github.com/hatRiot/toke

SeAssignPrimaryPrivilege

向进程(新创建或者挂起的进程)分配token

通常,iis或者sqlserver用户具有该权限

利用思路1

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

可供参考的测试代码:

github.com/3gstudent/Ho

代码实现了开启当前进程的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权限

3 SeTcbPrivilege权限的利用思路

参考资料:

github.com/hatRiot/toke

SeTcbPrivilege

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

利用思路

  1. 调用LsaLogonUser获得Token
  2. 将该Token添加至Local System account组
  3. 该Token具有System权限

可供参考的测试代码:

github.com/3gstudent/Ho

代码实现了开启当前进程的SeTcbPrivilege权限,登录用户test1,将其添加至Local System account组,获得System权限,创建注册表项HKEY_LOCAL_MACHINE\SOFTWARE\testtcb

4 SeBackupPrivilege权限的利用思路

参考资料:

github.com/hatRiot/toke

SeBackupPrivilege

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

利用思路

  1. 读取注册表HKEY_LOCAL_MACHINE\SAMHKEY_LOCAL_MACHINE\SECURITYHKEY_LOCAL_MACHINE\SYSTEM
  2. 导出当前系统的所有用户hash mimikatz的命令如下:
lsadump::sam /sam:SamBkup.hiv /system:SystemBkup.hiv

可供参考的测试代码:

github.com/3gstudent/Ho

代码实现了开启当前进程的SeBackupPrivilege权限,读取注册表,将其保存成文件C:\\test\\SAMC:\\test\\SECURITYC:\\test\\SYSTEM

5 SeRestorePrivilege权限的利用思路

参考资料:

github.com/hatRiot/toke

SeRestorePrivilege

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

利用思路1

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

利用思路2

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

可供参考的测试代码:

github.com/3gstudent/Ho

代码实现了开启当前进程的SeRestorePrivilege权限,创建注册表项HKEY_LOCAL_MACHINE\SOFTWARE\testrestore

6 SeCreateTokenPrivilege权限的利用思路

参考资料:

github.com/hatRiot/toke

SeCreateTokenPrivilege

用来创建Primary Token

利用思路

  1. 通过WinAPI ZwCreateToken创建Primary Token
  2. 将Token添加至local administrator组
  3. 该Token具有System权限

可供参考的测试代码:

github.com/3gstudent/Ho

代码实现了开启当前进程的SeCreateTokenPrivilege权限,创建Primary Token,将其添加至local administrator组,开启SeDebugPrivilege和SeTcbPrivilege权限

7 SeLoadDriverPrivilege权限的利用思路

参考资料:

github.com/hatRiot/toke

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权限,利用代码可参考: github.com/tandasat/Exp
  3. 获得System权限

可供参考的测试代码: github.com/3gstudent/Ho

代码实现了开启当前进程的SeLoadDriverPrivilege权限,读取注册表项hkcu\System\CurrentControlSet\CAPCOM,加载驱动文件Capcom.sys

8 SeTakeOwnershipPrivilege权限的利用思路

参考资料:

github.com/hatRiot/toke

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. 实现提权或是作为后门

可供参考的测试代码:

github.com/3gstudent/Ho

代码实现了开启当前进程的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"

9 SeDebugPrivilege权限的利用思路

参考资料:

github.com/hatRiot/toke

SeDebugPrivilege

用来调试指定进程,包括读写内存,常用作实现dll注入

利用思路

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

可供参考的测试代码:

EnableSeDebugPrivilege

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

0x04 缓解

  1. 特权账户管理

限制权限,以便用户和用户组无法创建令牌。仅应为本地系统帐户定义此设置。GPO:计算机配置> [策略]> Windows设置>安全设置>本地策略>用户权限分配:创建令牌对象。还定义谁可以通过GPO为本地和网络服务创建进程级别令牌:计算机配置> [策略]> Windows设置>安全设置>本地策略>用户权限分配:替换进程级别令牌。[6] [7]

2. 用户帐号管理

对手必须已经在本地系统上具有管理员级别的访问权限,才能充分利用此技术。确保将用户和帐户限制为所需的最少特权。

0x05 检测

如果对手使用的是标准command-line shell,则分析人员可以通过审核命令行活动来检测令牌操纵。具体地说,分析人员应寻找该runas命令的使用。Windows默认情况下不启用详细的命令行日志记录。[26]

如果对手使用的是直接调用Windows令牌API的有效负载,则分析人员只能通过仔细分析用户网络活动,检查运行的进程以及与其他端点和网络行为的关联来检测令牌操纵。

有效负载可以利用许多Windows API调用来操纵访问令牌(例如LogonUser [27]DuplicateTokenEx[28]ImpersonateLoggedOnUser[29])。请参阅参考的Windows API页面以获取更多信息。

查询系统以获取进程和线程令牌信息,并查找不一致之处,例如用户拥有模拟本地SYSTEM帐户的进程。[3]

0x06 防御

站在防御的角度,服务器禁用DCOM,禁用RPC,或者为每一个COM对象配置属性均不现实

针对Juicy Potato的关键在于权限的控制,阻止攻击者获得SeImpersonate或者SeAssignPrimaryToken权限

0x07 References

  1. MITRE ATT&CK T1134 - Access Token Manipulation
  2. 本地提权工具Juicy-Potato测试分析
  3. 渗透技巧-Windows-Token九种权限的利用
  4. 渗透技巧-Token窃取与利用
  5. 渗透技巧-从Admin权限切换到System权限
  6. vulhub.org.cn/attack/te
  7. privilege-escalation-through-token-manipulation
  8. rotten-potato-privilege-escalation-from-service-accounts-to-system
  9. abusing_token_eop_1.0
  10. bugs.chromium.org/p/pro
  11. Microsoft TechNet. (n.d.). Runas. Retrieved April 21, 2017.
  12. netbiosX. (2017, April 3). Token Manipulation. Retrieved April 21, 2017.
  13. Atkinson, J., Winchester, R. (2017, December 7). A Process is No One: Hunting for Token Manipulation. Retrieved December 21, 2017.
  14. Offensive Security. (n.d.). What is Incognito. Retrieved April 21, 2017.
  15. Mudge, R. (n.d.). Windows Access Tokens and Alternate Credentials. Retrieved April 21, 2017.
  16. Brower, N., Lich, B. (2017, April 19). Create a token object. Retrieved December 19, 2017.
  17. Brower, N., Lich, B. (2017, April 19). Replace a process level token. Retrieved December 19, 2017.
  18. Nicolas Verdier. (n.d.). Retrieved January 29, 2018.
  19. Strategic Cyber LLC. (2017, March 14). Cobalt Strike Manual. Retrieved May 24, 2017.
  20. PowerShellMafia. (2012, May 26). PowerSploit - A PowerShell Post-Exploitation Framework. Retrieved February 6, 2018.
  21. PowerSploit. (n.d.). PowerSploit. Retrieved February 6, 2018.
  22. Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.
  23. Nettitude. (2018, July 23). Python Server for PoshC2. Retrieved April 23, 2019.
  24. Kaspersky Lab. (2015, June 11). The Duqu 2.0. Retrieved April 21, 2017.
  25. FinFisher. (n.d.). Retrieved December 20, 2017.
  26. Allievi, A.,Flori, E. (2018, March 01). FinFisher exposed: A researcher’s tale of defeating traps, tricks, and complex virtual machines. Retrieved July 9, 2018.
  27. Sherstobitoff, R. (2018, March 08). Hidden Cobra Targets Turkish Financial Sector With New Bankshot Implant. Retrieved May 18, 2018.
  28. Lelli, A. (2010, January 11). Trojan.Hydraq. Retrieved February 20, 2018.
  29. Yan, T., et al. (2018, November 21). New Wine in Old Bottle: New Azorult Variant Found in FindMyName Campaign using Fallout Exploit Kit. Retrieved November 29, 2018.
  30. Baumgartner, K., Golovkin, M.. (2015, May). The MsnMM Campaigns: The Earliest Naikon APT Campaigns. Retrieved April 10, 2019.
  31. Allievi, A., et al. (2014, October 28). Threat Spotlight: Group 72, Opening the ZxShell. Retrieved September 24, 2019.
  32. Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016.
  33. Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Tools Report. Retrieved March 10, 2016.
  34. FireEye Labs. (2015, April 18). Operation RussianDoll: Adobe & Windows Zero-Day Exploits Likely Leveraged by Russia’s APT28 in Highly-Targeted Attack. Retrieved April 24, 2017.
  35. Faou, M. and Dumont R.. (2019, May 29). A dive into Turla PowerShell usage. Retrieved June 14, 2019.
  36. Mathers, B. (2017, March 7). Command line process auditing. Retrieved April 21, 2017.
  37. Microsoft TechNet. (n.d.). Retrieved April 25, 2017.
  38. Microsoft TechNet. (n.d.). Retrieved April 25, 2017.
  39. Microsoft TechNet. (n.d.). Retrieved April 25, 2017.
  40. Hot Potato
  41. powershell版本Hot Potato github.com/Kevin-Robert)
  42. Rotten Potato github.com/breenmachine)
  43. lonelypotato github.com/decoder-it/l)
  44. Juicy Potato
  45. token-priv
  46. abusing-token-privileges-for-windows-local-privilege-escalation
  47. hot-potato
  48. rotten-potato-privilege-escalation-from-service-accounts-to-system
编辑于 03-22

文章被以下专栏收录