当前位置: 首页 > news >正文

新手必看!从一道工控CTF题(西门子S7协议)手把手教你分析PLC异常流量

从零解析西门子S7协议:工控CTF实战指南

第一次接触工控CTF题目时,面对密密麻麻的十六进制报文,我完全摸不着头脑。直到亲手拆解了几道典型题目,才发现工业协议分析其实有一套清晰的逻辑路径。本文将以西门子S7协议为例,带你体验完整的分析过程——从协议认知到流量解析,最终构造有效载荷获取flag。不同于单纯展示解题步骤的Writeup,这里会重点解释每个判断背后的原理,让你真正掌握方法论。

1. 工控协议分析基础准备

1.1 认识西门子S7通信协议

西门子S7系列PLC采用基于OSI模型的简化通信协议栈,其核心特征包括:

  • 传输服务:基于TPKT和ISO-COTP协议实现可靠传输
  • 功能码:通过ROSCTR字段区分读写操作(1=读,2=写,3=确认)
  • 数据组织:采用DB块(Data Block)结构管理寄存器数据

典型报文结构分层如下表所示:

协议层字节位置说明
TPKT0-3包含版本号和总长度
COTP4-6连接控制信息
S7Comm7+实际功能参数和数据

提示:Wireshark内置的S7Comm协议解析器能自动拆解各层结构,建议安装插件增强分析能力

1.2 搭建分析环境

推荐工具组合:

# Kali Linux基础工具 sudo apt install wireshark python3-scapy # S7协议解析插件 git clone https://github.com/s7commtool/s7metadata.git

关键配置步骤:

  1. 在Wireshark的Analyze -> Enabled Protocols中启用S7Comm解析
  2. 为Python环境安装pys7库处理协议数据包
  3. 准备测试用PLC模拟器(如PLCSIM Adv)生成标准流量

2. 实战流量深度解析

2.1 原始报文结构拆解

以题目给出的PC端写操作报文为例:

03 00 00 24 02 F0 80 32 01 00 00 00 08 00 0E 00 05 05 01 12 0A 10 02 00 01 00 01 82 00 00 00 00 04 00 08 04

逐字节解析关键字段:

  • TPKT层(0-3字节):

    • 03 00:协议版本3
    • 00 24:总长度36字节(含TPKT头)
  • COTP层(4-6字节):

    • 02:PDU类型为DT Data
    • F0 80:目标引用和源引用标识
  • S7Comm头(7-17字节):

    • 32 01:协议ID为S7
    • 00 00:保留字段
    • 08 00:序列号(需与响应匹配)
    • 0E 00:参数长度14字节

2.2 关键操作参数定位

重点关注S7Comm参数区(18-35字节):

05 05 01 12 0A 10 02 00 01 00 01 82 00 00 00 00 04 00 08 04
  • 功能细节
    • 05:功能码为写变量
    • 01 82:写入类型为Output(0x82)
    • 00 00 00 00:偏移量0(bit单位)
    • 04 00:写入长度4字节
    • 08 04:实际写入值0x0804

注意:工业协议中地址常采用"DB编号.偏移量"格式,但Output区属于特殊存储区域

3. 逆向构造响应报文

3.1 响应报文特征提取

分析PLC的标准响应模式:

03 00 00 16 02 F0 80 32 03 00 00 00 08 00 02 00 01 00 00 05 01 FF

关键差异点:

  • ROSCTR字段变为03(确认响应)
  • 参数长度缩短为2字节
  • 数据部分仅包含状态码FF(成功)

3.2 Python自动化构造脚本

使用Scapy库快速生成响应包:

from scapy.all import * def build_s7_response(original_pkt): # 提取原始报文序列号 seq_num = original_pkt[Raw].load[11:13] # 构造响应帧 response = ( b'\x03\x00\x00\x16\x02\xf0\x80\x32\x03\x00\x00\x00' + seq_num + b'\x02\x00\x01\x00\x00\x05\x01\xff' ) return response # 示例使用 original = bytes.fromhex("0300002402f080320100000008000e00050501120a100200010001820000000004000804") resp = build_s7_response(original) print(resp.hex())

4. 进阶技巧与异常检测

4.1 常见攻击模式识别

工业协议中的危险操作特征:

