首页
社区
课程
招聘
[原创]看我如何挖到倍福PLC的漏洞
发表于: 2020-9-9 12:51 23855

[原创]看我如何挖到倍福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编辑 ,原因: 修改格式
收藏
免费 12
支持
分享
最新回复 (9)
雪    币: 1037
活跃值: (1780)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
前排占位嗑瓜子
2020-9-9 13:18
0
雪    币: 2155
活跃值: (2587)
能力值: ( LV12,RANK:667 )
在线值:
发帖
回帖
粉丝
3
晴天师傅带带我
2020-9-9 13:43
0
雪    币: 3425
活跃值: (1479)
能力值: ( LV9,RANK:320 )
在线值:
发帖
回帖
粉丝
4
和绿盟科技的那篇文章是同一作者?
http://blog.nsfocus.net/beckhoff-plc-safety-evaluation-in-action/
2020-9-9 14:00
0
雪    币: 10866
活跃值: (14664)
能力值: ( LV13,RANK:400 )
在线值:
发帖
回帖
粉丝
5
vasthao 和绿盟科技的那篇文章是同一作者? http://blog.nsfocus.net/beckhoff-plc-safety-evaluation-in-action/

没错 ,最近在上传以前写的东西,包括PLC,上位机的漏洞挖掘,还有一些关于代码虚拟化的东西

最后于 2020-9-9 14:04 被wmsuper编辑 ,原因: 修改格式
2020-9-9 14:01
0
雪    币: 4709
活跃值: (1575)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
6
晴天师傅带带我
2020-9-10 19:04
0
雪    币: 1015
活跃值: (5242)
能力值: ( LV12,RANK:312 )
在线值:
发帖
回帖
粉丝
7
晴天师傅带带我
2020-9-21 14:14
0
雪    币: 237
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
想请问一下师傅,您最后所说的patch绕过是指解包固件patch然后在打包回去么?
2021-7-9 15:13
0
雪    币: 10866
活跃值: (14664)
能力值: ( LV13,RANK:400 )
在线值:
发帖
回帖
粉丝
9
Mrxap 想请问一下师傅,您最后所说的patch绕过是指解包固件patch然后在打包回去么?
你说的不叫漏洞,那叫自娱自乐。
文中的patch是客户端,不是服务端,但是漏洞确出在服务端。
2021-7-9 19:25
0
雪    币: 17
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
10
我最近也开始这方面的研究工作,目前有大概5款工控机挖掘出来它的通讯协议,可以远程控制,现在碰到了一些需要逆向才能解决的问题,所以过来膜拜大神,吸吸神力
2022-3-5 16:39
0
游客
登录 | 注册 方可回帖
返回
//