無線網路滲透測試是網路安全領域中一個重要的方向,涉及許多技術和工具。瞭解無線網路的運作原理、通訊協定和安全漏洞對於進行有效的滲透測試至關重要。本文從網路攻擊和防禦的基礎開始,逐步探討無線網路滲透測試的各個方面,包括無線網路基本概念、802.11幀格式、管理幀型別、無線網路連線建立流程等。此外,本文還將介紹如何使用 Python 和 Scapy 進行無線網路封包分析,例如捕捉 Beacon 幀以取得 SSID、BSSID 和頻道等資訊,以及偵測連線到特定 AP 的使用者端。這些技術和工具可以幫助安全研究人員和滲透測試人員評估無線網路的安全性,並找出潛在的漏洞。
網路攻擊與防禦 第四章
在前面的程式中,我們看到了一個不斷掃描目前任務的程式。由於我們在程式中定義了30秒的間隔,因此它會每隔30秒掃描一次目前的任務。以下截圖顯示了在Windows工作管理員中執行的torrent服務:
torrent檢測的實作
客戶端機器的torrent服務正在執行。如果客戶端程式發現了一個包含torrent名稱的任務,那麼它就會向伺服器傳送訊息。在客戶端程式中,我們使用了執行tasklist命令的程式碼,就像在命令提示字元中執行一樣,如下所示:
上述截圖顯示了torrent正在執行。如果在客戶端機器上執行torrent,那麼伺服器就會收到以下訊息:
Gotcha! One machine, hostname *OUFM, user .PIJU, and IP address , is using the torrent.
客戶端發送了三個訊息,但我們只顯示了一個。我們使用了UDP,這是一種無連線的協定。伺服器和客戶端都不會知道封包是否在傳輸過程中丟失,這就是為什麼客戶端會傳送三個封包。
為什麼使用UDP而不是TCP?
TCP是一種導向連線的協定。如果伺服器機器宕機,那麼客戶端機器上的程式就會開始出現錯誤。
在隱藏模式下執行程式
首先,我們需要將Python程式轉換為Windows可執行檔。為了將Python程式轉換為Windows可執行檔,我們將使用Pyinstaller。
將Python程式轉換為Windows可執行檔
- 將
TFSWJDFQZ程式碼檔案複製到$=1Z*OTUBMMFS資料夾中。 - 開啟命令提示字元,瀏覽到
$=1Z*OTUBMMFS資料夾,並執行以下命令:
Python pyinstaller.py --onefile <file.py>
在隱藏模式下執行可執行檔
- 建立一個
TFSWJDFWCT檔案,並在檔案中寫入以下內容:
%JN8JO4DSJQU)PTU
4FU8JO4DSJQU)PTU$SFBUF0CKFDU 84DSJQU4IFMM
8JO4DSJQU)PTU3VO$IS 8*/%*3=TFSWJDFFYF$IS
4FU8JO4DSJQU)PTU/PUIJOH
- 只需點選
TFSWJDFWCT檔案,TFSWJDFFYF程式就會在後台執行,沒有圖形介面。
無線網路滲透測試 第五章
無線連線時代帶來了靈活性和行動性,但也引入了許多安全問題。使用有線連線時,攻擊者需要實體存取許可權才能連線和攻擊。在無線連線的情況下,攻擊者只需要訊號可用即可發起攻擊。在繼續之前,您應該瞭解所使用的術語:
無線網路基本概念
- 存取點(AP):用於將無線裝置連線到有線網路。
- 服務集識別碼(SSID):無線LAN的唯一0-32個字母數字識別碼。它是人類可讀的,簡單來說就是網路名稱。
- 基本服務集識別碼(BSSID):無線AP的MAC位址。
- 頻道號碼:代表AP用於傳輸的無線電頻率範圍。
在本章中,我們將涵蓋以下概念:
- 查詢無線SSID
- 分析無線流量
- 檢測AP的客戶端
- 無線解除認證攻擊
- 檢測解除認證攻擊
介紹802.11幀
IEEE定義了802.11和802.11x作為無線LAN技術家族。以下是根據頻率和頻寬的802.11規範:
:在2.4 GHz頻段提供最高1-2 Mbps的頻寬B:在5 GHz頻段提供最高54 Mbps的頻寬C:在2.4 GHz頻段提供最高11 Mbps的頻寬H:在2.4 GHz頻段提供最高54 Mbps的頻寬O:在兩個頻段上提供最高300 Mbps的頻寬
所有元件都屬於媒體存取控制(MAC)層或實體層。MAC層是資料鏈路層的子類別。我們已經在第三章「掃描滲透測試」中介紹了資料鏈路層的協定資料單元(PDU),稱為幀。首先,讓我們瞭解幀格式。中存在三種主要型別的幀:
- 資料幀
- 控制幀
- 管理幀
這些幀由MAC層輔助。下圖描述了MAC層的格式:
內容解密:
上述內容主要介紹無線網路的基本概念和802.11幀格式。首先,我們需要了解無線網路中的基本術語,如存取點(AP)、服務集識別碼(SSID)和基本服務集識別碼(BSSID)。然後,我們介紹了802.11規範和幀格式,包括資料幀、控制幀和管理幀。這些知識是理解無線網路滲透測試的基礎。
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title 無線網路滲透測試技術探討
package "安全架構" {
package "網路安全" {
component [防火牆] as firewall
component [WAF] as waf
component [DDoS 防護] as ddos
}
package "身份認證" {
component [OAuth 2.0] as oauth
component [JWT Token] as jwt
component [MFA] as mfa
}
package "資料安全" {
component [加密傳輸 TLS] as tls
component [資料加密] as encrypt
component [金鑰管理] as kms
}
package "監控審計" {
component [日誌收集] as log
component [威脅偵測] as threat
component [合規審計] as audit
}
}
firewall --> waf : 過濾流量
waf --> oauth : 驗證身份
oauth --> jwt : 簽發憑證
jwt --> tls : 加密傳輸
tls --> encrypt : 資料保護
log --> threat : 異常分析
threat --> audit : 報告生成
@enduml此圖示展示了無線網路基本概念和802.11規範之間的關係,以及802.11幀格式的三種型別。
內容解密:
本章節主要討論無線網路滲透測試的基本概念和技術。首先介紹了無線網路的基本術語,包括存取點、服務集識別碼和基本服務集識別碼。然後,詳細闡述了802.11規範和幀格式,包括資料幀、控制幀和管理幀。這些知識對於理解無線網路的安全性和進行滲透測試至關重要。
Wireless Pentesting Chapter 5:無線網路滲透測試的基礎知識與實作
無線網路通訊架構與管理幀
在無線網路中,裝置之間的通訊是透過各種幀(frame)來完成的。管理幀(management frame)是用於管理無線網路連線的重要組成部分。本章節將探討管理幀的各種子型別及其在無線網路滲透測試中的應用。
管理幀的子型別
管理幀有多種子型別,包括:
- 認證幀(authentication frame)
- 解除認證幀(deauthentication frame)
- 連線請求幀(association request frame)
- 斷開連線幀(disassociation frame)
- 探測請求幀(probe request frame)
- 探測回應幀(probe response frame)
這些幀在客戶端與無線接入點(AP)之間的連線建立過程中扮演著關鍵角色。
無線網路連線建立流程
無線裝置與AP之間的連線建立涉及多個步驟,以下是具體流程:
- Beacon 幀:AP 定期傳送 Beacon 幀以宣告其存在,包含 SSID、頻道號碼和 BSSID 等資訊。
- Probe 請求:無線裝置傳送 Probe 請求以偵測範圍內的 AP,包含 SSID、支援速率等資訊。
- Probe 回應:對應的 AP 回應 Probe 回應幀,包含能力資訊和支援的資料速率。
- 認證請求:客戶端傳送認證請求幀,包含其身份資訊。
- 認證回應:AP 回應認證結果,接受或拒絕。如果存在分享金鑰認證(如 WEP),AP 將傳送挑戰文字,客戶端需將加密後的挑戰文字回傳給 AP。
- 連線請求:成功認證後,客戶端傳送連線請求,包含其特性,如支援的資料速率和 AP 的 SSID。
- 連接回應:AP 傳送連接回應,包含接受或拒絕的結果。若接受,AP 將為客戶端建立一個連線 ID。
使用 Python 進行無線 SSID 查詢和流量分析
在 Kali Linux 環境下,我們可以使用 Python 編寫程式來捕捉無線封包並提取相關資訊。首先,我們需要啟用無線網路卡的監聽模式。
程式碼解析
以下是一個簡單的 Python 程式,用於捕捉 Beacon 幀並提取 SSID、BSSID 和頻道號碼等資訊:
import socket
import struct
import shelve
import sys
# 建立 socket 用於捕捉所有封包
try:
sniff = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)
sniff.bind(("mon0", 0x0003))
except Exception as e:
print(e)
# 定義一個列表用於儲存擷取到的資訊
ap_list = []
# 開啟 shelve 檔案用於儲存資料
s = shelve.open("WirelessData.db")
# 接收 Beacon 幀並提取相關資訊
while True:
try:
packet = sniff.recvfrom(1024)
# 解析 Beacon 幀
if packet[0][0] == 0x80:
source_addr = packet[0][10:16]
# 解析 SSID、BSSID 和頻道號碼
try:
ssid = packet[0][36:].split(b'\x00')[0].decode()
channel = ord(packet[0][38])
bssid = ':'.join('%02x' % b for b in source_addr)
print(f"SSID: {ssid}, BSSID: {bssid}, Channel: {channel}")
ap_list.append((ssid, bssid, channel))
s['data'] = ap_list
except Exception as e:
pass
except KeyboardInterrupt:
s.close()
sys.exit(0)
程式碼解說
- 建立 Socket:使用
socket.socket建立一個原始通訊端,並繫結到監聽模式的網路卡mon0上。 - 接收封包:使用
sniff.recvfrom接收封包,並檢查是否為 Beacon 幀(第一個位元組為0x80)。 - 解析 Beacon 幀:提取 SSID、BSSID 和頻道號碼等資訊,並儲存到
ap_list中。 - 儲存資料:使用
shelve模組將擷取到的資訊儲存到檔案中。
無線網路滲透測試第五章:偵測無線網路裝置與使用者端
在無線網路滲透測試中,瞭解周圍無線網路環境是至關重要的第一步。這包括識別無線存取點(AP)的SSID、MAC位址以及它們所使用的頻道。此外,偵測連線到特定AP的使用者端也是非常重要的。本章將介紹如何使用Scapy,一個強大的Python函式庫,來捕捉和分析無線網路封包,以達到上述目的。
使用Scapy捕捉Beacon幀
首先,我們來寫一個簡單的Scapy指令碼,用於捕捉Beacon幀並提取其中的SSID和MAC位址。Beacon幀是由AP定期發出的,用於宣告其存在和相關引數。
from scapy.all import *
interface = "mon0"
ap_list = []
def info_packet(pkt):
if pkt.haslayer(Dot11Beacon):
if pkt.type == 0 and pkt.subtype == 8:
if pkt.addr3 not in ap_list:
ap_list.append(pkt.addr3)
print("SSID: %s" % pkt.info)
print("MAC: %s" % pkt.addr3)
print("Channel: %s" % ord(pkt[Dot11Elt][3].info))
sniff(iface=interface, prn=info_packet)
程式碼解析:
- 匯入Scapy模組:
from scapy.all import *匯入Scapy的所有功能。 - 設定監聽介面:
interface = "mon0"設定要監聽的無線介面為監控模式(monitor mode)。 - 定義處理函式:
info_packet(pkt)定義了一個函式,用於處理捕捉到的每個封包。 - 過濾Beacon幀:
if pkt.haslayer(Dot11Beacon):檢查封包是否為Beacon幀。 - 提取資訊:從Beacon幀中提取SSID、MAC位址和頻道號,並列印出來。
- 開始監聽:
sniff(iface=interface, prn=info_packet)開始在指定介面上捕捉封包,並將每個封包傳遞給info_packet函式處理。
偵測AP的使用者端
為了偵測連線到特定AP的使用者端,我們需要捕捉Probe Request幀。這些幀是由使用者端發出的,用於請求連線到特定的AP。
from scapy.all import *
interface = "mon0"
probe_req = []
ap_name = raw_input("Please enter the AP name: ")
def probe_sniff(pkt):
client_name = pkt.info
if pkt.haslayer(Dot11ProbeReq):
if client_name == ap_name:
if pkt.addr2 not in probe_req:
print("New Probe Request: ")
print("Client MAC: %s" % pkt.addr2)
print("SSID: %s" % pkt.info)
probe_req.append(pkt.addr2)
sniff(iface=interface, prn=probe_sniff)
程式碼解析:
- 輸入AP名稱:
ap_name = raw_input("Please enter the AP name: ")輸入要偵測的AP的SSID。 - 定義處理函式:
probe_sniff(pkt)定義了一個函式,用於處理捕捉到的Probe Request幀。 - 檢查Probe Request幀:
if pkt.haslayer(Dot11ProbeReq):檢查封包是否為Probe Request幀。 - 提取使用者端資訊:如果Probe Request幀是針對指定的AP,則提取使用者端的MAC位址並列印出來。