作者使用原始套接字、Linux 回环接口和 cpppo 模拟器从头搭建 EtherNet/IP 和 CIP 沙箱,抛弃 Scapy 等高层库。起初基本读写测试通过,但在分段传输(0x52/0x53)中遭遇静默失败:客户端日志显示正常,实际数据包却无任何变化。
协议被多层封装包裹:EtherNet/IP 头部(24 字节)、Common Packet Format(CPF)、CIP 应用层。单字节错误即导致完整丢弃。借助实时抓包工具 enip_monitor.py 触发无效 tag 查询,PLC 返回状态码 0x05(路径未知),才确认客户端与实际线路状态存在误差。
修复分段偏移后负载正确提交。核心教训:抽象层不保证理解,反而隐藏架构。EtherNet/IP 和 CIP 默认信任格式正确的数据包,对象结构可外部观察,错误状态泄露内部路由信息,且许多遗留配置无需认证。防御必须工作在数据包级别:开发检测规则、监控封装和 CIP 服务、严格网络分段。
项目代码与 13 份技术笔记已公开。
GitHub
#开发者 #工具 #ICS #EtherNetIP #CIP #工控安全 #网络安全 #协议分析
📢 频道:@DevToolboxHub