风险类型报文特征防护建议
未授权写ROSCTR=01且功能码=05启用写操作白名单
内存覆盖异常大的数据长度限制单次读写长度
拒绝服务高频重复请求配置速率限制

4.2 流量分析实战案例

某次比赛中遇到的变形flag:

  1. 发现异常的TCP流包含base64编码数据
  2. 解码得到疑似flag的字符串但格式不符
  3. 进一步分析发现ROT13二次编码:
import codecs encoded = "syntvfguvfZbqohffffff" flag = codecs.decode(encoded, 'rot13') # 输出flag{...}

5. 系统性学习方法建议

建立工控安全知识体系的三个维度:

  1. 协议深度

    • 精读S7、Modbus等主流协议官方文档
    • 使用协议模拟器生成正常/异常流量
  2. 工具链掌握

    • Wireshark过滤语法:s7comm && s7comm.func == 0x05
    • Python处理二进制数据:struct.unpack()
  3. 实战积累

    • 参加工业信息安全技能大赛等赛事
    • 复现CVE漏洞中的攻击流量模式

记得第一次成功构造出合规的S7响应报文时,那种突破迷雾的成就感至今难忘。工控协议分析最有趣的地方在于,它既需要严谨的协议知识,又考验创造性的逆向思维——就像在二进制世界里玩拼图游戏,每个字段都有其存在的意义。

http://www.jsqmd.com/news/663745/

相关文章:

  • 别再到处找地图JSON了!手把手教你用ECharts + 阿里云DataV快速搞定省市地图可视化
  • 35岁被裁,拿了23万赔偿,朋友说我赚了。但我知道,那23万,是我用35岁的简历换来的,而35岁的简历,已经拿不到这个工资了
  • 国产APM32F103C8T6真能平替STM32?我花一周做了这些深度对比测试
  • 别再只用Add和Concat了!用PyTorch手把手实现AFF注意力融合模块(附完整代码)
  • 自动化脚本ui编程之列表框(listview)控件
  • 无网络文件传输的技术挑战与cimbar编码解决方案
  • 告别Boost和Qt?用Poco C++库5分钟搞定跨平台网络应用开发
  • 2026年靠谱的侧压平移窗主流厂家对比评测 - 行业平台推荐
  • AGI原型系统技术白皮书核心节选(SITS2026独家解密):动态认知架构+具身推理引擎+自主目标分解三体融合
  • 3步开启中文影视库:Jellyfin豆瓣插件智能配置实战
  • 从音频到乐谱:MT3音乐转录技术实战解析
  • AI代码扫描到底准不准?SITS2026实测237个CVE样本后,92.6%的高危漏洞被传统工具漏检
  • 终极指南:如何在Windows和Linux上运行macOS虚拟机
  • 【手搓 AI Agent 从 0 到 1】第六课:智能体循环——让 AI 不止回答一次
  • 从踩坑到精通:Element el-form 表单验证的完整避坑指南(Vue 2/3通用)
  • Hi3516CV610开发板ISP调参实战:用PQTools玩转Gamma和Demosaic,实时对比图像效果
  • 复现储能变流器PCS-PWM技术:实现三相电网与直流母线间的双向充放电控制及优化
  • 终极指南:三步将Windows电脑变身为AirPlay 2接收器
  • 如何用OBS Multi RTMP插件实现真正的多平台直播同步
  • Cortex-M52处理器架构与优化技巧详解
  • 从Yelp评论数到新闻分享量:两个真实数据集带你实战特征变换(附完整Python代码)
  • Unity里也能直接放PPT?用Aspose.Slides插件实现无痛加载与分页展示(附打包报错修复方案)
  • 别再死记硬背了!用‘搭积木’的方式,5分钟搞懂区块链的层级结构
  • 基于Simulink的六相PMSM双平面解耦控制
  • 终极指南:3步免费解锁Cursor Pro全部功能,告别试用限制!
  • 代码改一行,线上崩三天?SITS2026专家解密AI影响分析的4层防御体系,错过将增加87%回归成本
  • 碧蓝航线自动化助手如何解决你的日常游戏痛点?
  • CVPR 2015经典回顾:HED边缘检测如何用‘深度监督’解决样本不平衡与多尺度难题?
  • 谭浩强C语言习题精解:从入门到实战的编程思维训练
  • Zynq Linux系统下XVC服务器配置全记录:从设备树修改到xvcServer.c编译避坑