工控CTF_Modbus TCP
工控CTF_Modbus TCP
参考文章
https://blog.csdn.net/song123sh/article/details/128387982
https://www.anquanke.com/post/id/185513#h2-0
概况
Modbus由MODICON公司于1979年开发,是一种工业现场总线协议标准。1996年施耐德公司推出基于以太网TCP/IP的Modbus协议:ModbusTCP
modbus可以说是将读写指令分为了两大类,一类是离散的,也就是位操作,非1即0;第二类是模拟的,也就是数字,可以叫做字操作。
- DO(digital output 数字量输出),所谓线圈就是离散的输出状态,01即读一个离散的输出状态,举个不恰当的栗子,你家灯泡接到某个控制器上(实际上并不会存在这种情况……),我们可以通过01加上数据,比如1,让他亮,加上0,让他灭。
- DI (digital input 数字量输入),所谓的离散输入就是它,还是上面的栗子,我们想知道灯的开关是咋样的呢?就用02指令看看,如果是1,哦,按下去了,如果是0就是没按。通过这个不恰当的栗子我们大概也可以猜到,这是不可写的(如果你随便一个指令把开关给按死了,那我这灯不是彻底开不了了?),可以理解为外部对工控系统所带来的“开关”影响。
- AO(AnalogOutput 模拟输出),保持寄存器的功能,和DO最大的不同就是它不再是0或1,可以是一个数值,比如,我们设定的PID运行参数,或者是温度的上下限等等
- AI(Analog Input 模拟输入),也就是输入寄存器,和DI一样,可读但不可写,可以理解为外部对于系统的多位输入
Modbus TCP数据格式
Transaction identifier : 事务标识符
Protocol identifier : 默认为0
Length : 数据的长度
Unit identifier : 从机地址,因为使用了TCP/IP所以用ip地址来标识从机,所以该位可忽视,或者做进一步分发
Function code : modbus的功能码
Data :具体的数据
具体分析一条Modbus/TCP数据包
7484 329.001243 172.16.3.23 172.16.1.33 Modbus/TCP 66 Query: Trans: 13304; Unit: 1, Func: 3: Read Holding Registers
7484 数据包序号
329.001243 时间戳,表示数据包的捕获时间
172.16.3.23 源地址,发送此数据包的设备IP地址
172.16.1.33 目的地址,接收此数据包的设备IP地址
Modbus/TCP 协议类型,表示此数据包使用Modbus/TCP协议
66 数据包长度,66字节
Query: 请求信息,表示此数据包是一条查询请求
Trans: 13304 事务标识符,用于匹配请求和响应,这里是13304
Unit: 1 目标设备编号,这里是1号设备
Func: 3 功能码,这里是0x03,表示读保持寄存器的请求
Func 功能码(常见)
Modbus的操作对象有四种:线圈、离散输入、保持寄存器、输入寄存器。
| 对象 | 含义 |
|---|---|
| 线圈 | PLC的输出位,开关量,在Modbus中可读可写 |
| 离散量 | PLC的输入位,开关量,在Modbus中只读 |
| 输入寄存器 | PLC中只能从模拟量输入端改变的寄存器,在Modbus中只读 |
| 保持寄存器 | PLC中用于输出模拟量信号的寄存器,在Modbus中可读可写 |
1:读线圈
2:读离散输入
3:读保持
4:读输入
5:写单个线圈
6:写单个保持
15:写多个线圈
16:写多个保持
90:施耐德高危功能码,它是施耐德自定义的非标准功能码
筛选技巧
流内可直接得到的flag既不可能是位操作,也不可能是字操作,都太短了,所以聚焦的就应该是包长度大的,或者是类似16功能码那样写多个字的指令。
在wireshark过滤流中即可 ((modbus) && (modbus.func_code == 16)) && (modbus.byte_cnt) 如此使用
筛选出所有Modbus协议
modbus
下两步可以直接在对应位置选择:作为过滤流应用 --> ...且选中
分析功能码,以功能码为1举例
(modbus) && (modbus.func_code == 1)
找回包(对比发现回包有一个代表长度的Byte Count)
((modbus) && (modbus.func_code == 16)) && (modbus.byte_cnt)
搜寻异常流量
Func 功能码
17:主机正在对从机的某文件记录区块进行读取或写入操作
109:主机/从机接收到无效数据时的异常响应
67:重置通讯参数
1:读取线圈状态
先逐次查看容易出现异常的功能码
(modbus) && (modbus.func_code == 17)
筛选后要注意查看Data数据,对比筛选正常流量跟异常流量,并在此基础上新增对Data的筛选
如 当正常流量的data为600000时
(((modbus) && (modbus.func_code == 17))) && (modbus.data != 06:00:00)
用此方法对异常流量功能码依次处理
当呈现的是Byte Count数据时,对比数量进行筛选

(modbus.func_code == 1) && (modbus.bit_cnt != 1)

