工业控制(ICS)---S7Comm

文章详细解析了西门子S7Comm协议的结构,包括header、parameter和data部分,并探讨了在实际工控系统中遭遇的攻击案例,涉及参数修改、异常数据检测和安全威胁。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://www.ctfhub.com/#/challenge
S7common介绍:https://blog.csdn.net/song123sh/article/details/128388384
https://blog.csdn.net/Aluxian_/article/details/134825076

1 S7Comm协议

S7Comm(S7 Communication)是西门子专有的协议,是西门子S7通讯协议簇里的一种
S7Comm协议包含三部分:
Header:主要是数据的描述性信息,包含长度信息,PDU参考和消息类型常量,最重要的是要表明PDU的类型
Parameter:参数,随着不同类型的PDU会有不同的参数
Data:数据,该数据是一个可选字段来携带数据,例如存储器值,块代码,固件数据等。
在这里插入图片描述

1.1 header

(2)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(但可能忽略)

3)PDU reference: [2b]由主站生成,每次新传输递增,用于链接对其请求的响应,Little-Endian(注意:这是WinCC,Step7和其他西门子程序的行为,它可能是随机的生成后,PLC只将其复制到回复中)

Parameter Length: [2b]参数字段的长度,Big-Endian
Data Length: [2b]数据字段的长度,Big-Endian
在这里插入图片描述其实这里就只用记住他的特征码就知道他干了什么(异常中,不一样的):
0x01,硬件错误
0x03,想访问的东西不让访问
0x05,地址越界了
0x06,你请求的数据类型和请求的”东西“的数据类型不一致

1.2 Parammter

功能码:

在这里插入图片描述
区域类型:
在这里插入图片描述

例如:
在这里插入图片描述

2 S7Comm 攻击协议分析

某工厂生产内网遭到恶意攻击,经排查发现攻击者对设备进行了修改设备参数操作,请分析数据通讯流量找出修改的具体参数信息,flag为篡改行为数据包的前四位加后四位,flag格式为flag{}。
这次的流量里面,还含有cotp协议,s7comm是cotp的上层协议,可以对s7comm协议加密或认证。他经常的考的点就是TSAP这个位置,因为这个位置可以手动修改。

这个位置的过滤器是(cotp) && !(cotp.dst-tsap-bytes == 02:02)&&!s7comm

发现一个,尝试提交不是的
在这里插入图片描述
又发现一个,尝试提交flag{11e00205},正确在这里插入图片描述

3异常的S7数据

这是一个S7comm协议的数据包。但是流量中存在一条异常写入的数据。找出异常流量的ascii数据流。flag格式为flag{ascii数据流},字母为大写

首先打开流量包flag.pcapng,筛选s7common协议,需要知道:
Job:下发任务/指令,机器收到任务/指令后回传数据确认收到,回传的内容就是Ack/Ack_Data

Ack_Data:带有返回数据,例如指令是查询内容,返回的就有要查询的东西

Ack:单纯确认,不含有数据
题目中说一个异常写入的数据,则异常写入返回包应该是不正常的,可以看到正常的返回包是:在这里插入图片描述
则进行反选中:!(s7comm.data.returncode == 0xff) and s7comm,发现未看到返回异常的包,这条路走不通,在这里插入图片描述
继续查看job类型,发现所大部分的data都是ffff开头的,因此查询不以ffff开头的job包:
!(s7comm.resp.data[0:2] ==ff:ff) and s7comm,如下图所示,找到异常包,找到
则flag为:flag{ffad28a0ce69db34751f} 字母都大写:
flag{FFAD28A0CE69DB34751F}

参考:https://blog.csdn.net/song123sh/article/details/128388384

4特殊的工控流量

某10段工控网络中,工业协议中存在异常数据。请通过流量中的数据找寻flag。格式为flag{}
题解:直接长度倒叙,在192中发现16进制字符,69735f6e6f745f7265616c,flag{is_not_real}在这里插入图片描述

5工控协议数据分析(*)

运维人员在某工控环境内网发现内网控制系统被攻破,附件为从现场抓取的报文,
请通过分析报文,得出黑客都获取到了哪些信息?flag格式为:flag{}。

题解:
查看数据s7common 发现job类型的wirite var都有data 是二进制的,将这些过滤出来
s7comm.header.rosctr == 1 a在这里插入图片描述
nd s7comm.param.func == 0x05
获得二进制集合,然后转ascii得到flag:

01100110
01101100
01100001
01100111
01111011
01100110
01101100
01100001
01100111
01011111
01101001
01110011
01011111
01101000
01100101
01110010
01100101
01111101
flag{flag_is_here}

6 被篡改的数据

某黑客拿到上位机的权限后对工控设备存储的数据进行了大量的修改,请分析其攻击数据,并找到其中的flag信息。Flag格式为:flag{}。

题解:
直接筛选s7comm,根据题目提示,篡改的数据,那么优先筛选写参数请求即write var

发现大量数据66,转码为f,猜测可能是flag的f字符,但是两千多条,先将其筛除,看剩下的

(((s7comm) && (s7comm.param.func == 0x05)) && (s7comm.header.rosctr == 1)) && !(s7comm.resp.data == 66)
在这里插入图片描述

剩下的数据可以直接看出就是flag,开头结尾有花括号,但是为了防止flag中含有f,重新筛一遍

直接看序号19987,即刚刚发现的l上一条,从这里开始提取得到flag

筛选job类型的write的 data!=66的

!(s7comm.resp.data == 66:) and s7comm and s7comm.header.rosctr == 1 and s7comm.param.func == 0x05
可以看到flag:
flag{931377ad4a}
在这里插入图片描述

参考:
https://blog.csdn.net/song123sh/article/details/128388384

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值