工控学习

前言

要打振兴杯决赛,这里多学习一下工控相关

首先要对tshark做一个用法学习

tshark学习

1
2
3
4
5
tshark -r 1.pcapng -Y "http.request.method == POST" -T fields -e data.data > data.txt
# -r:指定了需要读取的文件
# -Y:使用过滤器
# -T:表示仅仅输出所选字段
# -e:指定提取的字段

工控流量分析

Modbus

Modbus 流量主要有三类:Modbus/RTU、Modbus/ASCII、Modbus/TCP

常见的就是TCP的,对于Modbus最经常考察的就是对功能码的理解

常见功能码

十进制 十六进制 功能
1 0x01 读线圈状态
2 0x02 读离散输入
3 0x03 读保持寄存器
4 0x04 读输入寄存器
5 0x05 写单个线圈
6 0x06 写单个寄存器
15 0x0F 写多个线圈
16 0x10 写多个寄存器

在wireshark中可以用modbus.func_code == 16来筛选功能码为16的协议

image-20251124215214166

可以用以下脚本统计各个功能码出现的次数,经过对比就可以发现哪个是可疑流量了

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import pyshark
def get_code():
     captures = pyshark.FileCapture("D:\\比赛!!\\2025振兴杯决赛\\question_1564353677_modbus1.pcap",tshark_path="D:\\网安\\工具\\Wireshark\\tshark.exe")
     func_codes = {}
     for c in captures:
         for pkt in c:
             if pkt.layer_name == "modbus":
                 func_code = int(pkt.func_code)
                 if func_code in func_codes:
                     func_codes[func_code] += 1
                 else:
                     func_codes[func_code] = 1
     print(func_codes)
if __name__ == '__main__':
 get_code()

simage-20251124222342524

这里明显是功能码16,然后后面再用modbus.func_code == 16来筛选就行(前面贴过图了)

S7comm

西门子设备的工控协议,基于 COTP 实现,是COTP的上层协议

主要有三种类型:Job(1)Ack_Data(3)/Ack(2)Userdata(7)

Job:下发任务/指令

Ack_Data:带有返回数据

Ack:单纯确认,含有数据

Userdata:用户自定义数据区,也包含功能指令

功能码

image-20251125140446363

s7comm.param.func ==0x05

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计