背景
最近几个月从事工控安全工作,其中涉及到模糊测试和漏洞分析,之前一直在忙各自项目,所以对漏洞挖掘没怎么做,这两天刚好对施耐德PLC进行了一次fuzz,出现了两次异常,这篇文章对异常进行分析的一个小结。

涉及到的知识
因为时间关系这个文章写的不是很详细,如果你有一些基础的话,看起来会容易,会涉及到如下技术:1.python数据类型转字节流,涉及到struct库的使用。2.modbus协议数据包的结构。3.数据包字节流的16进制表示,其实这个wireshark有这个功能,但没法用。3.可能需要一些工控的基础知识,里面的概念说的简约一些,一些部分需要自己去查

关于Fuzz
又叫模糊测试,原理就是往被测试目标发送大量畸形数据,去发现目标漏洞的一种方法,这个技术不是本次文章的重点。

工控系统简称ICS,全称工业额控制系统,有兴趣自行百度。

PLC介绍
可编程控制器,和一般的控制器的差别是它是可以对其编程的,而且有网卡接口,用来控制设备的,因为没有硬盘,所以很多没有操作系统,只有固件,也有一部分PLC比较强大有操作系统和web服务,

Modbus介绍
Modbus是由Modicon(现为施耐德电气公司的一个品牌)在1979年发明的,是全球第一个真正用于工业现场的总线协议。ModBus网络是一个工业通信系统,由带智能终端的可编程序控制器和计算机通过公用线路或局部专用线路连接而成。其系统结构既包括硬件、亦包括软件。它可应用于各种数据采集和过程监控。
ModBus网络只有一个主机,所有通信都由他发出。网络可支持247个之多的远程从属控制器,但实际所支持的从机数要由所用通信设备决定。采用这个系统,各PC可以和中心主机交换信息而不影响各PC执行本身的控制任务。
正文
首先大家看一下我的Fuzz结果,因为有两次异常,这边贴出来一次代表一下

这是fuzz的日志,其中00-00-00-00-00-03-00-00-de引发了通信异常,要对这个异常进行复现,所以要构造同样的数据包发送给目标,看能否再次引发,目前只知道协议的modbus的,对这个数据格式有待确定,通过查询modbus协议结构,发现它有应该有12个字节,但是这边只有9个单元,所以我很疑惑这些是单个字节的16进制还是18个数字,我隐约肯定这是一个数据包,应该是16进制,但是和协议数据包的长度又对不上

然后我去看了一下fuzz脚本的源代码,首先这个脚本是我从GitHub上下载的,并不是我自己写的,然后我阅读了一下它的源代码,找到了字节转换的一部分重要的代码,这里涉及到python的数据格式和字节流转换的问题,因为python自带的数据类型并不能直接发送到TCP上传输的,因为TCP层上传输的是字节流,而不是python的数据类型,稍后会讲到数据转换成字节。

数据类型转字节流
通过上面的代码进行分析,数据项转换成字节刚好是9个字节,意思是日志打印的是9个字节可以确定,这边需要提一点是python转换成字节流的时候的位数问题,比如一个整形8,你传入struct.pack的字符格式不同,它转换的字节数也是不同的,因为它对应C语言的整形,一般情况你使用i做参数的话它会把数字转为4个字节,对应C语言的整形,下面会放一张表

还有涉及到二进制的大端和小端传输方式

为了让大家更直观的看到差异,给大家做个例子,其中a=0

大家看到H和B转为的字节码位数是不一样的,所以查看程序的源代码我确定了字节的位数和字节的含义,在fuzz的源码上找到了字节数量和日志中的16进制的对应关系,确定了字节的含义。

构造引发异常的modbus数据包
接下来是构造modbus数据包,用16进制数据封装成一个modbus数据包,根据modbus协议的结构,在日志中的数据其实把数据包的头和控制部分已经定义好了,它先更改的是数据部分,这边需要做的是封装成16进制然后验证数据包。

首先我写了一个简单的python脚本,然后把日志里的字符串写成16进制形式数据

然后对发送的数据包使用wireshark进行流量分析,如下图

大家可以看到,完成了数据传输,而且服务端有响应,说明那个数据并不能使PLC产生漏洞,但也有好的一面是构造的数据包是正确的,然后接着验证构造的数据包如下,大家可以看到它的数据部分是de,和日志的最后一个字节是一致的,说明按照字节序是可以构造数据包的,而不需要再考虑大端小端问题

很遗憾这次没有挖到漏洞,不过对流程做个小结,后续会有更多分享。

