COTP 协议
概述
COTP 是 ISO OSI 七层模型中的传输层协议,其正式标准为 ISO 8073,对应的 RFC 文档是 RFC 905。你可以把它理解为 OSI 世界里的 “TCP”
报文结构
连接包
用于建立、维护和断开连接。其头部结构通常如下:
Length (1 字节):后续数据的长度
PDU Type (1 字节):数据包类型,常见的有:
0x0E:连接请求 (CR)0x0D:连接确认 (CC)0x08:断开请求 (DR)0x0C:断开确认 (DC)
Destination/Source Reference (各 2 字节):目的和源引用
Options (1 字节):包含扩展格式、流控等标志位
Parameters (可变长):包含关键参数,如 TSAP、TPDU Size(传输数据大小)等
功能包
连接建立后,用于数据传输和控制。主要包括:
数据传输 (DT):实际发送用户数据
控制功能:如流量控制、数据确认(AK)、错误报告(ER)等
工作流程
COTP 在西门子 S7 通信中扮演关键角色。一次典型的通信流程如下:
TCP 三次握手:首先在计算机和 PLC 之间建立 TCP 连接,默认端口为 102
COTP 连接请求 (CR):客户端发送 COTP CR 包,其中包含目的 TSAP,以明确要连接的具体 CPU
COTP 连接确认 (CC):服务端回复 COTP CC 包,确认连接建立
上层协议交互:COTP 连接建立后,上层协议(如 S7COMM)开始进行应用层数据交换
实战案例
S7Comm 攻击协议分析(COTP 协议)

流量包中有两个 IP,其中 192.168.1.188 的功能码全是 0x00 CPU 服务,所以可以直接排除

但是 192.168.1.33 的功能码全是 0xf0 建立连接的,它为什么要一直建立连接呢?

这题考点不是普通 S7comm 的 Read/Write Var,而是 COTP 连接请求里的 TSAP 字段
它在工业自动化(如西门子 S7 通信)和一些传统 OSI 网络中很常见,你可以把它理解成一个 “加强版”的 TCP
使用 cotp && ip.src == 192.168.1.33 过滤一下,分析第一个请求包

简单分析如下:
包类型与目的
- PDU 类型为 0x0e(CR):这是一个主动发起连接建立请求的报文,相当于 TCP 的 SYN 包
连接标识(引用)
Source reference(源引用)为 0x002f(47):发起方生成的本地连接标识,用于唯一标记这条会话
Destination reference(目标引用)为 0x0000:因为尚未建立连接,所以目标引用填 0
协议等级(Class)
- Class 为 0:这是最基础的传输层等级,不支持错误恢复和复用,只提供简单可靠的传输服务。这在工业控制等确定性场景中很常见
关键参数(TSAP 地址)
源 TSAP(0xc1):0x0100 —— 代表发起方(如工程师站/上位机)的访问点地址
目标 TSAP(0xc2):0x0102 —— 代表接收方(如 PLC)的访问点地址
含义:TSAP 相当于应用层的 “门牌号” 或端口扩展。在西门子 S7 协议栈中,0x0102 常对应 PLC 的编程/HMI 通信入口,0x0100 常对应 PC 端。这明确指明了双方的应用实体
传输能力协商
- TPDU size(0xc0)为 1024:表示发送方建议在这个连接上传输的数据块(TPDU)最大长度为 1024 字节。接收方若接受,后续通信将以此值(或协商后的较小值)为准
往下看发现这里连续两次发送请求

对比如下:
上一个包:目标 TSAP 是 0102
当前这个包:目标 TSAP 是 0205
符合题目描述的 “对设备进行了修改设备参数操作”

右键追踪 TCP 流拿原始数据

所以 flag 就是 flag{11e00205}
COTP(COTP 协议)

一眼过去全是 COTP 协议,过滤下

COTP 协议默认端口是 102,所以 192.168.99.22 是工控设备

再新增 ip.src == 192.168.99.22 过滤下,查看工控响应的内容有没有什么异常

第 217 个包长度突然不一样,是之前的两倍

Payload 中还能看到明显的设备信息字符串
1 | 6ES7 211-1BE51-0XB0 ;V3.0 |
这说明攻击者/扫描方正在读取设备型号、版本等信息
因此,这个响应包就是题目要找的 “遭到攻击的数据包”
最后的 flag 如下
1 | flag{31312D31424535312D30584230203B56332E308240001505323B32383882410003000300A20000000072010000} |