CVE-2020-0688反序列化漏洞
漏洞成因
漏洞产生的主要原因就是在Exchange ECP组件中发现,邮件服务在安装的过程中不会随机生成秘钥,也就是说所有默认安装的Exchange服务器中的validationKey和decryptionKey的值都是相同的,攻击者可以利用静态秘钥伪造__VIEWSTATE参数从而触发反序列化漏洞。
环境、工具
WinServer2016、Exchange Server2016、win10、dnspy
分析
default.aspx被解析,继承Page类(Page类位于命名空间 System.Web.UI)派生出新的类,然后,动态生成的类会被编译为程序集,该程序集之后会被缓存到ASP.Net专用的临时目录下。
(1)逆分析
寻找__VIEWSTATE参数。
因为最终继承Page,所以在Page类中寻找参数__VIEWSTATE。
发现在RequestViewStateString方法中,745行,获取了该值。
使用dnspy分析方法RequestViewStateString,发现有四处被使用的地方。
其中前俩处未找到关于反序列化的点。
在HiddenFieldPageStatePersister类中的Load方法找到反序列化触发点27行
往回寻找实现类HiddenFieldPageStatePersister的地方,在LoadPageSateFromPersistenceMedium方法1689行调用了Load方法。LoadPageSateFromPersistenceMedium方法中此语句
PageStatePersister pageStatePersister = this.PageStatePersister;
最终实现的都是HiddenFieldPageStatePersister类。
再往回分析LoadAllState方法中1649行调用了LoadPageSateFromPersistenceMedium方法。而LoadAllState方法在ProcessRequestMain方法中4403行被实现,而default.aspx处理请求时最终都会调用ProcessRequestMain方法。
(2)顺序分析
触发反序列化的路径已经很清晰了如下图。
紧接着分析进入到最后触发反序列化点的条件。
首先在ProcessRequestMain方法中,满足条件this.IsPostBack,即可进入LoadAllState()方法,而进入LoadAllState方法以后就很顺利的可以到达漏洞触发点。
(3)序列化漏洞分析
在上文提到在HiddenFieldPageStatePersister类中27行找到了序列化漏洞点。
紧接着对序列化函数进行分析,经过分析ObjectStateFormatter类中实现了IFormatter接口中
Deserialize(string serializedState)方法,而ObjectStateFormatter类也属于命名空间中System.Web.UI类。
紧接着查看反序列化实现的过程。
找到序列化函数,其中inputString就是我们输入进去的__VIEWSTATE参数。(以下步骤决定了我们构造反序列化能否成功的被解密)
首先inputString从Base64转成byte数据,最终根据条选择使用MachineKeySection.EncryptOrDecryptData()解密还是 MachineKeySection.GetDecodedData()解密
而加密解密使用的密钥在this.acKeyModifier()方法中获得。使用到viewStateUserKey,__VIEWSTATEGENERATOR,validationKey。其中viewStateUserKey可在cookie中找到,后面两者是定值(漏洞触发的关键)。
viewstate加密解密可参考
解决了加密的问题就反序列化就可以被顺利的触发了。
(4)工具ysoserial.net
使用ysoserial.net工具可以自动生成payload.
ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "cmd /c calc.exe" --validationalg="SHA1" --validationkey="CB2721ABDAF8E9DC516D621D8B8BF13A2C9E8689A25303BF" --generator="B97B4E27" --viewstateuserkey=""
生成的结果再进行url编码,访问以下url
/ecp/default.aspx?__VIEWSTATEGENERATOR=&__VIEWSTATE=
https://github.com/pwntester/ysoserial.net