Codesys反序列化漏洞-CVE-2021-21867复现
时间:2022-06-16 作者:安帝科技
Part1 漏洞状态
Part2 漏洞描述
CODESYS Development System 3.5.16和3.5.17的ObjectManager.plugin ObjectStream.ProfileByteArray功能中存在不安全反序列化漏洞,攻击者可借助特制的文件利用该漏洞执行任意命令。
Part3 漏洞复现
1. 实验环境
实验主机:win10 64
软件版本:CODESYS Development System 3.5.16.0(64位)
2.涉及工具
ysoserial.net
3.漏洞复现
1)构造恶意项目文件,首先使用反序列化工具ysoserial.net在命令行执行如下命令生成恶意项目文件:ysoserial.exe -f BinaryFormatter -g TypeConfuseDelegate -o base64 -c “calc”
其次,将有效负载插入到项目文件的“Profile”数组字段中,如果导入成功会弹出计算器。构造的恶意文件如下:
2)将第一步生成的恶意项目文件导入到CODESYS Development System中,结果弹出计算器,如下图所示:
Part4 漏洞分析
借助dnspy反汇编工具对CODESYS.exe进行调试,导入文件时设置断点,该处会进行文件打开并读取操作,如下:
随后执行至ObjectStream.ProfileByteArray处,当执行至165行处,会将存储文件内容的变量“value”传递给“ChunkedMemoryStream”,如下图所示:
BinaryFormatter.Deserialize将执行反序列化操作,问题就出在此处,下面对反序列化过程进行详细描述。操作过程中会将“ChunkedMemoryStream”值传递给“serializationStream”,如下图所示:
在ObjectReader.Deserialize处首先调用__BinaryParser. __BinaryParser,如下图所示:
在__BinaryParser. __BinaryParser将“serializationStream”实例化一个steam对象,并赋值给“this”,如下图所示:
调用ObjectReader.Deserialize中对this进行反序列化操作。
在反序列化过程中,因为攻击向量为TypeConfuseDelegate,反序列化工程中会执行SortedSet
观看SortedSet
在SortedSet
由于可以设置比较函数,而且传给比较函数的两个参数就是Add的前两个string 元素(可控),那么如果将比较函数设置为Process.Start() 函数,我们就可以实现代码执行了。
Part5 修复建议
将软件升级至3.5.17以后的版本。
—————————————————————–
目前,安帝科技工业互联网安全虚拟化靶场平台已集成该漏洞分析研究的环境和组件,可测试、验证、演示该漏洞及其利用过程。
安帝科技工业网络靶场定位于一个能够映射真实的IT/OT运营环境的可配置和可扩展的成本效益比高的混合平台,可批量整合(虚拟、实体)OT环境特定的硬件资源(不同供应商的PLCs、HMIs、RTUs、历史数据库、SCADA等),同时模拟出IT/OT的各种工业流程场景和攻击场景,将虚拟化IT/OT网络与工业流程仿真模型相结合,提供安全可靠的科研、教育、培训、演练、对抗、比赛、演示等功能和服务。