0x01 环境
攻击机:Kali
受害机:Windows 2008R2
0x02 利用过程
一、juicy-potato


条件限制:
- 需要支持SeImpersonate或者SeAssignPrimaryToken权限(通常情况下IIS、MSSQL具有这两个权限)
- 开启DCOM
- 本地支持RPC或者远程服务器支持PRC并能成功登录
- 能够找到可用的COM对象
- 获取权限后,使用
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
受害者主机成功上线




需要理解的几个知识:
- 使用DCOM时,如果以服务的方式远程连接,那么权限为System,例如BITS服务
- 使用DCOM可以通过TCP连接到本机的一个端口,发起NTLM认证,该认证可以被重放
- LocalService用户默认具有SeImpersonate和SeAssignPrimaryToken权限
- 开启SeImpersonate权限后,能够在调用CreateProcessWithToken时,传入新的Token创建新的进程
- 开启SeAssignPrimaryToken权限后,能够在调用CreateProcessAsUser时,传入新的Token创建新的进程
Juicy Potato的实现流程如下:
1、加载COM,发出请求,权限为System
在指定ip和端口的位置尝试加载一个COM对象
RottenPotatoNG使用的COM对象为BITS,CLSID为{4991d34b-80a1-4291-83b6-3328366b9097}
可供选择的COM对象不唯一,Juicy Potato提供了多个,详细列表可参考如下地址:
https://github.com/ohpe/juicy-potato/blob/master/CLSID/README.md
因为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
,依旧有效
下载地址:
https://labs.mwrinfosecurity.com/assets/BlogFiles/incognito2.zip
参考手册:
常见用法如下:
列举token:incognito.exe list_tokens -u
复制token:incognito.exe execute [options] <token> <command>
- 列举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
下载地址:https://github.com/PowerShellMafia/PowerSploit/blob/master/Exfiltration/Invoke-TokenManipulation.ps1
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.0https://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权限
2 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权限
3 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
4 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
5 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
6 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权限
7 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
8 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"
9 SeDebugPrivilege权限的利用思路
参考资料:
https://github.com/hatRiot/token-priv/blob/master/abusing_token_eop_1.0.txt#L736
SeDebugPrivilege
用来调试指定进程,包括读写内存,常用作实现dll注入
利用思路
- 找到System权限的进程
- dll注入
- 获得System权限
可供参考的测试代码:
代码实现了开启当前进程的SeDebugPrivilege权限,向指定进程注入dll
0x04 缓解
限制权限,以便用户和用户组无法创建令牌。仅应为本地系统帐户定义此设置。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
- MITRE ATT&CK T1134 - Access Token Manipulation
- 本地提权工具Juicy-Potato测试分析
- 渗透技巧-Windows-Token九种权限的利用
- 渗透技巧-Token窃取与利用
- 渗透技巧-从Admin权限切换到System权限
- http://vulhub.org.cn/attack/techniques/T1134.md
- privilege-escalation-through-token-manipulation
- rotten-potato-privilege-escalation-from-service-accounts-to-system
- abusing_token_eop_1.0
- https://bugs.chromium.org/p/project-zero/issues/detail?id=325&redir=1
- Microsoft TechNet. (n.d.). Runas. Retrieved April 21, 2017.
- netbiosX. (2017, April 3). Token Manipulation. Retrieved April 21, 2017.
- Atkinson, J., Winchester, R. (2017, December 7). A Process is No One: Hunting for Token Manipulation. Retrieved December 21, 2017.
- Offensive Security. (n.d.). What is Incognito. Retrieved April 21, 2017.
- Mudge, R. (n.d.). Windows Access Tokens and Alternate Credentials. Retrieved April 21, 2017.
- Brower, N., Lich, B. (2017, April 19). Create a token object. Retrieved December 19, 2017.
- Brower, N., Lich, B. (2017, April 19). Replace a process level token. Retrieved December 19, 2017.
- Nicolas Verdier. (n.d.). Retrieved January 29, 2018.
- Strategic Cyber LLC. (2017, March 14). Cobalt Strike Manual. Retrieved May 24, 2017.
- PowerShellMafia. (2012, May 26). PowerSploit - A PowerShell Post-Exploitation Framework. Retrieved February 6, 2018.
- PowerSploit. (n.d.). PowerSploit. Retrieved February 6, 2018.
- Schroeder, W., Warner, J., Nelson, M. (n.d.). Github PowerShellEmpire. Retrieved April 28, 2016.
- Nettitude. (2018, July 23). Python Server for PoshC2. Retrieved April 23, 2019.
- Kaspersky Lab. (2015, June 11). The Duqu 2.0. Retrieved April 21, 2017.
- FinFisher. (n.d.). Retrieved December 20, 2017.
- 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.
- Sherstobitoff, R. (2018, March 08). Hidden Cobra Targets Turkish Financial Sector With New Bankshot Implant. Retrieved May 18, 2018.
- Lelli, A. (2010, January 11). Trojan.Hydraq. Retrieved February 20, 2018.
- 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.
- Baumgartner, K., Golovkin, M.. (2015, May). The MsnMM Campaigns: The Earliest Naikon APT Campaigns. Retrieved April 10, 2019.
- Allievi, A., et al. (2014, October 28). Threat Spotlight: Group 72, Opening the ZxShell. Retrieved September 24, 2019.
- Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Unraveling the Long Thread of the Sony Attack. Retrieved February 25, 2016.
- Novetta Threat Research Group. (2016, February 24). Operation Blockbuster: Tools Report. Retrieved March 10, 2016.
- 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.
- Faou, M. and Dumont R.. (2019, May 29). A dive into Turla PowerShell usage. Retrieved June 14, 2019.
- Mathers, B. (2017, March 7). Command line process auditing. Retrieved April 21, 2017.
- Microsoft TechNet. (n.d.). Retrieved April 25, 2017.
- Microsoft TechNet. (n.d.). Retrieved April 25, 2017.
- Microsoft TechNet. (n.d.). Retrieved April 25, 2017.
- Hot 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
- token-priv
- abusing-token-privileges-for-windows-local-privilege-escalation
- hot-potato
- rotten-potato-privilege-escalation-from-service-accounts-to-system
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构