工控CTF之协议分析类型

本文讲述了在工控网络安全挑战中,如何利用Wireshark和特定协议知识(如Modbus、MMS、S7Comm等)分析流量、寻找隐藏的flag,以及使用工具如tshark解决实际问题的策略和技巧。
摘要由CSDN通过智能技术生成

协议分析

主要以工控流量和恶意流量为主,难度较低的题目主要考察Wireshark使用和找规律,难度较高的题目主要考察协议定义和特征
简单只能简单得干篇一律,难可以难得五花八门

常见的工控协议有:Modbus、MMS、IEC60870、MQTT、CoAP、COTP、IEC104、IEC61850、S7comm、OMRON等

由于工控技术起步较早但是统一的协议规范制定较晚,所以许多工业设备都有自己的协议,网上资料数量视其设备普及程度而定,还有部分协议为国家制定,但仅在自己国内使用,网上资料数量视其影响力而定
modbus例题
MMS
S7Comm
IEC
Omron
纵横靶场部分协议wirteup

做题思路

记住flag的各种形式,可能以其他形式隐藏
flag (16进制):666C6167
flag(base64): ZmxhZw==
ctf(16进制):637466
(0)用wireshark打开,按照length倒叙,查看最大的流量是否有异常,包含flag
(1)首先拿到题目先用字符串搜:
strings t3.pcap |grep ctf
strings t3.pcap |grep flag
strings t3.pcap |grep 666c6167
一些筛选技巧:
筛选16进制
strings S7comm.pcap|grep -E “^.{10}$”

使用tshark提取源地址为192.168.3.73的包的data字段
tshark -r fetus_pcap.pcap -Y ‘ip.src_host==“192.168.3.73”’ -e data -T fields > icmp_data.txt

查看文件类型:kali
file capture.log
(2)如果搜不到,则用wireshark打开,先看“统计”–》协议分级 查看哪个协议占比高,一般高占比的协议就是藏Flag的地方,然后查看TCP连接数有几个(“统计”–》“会话”–“TCP”),如果TCP连接数多的话,可以通过筛选在每一个TCP会话中 逐个查找flag:选择TCP流的筛选语句:tcp.stream eq 0
(3)针对一些寻找异常流量的题目,如果是通过wireshark找不出来,可以尝试使用"科来"软件进行流量回放,然后查看 “诊断”,通过查看一些有异常的数据包 也许可以发现些东西
在这里插入图片描述

(4)最后针对各个协议有一些查找技巧如下:

  • Modbus: 有些题目提到写入,就可以优先查看功能码 5 6 15 16的数据包,排查的过程中 ,按照每个功能码的去看
  • Omron: 查看write的包
  • S7Comm:一般查看job类型的包,优先查看write的。查看正常的返回包是啥,然后反选,找出异常的。或者查看Job包里的Data找规律
  • IEC60870:关注IOA的值;可尝试用type进行分类;筛选iec60870_asdu

(5)小工具使用 tshark

tshark -r xxx.pcap -Y "过滤规则(直接复制wireshark的)" -T fields -e "提取的字段" >data

例如:

tshark -r fetus_pcap.pcap -Y 'ip.src_host=="192.168.3.73"' -e data -T fields > icmp_data.txt
tshark -r .\super_electric.pcapng -Y "mms.itemId == \"LLN0$CO$FunEna1$Oper\"" -T fields -e "mms.octet_string" > data.txt

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:写多个保持
17:主机请求和从机报告

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值