raw ソケットから 802.11 パーサーに取り組んでいます。パーサーの目的は、さらに処理するために保持するパケットの量を決定することです。レイヤー 2 のみが保存され、レイヤー 3 以降はすべて削除されます。セキュリティ部分まではすべて順調です。WEP には 4 バイトの「ヘッダー」があり、TKIP と CCMP には 8 バイトのヘッダーがあります。フレームに WEP または TKIP/CCMP ヘッダーがあるかどうかを判断するアルゴリズムを探していますが、Google では見つかりません。WEP が使用されているかどうか、または TKIP または CCMP が使用されているかどうかを判断する必要があるだけです。明らかに、セキュリティ「ヘッダー」の最初の 4 バイトを使用してそうする必要があります。
私が見つけることができた唯一のことは、Impacket の dot11.py にあると判断することです: .
macSz = n # current determination of mac frame size
if flags['protected']:
# pf flag is set
sec = frame[macSz:macSz+4] # get first 4 bytes of msdu
bs = struct.unpack("=4B",sec)
# wep test case returns bs = (231, 1, 0, 0)
# ccmp test case returns bs = (2, 0, 79, 222)
if bs[3] & 0x20:
# using TKIP/CCMP
macSz += 8
else:
# using WEP
macSz += 4
このステートメントを確認するための文献が見つかりません。上記のコードは、私の側で間違っているか、ほとんどの場合、すべてが WEP であると見なされるため機能しません。私が見つけたのは、WEP ヘッダーのバイト 4 の 5 番目のビットがパッド ビットである必要があることです。TKIP では予約済みであり、CCMP では PN2 の一部です。
私の質問は、私がこれを間違ってコーディングしたのか (私は考えていません)、それとも WEP を判断する正しい方法ではないのか、そして後者の場合、動作するアルゴリズムを誰かが知っているのかということです。私は暗号学の専門家ではありません。
scapy を使用すると言う前に、これは最終処理中のオプションである可能性がありますが、オーバーヘッドを消費しすぎてパケットをドロップするため、現時点ではオプションではありません。さらに処理するために渡す暗号化されていないセキュリティ ヘッダーを含む、レイヤー 2 でのパケットのサイズを特定したいだけです。
編集 1: このリンクhttp://www.xirrus.com/cdn/pdf/wifi-demystified/documents_posters_encryption_plotterによると、4 番目のバイトのビット 5 (ゼロ インデックス) に 1 ビットの拡張 IV が存在し、両方の CCMP がおよび TKIP の場合、このビットが設定されます。ただし、上記のコードを機能させることはまだできません。TKIP を識別しているように見えますが、それでも CCMP を WEP として分類しているため、私のバイト順序には何かがあるはずです。引き続き調べてみます
編集 2: バイト順だったようです。テストする 16 進数をコピーして、wireshark でキャプチャしたパケットを使用していました。生のソケットを使用すると動作します