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强制系统对管道服务端完成身份认证并模拟客户端。

初始化管道名,返回的令牌;

image.png

创建命名管道服务器;

image.png

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

image.png

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

image.png

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

image.png

兼容问题

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

image.png

疑难杂症

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

Windows2016(提权失败):

image.png

Windows10(提权成功):

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