异常一定是有请求数据异常导致,这样就找到了异常流量包
工控CTF_Modbus TCP的更多相关文章
- 【转】工控老鬼】西门子S7200入门&精通【1】S7200硬件大全
转载地址:http://blog.sina.com.cn/s/blog_669692a601016i5f.html 工控老鬼提醒以下的信息和资料可能不全或者不准确,如有疑问可以查阅西门子中国网 ...
- 开源纯C#工控网关+组态软件
一. 前言 在园子潜水也七八年了.说来惭愧,这么多年虽然一直自称.NET铁杆粉丝,然仅限于回几个不痛不痒的贴,既没有发布过代码,也没有写过文章. 看着.NET和C#在国外风生水起,国内却日趋没落, ...
- 最新工控\建模仿真\组态\监控集成开发平台源码解决方案2019 ---所有VC++源码100%提供!
使用E-Form++可视化企业版本,构建属于自己的专业工控.建模仿真. 监控组态.培训仿真平台! -- 100%源码 (全部采用VC++/MFC编写,支持.NET, Java, Web, Delphi ...
- 工控安全入门之Ethernet/IP
这一篇依然是协议层面的,协议层面会翻译三篇,下一篇是电力系统中用的比较多的DNP3.这一篇中大部分引用的资料都可以访问到,只有一篇reversemode.com上的writeup(http://rev ...
- 工控安全入门之Modbus(转载)
工控安全这个领域比较封闭,公开的资料很少.我在读<Hacking Exposed Industrial Control Systems>,一本16年的书,选了的部分章节进行翻译,以其抛砖引 ...
- 工控安全入门之 Ethernet/IP
工控安全入门之 Ethernet/IP Ethernet/IP 与 Modbus 相比,EtherNet/IP 是一个更现代化的标准协议.由工作组 ControlNet International 与 ...
- 工控安全入门(七)—— plc的网络
上一篇我们详细分析了bootram和Vxworks的基本启动流程,这篇文章中我们把视线转到plc的网络部分,同时来复现我们第一个.第二个工控安全漏洞. VxWorks的网络设备驱动 一般我们说有三种设 ...
- 工控安全入门(三)—— 再解S7comm
之前的文章我们都是在ctf的基础上学习工控协议知识的,显然这样对于S7comm的认识还不够深刻,这次就做一个实战补全,看看S7comm还有哪些值得我们深挖的地方. 本篇是对S7comm的补全和实战,阅 ...
- 工控安全入门(二)—— S7comm协议
在上一次的文章中我们介绍了施耐德公司的协议modbus,这次我们把目标转向私有协议,来看看另一家巨头西门子的S7comm.首先要说明,这篇文章中的内容有笔者自己的探索,有大佬们的成果,但由于S7com ...
- 工控安全入门(一)—— Modbus协议
modbus基础知识 modbus协议最初是由Modicon公司在1971年推出的全球第一款真正意义上用于工业现场的总线协议,最初是为了实现串行通信,运用在串口(如RS232.RS485等)传输上的, ...
随机推荐
- CSS布局概念与技术教程
以下是一份CSS布局学习大纲,它涵盖了基本到高级的CSS布局概念和技术 引言 欢迎来到CSS教程!如果你已经掌握了HTML的基础知识,那么你即将进入一个全新的世界,通过学习CSS(Cascading ...
- ETSI GS MEC 015,MEP 带宽管理 API
目录 文章目录 目录 版本 ETSI MEC 对 MEP 带宽管理功能的定义 功能理解 Bandwidth Management Service BWMS UML ME APP registers t ...
- 23ai免费版本环境快速就绪
笔者感受就是搞一套Oracle 23ai的学习测试环境,从未如此的简单高效. 因为近期Oracle 23ai这个话题很火,很多人也在找实验环境想亲自体验测试一番. 其实搞这样的环境没有任何的门槛,甚至 ...
- 高效C#编程:通过智能线程池管理提升性能
前言 C#编程中,线程池(Thread Pool)是一个重要的概念,它允许开发者更有效地管理和利用系统资源.通过线程池,我们可以避免频繁地创建和销毁线程,从而减少系统开销并提高程序的响应速度和吞吐量. ...
- Flask简单部署至kubernetes
安装Kubernetes.Docker Kubernetes.Docker安装教程 项目地址 Github Flask flask run.py from flask import Flask imp ...
- FFmpeg开发笔记(二十三)使用OBS Studio开启RTMP直播推流
OBS是一个开源的直播录制软件,英文全称叫做Open Broadcaster Software,广泛用于视频录制.实时直播等领域.OBS不但开源,而且跨平台,兼容Windows.Mac OS.Lin ...
- MyBatis数据源模块源码分析
数据源对象是比较复杂的对象,其创建过程相对比较复杂,对于 MyBatis 创建数据源,具体来讲有如下难点: MyBatis 不但要能集成第三方的数据源组件,自身也提供了数据源的实现: 数据源的初始化参 ...
- go 通过指针修改结构体小写字段的值
package main import ( "fmt" "unsafe" ) type W struct { b int32 c int64 } func ma ...
- golang 后台 苹果一键登录 sing in with apple
本文主要展示golang后台编写苹果一键登录的代码.苹果一键登录的流程需自行去查看相关文档 这是解析 identity_token的方法来验证 如果是用code的话验证 请去 https://b ...
- 面向对象编程 es5和es6的构造函数
/* 面向对象编程 本质 创建一个对象 可以用 属性属性值的 方式 存储 数据参数 ...