課題は次のようになります:"ICMPv6のマルチキャストリスナのパケットをキャプチャするtcpdumpを/ windumpフィルタを書く"私は答えは非常に複雑にするもので、最大書き込み広範囲を持っている。 あなたがIPv6を知っていると答えをしたい場合は、末尾に進みます。
最初に、いくつかの背景
Steinarは以前の記事にいくつかのコメントを行い、軌道に100%であった。 あなたがそれらを読んで"うわー、それは本当に厄介な音"と思った場合、あなたは同様に問題の範囲を理解する。 ![]()
プロトコル対。 次のヘッダーフィールド
IPv4で我々はオプションのフィールドを持っていた。 これはIPヘッダのサイズは同じ大きさ最大60バイトに20バイトから成長する可能性があります。 IPv6では、オプションのフィールドは、もはや存在しないと、ヘッダーのサイズは40バイトに固定されています。 オプションが必要な場合は、我々はそれらを識別するための拡張ヘッダーを使用してください。 これは、(ほぼ)常に(TCP、UDPなど)上位のトランスポートを特定するためのIPv4プロトコルフィールド(バイト10)を私たちに面白いカーブボールをスローします。 IPv6では、次のヘッダフィールド(バイト6)上位層のトランスポートを識別することもあれば、オプションのいくつかが含まれます拡張ヘッダを識別する場合があります。
ここにあなたがに実行される可能性のあるいくつかのIPv6拡張ヘッダだけでなく、それらを定義するRFCのリストです:
| オプション# | オプション説明 | RFC |
| 0 | ホップバイホップ | 2460 |
| 6 | TCP | 793 |
| 17 | UDP | 768 |
| 43 | ルーティング | 5095 |
| 44 | フラグメンテーション | 2460 |
| 50 | ESP | 4303 |
| 51 | AH | 4302 |
| 58 | ICMPv6の | 4443 |
| 59 | 次ヘッダーなし | 2460 |
| 60 | デスティネーションオプション | 2460 |
| 135 | 移動 | 3775 |
IPv6は、単一のpacket.Thereで使用できる拡張ヘッダの数を制限していませんしかし、ヘッダをレイアウトする方法として公開されて、"推奨される順序"です。 順序は次のとおりです。
- IPv6のヘッダ
- ホップバイホップオプション
- ルーティングヘッダ
- フラグメントヘッダ
- AH
- ESP
- デスティネーションオプション
- モビリティヘッダ
- TCP/UDP/ICMPv6
このリストは、"推奨"が、必須ではありません。 IPv6ホストは、それらが受信されたこれまでどのような順序でヘッダを処理できなければなりません。 これは、おそらくこのリストは、次のベンダーではなく、攻撃者を見つけることを意味します。 私は個人的にデバイスを使用すると、ヘッダの順序を台無しにするときには本当に奇妙な演技開始を見てきました。 実際、私は優先順位が使用されていない場合に対処できない"IPv6の互換性のあるコード"のかなり越えて実行しました。
プロトコルヘッダーを追いかけて
そうIPv6を我々は、IPv6ヘッダーの後ろに複数のヘッダを持つことができます。 新しいコンセプトのようなこの音なら、それは実際にはありません。 実際にはおそらく既にそれを一緒に働いてきた。 これは、IPSecを展開するとき、2つのセキュリティプロトコルはESPとAHです。 これらは、実際にIPv6のから借用し、IPv4上で動作するようにマッサージしていた。 AHとESPの両方は、彼らがprotecting.Thisな種類のパケットを識別するために次のヘッダーフィールドを含めて、効果的にレイヤ3プロトコルのヘッダの後ろに座ってのヘッダが複数あるとして、 プロトコルの連鎖と呼ばれます。
ので、上位のトランスポートが(TCP、UDPなど)が使用されているかを把握するために、あなたは答えを見つける前に複数のヘッダを検索する必要があります。 これは、" ヘッダを追いかけて "、およびtcpdump / Windumpは私たちにこのタスクを実行するには、フィルタオプションを与えるとも呼ばれます。 あなたは、プロトタイプフィルタの作業に慣れていないと厳しいかもしれません。 IPv4の世界では、私が言う場合:
IPプロトTCP
フィルタが読み取る"IPv4ヘッダのバイト9をチェックし、値が6(TCPのプロトコル値)と等しい場合、パケットに一致している"。 IPv6ヘッダのバイト6は上位層の輸送を決めることができるかもしれない、またはそれだけで使用されているオプションの拡張ヘッダを特定する可能性があるため、このフィルタは、もちろんIPv6の世界ではそれほど効果的ではありません。 この問題を解決するために、protochainフィルタが導入されました。 書き込み:
IP6 protochain TCP
値は6に等しいかどうかをIPv6ヘッダのバイト6のチェック"として読み込みます。 オプションの拡張ヘッダーを識別する値を見つける代わりにする場合、6の値の拡張ヘッダの次ヘッダフィールドを確認してください。 あなたがより多くのオプションの拡張ヘッダーを見つけた場合は、最後の拡張ヘッダー"を見つけるまで、最後のテストを繰り返し続ける。
かなり英語で書き込みするための単純な、しかしこれはコードで実装する悪夢です。 ほとんどのオプションの拡張ヘッダーには、単に複雑に長さの変数です。 私はといくつかのテストをやったscapyのと、実際にはprotochainが呼び出されるパフォーマンスの違いを見ることができます。 実際、あなたはおそらくそれが無用の拡張ヘッダーの多くを処理するために強制することにより、IDS / IPSを投与するのはかなり良い仕事をすることができます。
私たちのフィルタを書く
のでチャレンジフィルタを書くのに私たちの最初の問題は、ICMPv6ヘッダーは、IPv6ヘッダーの後に右に表示されない可能性があるということです。 我々は、オプションの拡張ヘッダに注意する必要があります。 実際にはRFC 2710によると:"このドキュメントで説明されているすべてのMLDメッセージはリンクローカルIPv6ソースアドレス、1のIPv6のホップ制限、およびIPv6 Router Alertオプション[RTR - ALERT]ホップバイホップので送信されるオプションヘッダーは、"これは我々のマルチキャストリスナのパケットがRouter Alertオプションが設定されているホップバイホップ拡張ヘッダーを持つ必要があることを意味します。 これを念頭において、私たちの最初のチェックは次のようになります。
IP6 protochain ICMP6
我々は唯一のICMPv6パケットを見ているようにします。 今では単なる型のフィールド(バイト0)130(マルチキャストリスナクエリ)または131(マルチキャストリスナレポート)に設定されているかどうかをチェックする処理の問題です。しかしこれは私たちの第二の問題に私たちをもたらします。 IPv4の世界では私が行うことができます。
ICMP [0] = interest>の<type値
私はICMP6でこれをしようとすると私が得られます。
[ルート@しっちゃかめっちゃか〜]#tcpdumpの- NN ICMP6 [0] = 130
tcpdumpは:IPv6の上位層プロトコルは、プロト[X]でサポートされていません
言い換えれば、私は特定の値を検索するICMP6とオフセットを使用することはできません。 Windumpとtcpdumpは、IPv6の互換性のあるとして宣伝されていますが、IPv4で持っているすべての同じ機能を得ることを期待しないでください。 YUCK!
だから我々は何をしますか? 我々は、オフセットIP6から値を参照するに戻ってください。 言い換えれば、我々は必要なホップバイホップヘッダーを介して、IPv6のヘッダーを介して測定すること、および型のフィールドが130または131に設定されている場合、ICMPv6ヘッダに参照する必要があります。 考慮する点がいくつかあります。
- IPv6ヘッダのサイズは40バイトに固定されています
- ホップバイホップヘッダは変数ですが、ルータアラートセット付き4バイト
- typeフィールドは、ICMPv6ヘッダ内のバイト0になります
そこでここでは、で終わるものです。
IP6 protochain ICMP6と(IP6 [44] = 130またはip6の[44] = 131)
やれやれ! 我々は最終的にそれを得た! または我々がやった?
Q:パケットが追加の拡張ヘッダがある場合はどうなりますか?
:私達のフィルターは動作しません。
Q:ホップバイホップヘッダは、ルータアラートオプションより多くのオプションを設定している場合はどうなりますか?
:私達のフィルターは動作しません。
Q:我々は上記の二つの問題を解決することはできますか?
:tcpdumpの/ WindumpフィルタリングはIF THEN /ループのサポートが追加されていないまで。
我々は通常のMLのトラフィックをキャプチャしたいのであれば、上記のフィルタが正常に動作します。 しかし、我々は我々が同様に攻撃者の奇策をキャッチ確保したい場合、フィルタは飛ぶつもりはない。
我々はこのような何かをしようとした場合:
tcpdumpの- NN - S 1500 - X IP6 protochain ICMP6 |はgrep - iのマルチキャスト> multicast.txt
し、単に形式をlibpcapをするためにそれを変換するためにWiresharkのtext2capツールを使うのか? ここでの問題は、我々は唯一のヘッダ情報を取得するです。 grepは、"マルチキャスト"という単語が含まれているが、その後、パケットの実際の内容であり、その下のすべてのHexをスキップ要約行に一致するようになります。
最終的な答えは:"ハヤからtheyaを取得できません" ![]()
あなたが本当にこのトラフィックを見ることができるようにする必要がある場合は、だから何? IPv6のサポートが成熟するまでは、唯一の100%の方法は、すべてのICMPv6トラフィックを取得してから、手動でそれをソートすることです。
この上で、少なくともそれはの私のビュー。 誰もが実際には100%実用的なソリューションを考え出すことができれば、私はそれを聞くのが大好きだ。


