如何在 mac80211 中使用資料包注入

mac80211 現在允許從使用者空間將任意資料包注入到任何監聽模式介面中。您注入的資料包需要按以下格式組成

[ radiotap header  ]
[ ieee80211 header ]
[ payload ]

radiotap 格式在 ./Documentation/networking/radiotap-headers.rst 中討論。

儘管目前定義了許多 radiotap 引數,但大多數引數僅在接收的資料包上才有意義。以下資訊從 radiotap 標頭中解析,並用於控制注入

  • IEEE80211_RADIOTAP_FLAGS

    IEEE80211_RADIOTAP_F_FCS

    FCS 將被移除並重新計算

    IEEE80211_RADIOTAP_F_WEP

    如果金鑰可用,則幀將被加密

    IEEE80211_RADIOTAP_F_FRAG

    如果幀長度超過當前分片閾值,則將被分片。

  • IEEE80211_RADIOTAP_TX_FLAGS

    IEEE80211_RADIOTAP_F_TX_NOACK

    即使幀是單播幀,也應傳送幀而不等待 ACK

  • IEEE80211_RADIOTAP_RATE

    傳輸的傳統速率(僅適用於沒有自己速率控制的裝置)

  • IEEE80211_RADIOTAP_MCS

    傳輸的 HT 速率(僅適用於沒有自己速率控制的裝置)。還會解析一些標誌

    IEEE80211_RADIOTAP_MCS_SGI

    使用短保護間隔

    IEEE80211_RADIOTAP_MCS_BW_40

    以 HT40 模式傳送

  • IEEE80211_RADIOTAP_DATA_RETRIES

    當使用 IEEE80211_RADIOTAP_RATE 或 IEEE80211_RADIOTAP_MCS 時的重試次數

  • IEEE80211_RADIOTAP_VHT

    VHT mcs 和傳輸中使用的流數(僅適用於沒有自己速率控制的裝置)。還會解析其他欄位

    標誌欄位

    IEEE80211_RADIOTAP_VHT_FLAG_SGI:使用短保護間隔

    頻寬欄位
    • 1:使用 40MHz 通道寬度傳送

    • 4:使用 80MHz 通道寬度傳送

    • 11:使用 160MHz 通道寬度傳送

注入程式碼還可以跳過所有其他當前定義的 radiotap 欄位,從而方便直接重放捕獲的 radiotap 標頭。

這是一個有效的 radiotap 標頭示例,定義了一些引數

0x00, 0x00, // <-- radiotap version
0x0b, 0x00, // <- radiotap header length
0x04, 0x0c, 0x00, 0x00, // <-- bitmap
0x6c, // <-- rate
0x0c, //<-- tx power
0x01 //<-- antenna

ieee80211 標頭緊隨其後,例如如下所示

0x08, 0x01, 0x00, 0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x13, 0x22, 0x33, 0x44, 0x55, 0x66,
0x13, 0x22, 0x33, 0x44, 0x55, 0x66,
0x10, 0x86

最後是有效負載。

在組成資料包內容後,透過 send()-ing 將其傳送到處於監聽模式的邏輯 mac80211 介面。也可以使用 Libpcap(這比完成將套接字繫結到正確介面的工作更容易),如下所示:

ppcap = pcap_open_live(szInterfaceName, 800, 1, 20, szErrbuf);
...
r = pcap_inject(ppcap, u8aSendBuffer, nLength);

您還可以在此處找到指向完整注入應用程式的連結

https://wireless.wiki.kernel.org/en/users/Documentation/packetspammer

Andy Green <andy@warmcat.com>