0x01背景
近日,安全研究人员发现微软Microsoft Exchange SSRF漏洞,该漏洞它允许任何经过身份验证的用户冒充Exchange Server上的其他用户,从而得到被冒充用户的权限。
漏洞的提交时间在2018年11月14日。
漏洞的影响版本为 Microsoft Exchange Server 2010、2013、2016、2019。
0x02漏洞详情
Exchange允许任何用户把订阅推送到指定的URL,服务器将向此URL发送通知。 Exchange服务器使用了CredentialCache.DefaultCredentials进行连接导致出现以下问题:
在Exchange Web服务中,CredentialCache.DefaultCredentials以NT AUTHORITY \ SYSTEM权限运行。导致Exchange Server会将NTLM Hash发送到攻击者的服务器。Exchange服务器在默认情况下还设置了以下注册表项:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\DisableLoopbackCheck = 1
我们可以使用这些NTLM Hash进行HTTP身份验证。 例如,利用这些哈希来访问Exchange Web服务(EWS)。因为它以NT AUTHORITY \ SYSTEM权限运行,攻击者可以利用令牌来建立“特权”会话,然后利用SOAP头冒充任意用户。
下面是利用管理员SID来伪造管理员身份的SOAP头:
0x03漏洞利用
为了冒充用户身份,需要结合SSRF和其他漏洞。
需要安装python-ntlm模块。
且需要一个授权用户的账号。
第一步是获取他人的SID。
1.首先用自己的账户登录OWA,并任意创建一个文件夹。
2.接下来在文件夹上右键-〉权限,添加被攻击的用户地址。
3.再次点击文件->权限。并对这一操作抓包。
4.在响应正文里找到对应用户的SID。
具体位置为:
Body->ResponseMessages->Items->0->Folders->0->PermissionSet->Permissions->N->UserId->SID
(N在本例中是3)
5.接下来修改脚本:serverHTTP_relayNTLM.py并在vps上启动监听。
6.接下来配置Exch_EWS_pushSubscribe.py并执行该脚本。
7.一段时间后,vps上收到推送。
7.收到success代表攻击已经成功。新的规则已经被添加到受害者邮箱,受害者收到的所有电子邮件都会转发给攻击者。
0x04攻击中可能遇到的问题
1.在配置Exch_EWS_pushSubscribe.py时,需要配置domain,它的获取可能不是那么容易。
2.我在运行github给出的Exch_EWS_pushSubscribe.py时,返回值是500没有成功,且返回的response.msg是乱码,没法确定问题。
这时,修改脚本按照utf8编码:
#sending request and receiving response
conn.request("POST", URL, body, headers)
response = conn.getresponse()
resp_data = response.read().decode('utf-8')
得到返回报错。
<?xml version="1.0" encoding="utf-8"?><s:Envelope xmlns:s="http://schemas.xmls
oap.org/soap/envelope/"><s:Body><s:Fault><faultcode xmlns:a="http://schemas.mi
crosoft.com/exchange/services/2006/types">a:ErrorSchemaValidation</faultcode><
faultstring xml:lang="zh-CN">该请求未通过架构验证: 元素 命名空间“http://schem
as.microsoft.com/exchange/services/2006/messages”中的“PushSubscriptionReques
t”。 的子元素 命名空间“http://schemas.microsoft.com/exchange/services/2006/t
ypes”中的“CallerData”。 无效。应为可能元素的列表: 命名空间“http://schemas.
microsoft.com/exchange/services/2006/types”中的“URL”。。</faultstring><deta
il><e:ResponseCode xmlns:e="http://schemas.microsoft.com/exchange/services/200
6/errors">ErrorSchemaValidation</e:ResponseCode><e:Message xmlns:e="http://sch
emas.microsoft.com/exchange/services/2006/errors">请求未通过架构验证。</e:Mess
age><t:MessageXml xmlns:t="http://schemas.microsoft.com/exchange/services/2006
/types"><t:LineNumber>18</t:LineNumber><t:LinePosition>17</t:LinePosition><t:V
iolation>元素 命名空间“http://schemas.microsoft.com/exchange/services/2006/me
ssages”中的“PushSubscriptionRequest”。 的子元素 命名空间“http://schemas.mi
crosoft.com/exchange/services/2006/types”中的“CallerData”。 无效。应为可能
元素的列表: 命名空间“http://schemas.microsoft.com/exchange/services/2006/type
s”中的“URL”。。</t:Violation></t:MessageXml></detail></s:Fault></s:Body></s
:Envelope>
发现是某个子元素无效。我对该命名空间缺乏了解,只能暴力一点,在body里删除无效的元素。(后发现并不影响执行效果)
3.在vps上执行的serverHTTP_relayNTLM.py需要注意请求的owa版本。脚本里默认是2016,如果版本不对应会返回500错误,改成正确版本即可,我的话改成2013。
0x05修补方案
Microsoft在11月发布的更新里发布了此漏洞的环节措施,通过删除注册表项开启回环检测。
具体方法是开启管理员权限的cmd并输入命令:
reg delete HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Lsa / v DisableLoopbackCheck / f
删除后无需重启系统或Exchange Server。公告指出,未来Exchange更新后将不再默认启用注册表项。
0x06参考