某SCADA工程文件代码执行漏洞挖掘和利用

前言

在工控系统中,工程师会将编写好的组态程序或者HMI画面保存到工程文件中,方便下次打开进行查看或者编辑。然而,开发人员在打开工程文件时,会发生什么呢?正常来说,组态软件负责解析对应的工程文件,在这过程中,如果组态软件的开发人员如果缺乏安全开发的意识,那么就可能导致一些常见的堆栈溢出甚至是命令注入的漏洞出现。攻击者可以引诱工程师打开恶意工程文件,利用代码执行漏洞在工程师站执行任意代码。本文以某个国产的SC++ADA软件的工程文件作为例子,分析在解析工程文件中存在的漏洞和利用的思路。

尝试插入代码

由于该工程文件支持js语言编写,而且runtime是nodejs编写的,所以在开始设想的时候是直接插入nodejs代码,看是否能触发恶意代码。但是事实证明,直接插入恶意代码的方法并不行,该组态软件有语法检查,只能调用指定的模块函数。 651413_5U36BARZXF9PRAA 于是想到直接绕过语法检测器对工程文件直接插入恶意代码。

工程文件格式

使用十六进制编辑器打开该SCADA对应的工程文件,可以看到并没有很明显的magic number,所以文件应该是被加密的。 651413_A2RF49KW34NR7SS 由于该SCADA组态软件是C#/nodejs共同实现的,所以通过DNSpy很快就找到了该工程文件的解密算法,如下所示,可以看出这是一个被密码保护的SQLite的数据库文件。密码为SSProject.dbpassword的值。 651413_W74FNSQMQ6QZAF4 在分析出算法后,我使用C#快速实现了一个加解密该工程文件的程序。该程序参数-e是加密,-d为解密。 651413_629RG2XBBGZGJZF 最后,成功解密出该数据库文件,这时可以看到SQLite3数据库的header。 651413_RJAFZGW665NZ2X2

漏洞利用

通过SQLite编辑器对数据库文件进行查看和编辑,定位到代码执行的地方,这部分可以插入nodejs语法的代码。 651413_THKRXRF3E4R5J5R

使用nodejs编写一个payload插入到该字段中,这里的payload是弹出一个计算器来验证是否执行成功。并将修改后的工程文件重新加密回去,这样一个恶意的工程就做好了。

651413_AFUREHZ73SENBHY 双击打开该工程文件,立即被SCADA runtime执行,计算器成功弹出,该漏洞可以在Windows10上稳定利用。 651413_TW3RJUWQJD6S4F4

利用场景

1.使用钓鱼邮件将恶意工程文件作为附件对工程师进行钓鱼攻击,引诱工程师打开,由于传统的邮件WAF只对一些zip/office/pe等文件进行扫描,工程文件可以很容易绕过防火墙的检测成功进行投递。2.在拿到主机控制权后,直接修改工程师保存好的工程文件,进行渗透持久化,甚至能达到在工程师之间进行传播的效果,这样可以对工控系统进行隐蔽性更高的渗透。3.结合其他代码执行漏洞,比如WinExec代码执行类漏洞,可以绕过windows系统中MOTW,达到远程代码执行的目的。

总结

通过分析可以看出,现代化的SCADA软件开始尝试使用一些比较新兴的开发语言(在文中是nodejs)进行开发。开发人员虽然有较强的开发技术,但是缺少安全开发意识,导致在解析执行工程文件时出现了代码执行问题。本文是为数不多的分析并利用SCADA软件漏洞的文章,希望大家喜欢。

标签