阅读: 1
近日,在研究国产工控上位机应用软件时遇到了由nodejs语言开发的一款SCADA软件,该软件是基于.NET Framework,集编程与仿真运行为一体的新兴软件,功能强大可支持云端应用、支持编程语言、集成数据互联工具等特点,因此抱着谦虚学习的态度一探究竟,想看看该类软件在安全研究时需要什么样的技术?软件中的脆弱性包含了哪些方面?下边就带你一起看看我的研究之路。
初识庐山
随即下载了该SCADA软件,进行安装后根据自己的经验很快便上手使用了,发现该款软件相较于高大上的国际化工控上位机应用软件而言,设计更符合国人习惯,也很简单易用。进入正题,安全研究的第一步就是寻找攻击面,查看该软件运行时对外开放端口为4001和8888,因此可通过这两个端口寻找突破口。
很快便发现在8888的端口上支持WEB访问功能,如下图:
WEB的访问功能中是否有OWASP TOP10中的问题?如果盲目尝试是不是有点浪费时间呢?如果有源码可供审计是不是可以如虎添翼呢?随即查看安装目录确认开发语言,真是如愿以偿,可以看到JavaScript源码。此时便可以开启代码审计模式了!
逐个查看项目中的js文件,大致浏览查看其中容易出问题的点,并结合SCADA软件的使用,验证问题点是否真的有漏洞存在,利用该思路就可以收割一部分干货了。
问题又来了,明知有问题的点,但是由于请求参数复杂难以构造,不易进入问题代码分支进行分析,那么可否通过搭建调试环境,逐步调试分析呢?接下来就要研究如何在Windows系统下搭建nodejs调试环境并开启调试模式。
磨砥刻厉
工欲善其事必先利其器,安全研究过程如若能灵活应用各种技能、构筑调试环境,深入代码内部,如同借助高端仪器诊疗疾病一般,可快速寻找到病灶予以治疗。该软件是利用nodejs框架开发,则需要搭建nodjs开发环境。
环境搭建要求
主机操作系统:Windows7
Python版本:Python 2.7.16
node版本:v8.9.3
npm版本:v5.5.1
cnpm版本:v6.0.0
Electron版本:v6.0.0
开发工具介绍及安装
安装 Vs code最新版,在VS code下安装如下插件
npm
npm Intellisense
Node.js Extension Pack
Node.js Modules Intellisense
如下图是安装好npm相关插件状态,安装时搜索npm/node.js在对应插件后点击install即可安装。
安装Python
进入官网下载页面下载对应版本(2.7.16)的msi安装包 (https://www.python.org/downloads/)。
点击运行msi安装包,默认安装python。
win + r 输入cmd打开命令行,输入python -V查看python是否正确安装。
安装node、npm和配置npm安装路径
进入官网下载页面下载对应版本(v8.9.3)的msi安装包 (https://nodejs.org/zh-cn/download/releases/)。
点击运行msi安装包,默认安装即可。
win + r 输入cmd打开命令行,输入node -v查看node v8.9.3是否正确安装,输入npm -v查看集成的npm v5.5.1是否正确安装。
npm 全局模块的存放路径以及cache的路径的配置,默认是在 C 盘 “C:\Users\用户” 下。
在 nodejs 安装目录下,创建 “node_global”和 “node_cache”两个文件夹。
进入cmd命令行,输入如下命令设置全局模块安装路径到‘node_global’文件夹以及设置缓存到‘node_cache’文件夹。
由于node全局模块大多数都是可以通过命令行访问的,需要将” C:\Program Files (x86)\nodejs\node_global”加入至环境变量PATH中,方便直接运行命令。
安装cnpm
由于electron包挂载在国外网站上,使用npm下载比较容易失败,使用cnpm能够快速下载指定版本的electron包。
win + r 输入cmd打开命令行,输入如下内容,回车。
npm install -g cnpm –registry=https://registry.npm.taobao.org”
win + r 输入cmd打开命令行,输入:cnpm –v。查看cnpm是否正确安装。
安装electron
Electron是由Github基于Chromium和Node.js开发,使用JavaScript、HTML和CSS等WEB技术创建跨平台原生桌面应用的框架。兼容Mac、Window和Linux,它构建的应用可在这三个操作系统上面运行,借助Electron,可以使用纯JavaScript来调用丰富的原生APIs。
此处需要安装特定版本的electron,可以使用以下命令安装6.0.0版本electron。此处注意,electron版本必须与待调试代码中已经包含的electron文件版本一致。
cnpm install –g [email protected]
win + r 输入cmd打开命令行,输入:electron –v。查看cnpm是否正确安装。
导入文件-调试
安装完必要环境就需要将待分析的文件代码库导入至VS code进行调试工作了。
以管理员身份运行VS code,在【File】中点击【Open Folder】,添加待分析的文件夹。
打开文件夹后需要配置.vscode下的launch.json文件,最关键的几项均标记为红色。
其中”outputCapture”: “std”,表示如果控制台输出采用的是log4js 加上该配置在控制台会输出打印的日志信息。
“runtimeExecutable”:“xxxx”表示采用xxxx模式进行启动,此处选择electron;填入electron模块所在的具体路径。
Launch.json支持定义值(例如,要传递给程序的参数),该值取决于运行调试器的操作系统。为此,请将平台特定的键放入launch.json文件中,并指定相应的属性。此处需要在Windows平台下利用electron进行调试,因此需要将runtimeExecutable中填入electron.cmd的具体路径。
其余必要项目为:
type-用于启动配置的调试器的类型。每安装调试扩展引入一个类型:node用于内置节点调试器。
request-启动配置的请求类型。当前仅支持:launch 和attach。此处选launch项。
name -在调试启动配置下拉列表中显示的易于阅读的名称。
还需要在文件目录下生成的package.json中配置启动脚本如下。最主要需要添加启动start脚本指引 Electron 去执行当前的 package。
配置完如上两项后,点击【RUN】下的【Start Debugging】即可开启调试。
至此已经完成了nodejs调试环境的搭建,可以找到对应的问题分支,打断点,构造不同的请求方法进入分支进行分析。
鸣金收兵
通过代码审计与nodejs调试环境两个大法,针对某国产SCADA软件,发现了该软件的安全问题如下:
- 未正确保存敏感信息,导致多处敏感信息泄露。
- 未能正确处理授权问题,存在多处授权绕过问题。
- 在目录访问时,未添加授权信息,未授权情况下也可目录穿越。
- 存在多处命令执行与命令注入漏洞。
- 编程语言在设计之初未考虑运行文件被更改的可能性,存在工程文件远程代码执行漏洞。
- 存在多处硬编码凭据,可被用来绕过授权、解密固件等等。
这些问题只是在十天内发现的,应该还存在更多的问题,诸如4001端口上backmanage后台程序、云端访问场景、移动端APP等。从侧面折射出了目前工控厂商无暇或者无安全能力投入到产品的研发中,面对竞争激烈的市场,能将产品做到易用稳定可靠已属不易,但从长远来看,安全能力加持至工控产品,才能让工控产品在数字化转型、新基建等浪潮中走得更远。关键基础设施的控制系统长期使用有多处明显漏洞的产品无疑是将财产、生命交给了随时可能出现的恶意攻击者。虽然威胁时刻在你我身边,但是做好提前防御,才能避免真正发生严重后果的追悔莫及。
面对这样的窘境,在此也提供个人的一些建议:
工控系统使用者:
- 严格按照安全管理规范对工控系统执行分区管理,网络严格划分,有外部连接时使用安全可信的VPN接入。
- 系统必须在多重授权情况下登录使用,并做好使用记录台账。
- 加强员工安全意识培训,不打开来源不明的文件。
工控系统供应商:
- 研发阶段——建立安全编码规范并落实执行,针对产品做安全性测试。
- 施工阶段——按照安全施工规范,设计合理的网络架构,工程组态过程同样需要注意安全编码。
路漫漫其修远兮,吾将上下而求索。工控安全之路很长,在多方协同的情况下,通过组合各家专长,工控系统才能稳定、可靠、安全、可信。
时间线
- 2020-05-11 开始研究某国产SCADA软件。
- 2020-05-18 研究过程中陆续将8个漏洞上报CNVD&CICSVD。
- 2020-05-20 厂商发布软件新版本。
- 2020-05-21 CNVD颁发原创证书。
- 2020-05-21~06-01 CICSVD陆续颁发原创证书。