Decemberのアーカイブ、2009

ICMPv6のチャレンジ-回答

2009年12月13日

課題は次のようになります:"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%実用的なソリューションを考え出すことができれば、私はそれを聞くのが大好きだ。

IPルックアップが完了しました

2009年12月10日

ちょうど私がAppleのApp Storeに提出したことを新しいツールIPルックアップと呼ばれるが終了しました。 運が良ければ、それは来週かそこらで日の光が表示されます。

私が知っている、たくさんのTCP / UDPポートを参照するのはそこにあります。 私はこのほとんどの完全なリストが利用できるように試みた。 そこに12000エントリを超える現在で、私はまだリストを拡大しています。

私が特に挑もういる機能の一つは、リアルタイム検索です。 あなたが探しているものの入力時に結果を表示できるように、リストがリアルタイムでフィルタリングされます。

screenshot-2

詳細は私ので見つけることができるモバイルセキュリティハックサイト。

そして今、戻ってあなたのコマーシャルフリー教材に。 ;)

ICMPv6のチャレンジ-ヒント

2009年12月9日

OK、ここでは正しい方向を指すようにヒントです。

課題は次のようになります:"ICMPv6のマルチキャストリスナのパケットをキャプチャするtcpdumpを/ windumpフィルタを書く"

簡単そうに見えるけど、本当?

Googleからの少し助けを借りれば、マルチキャストリスナーのための"型は"130であることがわかります、とICMPv6タイプフィールドは、ヘッダの最初のバイトです。 ので、これはできるだけ簡単にする必要があります。

tcpdumpの- NN - P - V - S 0 icmp6の[0] = 130

あなたがコマンドを実行する場合しかし、あなたが戻って得られます:

tcpdumpは:IPv6の上位層プロトコルは、プロト[X]でサポートされていません

言い換えれば、あなたはすべてのICMPv6パケットを見て"icmp6の"使用することはできますが、ICMPv6ヘッダのフィールドの任意の上でのフィルタリングを使用することはできません。

だから我々は"プランB"が必要です。 プランBを把握し、課題を解決した。 :)

ICMPv6のチャレンジ

2009年12月4日

前回からIPv6課題を踏まえ、私はあなたのために新しいものを持っている。ICMPv6のマルチキャストリスナのパケットをキャプチャするtcpdumpを/ windumpフィルタを作成する。

それはこれだけです! とても簡単、右? ;)

週末チャレンジ-回答

2009年12月3日

木曜日、今その井戸ので、私は先週末の課題に対する回答を投稿するには、その時間を考え出した。 ;)

あなたがそれを導入開始していない場合、最初に、なぜあなたも、IPv6のか注意すべきことはありますか? 私はクライアントのネットワーク内で秘密の通信チャネルとして使用されているIPv6を見つけたまで私はほとんど同じように感じた。 データはその後のTeredo経由でインターネットに押し出されていた。 あなたがこのテクニックに精通していない場合は、スコットホッグが持ついくつかの優れた投稿トピックについてを。

ですから、現時点ではIPv6を使用していない場合でも、それは技術で治療を切るだけでなく、ローカルネットワーク上での監視を開始するために支払う。

そう確認し、課題であった。

DB8:::〜2001 10:DB8::20 2001年のソースIPv6アドレスを持つすべてのトラフィックをキャプチャするtcpdumpやWindumpフィルタを書く。

このフィルタを書くと注意点がいくつかあります。 最初のいくつかの私は前回の記事で覆われて。 私はかなり頻繁にIPv6を使い始めたまで私は知っていたが、実際に考えたことがない最後の1つが、問題だった、tcpdumpを/ Windumpだけあなたが1、2または4バイトのマスクを使用できるようになるということです。 一方私たちは、"IP6 [8時14分] ="、我々は我々が4バイトに制限されることができないための最初のフィルタステートメントでこれを解決するのが大好きだ。 そこにこれを回避する方法は、実際にはですが、私はそれに戻って来ます。

だからここは私が働いているフィルタです。

(IP6 [午前8時04分] = 0x20010db8およびip6 [12:4] = 0とip6 [16時04] = 0と(IP6 [20時04分]> = 0 × 0010とip6 [20:04] <= 0050 ))

少し長いが、動作します。 エリザベスは、はるかに洗練された自分よりも解決策を考え出した。

SRCネット2001:DB8::/ 122およびip6 [23]> = 0 × 10&&IP6 [23] <= 0 × 20

ので、libpcapフォーマットで起動することによって、彼女は一つに私の最初の3つのステートメントを組み合わせることができるでしょう。 サイズの女王であるが、それは彼女の解決策は私よりもはるかに短いですにではない。 このケースではそれは良いことだ。 :)

