1、Modbus PLC 攻击分析:Smod 渗透框架研究 前言:前言: Modbus 是由是由 Modicon 公司公司 1979 年发行的, 已经被广泛应用于工业控制现场的年发行的, 已经被广泛应用于工业控制现场的 应用层协议,如应用层协议,如 Modbus 协议已被广泛应用于在监控和控制现场设备。协议已被广泛应用于在监控和控制现场设备。Modbus 协议最初是通过串行数据进行通信的,也就是协议最初是通过串行数据进行通信的,也就是 Modbus Serial 协议。随着工业现协议。随着工业现 代化的发展,产生了代化的发展,产生了 Modbus TCP 协议,即通过与协议,即通过与 TCP 协议
2、相结合来发送和接协议相结合来发送和接 收收 Modbus Serial 数据。数据。Modbus 的出现是为了使工业现场设备实时地接收和发的出现是为了使工业现场设备实时地接收和发 送相关命令和数据,然后最重要的安全措施在送相关命令和数据,然后最重要的安全措施在 Modbus 的设计之初并没有被考的设计之初并没有被考 虑进去。虑进去。 通过前一篇对 Moubus 模拟器的使用和基础知识的理解,本文主要深入研究 Modbus 专属的渗透框架 Smod, 以及一些对 Modbus PLC 设备的扫描和漏洞利用 脚本。 安全环境介绍:安全环境介绍: 自 1979 年以来, 作为业界系列上的标准, Mo
3、dbus 已经使数百万自动化设备能够 进行通信。这些设备在全世界分布着,下图是 SHODAN 搜集协议使用分布区域 的动态立体图。大家可以看一下,链接:https:/ics-radar.shodan.io/ 然而广泛的使用也必然引起黑客们的注意, 随之而来的是爆出各种各样的安全问 题,包括拒绝服务、远程代码执行和堆栈缓冲区溢出等漏洞,下方是部分关于 Modbus 协议和 Schneider 设备的漏洞: Smod介绍:介绍: Smod 是一个模块化的 Modbus 渗透测试框架,可以用来测试 Modbus 协议所需 的各种诊断和攻击功能。 这是一个使用 Python 和 Scapy 的完整的
4、Modbus 协议实 现。这个软件可以在 python 2.7.x 下的 Linux / OSX 上运行。 近年来,SummerySCADA(过程控制网络)系统已经从专有封闭网络转向开源 解决方案和支持 TCP / IP 的网络。 这使他们容易受到我们传统计算机网络面临的 相同安全漏洞的影响。由于 Modbus/TCP 协议简单且容易实现,而且广泛应用于 电力、水力等工业系统。所以 Smod 框架均使用 Modbus/TCP 协议。而且 Smod 框架可以用来评估一个 Modbus 协议系统的漏洞。下图是启动 Smod: 下载链接:https:/ 扫描扫描PLC: 在对 PLC 设备进行一系列
5、渗透测试操作之前,我们先对网段 PLC 设备进行一次 扫描,了解有哪些设备。虽然 Smod 框架里面也有扫描脚本,但并没有 Nmap 里 面的 Scripts 脚本效率高,当然也可以用 PLCScan(通过先检测端口 TCP/502, 若开放会调用其他函数来进行更深层次的扫描检测的工具)。这里我选择 Nmap 里的三个模块: modbus-discover.nse(nmap 自带)识别并发现 Modbus PLCS 设备及版本 modicon-info.nse(需添加)识别并列举 Schneider Electric Modicon PLC modbus-enum.nse (需添加)识别并枚举
6、使用 Modbus 的设备 检测脚本下载地址: https:/ 使用modbus-discover.nse脚本, 发现了一系列 Schneider Electric的设备及版本号, 还有开启的 502 端口和 sid(设备 ID)。 使用 modicon-info.nse 脚本获取更详细的信息: BMX P34 2020: BMX P34 高性能 CPU, 内置 USB 口, Modbus, Ethernet TCP/IP Fireware:固件版本 v3.2 Memory Card:BMXRMS008MP 内存卡 8MB Smod渗透:渗透: 接下来我们来使用 Smod,看看它有哪些厉害的功
7、能: 1、 暴力破解 PLC 的 UID 2、 网络嗅探进行 ARP 地址欺骗 3、 枚举 Modbus PLC 的功能 4、 模糊读写单一或多个线圈功能 5、 模糊读写单一或多个输入寄存器功能 6、 测试读写单一或多个保持寄存器功能 7、 测试单个 PLC 所有功能 8、 对单个或多个线圈写值进行 Dos 攻击 9、 对单个或多个寄存器写值进行 Dos 攻击 10、对 ARP 地址欺骗进行 Dos 攻击 首先我们暴力破解 PLC 的 UID,因为接下来的操作,例如读写线圈和寄存器或 者 Dos 攻击,都需要带上 UID,所以我们先使用/modbus/scanner/uid 这个模块。 如下图
8、所示,我们填写好 RHOSTS IP 后直接 exploit,获取到的 UID 为 1。 接着我们对 Modbus PLC 的功能进行枚举(/modbus/scanner/getfunc),携带上 UID,查看我们可以针对其 PLC 做哪些渗透工作,如下图所示,发现基本常用 的功能码(Function Code)都支持,那接下来就好办了。 知道了该 PLC 支持的功能,我们先选择读取线圈看一下是否成功 (/modbus/function/readCoils),发现读取成功了 Coils 给了回应,如下图所示: 接下来我们主要对保持寄存器进行读取 (/modbus/function/readHo
9、ldingRegister) , 需要设置的参数如下: RHOSTS:xx.xx.xx.xx(IP) Quantity:0 0010(为读取寄存器连续个数,默认为 10 个,对应组态软件的通道 数量,这里我们读取 16 个,所以换成 16 进制是 0010) StartAddr:0 0064(为寄存器起始地址,默认从 0 开始,这里我们从 100 开始, 所以换成 16 进制是 0064) UID:1 如下图所示,读取到了 registerval(寄存器的值): Dos 这块的攻击我就不演示了,把我一群 PLC 设备弄挂了我上哪哭去篇幅 原因,我再演示对单个寄存器的写值功能,其他模块的功能大同
10、小异,大家有空 可以一一尝试哈, 如果有不理解的地方, 可以直接评论或者私信俺。 如下图所示, 设置好了寄存器的数据存放地址和值,成功写入。 总结:总结: 使用了 Smod 渗透框架才知道,我们在一个 PLC 的网络里,居然可以做这么多 坏事!读写线圈和寄存器,还有 Dos 攻击,这些对 PLC 都是致命的,所以一个 Modbus 协议系统里需要多层次的安全防御手段,例如流量异常行为检测,只有 可信任的设备,才能接入工控系统网络,且需要进行身份认证,确保登陆者也是 可信任者。对 Modbus 系统进行日志记录和安全审计功能,记录操作的时间、地 点、操作者和操作行为等关键信息从而提供安全事件爆发后的追查能力。 当然,之前讲述了很多 Modbus 协议和 PLC 设备被爆出的漏洞,所以企业也要 定期对工控系统进行漏洞扫描,即时修补漏洞更新软硬件。后续将与大家一起更 深入研究 Modbus 协议,通过 Python 的 modbus_tk 模块进行读写 PLC 并进行详 细的流量分析。 *本文作者:黄一本文作者:黄一 113530,转载请注明来自,转载请注明来自 FreeBuf.COM