Hali硬件安全实战:从RS232/485/422到CAN总线的工业协议抓包与逆向分析
1. 工业协议抓包的实战意义
第一次接触工业协议抓包是在2015年的一次工控系统渗透测试项目中。当时客户反馈他们的生产线偶尔会出现"幽灵操作"——设备在没有人工干预的情况下自行启动。经过排查,我们发现问题的根源就出在RS485总线的明文通信上。这个经历让我深刻认识到,工业协议安全研究不是纸上谈兵,而是关乎生产安全的重要课题。
工业现场常见的RS232/485/422和CAN总线,就像工厂的神经系统。它们负责传输控制指令、设备状态等关键数据。但很多工程师在设计这些系统时,往往只考虑功能实现,忽略了安全性。我见过太多案例:使用固定波特率、无身份验证、明文传输关键指令...这些都为攻击者提供了可乘之机。
通过抓包分析,我们可以:
- 发现协议设计缺陷(如缺乏校验机制)
- 识别未加密的敏感指令
- 验证设备的安全防护能力
- 为安全加固提供依据
2. 硬件工具选型指南
2.1 逻辑分析仪的选择
LA2016逻辑分析仪是我的主力设备,价格在800-1200元之间。相比更贵的示波器,它的优势在于:
- 16通道同时采集
- 支持最高200MHz采样率
- 自带协议解码功能
- 便携性好(仅手机大小)
实际使用中要注意:
- 采样深度建议设置≥1M
- 触发条件要合理设置(如上升沿触发)
- 接地线一定要接好,否则波形会抖动
2.2 串口转换工具
不同总线需要不同的转换器:
- RS232:建议用FT232芯片的转换器
- RS485/422:需要带隔离的型号(如ADM2587E)
- TTL电平:注意电压匹配(3.3V/5V)
我常用的配置是:
# 查看USB转串口设备 ls /dev/ttyUSB* # 设置波特率 stty -F /dev/ttyUSB0 96002.3 CAN分析仪
CAN总线分析要特别注意:
- 终端电阻匹配(通常120Ω)
- 波特率设置(常见125kbps/250kbps)
- 帧格式(标准帧/扩展帧)
推荐PCAN-USB适配器,配套软件可以实时显示报文ID和数据内容。
3. 实战抓包全流程
3.1 物理接入技巧
在工厂环境中接线是个技术活。我的经验是:
- 先确认接口类型(DB9/RJ45/端子排)
- 准备转接头或穿刺探针
- 最好在设备停机时接入
- 记录原始接线顺序(拍照存档)
常见错误:
- 485总线接反A/B线
- 忘记给CAN总线加终端电阻
- 232接口误接RTS/CTS线
3.2 参数配置要点
以逻辑分析仪为例,关键设置包括:
- 采样率:至少5倍于信号频率
- 触发方式:边沿触发/模式触发
- 阈值电压:RS485建议1.4V
CAN总线配置示例:
# can-utils工具配置 sudo ip link set can0 type can bitrate 125000 sudo ip link set up can0 # 监听CAN帧 candump can03.3 数据捕获实战
抓包时要特别注意:
- 捕获完整业务场景(如设备启停全过程)
- 标记关键操作时间点
- 保存原始数据(.sal/.csv格式)
- 记录环境信息(波特率、接线方式等)
我常用的命令:
# 保存逻辑分析仪数据 sigrok-cli -d saleae-logic -o capture.sr # 转换数据格式 sigrok-cli -i capture.sr -O csv > capture.csv4. 协议逆向分析方法
4.1 数据预处理
原始数据通常需要清洗:
- 去除空闲时段数据
- 标注有效数据段
- 转换数据格式(Hex/ASCII)
- 提取特征字段
Python处理示例:
import pandas as pd def clean_data(raw_file): df = pd.read_csv(raw_file) # 过滤无效数据 df = df[df['data'].str.contains('^[0-9A-F]{2}', na=False)] # 提取关键字段 df['cmd'] = df['data'].str[0:2] return df4.2 协议字段识别
通过对比分析可以发现:
- 固定前缀/后缀(如起始符0xAA)
- 长度字段(通常第2字节)
- 校验算法(累加和/CRC)
- 功能码(如0x01读/0x02写)
典型协议结构:
| 偏移量 | 长度 | 说明 |
|---|---|---|
| 0 | 1 | 设备地址 |
| 1 | 1 | 功能码 |
| 2 | 1 | 数据长度 |
| 3 | N | 数据域 |
| 3+N | 1 | 校验和 |
4.3 协议验证技巧
发现疑似协议后需要验证:
- 重放测试(发送相同指令)
- 模糊测试(修改各字段值)
- 边界测试(超长/异常数据)
- 时序测试(快速连续发送)
使用Python自动化验证:
import serial import time def send_cmd(port, cmd): ser = serial.Serial(port, 9600, timeout=1) ser.write(bytes.fromhex(cmd)) response = ser.read_all() return response.hex() # 测试不同设备地址 for addr in range(1, 5): cmd = f"{addr:02X}020001FD" print(f"发送 {cmd}, 响应 {send_cmd('/dev/ttyUSB0', cmd)}") time.sleep(0.5)5. 典型漏洞案例分析
5.1 未授权访问漏洞
在某PLC系统中,我们发现:
- 无需认证即可发送控制指令
- 设备地址固定为0x00
- 所有设备响应广播指令
利用方式:
echo -ne '\x00\x02\x01\x00\x03' > /dev/ttyUSB05.2 固件提取漏洞
通过UART接口可以:
- 中断启动过程进入bootloader
- 使用Xmodem协议下载固件
- 逆向分析获取敏感信息
关键命令:
# 使用screen连接串口 screen /dev/ttyUSB0 115200 # 在启动时按Ctrl+C进入bootloader # 发送下载命令 flash read 0x80000000 0x00000000 0x1000005.3 CAN总线注入
汽车ECU系统中常见问题:
- 无报文认证机制
- 关键控制指令ID固定
- 缺乏速率限制
攻击示例(使用cangen):
# 生成油门指令 cangen can0 -I 0x123 -D 2233 -L 8 -g 106. 安全防护建议
6.1 协议层防护
建议工程师在设计时:
- 增加身份认证机制
- 实现指令加密
- 添加时序保护
- 完善校验机制
改进后的协议示例:
[HEAD][SEQ][ENC_CMD][MAC]6.2 物理防护措施
现场防护要点:
- 总线接口加装保护壳
- 使用带加密的通信模块
- 定期检查异常接入
- 关键线路增加监控
6.3 安全测试流程
建议企业建立:
- 上线前安全测试
- 定期渗透测试
- 异常流量监控
- 应急响应机制
我在实际项目中总结的测试清单包括:
- 接口物理防护检查
- 协议逆向分析测试
- 异常指令注入测试
- 固件安全分析测试
7. 进阶技巧与经验
7.1 复杂协议分析
遇到加密协议时可以:
- 定位加密函数(常见于固件中)
- 分析密钥生成逻辑
- 尝试侧信道攻击
- 使用模拟器动态调试
7.2 性能优化技巧
大数据量采集时:
- 使用环形缓冲区
- 过滤无关信号
- 增加预处理脚本
- 分阶段保存数据
7.3 特殊场景处理
对于干扰严重的环境:
- 使用差分探头
- 增加硬件滤波
- 调整触发阈值
- 多次采集对比
在汽车诊断中,我常用这个技巧来稳定采集CAN数据:
# CAN报文稳定性检测 def check_can_stability(interface): os.system(f"candump {interface} | head -n 100 > can_sample.log") with open("can_sample.log") as f: lines = f.readlines() error_rate = sum(1 for line in lines if "ERROR" in line)/len(lines) return error_rate < 0.018. 工具链整合方案
8.1 自动化分析框架
我搭建的自动化流程包括:
- 数据采集模块(Python+libsigrok)
- 协议分析模块(Wireshark插件)
- 模糊测试模块(基于Boofuzz)
- 报告生成模块(Jinja2模板)
核心代码结构:
├── capture/ # 原始数据 ├── parsers/ # 协议解析脚本 ├── fuzz/ # 模糊测试用例 └── utils/ # 通用工具函数8.2 自定义解码器开发
对于私有协议,可以:
- 分析协议特征
- 编写sigrok解码器
- 制作Wireshark插件
- 开发IDAPython脚本
解码器示例(PulseView格式):
<protocol> <name>MyProtocol</name> <fields> <field id="addr" name="Address" width="8"/> <field id="cmd" name="Command" width="8"/> </fields> <decoder> <bits>8</bits> <field>addr</field> <bits>8</bits> <field>cmd</field> </decoder> </protocol>8.3 云端协同分析
分布式分析架构:
- 边缘设备采集数据
- 云端解析关键特征
- 多专家协同标注
- 知识库自动更新
部署示例:
# 边缘设备 sigrok-cli --config samplerate=1M -d fx2lafw -o - | gzip | \ ssh user@server "cat > $(date +%s).sr.gz" # 云端分析 find ./ -name "*.sr.gz" | parallel -j 8 \ "zcat {} | sigrok-cli -i - -P myprotocol -O json > {}.json"9. 法律合规要点
9.1 授权测试规范
必须确保:
- 获得书面授权
- 明确测试范围
- 避开生产高峰
- 做好应急预案
9.2 数据保护措施
敏感数据处理原则:
- 匿名化存储
- 加密传输
- 访问控制
- 定期销毁
9.3 报告撰写指南
合格的报告应包含:
- 测试范围说明
- 漏洞详情(PoC+影响)
- 修复建议
- 风险评级
我通常按照这个结构组织报告:
1. 概述 2. 测试方法 3. 发现漏洞 - 漏洞1:描述+截图 - 漏洞2:描述+日志 4. 修复建议 5. 附录(原始数据)10. 学习路径建议
10.1 入门阶段
建议学习:
- 电子基础(电压/电流测量)
- 通信原理(UART/CAN协议)
- 工具使用(逻辑分析仪基础)
- 简单协议分析(Modbus RTU)
推荐实验:
- 用USB-TTL模块自发自收数据
- 用逻辑分析仪捕捉I2C通信
- 分析智能家居设备通信
10.2 进阶提升
需要掌握:
- 信号完整性分析
- 嵌入式系统架构
- 加密算法基础
- 逆向工程技能
实验项目建议:
- 破解电子锁通信协议
- 分析汽车OBD-II指令
- 提取设备固件并分析
10.3 专业深造
研究方向包括:
- 硬件安全架构
- 侧信道攻击
- 物理层加密
- 可信执行环境
我常跟团队说,工业协议安全就像医生看病,既需要理论知识,更需要临床经验。建议大家多参与实际项目,从简单设备开始,逐步挑战更复杂的系统。每次分析新协议时,保持好奇心,注意细节,往往最关键的发现就藏在看似无关的数据字节中。
