协议分析
主要以工控流量和恶意流量为主,难度较低的题目主要考察Wireshark使用和找规律,难度较高的题目主要考察协议定义和特征
简单只能简单得干篇一律,难可以难得五花八门
常见的工控协议有:Modbus、MMS、IEC60870、MQTT、CoAP、COTP、IEC104、IEC61850、S7comm、OMRON等
由于工控技术起步较早但是统一的协议规范制定较晚,所以许多工业设备都有自己的协议,网上资料数量视其设备普及程度而定,还有部分协议为国家制定,但仅在自己国内使用,网上资料数量视其影响力而定
1Modbus
Modbus,市场占有率高、出题频率高,算是最常见的题目,因为这个协议也是工控领域最常见的协议之一,主要有三类
Modbus/RTU
从机地址1B+功能码1B+数据字段xB+CRC值2B
最大长度256B,所以数据字段最大长度252B
Modbus/ASCII
由Modbus/RTU衍生,采用0123456789ABCDEF 表示原本的从机地址、功能码、数据字段,并添加开始结束标记,所以长度翻倍
开始标记:(0x3A)1B+从机地址2B+功能码2B+数据字段xB+LRC值2B+结束标记\r\n2B
最大长度513B,因为数据字段在RTU中是最大252B,所以在ASCII中最大504B
Modbus/TCP
不再需要从机地址,改用UnitID;不再需要CRC/LRC,因为TCP自带校验
传输标识符2B+协议标识符2B+长度2B+从机ID 1B+功能码1B+数据字段xB
题目中一般只考Modbus/TCP类型
功能码(常见)
1:读线圈
2:读离散输入
3:读保持
4:读输入
5:写单个线圈
6:写单个保持
15:写多个线圈
16:写多个保持
2MMS
工控领域的TCP协议,有时wireshark会将response包解析为tcp协议,影响做题,如果筛选mms时出现连续request包,考虑wireshark解析错误,将筛选条件删除手动看一下
initiate(可以理解为握手)
initiate-RequestPDU
initiate-ResponsePDU
confirmed(可以理解为交互,即传数据)
confirmed-RequestPDU
confirmed-ResponsePDU
通常情况为
1轮initiate:即发送1个initiate-RequestPDU,接收1个initiate-ResponsePDU
n轮confirmed:直到会话主动关闭或被动断开即confirmed-RequestPDU和confirmed-ResponsePDU交替发送和接收
交互时的指令称为confirmedService
常见的confirmedService有
对象操作
getNameList (1)
read (4)
write (5)
getVariableAccessAttributes (6)
getNamedVariableListAttributes (12)
文件操作
fileOpen (72)
fileRead (73)
fileClose (74)
fileDirectory (77)
3 S7Comm协议
S7Comm(S7 Communication)是西门子专有的协议,是西门子S7通讯协议簇里的一种
S7Comm协议包含三部分:
Header:主要是数据的描述性信息,包含长度信息,PDU参考和消息类型常量,最重要的是要表明PDU的类型
Parameter:参数,随着不同类型的PDU会有不同的参数
Data:数据,该数据是一个可选字段来携带数据,例如存储器值,块代码,固件数据等。
3.1 header
(1)Message Type:
[1b]消息的一般类型(有时称为ROSCTR类型),消息的其余部分在很大程度上取决于Message Type和功能代码。
0x01- Job Request:主站发送的请求(例如读/写存储器,读/写块,启动/停止设备,通信设置);下发任务/指令,机器收到任务/指令后回传数据确认收到,回传的内容就是Ack/Ack_Data
0x02- Ack:从站发送的简单确认没有数据字段(从未见过它由S300 / S400设备发送)(单纯确认,不含有数据)
x03- Ack-Data:带有可选数据字段的确认,包含对作业请求的回复(带有返回数据,例如指令是查询内容,返回的就有要查询的东西)
0x07- Userdata:原始协议的扩展,参数字段包含请求/响应id,(用于编程/调试,SZL读取,安全功能,时间设置,循环读取…)
Reserved: [2b]始终设置为0x0000(但可能忽略)
(2)PDU reference: [2b]由主站生成,每次新传输递增,用于链接对其请求的响应,Little-Endian(注意:这是WinCC,Step7和其他西门子程序的行为,它可能是随机的生成后,PLC只将其复制到回复中)
Parameter Length: [2b]参数字段的长度,Big-Endian
Data Length: [2b]数据字段的长度,Big-Endian
其实这里就只用记住他的特征码就知道他干了什么(异常中,不一样的):
0x01,硬件错误
0x03,想访问的东西不让访问
0x05,地址越界了
0x06,你请求的数据类型和请求的”东西“的数据类型不一致
3.2 Parammter
功能码:
区域类型:
例如:
4 OMRON
欧姆龙厂商
命令代码(Command CODE)特别多,主要关注读写相关,如:
Memory Area Read (0x0101)
Memory Area Write (0x0102)
Multiple Memory Area Read (0x0104)
Memory Area Transfer (0x0105)
Parameter Area Read (0x0201)
Parameter Area Write (0x0202)
Data Link Table Read (0x0220)
Data Link Table Write (0x0221)
Program Area Read (0x0306)
Program Area Write (0x0307)
5 IEC60870
子协议
IEC101(任务相关)
IEC102(电量相关)
IEC103(保护相关)
IEC104(101的网络版)
IECASDU(基于101/104的应用服务数据单元传输)
主要技巧
筛选iec60870_asdu
关注IOA的值
可尝试用type进行分类
6 COTP
可以理解为基于TCP的工控TCP,主要有五种类型:
CR Connect Request (0x0e)——握手,发送方发送
CC Connect Confirm (0x0d)——握手,接收方发送
DT Data (0x0f)——传正常数据
UD User Data (0x04)——少见,传自定义数据
ED Expedited Data (0x01)——少见,传紧急数据
CR和CC只在建立连接时由双方发送,发起方发送CR,被动方发送CC,后续数据主要走DT。因为协议类似于TCP,较为底层,所以没有其他比较有用的协议字段可供解题;同样因为COTP较为底层,用来出题的概率较小,就像用纯TCP出题的概率一样
参考:https://blog.csdn.net/song123sh/article/details/128387982