
在 OT/ICS 环境中用 Zeek、Suricata 与 Python 检测 Modbus 协议异常【免费下载链接】Anthropic-Cybersecurity-Skills817 structured cybersecurity skills for AI agents · Mapped to 6 frameworks: MITRE ATTCK, NIST CSF 2.0, MITRE ATLAS, D3FEND, NIST AI RMF MITRE F3 (Fight Fraud) · agentskills.io standard · Works with Claude Code, GitHub Copilot, Codex CLI, Cursor, Gemini CLI 20 platforms · 29 security domains · Apache 2.0项目地址: https://gitcode.com/GitHub_Trending/an/Anthropic-Cybersecurity-Skills导读Modbus 是工业控制系统ICS/SCADA中应用最广泛、同时也是最缺乏原生安全机制的现场总线协议之一攻击者一旦进入 OT 网络往往只需几帧合法的 Modbus 写命令即可篡改工艺设定值。本篇技术指南以开源仓库 Anthropic-Cybersecurity-Skills 中skills/detecting-modbus-protocol-anomalies技能为主体系统讲解如何在 OT 环境中通过函数码监控、寄存器范围校验、时序分析与深度包检测来发现 Modbus/TCP 与 Modbus RTU 流量异常涵盖 Zeek Modbus 解析器、Suricata OT 规则集以及基于 Pythonscapy pymodbus的自建检测器。读者读完将掌握从被动抓包、协议基线建立到异常分级告警的完整实战能力。适用场景与边界本技能面向以下典型任务在 OT 环境中部署 Modbus 专项入侵检测为确定性的 Modbus 轮询模式建立基线模型调查被 OT 监控工具标记的可疑 Modbus 流量在工业防火墙上实施函数码白名单allowlist检测可能篡改工艺设定值的未授权 Modbus 写命令。需要明确的是该技能不适用于以下场景端到端保障 Modbus 通信安全Modbus 无原生安全机制防火墙级控制请参考 implementing-network-segmentation-for-ot非 Modbus 协议的多协议监控请参考 detecting-anomalies-in-industrial-control-systems以及对 Modbus 实现的主动模糊测试请参考 performing-plc-firmware-security-analysis。前置条件开始前需要准备对 502 端口 Modbus/TCP 流量的网络 SPAN/TAP 旁路接入Zeek原 Bro及其 Modbus 协议分析器或带 OT 规则集的 SuricataPython 3.9并安装scapy与pymodbus用于自定义分析至少 12 周的正常 Modbus 流量基线抓包已授权的 Modbus 客户端、函数码与寄存器映射文档。核心概念速览术语定义Modbus/TCP运行于 TCP 502 端口的工业协议由 MBAP 头与带函数码和数据的 PDU 组成函数码Function CodeModbus 命令标识FC1-4 读、FC5-6/15-16 写、FC8 诊断决定操作类型MBAP 头Modbus 应用协议头包含事务 ID、协议 ID0x0000、长度与单元 ID单元 IDUnit ID标识目标从站设备的 Modbus 地址0-247单元 ID 0 表示广播到所有从站寄存器映射Register Map厂商自定义的寄存器地址到工艺变量的映射如寄存器 40001 反应釜温度函数码白名单定义每个源 IP 到目标设备允许的 Modbus 函数码集合的安全策略其中 MBAP 头的具体字节布局为事务 ID2 字节、协议 ID2 字节、长度2 字节、单元 ID1 字节随后是 PDU 中的函数码字节。这一结构在scripts/agent.py的parse_modbus_log与 SKILL 主脚本的process_packet中均有对应解析实现。第一步捕获并解析 Modbus 流量部署被动监控捕获所有 Modbus/TCP 流量并将其解析为结构化记录供分析。SKILL 文档提供了一个完整的自研检测器实现其核心流程如下过滤 TCP 载荷、确认端口为 502解析 MBAP 头事务 ID、协议 ID、长度、单元 ID与函数码依据目的端口判断请求方向dport 502 为请求sport 502 为响应以源IP-目的IP为会话键维护主从会话状态ModbusSession记录函数码计数、寄存器访问范围、轮询间隔滑动窗口。检测器内置标准函数码表供白名单与告警描述使用MODBUS_FUNCTION_CODES { 1: (Read Coils, read), 2: (Read Discrete Inputs, read), 3: (Read Holding Registers, read), 4: (Read Input Registers, read), 5: (Write Single Coil, write), 6: (Write Single Register, write), 7: (Read Exception Status, diagnostic), 8: (Diagnostics, diagnostic), 11: (Get Comm Event Counter, diagnostic), 12: (Get Comm Event Log, diagnostic), 15: (Write Multiple Coils, write), 16: (Write Multiple Registers, write), 17: (Report Slave ID, diagnostic), 22: (Mask Write Register, write), 23: (Read/Write Multiple Registers, read_write), 43: (Encapsulated Interface Transport, diagnostic), }从仓库源码结构看scripts/agent.py采用另一条分析路径直接解析 Zeek 的modbus.log制表符格式识别#fields头行把每条事件映射为字段字典再交给时序、寄存器与扫描模式三类检测函数处理两者互为补充。第二步六类内置异常检测规则SKILL 主脚本将异常判定封装为六条可组合的规则每条规则都关联到具体的告警类型与严重级别并映射到 MITRE ATTCK ICS 技术编号规则 1 —— 未授权 Modbus 客户端UNAUTHORIZED_CLIENT当配置了authorized_clients集合后任何不在白名单中的源 IP 发出 Modbus 请求即触发级别为 critical映射T0886 - Remote Services。规则 2 —— 未授权函数码UNAUTHORIZED_FUNCTION_CODE按会话加载白名单authorized_func_codes若函数码不在允许集合内则告警写类函数码如 FC5/6/15/16判定为 critical其余为 high映射T0855 - Unauthorized Command Messageallowed_fcs self.authorized_func_codes.get(session_key) if allowed_fcs and func_code not in allowed_fcs: fc_info MODBUS_FUNCTION_CODES.get(func_code, (fUnknown FC{func_code}, unknown)) severity critical if fc_info[1] write else high规则 3 —— 写操作检测WRITE_OPERATION对 FC 5、6、15、16、22、23 单独计数并从载荷第 8-10 字节提取寄存器起始地址记录到会话的register_ranges映射T0836 - Modify Parameter。这与仓库mappings/mitre-attack/coverage-summary.md中“Modify Parameter / T0836 属于 ot-ics-security 控制类技能”的覆盖声明一致。规则 4 —— 时序异常TIMING_ANOMALY以会话内相邻请求的时间间隔毫秒为样本当样本数超过 10 且存在基线时计算与基线平均轮询间隔的 z-score超过 5.0 即告警medium映射T0831 - Manipulation of Controlif expected_std 0: z_score abs(interval - expected_interval) / expected_std if z_score 5.0: # TIMING_ANOMALY with interval vs baseline detail规则 5 —— 协议违规PROTOCOL_VIOLATIONMBAP 头的协议 ID 必须为 0否则判定为非标准协议 IDhigh映射T0830 - Man in the Middle。规则 6 —— 广播写BROADCAST_WRITE单元 ID 为 0 且函数码为写类FC 5/6/15/16时意味着命令会作用于所有从站风险极高判定为 critical映射T0855 - Unauthorized Command Message。第三步建立正常通信基线基线是整个检测体系的前提load_baseline()从 JSON 基线文件加载每个会话的allowed_function_codes并由set_authorized_clients/set_authorized_func_codes支持人工补充授权信息。基线 JSON 结构与命令注入检测技能detecting-modbus-command-injection-attacks中load_baseline解析的格式一致包含allowed_function_codes会话允许的函数码集合register_ranges合法寄存器区间列表start/endpolling_interval_avg_sec与polling_interval_stddev轮询间隔均值与标准差。基线监控的参考阈值来自references/api-reference.md以expected_interval 1.0秒为期望轮询周期、容差 0.5 秒间隔小于 0.5 秒或大于 3.0 秒即触发告警而scripts/agent.py的detect_timing_anomalies(events, expected_interval1.0, tolerance0.5)将小于expected - tolerance的间隔判为 HIGH、大于expected * 3判为 MEDIUM两种实现可互相印证。第四步超出协议规范的异常检测Modbus 协议本身对数据量有硬性上限超出即视为异常。references/api-reference.md列出了关键限制参数最大值线圈读取数量Coil read quantity2000寄存器读取数量Register read quantity125寄存器写入数量Register write quantity123单元 ID 范围1-247PDU 大小253 字节scripts/agent.py将MAX_REGISTER_READ 125与MAX_COIL_READ 2000直接编码为常量在detect_register_anomalies中对读线圈FC1/2与读寄存器FC3/4的quantity字段逐一校验超限即产生excessive_coil_read/excessive_register_read的 HIGH 级发现。除此之外references/api-reference.md还归纳了完整的异常检测方法表与 SKILL 六条规则相互补充异常检测方式严重级别时序偏差轮询间隔超出容差MEDIUM-HIGH过量读取数量超过协议上限HIGH非法函数码不在标准函数码集合内HIGHModbus 扫描单个源出现超过 5 种不同函数码HIGH寄存器越界地址超出配置区间MEDIUM其中 Modbus 扫描由scripts/agent.py的detect_scan_patterns(events, threshold50)实现统计每个源 IP 出现的唯一函数码数量超过 5 个即判定为枚举扫描若同一源同时调用 FC17Report Slave ID与 FC43Encapsulated Interface Transport同样视为扫描行为。工具链选型Zeek Modbus Analyzer网络安全监控器内置 Modbus/TCP 协议解析与日志记录。其modbus.log字段结构为#fields ts uid id.orig_h id.orig_p id.resp_h id.resp_p func exception quantityscripts/agent.py的parse_modbus_log正是针对该格式实现。Suricata ET Open ICS 规则具备 Modbus 专项检测规则的 IDS/IPS可覆盖命令注入与协议异常。references/api-reference.md给出两条可直接落地的规则示例alert modbus any any - any 502 (msg:Modbus Invalid Function Code; \ modbus: function !1,!2,!3,!4,!5,!6,!15,!16; sid:4000001;) alert modbus any any - any 502 (msg:Modbus Excessive Register Read; \ modbus: function 3; modbus: quantity 125; sid:4000002;)第一条对函数码取反集!1,!2,...命中即代表出现标准集合之外的非法函数码第二条在 FC3读保持寄存器上限制 quantity 不超过 125与协议上限和 Python 常量保持同一阈值口径。Wireshark Modbus Dissector支持 Modbus/TCP 与 Modbus RTU 完整解码的协议分析器。PyModbus用于构建自定义监控与测试工具的 Python Modbus 库。若使用 scapy 直接分析抓包文件references/api-reference.md提供了轻量写法借助 scapy 内置的 Modbus ADU 层提取函数码与长度from scapy.contrib.modbus import ModbusADURequest from scapy.all import rdpcap pkts rdpcap(modbus.pcap) for pkt in pkts: if pkt.haslayer(ModbusADURequest): print(fFC{pkt.funcCode} Len{pkt.len})运行方式与输出格式自研检测器支持两种使用模式。SKILL 主脚本以命令行方式分析 pcap 并可选加载基线python modbus_detector.py pcap_file [baseline.json]scripts/agent.py则直接消费 Zeek 日志支持自定义期望轮询间隔python agent.py --modbus-log modbus.log python agent.py --modbus-log modbus.log --expected-interval 2.0检测完成后输出标准化的报告格式便于与 SOC 流程衔接Modbus Protocol Anomaly Detection Report Capture Period: YYYY-MM-DD to YYYY-MM-DD Packets Analyzed: [N] Sessions: [N] ANOMALIES: [N] UNAUTHORIZED_CLIENT: [N] UNAUTHORIZED_FUNCTION_CODE: [N] WRITE_OPERATION: [N] TIMING_ANOMALY: [N] BROADCAST_WRITE: [N]scripts/agent.py的main()则输出 JSON 结构timestamp、total_events、findings、total_findings其中每条 finding 含类型、源、函数码、数量与严重级别适合直接接入 SIEM 或自动化编排其报告的timestamp采用 UTC ISO 格式 Z便于跨时区归并。与框架的对应关系本技能在仓库中被映射到多个安全框架可作为合规与审计引用依据MITRE ATTCKICST1078、T1190、T1059、T0816、T0836并在检测规则中进一步关联 T0886、T0855、T0831、T0830NIST CSF 2.0PR.IR-01、DE.CM-01、ID.AM-05、GV.OC-02MITRE ATLASAML.T0070、AML.T0066、AML.T0082NIST AI RMFMEASURE-2.7、MAP-5.1、MANAGE-2.4。其中 T0831Manipulation of Control、T0836Modify Parameter等 ICS 战术技术在 mappings/mitre-attack/coverage-summary.md 中被归入 ot-ics-security 控制类技能与本文的检测方法形成闭环。部署建议与落地要点先基线后告警上线前至少采集 12 周正常流量生成baseline.json避免用空基线导致规则 4时序大量误报白名单按会话细化authorized_func_codes按源IP-目的IP粒度过滤比全局白名单更贴近 OT 网络的确定性通信模型写命令重点防护规则 3、6 对写类函数码单独加权广播写unit ID 0一律 critical与 OT 变更管理流程联动多引擎交叉验证Zeek 负责协议级日志、Suricata 负责规则告警、Python 脚本负责统计型异常三者结论在 SOC 中合并研判结合纵深防御Modbus 无原生认证与加密检测只是最后一道防线应配合 implementing-iec-62443-security-zones 的 IEC 62443 安全分区与工业防火墙白名单共同使用。相关参考文档技能主文档 SKILL.md、协议限制与规则速查 api-reference.md、可运行的 Zeek 日志分析代理 agent.py。【免费下载链接】Anthropic-Cybersecurity-Skills817 structured cybersecurity skills for AI agents · Mapped to 6 frameworks: MITRE ATTCK, NIST CSF 2.0, MITRE ATLAS, D3FEND, NIST AI RMF MITRE F3 (Fight Fraud) · agentskills.io standard · Works with Claude Code, GitHub Copilot, Codex CLI, Cursor, Gemini CLI 20 platforms · 29 security domains · Apache 2.0项目地址: https://gitcode.com/GitHub_Trending/an/Anthropic-Cybersecurity-Skills创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考