工控modbus协议fuzz测试验证小结相关推荐

  1. 工控安全—工控常见协议识别

    文章目录 一.Nmap常见参数介绍 二.工控常见协议识别 三.工控设备指纹识别 3.1 S7 3.2 Modbus 3.3 IEC 60870-5-104 3.4 DNP3 3.5 EtherNet/ ...

  2. 常见工控通讯协议(ICS)

    工控概述 工业控制系统(ICS)是一个通用术语,它包括几种工业生产中使用的控制系统类型,包括监控和数据采集(SCADA)系统,分布式控制系统(DCS),和其他较小的控制系统配置,如可编程逻辑控制器(P ...

  3. sulley对Modbus协议fuzz实验

    sulley对Modbus协议fuzz实验 https://www.cnblogs.com/y1cl13n/articles/12978653.html

  4. 【工控协议专题01】Modbus协议原理与安全性分析

    目录 O.术语 一.背景: 二.协议原理 三.传输方式 四.Modbus RTU 和Modbus ASCII有什么区别? 五.MODBUS TCP 注意点 六.功能码作用 七.Modbus 协议安全性 ...

  5. 工控网络安全性测试解决方案

     工业控制网络面临的安全威胁   ♦ 传统的工控网络具备的以下特点:   ♦ 强调实时I/O能力,而非更高的网络安全能力.   ♦ 极少安装普通的防病毒软件,就算安装了也难以实时更新病毒库.   ...

  6. Modbus通讯协议(一)——测试工具ModbusPoll和ModbusSlave

    本文参考<Modbus测试工具ModbusPoll与Modbus Slave使用方法>,但与原文不同,截图使用的Modbus工具是从官网modbus tools下载的最新版本ModbusP ...

  7. 工控安全PLC固件逆向一

    在工控领域,我们会遇到许多协议,为了进行安全研究,经常需要对协议的具体内容进行探索,今天我们就来聊聊关于工控协议逆向的问题. 接下来会简单介绍一下常用的协议逆向方法并配合一些实战,当然,从未知到已知的 ...

  8. 工控安全常用工具及软件-学习笔记

    工控安全常用工具及软件 S7 Client Demo 开源的S7协议库"snap7"基础上进行开发的,主要支持西门子的S7-300/s7-400设备,可以直接连接西门子的控制器,获 ...

  9. 工控网络安全产品---学习笔记

    工控网络安全产品 常见的工控安全产品分类 防护类产品 审计类产品 终端类产品 检测类产品 管理类产品 工业互联网态势感知(内网运维管理中心) 物联网态势感知(物联网在线监测系) 工控安全实验室 工控安 ...

最新文章

  1. 动态划分VLAN的方法中不包括(23)。【答案】C
  2. 图说子图同构算法——VF2算法(一)
  3. MS UC 2013-0-虚拟机-标准化-部署-3-虚拟机-生产
  4. 解决java.lang.UnsupportedClassVersionError
  5. 洛谷 - P2756 飞行员配对方案问题(二分图最大匹配+路径打印)
  6. 微信打开页面底部显示“原页面已由QQ浏览器云转码”解决办法
  7. java cha r转string_JAVA String.format 方法使用介绍
  8. unity创建项目报错:解决sentinel key not found (h0007) Unity
  9. java 复选框怎么用_Java Swing公开课|Java Swing的复选框组件怎么用,看完这篇文章你一定就会了...
  10. 最后一个页面:构建电影详情页面
  11. BAT 数据披露:缺人!110万AI人才缺口,两者矛盾,凉凉了!
  12. LINUX安装CUDA 9.2,提示缺少文件的解决办法
  13. paip.输入法编程----删除双字词简拼
  14. 电子口岸客户端控件首次安装
  15. 文本表示与文本特征提取的区别
  16. 开源网站GitHub把自己给开源了
  17. 零基础搭建完全免费个人静态博客
  18. 电气simulink常用模块_支持PLC编程的5大电气语言,你会几种?
  19. macOS开发中用TagLib获取、修改音频文件信息
  20. iconfont怎么添加新的字体图标?

热门文章

  1. butter滤波器是iir吗_学习随笔之IIR滤波器与FIR滤波器
  2. 自动抢红包-辅助功能的使用
  3. Vue 移动端 hash模式下微信授权登录
  4. 漏洞复现-Wordpress 4.6 PwnScriptum RCE命令执行
  5. 场效应管 - MOSFET
  6. 锐龙r9 5900hx相当于英特尔的什么 r9 5900hx属于什么档次
  7. doctor技术基础
  8. noi 2017 简要题解
  9. Ice Lake CPU RESET流程
  10. P2150 [NOI2015]寿司晚宴