WindowsAPI函数
模拟令牌转换主令牌函数
1 2 3 4 5 6 7 8
| BOOL DuplicateTokenEx( [in] HANDLE hExistingToken, [in] DWORD dwDesiredAccess, [in, optional] LPSECURITY_ATTRIBUTES lpTokenAttributes, [in] SECURITY_IMPERSONATION_LEVEL ImpersonationLevel, [in] TOKEN_TYPE TokenType, [out] PHANDLE phNewToken );
|
使用用户令牌创建指定用户的进程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| BOOL CreateProcessWithTokenW( [in] HANDLE hToken, [in] DWORD dwLogonFlags, [in, optional] LPCWSTR lpApplicationName, [in, out, optional] LPWSTR lpCommandLine, [in] DWORD dwCreationFlags, [in, optional] LPVOID lpEnvironment, [in, optional] LPCWSTR lpCurrentDirectory, [in] LPSTARTUPINFOW lpStartupInfo, [out] LPPROCESS_INFORMATION lpProcessInformation ); BOOL CreateProcessAsUserW( [in, optional] HANDLE hToken, [in, optional] LPCWSTR lpApplicationName, [in, out, optional] LPWSTR lpCommandLine, [in, optional] LPSECURITY_ATTRIBUTES lpProcessAttributes, [in, optional] LPSECURITY_ATTRIBUTES lpThreadAttributes, [in] BOOL bInheritHandles, [in] DWORD dwCreationFlags, [in, optional] LPVOID lpEnvironment, [in, optional] LPCWSTR lpCurrentDirectory, [in] LPSTARTUPINFOW lpStartupInfo, [out] LPPROCESS_INFORMATION lpProcessInformation );
|
源代码分析
总所周知PetitPotam可以强制系统对指定目标进行认证,在SweetPotato中efsrpc就是通过SeImpersonatePrivilege特权模拟管道服务端进行身份验证,然后使用PetitPotam强制系统对管道服务端完成身份认证并模拟客户端。
初始化管道名,返回的令牌;

创建命名管道服务器;

使用PetitPotam强制访问指定命名管道进行认证;

将模拟令牌转换为主令牌;

设置线程模拟令牌,使用模拟令牌创建线程;

兼容问题
如果有看过SweetPotato
源代码中的efsrpc
的利用方式可能会发现我添加了两个版本的PetitPotam
。这是因为我在测试的时候发现SweetPotato
原来的方式(TriggerEfsRpc2)在Windows 2008和2012是不兼容的。经过我测试,我添加TriggerEfsRpc1
兼容。

疑难杂症
我在虚拟机中测试SweetPotato
,在Win10中是正常运行的,但是在Win2016中无法正常运行。SeImpersonatePrivilege
开启是正常开启的,通过Procmon
查看发现没有访问成功?在知乎的这篇文章上有相关说明 https://zhuanlan.zhihu.com/p/500415108
Windows2016(提权失败):

Windows10(提权成功):

后面在跟基友的讨论中发现微软应该是在4月份引入了某一个补丁对Efsrpc
提权的利用方式进行了修补。大概过了4天左右在跟进PetitPotam
过程中中发现CVE-2022-26925
。从推特上的讨论来看在对PetitPotam
进行修复以后,在2021年12月-2020年4月这段时间中,微软发布了某个补丁疑似与PetitPotam
补丁发生了冲突,导致PetitPotam
死而复生。