fkie-cad/maritime-dissector

GitHub: fkie-cad/maritime-dissector

一款用于 Wireshark 的 Lua 插件,提供 IEC 61162-450、NMEA-0183/2000、Navico BR24 及 Furuno 雷达等海事协议的深度解析能力。

Stars: 16 | Forks: 8

# 适用于海事协议的 Wireshark 解析器 本项目包含用于 Wireshark 的 Lua 插件,提供海事网络协议的解析器: - `maritime-dissector` 用于: - IEC 61162-450 (Lightweight Ethernet) - 通过 UDP 发送的 NMEA over IP(包含 NMEA 0183 中定义的语句) - NMEA2000 over CAN-Bus - `br24-dissector` 用于 Navico BR24 RADAR 协议 - `furuno-dissector` 用于不同型号的 Furuno 雷达 - 支持编码/压缩级别 3 和级别 0(后者因缺乏样本尚未测试) `maritime-dissector` 插件主要由 Merlin von Rechenberg 在 Fraunhofer FKIE 工作期间开发。 ## 截图 IEC 61161-450 解析器运行效果:
![NMEA 解析器截图](https://raw.githubusercontent.com/fkie-cad/maritime-dissector/master/docs/images/450-screenshot.png) Navico BR24 解析器:
![BR24 解析器截图](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/3fd6b04d06134027.png) Furuno 解析器(已启用 spoke 拆分):
## 依赖 插件使用 Lua 编写,并使用 Lua 5.4 或更高版本,该版本默认随 Wireshark 附带。 需要 Wireshark 4.0.0 或更高版本才能使用此插件。 也可以使用 TShark 代替 Wireshark。 为此必须手动安装 lua5.4(或更高版本),因为 TShark 不包含 Lua 解释器。 ## 快速开始 *注意*:自动安装脚本仅适用于 Unix-like 系统,并会安装两个插件。 对于其他系统,请按照[手动安装](#manual-installation)的说明进行操作 下载或克隆仓库,打开终端,并导航到包含 `install.sh` 文件的已下载目录。 执行安装脚本: ``` ./install.sh ``` 按照脚本给出的指示操作。 如果私有 Wireshark 插件目录尚不存在,脚本可能会请求创建该目录的权限。 如果是这种情况,请按 `y` 确认并继续。 如果脚本不可执行,你可以使其可执行: ``` chmod +x ./install.sh ``` 安装后,插件将被 Wireshark 自动加载。 Wireshark 将对所有匹配包含的海事协议的数据包使用这些解析器。 ### 手动安装 将你想使用的插件的所有 Lua 文件复制到你的 Wireshark 安装的插件目录中。 对于 Unix-like 系统上的 Wireshark 标准安装,该目录是: *~/.local/lib/wireshark/plugins*: ``` cp ./maritime-dissector.lua ~/.local/lib/wireshark/plugins/ cp -r ./maritime-modules/ ~/.local/lib/wireshark/plugins/ cp ./br24-dissector.lua ~/.local/lib/wireshark/plugins/ cp -r ./br24-modules/ ~/.local/lib/wireshark/plugins/ cp ./furuno-dissector.lua ~/.local/lib/wireshark/plugins/ cp -r ./furuno-modules/ ~/.local/lib/wireshark/plugins/ ``` 对于其他系统,请使用 [官方 Wireshark 文档](https://www.wireshark.org/docs/wsug_html_chunked/ChPluginFolders.html) 中列出的插件目录。 要加载插件,请重启 Wireshark 或在 Wireshark 中重新加载 Lua 插件(通常为 `ctrl+shift+l`)。 ## 使用方法 Maritime 解析器插件中包含三个解析器,BR24 解析器插件中包含一个。 ### Maritime 解析器 第一个解析器用于包含在 UDP 数据包中的纯 NMEA 语句(如 NMEA-0183 中所定义)(NMEA over IP)。 另外两个解析器均用于 IEC-61162-450 (Lightweight Ethernet),因为有两种不同类型的 IEC 61162-450,在此插件中被作为单独的协议处理。 第一个 IEC-61162-450 解析器用于包含嵌套在 IEC-61162-450 内部的 NMEA 语句的数据包。 第二个 IEC-61162-450 解析器用于包含二进制文件或二进制文件片段的数据包。 #### NMEA-0183 用于作为负载包含在 UDP 数据包中的 NMEA 语句的解析器解析以下字段: | 字段名称 | 字段 | 描述 | | ------ | ------ | ------ | | TalkerID | nmea-0183.talkerid | NMEA-0183 中定义的 Talker ID | | SentenceID | nmea-0183.sentenceid | NMEA-0183 中定义的语句类型 | | Data | nmea-0183.data | 语句中包含的以逗号分隔的航海数据 | | Checksum | nmea-0183.checksum | 语句的校验和 (Checksum8 XOR) 以及校验和是否有效或损坏的信息 | 如果校验和损坏或语句过长,此解析器将显示专家信息。 #### IEC-61162-450-NMEA 此解析器解析头部标记为 `UdPbC` 且包含 NMEA 语句的 IEC 61162-450 的以下字段: | 字段名称 | 字段 | 描述 | | ------ | ------ | ------ | | Token | iec-61162-450-nmea.token | 标识消息类型。对于 NMEA 消息,这应该是 `UdPbC` | | Tags | iec-61162-450-nmea.tags | IEC-61162-450 中定义的标签块(`\\` 分隔的字符串) | | Sentence | iec-61162-450-nmea.sentence | 包含航海数据的 NMEA 语句,如 IEC 61162-450 和 NMEA 0183 中所定义 | | NMEA 0183 | nmea-0183 | 使用上述 NMEA 0183 解析器对 NMEA 语句进行嵌套解析 | 如果任何校验和损坏或任何标签的长度超过 IEC 61162-450 中定义的长度,此解析器将显示专家信息。 #### IEC-61162-450-Binary 此解析器解析头部标记为 `RrUdP`、`RaUdP` 或 `RpUdP` 且包含二进制文件片段的 IEC 61162-450 的以下字段: | 字段名称 | 字段 | 描述 | | ------ | ------ | ------ | | Token | iec-61162-450-binary.token | 标识消息类型和传输模式。对于二进制文件传输,这应该是 `RaUdP`、`RrUdp` 或 `RpUdP` | | Version | iec-61162-450-binary.version | 头版本。此解析器是为版本 1 编写的,可能不适用于更高版本 | | Source ID | iec-61162-450-binary.srcid | 发送文件的单元的 ID | | Destination ID | iec-61162-450-binary.destid | 指定目标单元的 ID(如果未给出具体目标,可以是 `XXXXXX`) | | Type | iec-61162-450-binary.mtype | 包含的信息类型:可以是 1 (数据)、2 (查询) 或 3 (确认) | | Block ID | iec-61162-450-binary.blockid | 标识每个可以分片为多个数据报的二进制文件块 | | Sequence Number | iec-61162-450-binary.seqnum | 此数据报中片段的编号。用于二进制文件块的分片和重组。 | | Maximum Sequence Number | iec-61162-450-binary.maxseqnum | 属于此二进制文件块的片段数量 | | First binary fragment | iec-61162-450-binary.firstpacket | 包含第一个片段的数据包的编号和链接,以及该二进制文件块的二进制文件描述符 | | Previous binary fragment | iec-61162-450-binary.prevpacket | 包含前一个片段的数据包的编号和链接 | | Next binary fragment | iec-61162-450-binary.nextpacket | 包含下一个片段的数据包的编号和链接 | 从 IEC-61162-450-Binary 数据包中,包含整个块的第一个二进制文件片段的数据包还包含一个二进制文件描述符。 二进制文件描述符具有几个也可以被解析的字段。 IEC-61162-450-Binary 头中的两个字段指示数据包是否具有二进制文件描述符、类型和序列号。 如果数据包中存在二进制文件描述符,这些字段必须具有以下值: * Type: `iec-61162-450-binary.mtype==1` * Sequence Number: `iec-61162-450-binary.seqnum==1` 如果满足这些条件,二进制文件描述符将始终作为 IEC-61162-450-Binary 的嵌套协议被解析,具有以下字段: | 字段名称 | 字段 | 描述 | | ------ | ------ | ------ | | File descriptor length | binary-file-descriptor.fd_length | 二进制文件描述符的长度 | | File length | binary-file-descriptor.file_length | 整个文件(所有片段)的长度 | | Status of acquisition | binary-file-descriptor.stat_of_acquisition | 错误代码字段 (无错误 = 0) | | Device | binary-file-descriptor.device| 数据源设备二进制值 (介于 1 和 255 之间) | | Channel | binary-file-descriptor.channel | 根据数据源 (设备) 的细分 (介于 1 和 255 之间,默认值 = 1) | | Type length | binary-file-descriptor.type_length | 数据类型字段的长度 | | Data type | binary-file-descriptor.data_type | 描述数据类型和编码的字符串 | | Status and information text | binary-file-descriptor.stat_and_info | 用于附加信息的字符串,每个都以 null 终止 | #### NMEA-2000 虽然 NMEA-2000 基于 CAN-Bus,但 Wireshark 仍然支持 CAN 协议。我们的实现基于 CANBoat [文档](https://canboat.github.io/canboat/canboat.html)和[仓库](https://github.com/canboat/canboat)中提供的信息。NMEA-2000 协议的字段根据其参数组编号 (PGN) 在不同的消息类型之间有所不同。独立于特定 PGN 的协议字段如下所列: | 字段名称 | 字段 | 描述 | | ------ | ------ | ------ | | Parameter Group Number | nmea-2000.pgn | PGN 标识数据包类型。 | | Source | nmea-2000.src | 发送设备的源地址。 | | Destination | nmea-2000.dst | 目标地址。 | | Priority | nmea-2000.prio | 消息的优先级。 | | Data | nmea-2000.data | 消息中包含的原始数据。 | 请注意,特定的 PGN 消息可能会分散在不同的 CAN 消息中。我们的解析器可以对这些消息进行重组。 目前并非所有 PGN 都受支持,某些数据类型(例如 8 字节整数)不受支持。此外,并非所有 PGN 都已被 Canboat 项目描述或完全逆向。我们在 `tests/nmea2000/INFO.md` 中列出了受支持或已验证的 PGN。 如果你想更新 NMEA2000 解析器,你需要执行 `maritime-modules/proto/pgn/pgn.py` 和 `maritime-modules/knownids/pgn.py` 文件。这些文件访问当前的 [Canboat 的 NMEA2000 定义](https://github.com/canboat/canboat/blob/master/docs/canboat.json)并生成 NMEA2000 解析器。 ### BR24 解析器 此插件解析端口 6678、6679 和 6680 上的 UDP 消息,分别用于 BR24 图像、报告和注册消息。字段应与 [./docs/BR24-protocol.md](./docs/BR24-protocol.md) 中提供的描述相匹配。 ### Furuno 解析器 此插件解析具有 Furuno 雷达网络数据包典型头部模式的 UDP 消息。 目前,它仅支持图像数据包,不解析用于控制雷达的 TCP 连接。 字段应与 [./docs/Furuno-protocol.md](./docs/Furuno-protocol.md) 中提供的描述相匹配。 该解析器支持读取以级别 0(由于缺乏样本尚未测试)和级别 3 编码的数据的方位角和航向值。 为了减少内存使用,方位角和航向值被连接成由空格 (" ") 分隔的字符串。 单个 spoke 也可以拆分为单独的子树,显示相应的方位角、航向和编码数据。 可以通过 Wireshark GUI 在以下位置启用它:
`Edit` -> `Preferences` -> `Protocols` -> `FURUNO-IMG` -> Check `Split Spokes`
请注意,这会增加内存使用量,并且默认情况下处于关闭状态。 其他编码或压缩级别尚未实现,仅解析到编码的回波数据为止。 ## 测试 此仓库中包含插件的自动化测试。 这些测试的目的是检查插件是否按预期工作。 通过运行测试,你还可以获得代码覆盖率报告。 ### 测试要求 测试需要额外的依赖项。 你的系统上必须安装以下软件包: * `tshark` * `python3` * `python3-pytest` * `lua` * `luacov` (可选,用于代码覆盖率报告) * `luacov-console` (可选,用于代码覆盖率报告) 在基于 Debian 的系统上,你可以像这样安装 `tshark`、`python3`、`python3-pytest` 和 `lua`: ``` sudo apt-get update sudo apt-get install tshark python3 python3-pytest lua5.3 ``` `luacov` 和 `luacov-console` 可以通过 `luarocks` (https://luarocks.org/) 安装。 这两个软件包仅用于代码覆盖率报告。 如果你不需要覆盖率报告,可以在没有的情况下执行测试。 为了运行测试,不应安装解析器。 这意味着在执行测试时,解析器的 Lua 文件*绝不能*位于 Wireshark 插件目录中。 如果你在运行测试之前已经安装了解析器,则必须从插件目录中删除属于该解析器的所有 Lua 文件。 对于 Unix-like 系统上的标准安装,可以通过以下方式完成: ``` rm ~/.local/lib/wireshark/plugins/iec-61162-450-nmea.lua rm ~/.local/lib/wireshark/plugins/iec-61162-450-binary.lua rm -r ~/.local/lib/wireshark/plugins/iec-61162-450-modules ``` 你可以在运行测试后按照[快速开始](#quick-start)中的说明重新安装解析器。 ### 运行测试 *重要*:只有当解析器*未*安装在插件目录中时,才能执行测试! 如果你已经安装了解析器并想运行测试,请参考上一节[测试要求](#requirements-for-the-tests)。 满足所有要求后,你可以通过执行测试脚本来运行测试: ``` ./tests/test.sh ``` 如果脚本不可执行,你可以使其可执行: ``` chmod +x ./tests/test.sh ``` ## 许可证 Wireshark 插件根据[补充的 MIT 许可证](./LICENSE)授权。
标签:CAN总线, Furuno雷达, ICS, IEC 61162-450, Lua, Navico BR24, NMEA 0183, NMEA 2000, NTLM Relay, PKINIT, rizin, TShark, Wireshark, 句柄查看, 工控安全, 报文解码器, 攻击面映射, 流量解析, 海洋工业, 网络协议分析, 网络安全监控, 网络抓包, 航海协议, 逆向工具, 防御绕过, 驱动开发