Microsoft Exchange任意用户伪造漏洞(CVE-2018-8581)分析
字数 1941 2025-08-18 11:37:50
Microsoft Exchange 任意用户伪造漏洞(CVE-2018-8581) 技术分析与复现指南
一、漏洞概述
漏洞编号: CVE-2018-8581
漏洞类型: 特权提升漏洞
影响范围: Exchange Server 2010/2013/2016
漏洞描述: 该漏洞允许任何经过身份验证的用户冒充 Exchange Server 上的其他任意用户,原因是 Exchange Server 在使用 NTLM 身份验证时存在特定缺陷,服务器产生的 NTLM 响应可以反射回攻击者服务器。
二、技术背景
2.1 关键概念
SID (Security Identifiers):
- 微软从 Server2000 引入的安全标识符概念
- 在工作组环境下,计算机、组、用户都有自己的 SID 号
- 存储在用户计算机本地注册表中
- 根据对象类型不同随机生成,具有特定命名规则
EWS (Exchange Web Services):
- 微软实现的客户端和服务器间交换信息的协议
- 提供电子邮件、会议安排、日程管理、任务管理等功能
- 支持丰富的协作应用开发
NTLM 认证:
- 一种不直接提供密码的间接认证方法
- 认证流程分为四个阶段:
- 协商(Negotiate)
- 挑战(Challenge)
- 认证(Authenticate)
- 域控制器验证
三、漏洞原理分析
3.1 漏洞核心机制
漏洞利用了两个关键问题:
- SSRF漏洞:允许攻击者通过EWS发送推送订阅请求并指定任意URL
- NTLM身份验证缺陷:Exchange Server使用CredentialCache.DefaultCredentials进行连接,以NT AUTHORITY\SYSTEM权限运行
3.2 关键注册表项
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\DisableLoopbackCheck=1
- 该设置允许NTLM响应被反射回攻击者服务器
- 是漏洞能够成功利用的关键配置
四、漏洞复现步骤
4.1 环境准备
测试环境:
- Windows 2008 R2
- Exchange Server 2010 SP2
4.2 复现流程
-
获取目标用户SID
- 通过反向委托方式获取
- 构造SOAP请求将攻击者邮箱委托给目标邮箱
- 服务器返回目标邮箱用户的SID
-
请求推送订阅
- 构造EWS推送订阅请求
- 指定攻击者控制的URL(SSRF漏洞点)
- Exchange Server会向指定URL发送请求
-
构造攻击数据包
- 使用获取的SID构造SOAP头部
- 模拟目标用户身份
- 构造委托请求包,将目标邮箱收件箱委托给攻击者
-
NTLM认证攻击
- 搭建Python HTTPServer作为代理服务器
- 捕获Exchange Server的NTLM响应
- 使用响应值请求EWS完成认证
4.3 详细攻击流程
- Exchange订阅功能向代理服务器发送POST请求
- 代理服务器返回401状态和WWW-Authenticate:NTLM头
- Exchange发送Negotiate协商消息
- 代理服务器用Negotiate消息和攻击包请求EWS
- EWS返回Challenge挑战消息
- 代理服务器将Challenge响应回Exchange
- Exchange加密后返回Authenticate认证消息
- 代理服务器使用Authenticate和攻击包请求EWS完成攻击
五、漏洞修复方案
5.1 手工修复
删除关键注册表项:
reg delete HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa /v DisableLoopbackCheck /f
注意:删除后无需重启系统或Exchange服务
5.2 官方补丁
- Microsoft在2018年11月发布了缓解补丁
- 后续Exchange累计更新中不再默认启用该注册表项
六、技术细节补充
6.1 反向委托获取SID
- 通过添加委托操作触发服务器返回目标用户SID
- 如果已存在委托关系(ErrorDelegateAlreadyExists),需先remove再add
- SOAP请求中:
<t:EmailAddress>: 攻击者邮箱(委托方)<t:PrimarySmtpAddress>: 受害者邮箱(被委托方)
6.2 EWS处理流程
- 请求发送到
/EWS/Exchange.asmx - Url参数被保存到PushSubscription的clientUrl
- 最终通过HTTP协议与指定URL进行通信
6.3 NTLM消息结构
所有NTLM消息(Negotiate/Challenge/Authenticate)都有相似结构:
NTLMSSPXXXXXXXXXX (经过Base64编码)