OT セキュリティ問題のトラブルシューティングにおける通常とは異なるプロトコルの解析に関する最近のブログでは、Cisco Nexus プロトコルをユースケースとして使用し、リバースエンジニアリングプロセスにおいて Wireshark プラグインがどのように役立つかを紹介した。
この投稿では、ターゲットとなる通信スキームを適切に分解するよう我々のツールに指示するために活用できる、特殊な一連の機能に関連する別の興味深いレイヤー2プロトコルに焦点を当てる。
この旅では、Ruggedcomスイッチとそのプロビジョニング・ツールの間で使用されている未知のプロトコルを分析し、適切なコンフィギュレーションを確認する必要があった。このプロトコルは RUGGEDCOMディスカバリープロトコル (RCDP).
このようなデバイスは産業分野で人気があるため、私たちはRuggedcom ROSデバイスで使用されているレイヤー2プロトコルを解析することにしました。特に、プロトコルの内部構造ではなく(面白い部分を台無しにしたくないので)、Wiresharkにどのように指示すればプロトコルを適切に検出し、解析プロセスを開始できるかに焦点を当てました。
なぜ解剖を延期するのか?
分析に使用したセットアップは以下の通りだ:
- ラギッドコムスイッチ RS910
- RCDPディスカバリーツール
ディスカバリー・ツールによって、いくつかの主要な機能を起動させることができ、その結果、ディープ・ダイブ分析のためにPcapsを収集することができた。プロトコルはこのように見えた:
おわかりのように、今回Wiresharkは起こっている通信を完全に把握しているわけではない。
最後のデコードされたフレームは、通常MAC(レイヤ2)レイヤとネットワークレイヤの間のリンクとしてよく知られているLLCフレームを示している。
私たちの目標は、データの内容を完全に理解することだった。
RCDPプロトコルを完全に分解するために行ったリバース・エンジニアリングのプロセスについては、ここでは割愛する。その代わりに、未知のプロトコルをどのように分析し、プラグインを開発するために必要な指標を集めたかを紹介しよう。
LLCのフレーム内部を調べることで、この特定のレイヤーの解剖において、ツールが完全に不正確ではなかったと推測させる最初の証拠が見つかった。
llc.pidはプロトコルをタグ付けするためのかなり信頼できる指標であるようだ。しかし、一つ疑問が残った。現在の解剖と重複することなくデータ・フィールドにアクセスするにはどうすればいいのだろうか?
ポストディセプターの使用
私たちを大いに助けてくれる興味深いコンセプトは、いわゆるポストディセクターに関するものだ。この種のプラグインを活用することで、「通常の」ディセクタがすべて仕事を終えた後に、解剖を開始することができる。これにより、解剖ツリーの一番下に結果を追加することができます。
ヒント: 複雑なメカニズムを理解するのに行き詰まった場合、Wiresharkには有名なstackoverflowの独自バージョンであるask.wiresharkがあることを思い出してください。ここに 例.
ポストディセクタを呼び出す最も簡単な方法は、標準的なDissector.Table.get()ではなく、スクリプトの一番下にあるregister_postdissector()関数を使うことだ。
-- プロトコルフィールドの初期化rcdp_proto = Proto("RCDP", "Siemens RCDP")-- RCDP PROTOCOL IDlocal RCDP_PID = 0x01e6-- main functionfunction rcdp_proto.dissector(buffer, pinfo, tree)length=buffer:len()if length == 0 then return endend-- RCDPポストディセクタの登録register_postdissector(rcdp_proto)
次に、カスタム LLC プロトコル ID(0x01e6)を検出するたびに、現在のスクリプトをバインドするように指示する必要があります。そのためには、上フレームのプロトコル ID と Data セクションを参照する 2 つの変数を初期化する必要があります。
ヒント: Wiresharkのフィルタは、ディセクタのコンテキストでもかなり役に立つ!
llc.pidを参照すれば、RCDPプロトコルのタグ付けに必要な条件を簡単に追加できる。
この段階では、LLC Dataセクションにバッファを登録するだけである。あとは通常通り、ディセクションを追加していけばいい。
-- プロトコルフィールドの初期化rcdp_proto = Proto("RCDP", "Siemens RCDP")-- RCDP PROTOCOL IDlocal RCDP_PID = 0x01e6-- LLCフレームを参照local llc_pid = Field.new("llc.pid")local data_data = Field.new("data.data")-- main functionfunction rcdp_proto.dissector(buffer, pinfo, tree)length=buffer:len()if length == 0 then return end-- 現在のプロトコルID値を取得し、それがRCDPかどうかをチェック onelocal llc_pid_ex = llc_pid()if llc_pid_ex == nil or llc_pid_ex.value ~= RCDP_PIDthen returnendpinfo.cols.protocol = rcdp_proto.name-- バッファを正しい位置にセットlocal buf = data_data().range()local buf_len = buf:len()local subtree = tree:add(rcdp_proto, buf(0, buf:len()), "RCDP Protocol Data")end-- RCDPポストディセクタの登録register_postdissector(rcdp_proto)RCDPポストディセクタを登録する。
Wiresharkにプロトコルの解析を指示する
このアプローチを使うと、前回見た標準的な解析の直後に、Wiresharkにプロトコルを解析するよう適切に指示することができる。これがポストディセクタの動作であり、RCDPプロトコルのような実際のユースケースでどのようにそのロジックを適用できるかを示している。
この時点で、Ruggedcom Explorerユーティリティで遊びながら、内部のプロトコル構造を調べ始めることができます。例として、主要なアセット詳細を抽出してみましょう。
そのためには、診断ツールのオートディスカバリー機能を起動し、生成されたトラフィックの解析を開始する必要がある。
ヒント:ツールのUIは、未知のプロトコルについて理解を深めたいときの強い味方になる。
Nozomi Networks ラボにセットアップされたスイッチをツールが発見するとすぐに、それに関する興味深い詳細を収集することもできる。
検索された通信をある程度理解した後、構造化された方法で視覚化された製品情報を抽出できるように、ディセクタを簡単に改良することができる。最終的な結果は、通信全体の完全な解析である。
Nozomi Networks ラボグローバル研究コミュニティのサポート
プロトコルのディセクタに関するこの2回目のブログでは、プラグインでpostdissectorの概念を活用し、WiresharkにディセクタをRuggedcomスイッチとその監視ツール間で使用されているプロトコル(以下 RUGGEDCOMディスカバリープロトコル (RCDP).
LLCフレーム内で公開されたカスタムプロトコルIDを使用し、適切なオフセット位置で解剖を開始することができた。
データ内容を完全に理解するという目標を達成するために、我々はポストディセクタのトリガーや上位フレームを呼び出すために、以下のような主要な関数を使用した:
- register_postdissector(v1)
- Field.new(v2)
- 抽出フィールドの値
- 抽出フィールド.range()
私たちは、グローバルなセキュリティ・コミュニティが、私たちの提案やテクニックを使って、それぞれの分析や研究プロジェクトを進めてくれることを願っています。次回のNozomi Networks Labs ブログにご期待ください。ランサムウェア、ICS、IoT の脆弱性などに関する洞察については、OT/IoT セキュリティレポート2021年7月号、および以下の関連オンデマンドウェビナーをご覧ください。
参考文献
- https://cache.industry.siemens.com/dl/files/793/82169793/att_66887/v1/ROS_RS920L_User-Guide_EN.pdf
- https://new.siemens.com/global/en/products/automation/industrial-communication/rugged-communications/ruggedcom-portfolio/software/explorer.html
- https://www.siemens-pro.ru/docs/ruggedcom/EXPLORER_User-Guide_EN.pdf
- https://www.wireshark.org/docs/wsdg_html_chunked/lua_module_Proto.html
- https://wiki.wireshark.org/Lua/Examples/PostDissector
- https://github.com/NozomiNetworks/dissectors