倍福PLC安全评估实战

CX9020是倍福公司生成的PLC,运行Microsoft Windows Embedded Compact 7操作系统,广泛运用在运动控制领域。本文会从固件逆向分析的角度来简单介绍下安全评估的方法。

0x01 前言

CX9020是倍福公司生成的PLC,运行Microsoft Windows Embedded Compact 7操作系统,广泛运用在运动控制领域。

下图就是安全评估的目标PLC。本文会从固件逆向分析的角度来简单介绍下安全评估的方法。

0x02 固件提取和解包

     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信息,获取起始地址和长度信息
>>>viewbin.exe NK.bin
ViewBin… NK.bin
Image Start = 0x80200000, length = 0x039A8B30
                Start address = 0x80201000
Checking record #88 for potential TOC (ROMOFFSET = 0xFD13FEC4)
Checking record #91 for potential TOC (ROMOFFSET = 0xFD15DEE8)
Checking record #181 for potential TOC (ROMOFFSET = 0xFE3C3EDC)
Checking record #293 for potential TOC (ROMOFFSET = 0xFF2C2EC0)
Checking record #339 for potential TOC (ROMOFFSET = 0x00000000)
Found pTOC  = 0x83ba40c4
ROMOFFSET = 0x00000000
Done.

#将NK.bin转为NK.nb0
>>>cvrtbin.exe -r -a 0x80200000 -w 32 -l 0x039A8B30 NK.bin




start 83af9d0c length 000211f4
start 83b1af00 length 00051000
start 83b6bf00 length 000381c4
start 83ba40c4 length 00000054
start 83ba4118 length 00004a18 Progress…
0%Done.

#将NK.nb0里面文件全部dump出来,bins是提取到的文件夹

>>>eimgfs.exe NK.nb0 -extractall -fs xip –d bins

通过以上步骤,NK.bin里面的文件已经全部提取出来,一共有628个文件。

0x03 动态调试

逆向分析不仅需要静态分析,动态调试也是必不可少的,通过动态调试的方法往往能发现一些安全性问题,相对于Vxworks一类的固件,WINCE是非常方便进行动态调试的。

首选先把IDA PRO的wince debug server上传到PLC中并运行,该程序启动后会自动监听端口并且等待调试器连接。

启动调试服务端后,用IDA连接后便可以进行动态调试了。

0x04 安全问题1——拒绝服务

     在上面的准备工作之后,就可以进行接下来的安全评估工作。首先,最开始的主要目标是web端,因为网页的交互和处理比较复杂,比较容易出现安全问题。但是安全评估对象使用的并不是标准的HTTP协议,而是使用了微软编写的HTTP Server,对协议进行安全评估比较困难。所以,我们把注意力放在了HTTP之上的应用层。通过手动的方法先快速对web层进行测试,具体方法是对网页输入超长的字符串提交之后,看看是否会存在安全问题,在这个过程中,发现了一个拒绝服务问题,触发之后直接会让设备web服务端无法正常工作:

通过调试器,我们快速定位到了崩溃点,并分析了崩溃原因。在mdp.dll处理函数中,有一处字符串编码转换处理,会将转换的编码结果输出到栈上,由于把输入字符串长度作为MultiByteToWideChar函数的cchWideChar,也就是输出的缓冲区大小(宽字节数),会导致缓冲区溢出发生,造成内存破坏从而引发拒绝服务。

0x05 安全问题2——授权绕过

在对web端进行简单的测试后,我们把目光转向了Remote Display服务,该服务提供远程桌面服务,通过该服务用户可以进行桌面级操作。

由于这个倍福自带的CeRDisp不仅实现了远程桌面服务,还实现了授权功能,在用户设置密码后,使用远程桌面进行访问的时候要输入安全密码,如下图:

通过使用IDA简单分析了授权流程,发现该服务授权机制是存在缺陷的,可以直接被绕过。在CeRDisp.exe中,可以看到在检测密码之后,仅仅发送了一个判断密码正确与否的标志给客户端,而没有采取其他动作(如关闭连接之类的操作)来防止客户端继续进行连接流程,造成了只要修改客户端的判断代码忽略错误标志即可绕过授权强制进行登入。

0x06 总结

     发现安全问题之后,我们将安全问题直接通报给厂商。至此,厂商已经发布安全通告和更新固件。

(https://download.beckhoff.com/download/Document/product-security/Advisories/advisory-2019-006.pdf)

时间线如下:

2019.7.26  漏洞通报厂商
2019.8.16  厂商已经确认漏洞并完成分析
2019.9.03  厂商发布安全通告并提供更新固件

     安全评估不仅需要一些独特的思路,更重要的是足够的耐心,目睫之论,以供参考。

发表评论