それはそれについてです。 私は明日、別のIPv6型の課題を掲載します。

ミークレイジー呼ぶ...

2009年12月1日

しかし、私はPaulDotComの乗組員でポッドキャストを行うことに合意しました。 ああ狂気が結果として起きることができます。

それは8:30 ESTに今週の金曜日になります。 詳細はここで見ることができます。

http://www.pauldotcom.com/

あなたに同調したことがない場合、あなたが欠けているのか見当がつかない。 確かにネットワークのセキュリティは深刻なビジネスですが、エッジを通過さ保つためにユーモアのセンスを持っている必要があります。 ポッドキャストは、ニュースや側面に追加された笑いの良好な混合物と情報の宝庫です。 "モンティパイソンはビールで...チェイニーを満たしている"とあなたのアイデアを得ると思います。 ;)

あなたはに調整願っています!

週末チャレンジ-ヒント

2009年12月1日

うわー、コオロギの音が耳をつんざくようなさ。 きっと誰かがこのジレンマを介して私たちを得るためのスキルを持って? ;)

[OK]を、いくつかのヒントは挑戦する手順を取得する。 IPv4アドレスとしてこれを解くことによって起動し、我々は、IPv6に私達のような機能を紹介してみましょう。 192.168.1.20 - 我々はキャプチャしたいアドレス範囲が192.168.1.10であると仮定します。 大きな問題は、IPアドレスが偶数バイト境界上にないです。 我々は、ようにすることができます。

SRCネット192.168.1.0/27

、我々は実際に見ていたよりも多くのIPを0.31 - それが私たちのアドレス0.0を与えるだろう。 この問題を解決するために我々はいくつかの演算子とプリミティブを使用する必要があります。 一つの可能​​性は、次のとおりです。

(IP [12] = 192とIP [13] = 168およびIP [14] = 1と(IP [15]> = 10およびIP [15] <= 20))

最も内側の括弧から始まる、上記の文は"バイト15が10以上でなければなりません読み取りますが、それはまた、より小さいまたは20以下である必要があります。 この文がtrueの場合、バイト12が192に等しくなっていることを確認、バイト13が168に等しく、バイト14が1に等しいです。"

我々は、この式を短縮することはできますか? 絶対に! まず、しかし六角に変換する必要があります。 なぜ六角? 私のような文書き込む場合は"IPを[12時02分] ="tcpdumpは、結果は16ビットの数値ではなく 、2つの8ビットの数値になると仮定します。 これは、"TCP [2:02] = 12345"のようなものを書くことができる、それが動作している理由です。 tcpdumpは、16ビットの値に2バイトに変換し、指定した値と照合して一致する。 六角に変換することによって我々はこの問題を回避する。 だから:

192.168.1.10 = 0xC0A8010A

192.168.1.20 = 0xC0A80120

今我々は単に私たちの式を記述します。

IP [12:4]> = 0xC0A8010AとIP [12:4] <= 0xC0A80120

それはそれでおしまいです。

IPv4アドレスは4バイトのアドレスを使用しますが、IPv6では16バイトを使用しています。 アドレスは非常に長いので、我々はいくつかのスペースを節約するには、Hexでそれらを書く。 だから私は挑戦にあなたに与えたアドレスは次のとおりだった:

2001:0 DB8:0000:0000:0000:0000:0000:0010

2001:0 DB8:0000:0000:0000:0000:0000:0020

私は最初にそれらをそのように書いていない注意してください。 IPv6アドレスを記述する際にスペースを節約するために使用できるいくつかの規則があります。 最初に、我々は、先頭にゼロを切り捨てることができます。 だから:

2001:0 DB8:0000:0000:0000:0000:0000:0010

になります:

2001:DB8:0000:0000:0000:0000:0000:10

今、途中でそれらすべてのゼロを参照してください? 我々は、あまりにもそれらを切ることができる。 と表示されたら、"::"それは16バイトに戻ってアドレスを展開するのに十分なゼロで、そのスペースを埋めることを意味します。 ので、同様にこのトリックに追加して、我々が得られます。

2001:DB8::10

書き込みする方がはるかに簡単。 注意事項は、唯一の二重コロンのトリックとゼロの1つのグループを削除することができますです。 次のアドレスを考えてみます。

2001::1234::10

我々は、アドレスに"1234"バイトのシーケンスを置くには考えている。 それは、バイトから12バイト6のどこからでも始める。

上記の例で示すように、IPv4で作業する場合、tcpdumpとWindumpは、プロトコルのキーワード"IP"を使用してください。 へのIPv6のお世辞は、"IP6"である。 IPv6ヘッダのソースアドレスフィールドはどこにありますか? さて、私はあなたにそこにすべての答えを与えることができないか、それはもはや"挑戦"です。 :)