记一次 Modbus 协议流量分析

首先协议分级能够发现是 Modbus/TCP 的类型的流量

同时这也是题目中考的最多的 Modbus 协议流量

常见的功能码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1:读线圈

2:读离散输入

3:读保持

4:读输入

5:写单个线圈

6:写单个保持

15:写多个线圈

16:写多个保持

首先先过滤一下 modbus 协议的流量

翻了翻,发现该流量包中只有两种功能码,一个是 3(读保持)一个是 6(写单个保持)

首先先将功能码 6 且选中进行过滤,并将 data 都提取出来

转码也并没有什么发现

接下来同样的方法过滤功能码 3

发现每次的回复包都有一组可疑的数据,并且随着包的标号往下看,从每一组的第一个数开始依次轮换了三次,也就是有四组数据,把他们都提取出来

1
2
3
4
5
6
7
71 71 81 63 79 64 43 40 41 41

112 65 35 86 83 101 98 77 96 91

74 93 88 71 90 85 68 73 68 85

90 93 0 1 2 3 4 3 2 1

直接转 ascii 码并不正确,但是由于数据可疑并且长度差不多,我们计算一下标头数据和 flag 头字母 ascii 码的偏移量,发现都是一样的

利用脚本加上偏移转换成 ascii 码得到 flag

1
2
3
4
5
6
7
c =[71,71,81,63,79,64,43,40,41,41,112,65,35,86,83,101,98,77,96,91,74,93,88,71,90,85,68,73,68,85,90,93,0,1,2,3,4,3,2,1]

offset = ord('H') - c[0]

for i in range(0, len(c)):

print(chr(c[i]+i+offset),end='')

输出:

1
HITCTF2023{M0dbus_so_so_so_easy}!#%'))))