阅读: 0
HMI作为工业控制系统的一个重要组成部分,其安全性是非常重要的,一旦攻击者成功攻破了HMI设备,就可以读取甚至恶意修改工业现场中的数据变量(温度,压力,阀门开关等),严重危害生产安全。所以一些HMI生产厂商为了保护HMI的固件不被逆向分析,一般都会对提供下载的固件进行加密。
本篇文章以一个HMI设备作为例子,介绍了如何不拆机直接解密固件文件。
HMI
HMI(Human Machine Interface)人机界面是系统和用户交货信息的媒介,在工控系统中将具有触摸输入的HMI叫做触摸屏。HMI用来连接可编程序控制器(PLC)、变频器、直流调速器、仪表等工业控制设备,通过采集工控现场的数据使之呈现出来,同时也可以让用户直接完成一些设备的控制。
下面是一个典型的场景,HMI作为SCADA系统中的一个部分,提供可视化和控制设备的能力,PLC控制不同的传感器和执行器,每个PLC都配有一个HMI(当然多个PLC也可以连接一个HMI设备)。
固件获取
HMI设备固件可以从官网上很容易获取到,这里直接下载它最新版的固件:
同时我们需要下载与之配套的SCADA软件,如下:
使用十六进制编辑软件打开HMI固件文件,可以看到很明显的“PK”头,说明是zip压缩包:
将该文件加个“.zip”后缀,再用解压缩软件尝试解压,不出所料,该压缩包有密码保护:
解密固件
经过分析知道了固件是一个压缩包,需要密码才能解开,那如何找到密码呢?一般而言,SCADA软件中可能存在固件解密逻辑,所以可以先在SCADA的代码中查找看有没有解密的密钥。
SCADA分析
该SCADA软件主要由两大部分组成,一个是用C#编写的开发工具,可以使用dnspy进行反编译和调试,另一部分是运行时(runtime),这部分负责执行HMI逻辑,显示相关数据,runtime部分是nodejs编写的,对于这部分可以用vscode进行动态调试。
压缩包密码
简单搜索一些关键字,例如“pwd”便可快速定位到固件解压的代码,下图框起来的地方就是解压密码。
使用该密码解压之后,得到一个压缩包文件hmis.tar.gz。
使用十六进制打开hmis.tar.gz,发现该文件不是gz压缩包,很明显也被加密了,接下来就需要找到加密的算法以及加密的密钥。
AES密钥
使用binwalk来识别文件中包含的一些特殊文件头(如下图),binwalk在偏移0x22的地方识别到了一个openssl的salt。
通过简单搜索,发现文件是使用openssl命令直接加密的文件:
通过在SCADA软件的安装目录下搜索包含“openssl”字符串的文件,找到了一个可执行文件backmanage.exe。
密钥如下所示:
删除前0x22字节,直接从“Salted”部分进行解密:
运行如下openssl命令进行解密:
openssl enc -d -k "1DqhR7#xvUD@qU2F" -aes256 -in "hmi.tar.gz" -md md5 -salt | tar xz -C hmi/ |
最后成功解密出固件:
总结
解密固件往往是分析固件安全性的第一步,在解密固件之后,通过研究发现了该固件中的多个安全缺陷,有些甚至能远程代码执行。可见,工业控制领域不仅仅需要重视 PLC和上位机软件的安全,HMI的安全也是应该值得重视的。