阅读: 0
一、前言
在工控系统中,工程师会将编写好的组态程序或者HMI画面保存到工程文件中,方便下次打开进行查看或者编辑。然而,开发人员在打开工程文件时,会发生什么呢?正常来说,组态软件负责解析对应的工程文件,在这过程中,如果组态软件的开发人员如果缺乏安全开发的意识,那么就可能导致一些常见的堆栈溢出甚至是命令注入的漏洞出现。攻击者可以引诱工程师打开恶意工程文件,利用代码执行漏洞在工程师站执行任意代码。本文以某个国产的SCADA软件的工程文件作为例子,分析在解析工程文件中存在的漏洞和利用的思路。
二、尝试插入代码
由于该工程文件支持js语言,而且runtime是nodejs编写的,所以在开始设想的时候是直接插入nodejs代码,看是否能触发恶意代码。但是事实证明,直接插入恶意代码的方法并不行,该组态软件有语法检查,只能调用指定的模块函数。
于是想到直接绕过语法检测器对工程文件直接插入恶意代码。
三、工程文件格式
使用十六进制编辑器打开该SCADA对应的工程文件,可以看到并没有很明显的magic number,所以文件应该是被加密的。
由于该SCADA组态软件是C#/nodejs共同实现的,所以通过dnspy很快就找到了该工程文件的解密算法,如下所示,可以看出这是一个被密码保护的SQLite的数据库文件。密码为SSProject.dbpassword的值。
在分析出算法后,使用C#快速实现了一个加解密该工程文件的程序。该程序参数-e是加密,-d为解密。
最后,成功解密出该数据库文件,这时可以看到SQLite3数据库的header。
四、漏洞利用
通过SQLite编辑器对数据库文件进行查看和编辑,定位到代码执行的地方,这部分可以插入nodejs语法的代码。
使用nodejs编写一个payload插入到该字段中,这里的payload是弹出一个计算器来验证是否执行成功。并将修改后的工程文件重新加密回去,这样一个恶意的工程就做好了。
双击打开该工程文件,立即被SCADA runtime执行,计算器成功弹出,该漏洞可以在Windows10上稳定利用。
五、利用场景
1. 使用钓鱼邮件将恶意工程文件作为附件对工程师进行钓鱼攻击,引诱工程师打开,由于传统的邮件WAF只对一些zip/office/pe等文件进行扫描,工程文件可以很容易绕过防火墙的检测成功进行投递。
2. 在拿到主机控制权后,直接修改工程师保存好的工程文件,进行渗透持久化,甚至能达到在工程师之间进行传播的效果,这样可以对工控系统进行隐蔽性更高的渗透。
3. 结合其他代码执行漏洞,比如WinExec代码执行类漏洞,可以绕过windows系统中MOTW,达到远程代码执行的目的。
六、结语
通过分析可以看出,现代化的SCADA软件开始尝试使用一些比较新兴的开发语言(在文中是nodejs)进行开发。开发人员虽然有较强的开发技术,但是缺少安全开发意识,导致在解析执行工程文件时出现了代码执行问题。一旦出现这类解析工程文件漏洞,无疑将工程师站暴露在一个不安全的环境下。建议组态软件开发人员在掌握设计和实现完整功能能力的同时,也需要掌握安全设计与安全开发等方面的技能并进行应用。