この課題は、それがあるべきよりも難しいようなら、あなたは正しい軌道に乗っています。 
私の書くとき、私はこの問題偶然パケットデコードツールを。 私は言わなければならない、それは私が実際にtcpdumpとあらゆる可能なIP、TCP、UDPおよびICMPフィールドおよび/または値のWiresharkのフィルタの作成について考えたことがないように、私のためのクールな練習だった。 はるかにTCPオプションフィールドは、他のIPのフィールドよりもパケットのデコードの観点から最も"壊れた"です。
最初のTCPオプションは実装されている方法について説明しましょう。 あなたがIPv4のオプションフィールドを見れば、それは"型"の識別子で始まります。 特定のIPオプションに興味があるなら、それはちょうどビットの組み合わせでは、このフィールドをチェックするだけです。 TCPオプションをこのように実装されて、この課題は単純明快だっただろうしていた。
ちょうど約すべてのTCPオプションのサイズは1バイトが、どちらも"種類"と"長さ"フィールドを、持っている。 例外は唯一のKindフィールドを持っている"オプションリストの終わり"と"ノーオペレーション"であり、したがって、サイズが1バイトです。 ここに一般的なTCPオプションのリストです:
の15ページのRFC 793は、 "TCPヘッダは(オプションを含む一つでも)は32ビット長の整数です。"を教えてくれる言い換えれば、バイトのTCPヘッダのサイズは、4(20バイト、24バイトで割り切れる必要がありますなど)。 あなたがTCPオプションのリストを見れば、唯一の"最大セグメントサイズが"4の倍数です。 したがって、任意の他のオプションの使用は、パディングを必要としている。
パディングは、どのように適用されるべきビットは不明である。 我々は26ページを見ればRFC 1323我々はこれを見つける:
付録A:実装提案
次のレイアウトが非SYN上でオプションを送信するために推奨されています
32ビットおよび64ビットの最大可能なアラインメントを達成するためにセグメントを、
マシン。
+--------+--------+--------+--------+
| NOP | NOP | TSopt | 10 |
+--------+--------+--------+--------+
| TSvalタイムスタンプ|
+--------+--------+--------+--------+
| TSecrタイムスタンプ|
+--------+--------+--------+--------+ ご想像のようにNOPのパディングは最後ではなく、タイムスタンプオプションの前に表示されますに注意してください。 また、RFCは、特にこれは"非SYNセグメント"のためであり、それは、"推奨"必要ないことを言って注意してください。 しかし、そのほとんどのオペレーティングシステムがこの勧告に従うと、常に種類と長さのバイトの前にパディングを置くようである。 私はWindowsやLinux、Mac、さまざまなハードウェア、などをチェックし、それらはすべて先頭にパディングを置く。
だから我々は右、これは"標準"であることに数えることができる? はなく、かなり。 RFC 793の17ページには、NOP、この方法を説明します。
このオプションのコードは、たとえば、オプションの間に使用することができます
ワード境界上に後続のオプションの先頭に合わせます。
送信者がこのオプションを使用するという保証はありませんので、
彼らが行う場合でも、受信機は、オプションを処理するために準備する必要があります
ワード境界で開始されません。 言い換えれば、そのNOPがまたは開始時に表示されない場合がありますだけではなくこと、NOPはまったく使用されないことがあります! それはないNOPのパディングをレイアウトするためにTCPオプションのフィールド完全に合法で、ちょうど適切な境界を達成するために最後にフィラーとしてオプションのリストの最後を使用してください。
だから我々は、フィルタ用になってしまうのですか? 我々はオプションの前にNOPを数える場合、我々はこのようなフィルタになってしまいます。
TCP [13]&2 = 2とtcp [12]&240> 80と((TCP [20] = 1とtcp [21時02] = 0 × 0303)または(TCP [24] = 1とtcp [25:2 ] = 0 × 0303)または(TCP [28] = 1とtcp [29:2] = 0 × 0303)または(TCP [32] = 1とtcp [33:2] = 0 × 0303)または(TCP [ 36] = 1とtcp [37:2] = 0 × 0303)または(TCP [40] = 1とtcp [41:2] = 0 × 0303)または(TCP [44] = 1とtcp [45:2 ] = 0 × 0303)または(TCP [48] = 1とtcp [49:2] = 0 × 0303)または(TCP [52] = 1とtcp [53:2] = 0 × 0303)または(TCP [ 56] = 1とtcp [57:2] = 0 × 0303))
このフィルタは何をしているかを打破するには:
- TCP [13]&2 = 2:のみSYN&SYN / ACKパケットをチェックする
- TCPヘッダは、以上の20バイト(オプションが設定されている)です:TCP [12]&240> 80
- NOPのための各4バイトの境界の最初のバイトをチェック:TCP [20] = 1、TCP [24 = 1、...
- カインド= 3と長さ場合= 3を参照するために次の2バイトをチェック:TCP [21:02] = 0 × 0303、TCP [25:2] = 0 × 0303、...
しかし、我々は、システムが我々になってしまうNOPを実装していない場合に我々はすべての可能性をキャッチようにするには:
TCP [13]&2 = 2とtcp [12]&240> 80と(TCP [20時02] = 0 × 0303またはTCP [夜9時02分] = 0 × 0303またはTCP [22:02] = 0 × 0303またはTCP [23:02] = 0 × 0303またはTCP [24:2] = 0 × 0303またはTCP [25:2] = 0 × 0303またはTCP [26:2] = 0 × 0303またはTCP [27:2] = 0 × 0303またはTCP [28:2] = 0 × 0303またはTCP [29:2] = 0 × 0303またはTCP [30:2] = 0 × 0303またはTCP [31:2] = 0 × 0303またはTCP [32:2] = 0 × 0303またはTCP [33:2] = 0 × 0303またはTCP [34:2] = 0 × 0303またはTCP [35:2] = 0 × 0303またはTCP [36:2] = 0 × 0303またはTCP [37:2] = 0 × 0303またはTCP [38:2] = 0 × 0303またはTCP [39:2] = 0 × 0303またはTCP [40:2] = 0 × 0303またはTCP [ 41:2] = 0 × 0303またはTCP [42:2] = 0 × 0303またはTCP [43:2] = 0 × 0303またはTCP [44:2] = 0 × 0303またはTCP [45:2] = 0 × 0303またはTCP [46:2] = 0 × 0303またはTCP [47:2] = 0 × 0303またはTCP [48:2] = 0 × 0303またはTCP [49:2] = 0 × 0303またはTCP [50 :2] = 0 × 0303またはTCP [51:2] = 0 × 0303またはTCP [52:2] = 0 × 0303またはTCP [53:2] = 0 × 0303またはTCP [54:2] = 0 × 0303またはTCP [55:2] = 0 × 0303またはTCP [56:2] = 0 × 0303またはTCP [57:2] = 0 × 0303またはTCP [58:2] = 0 × 0303)
このフィルタとの違いは、我々にはKind = 3と長さ= 3オプションのフィールドを介してすべての道を(エリザベスが示唆したように)チェックしているということです。
これらのいずれかのフィルタの誤検知を生成することはできますか? 絶対に! 二つの可能性:
- タイムスタンプの値は我々が探しているパターンに一致する場合があります。
- フィルタは、40バイトのオプションのフィールドを想定しています。 それは、ペイロードにこれらの値を使用して小さくなります。
フィルタはどのように使うべきでしょうか? 最初は少ない偽陽性を生成しますが、RFC準拠が標準とは異なるシステムを欠場する。 それが設定されている場合は二つ目は、常にウィンドウスケールをキャッチしますが、偽陽性の可能性が高いです。
私は挑戦の勝者としてエリザベスを指定するつもりです。 いくつかの他は同じくらい近くにいたが、彼女がコメントしている思考の彼女の列車を投稿する勇気を持つだけだった。 私は部分的に周りの冗談は、この解決策を思い付いたのジェフの2番目の賞を授与するつもりです。
tcpdumpの- NN | grepは"wscale'> wscale - matches.txt
これは、実際のパケットキャプチャを生成しませんが、あなたは何ができる:
tcpdumpの- NN - X - S 0 | grepは"wscale'> wscale - matches.txt
して、pcap形式にそれを取り戻すためにtxt2capを通じて出力を実行します。 彼は特に挑戦に従っていませんでしたが、これはすべての偽陽性の問題を修正するようにボックスの外側で考えることで名声を与えるちゃ。 
エリザベスとジェフが、私は電子メールでの両方に接触することができます。 おめでとう!