Exchange Server(CVE-2023-36439)远程代码执行漏洞分析
0x01 漏洞描述 2023年11月微软发布的安全更新中,修复了笔者报送的CVE-2023-36439。 利用该漏洞,在与Exchange服务器位于同一内部网络的情况下,经过身份验证的攻击者可以通过PowerShell远程会话实现远程代码执行。攻击者利用CVE-2023-36439可以在服务器邮箱后端获得NT AUTHORITY\SYSTEM的远程代码执行权限。 0x02 背景介绍 Exchange 命令行管理程序基于Windows PowerShell技术构建,并提供强大的命令行界面,可实现 Exchange 管理任务的自动化。 可以使用 Exchange 命令行管理程序 来管理 Exchange 的各个方面。 例如,可以创建电子邮件帐户、创建发送连接器和接收连接器、配置邮箱数据库属性以及管理通讯组。 本漏洞位于Exchange针对Powershell数据的反序列化过程中,理解proxynotshell相关漏洞原理有助于理解本漏洞触发逻辑,相关分析可参考《CONTROL YOUR TYPES OR GET PWNED: REMOTE CODE EXECUTION IN EXCHANGE POWERSHELL BACKEND》。 0x03 漏洞分析 本漏洞编号在11月发布,但漏洞在10月补丁中已经被修补。同时11月补丁中提到新增了“Serialized Data Signing feature”机制来缓解反序列化相关漏洞问题。 所以在11月补丁的SerializationTypeConverter.cs 中可以观察到针对被反序列化数据的校验: 而在10月补丁中,通过对不同版本ChainedSerializationBinder.cs进行对比可直观发现以下结果: 在BuildDisallowedTypesForDeserialization函数中新增了黑名单类型System.Xaml.XamlServices。 System.Xaml.XamlServices.Parse方法与常见的XamlReader.Parse其实在功能、危害及利用方法上其实没有本质区别。 比如执行以上代码将调用计算器,所以本漏洞实际上是CVE-2022-41082的一个变种。 但其实从CVE-2022-41082以后,增加了ValidateTypeToDeserialize函数对类型进行黑名单校验;在CVE-2023-21529、CVE-2023-28310 以后增加了vistor模式的递归黑名单校验;在CVE-2023-36745、CVE-2023-35388等漏洞后增加了vistor模式的白名单校验,为什么这个漏洞还能够触发? 以下是Exchange反序列化时,白名单校验的逻辑 可以看到当typeToDeserialize.IsAbstract为true,且类型名称不为System.Type时,认为类型合法。 可以看到XamlServices并没有被声明为Abstract,但IsAbstract的属性为true 这是因为在C#中,如果一个类被声明为static,则它的IsAbstract属性会是true。在C#中,静态类在概念上是抽象的,不能被实例化。 所以XamlServices以这种‘反直觉’的方式成为了漏网之鱼,只需要简单替换目标类,利用方法与CVE-2022-41082完全一致。 0x04 总结 本文分析了CVE-2023-36439的补丁及漏洞成因,同时简单统计可以发现关于Exchange Powershell模块已经披露了超过10个相关漏洞,并且大部分都可以通过变种分析来发现,文中提到的多个漏洞编号其实均为CVE-2022-41082(proxynotshell)的变种漏洞,同时比如10月补丁的CVE-2023-36778其实也是CVE-2022-41076的相似漏洞。通过本文希望能帮助读者更好理解Exchange Powershell模块的相关漏洞原理。