-
-
[原创]看我如何挖到倍福PLC的漏洞
-
发表于:
2020-9-9 12:51
23855
-
前言
CX9020是倍福公司生成的PLC,运行Microsoft Windows Embedded Compact 7操作系统,广泛运用在运动控制领域。
下图就是测试的目标PLC,版本号为CX9020 HPS 6.02d。本文会从固件逆向分析的角度来简单介绍下漏洞挖掘的方法。
实物图:
系统配置图:
固件提取和解包
CX9020的固件是存储在SD卡中,所以可以很容易通过读卡器读取到其中的固件。同时官网也开放了固件下载,可以获取到不同版本的固件(https://download.beckhoff.com/download/software/embPC-Control)。
该固件是典型的WINCE固件,版本为Windows Embedded Compact 7。其中System文件夹包含关键的一些自定义的程序文件:
在NK.bin文件中则包含有windows系统文件和额外自定义的一些组件。对于NK.bin无法直接查看,需要用解包工具进行提取里面的文件。
提取工具需要用到Github上开源的eimgfs以及wince开发工具包中的cvrtbin,viewbin,通过将这些工具结合起来使用就能把NK.bin里的文件提取出来,相关命令如下:
通过以上步骤,NK.bin里面的文件已经全部提取出来,一共有628个文件。
动态调试
逆向分析不仅需要静态分析,动态调试也是必不可少的,通过动态调试的方法往往能发现一些安全性问题,相对于Vxworks一类的固件,WINCE是非常方便进行动态调试的。
首选先把IDA PRO的wince debug server上传到PLC中,在PLC中运行该程序即可,该程序就会自动监听端口并且等待调试器连接。
启动调试服务端后,就可以让IDA进行连接,这样就使用IDA可以进行动态调试了。
漏洞挖掘
在上面的分析中,我们已经可以通过IDA进行静态分析和动态调试了。总的来说倍福PLC的安全性算是做得不错的,通过逆向可以看出,该产品应该使用了严格的编码规范,移除了一些诸如strcpy,sprintf之类的不安全的函数,为了挖掘到漏洞,也是经过了大量逆向工程和手动测试。该PLC的ADS协议应该经过了大量的代码审计和模糊测试的,如果对该协议进行漏洞挖掘可能花大量的时间但是一无所获,所以我把挖掘目标转向一些冷门的服务。
一、远程拒绝服务
首先,最开始的主要目标是web端,因为网页的交互和处理比较复杂,比较容易出现问题。但是挖掘漏洞对象不是HTTP协议解析,因为这个系统使用了微软编写的Http Server,对协议漏洞挖掘可能比较困难。所以,我们把注意力放在了Http之上的应用层。通过手动的方法先快速对web层进行测试,具体方法是对网页输入超长的字符串提交之后,看看是否会存在问题,在这个过程中,发现了一个拒绝服务问题,触发之后直接会让web端无法正常工作:
通过调试器,我们快速定位到了崩溃点,并分析了崩溃原因。在mdp.dll处理函数中,有一处字符串编码转换处理,会将转换的编码结果输出到栈上,由于把输入字符串长度作为MultiByteToWideChar函数的cchWideChar,也就是输出的缓冲区大小(宽字节数),会导致溢出发生,造成内存破坏从而引发拒绝服务。
二、授权绕过
在对web端进行简单的测试后,我把目光转向了Remote Display服务,该服务提供远程桌面服务,通过该服务用户可以进行桌面级操作。
由于这个倍福自带的CeRDisp不仅实现了远程桌面服务,还实现了授权功能,在用户设置密码后,使用远程桌面进行访问的时候要输入安全密码,如下图:
通过使用IDA简单分析了下该授权流程,发现该服务授权机制是存在缺陷的,可以直接被绕过。在CeRDisp.exe中,可以看到在检测密码之后,仅仅发送了一个判断密码正确与否的标志给客户端,而没有采取其他动作(如关闭连接之类的操作)来防止客户端继续进行连接流程,造成了只要patch客户端的判断代码忽略错误标志即可绕过授权强制进行登入。
总结
发现漏洞后本人第一时间通报给厂商,目前厂商已经发布安全通告(没CVE,哭哭),所述漏洞已经全部得到有效地修复。本文是应该算是为数不多的讨论PLC漏洞挖掘的文章,希望大家能够喜欢。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2020-9-10 10:38
被wmsuper编辑
,原因: 修改格式