La manipulación de protocolos de red es una habilidad clave para los profesionales de la ciberseguridad y administradores de redes. Scapy es una herramienta poderosa de Python que permite construir, enviar, recibir y analizar paquetes de red con gran flexibilidad. A lo largo de este artículo, profundizaremos en el uso avanzado de Scapy para la manipulación de protocolos de red, cubriendo desde la creación y manipulación de paquetes personalizados hasta el análisis detallado de tráfico.
Scapy es una librería escrita en Python que facilita la creación y manipulación de paquetes de red de diversos protocolos como TCP/IP, ARP, ICMP y más. Además de construir y enviar paquetes, Scapy permite a los usuarios realizar análisis de tráfico y responder a eventos de red en tiempo real. Esta herramienta es utilizada frecuentemente en auditorías de seguridad, pruebas de penetración y para la comprensión profunda del comportamiento de los protocolos.
Para comenzar, es necesario instalar Scapy en el entorno de desarrollo. Puede instalarse fácilmente usando pip
:
pip install scapy
Si se requieren capacidades más avanzadas o soporte para otros protocolos, se recomienda instalar la versión completa de Scapy:
pip install scapy[complete]
Para utilizar Scapy en scripts de Python, simplemente se debe importar la librería de la siguiente manera:
from scapy.all import *
Esto importa las funciones principales y los protocolos comunes, como IP, TCP, UDP y otros.
La estructura fundamental de Scapy está basada en la creación y manipulación de paquetes individuales. A continuación, se muestra cómo crear un paquete IP básico con el protocolo ICMP:
packet = IP(dst="192.168.1.1")/ICMP()
Este ejemplo crea un paquete IP con destino a la dirección 192.168.1.1
y un mensaje ICMP adjunto (usualmente utilizado en comandos ping
). La estructura se basa en la concatenación de capas (/
), donde cada capa se apila sobre la anterior. La capa superior es siempre la primera en ser creada, como IP
, seguida de capas de transporte como ICMP
, TCP
o UDP
.
Cada capa de un paquete en Scapy tiene atributos que pueden ser modificados de manera independiente. Por ejemplo, si se desea cambiar la dirección IP de origen:
packet.src = "10.0.0.2"
Esto cambia el campo de dirección de origen a 10.0.0.2
, permitiendo falsificar la procedencia de los paquetes.
Scapy permite un control detallado sobre los campos de los paquetes TCP, como números de secuencia, banderas y puertos:
tcp_packet = IP(dst="192.168.1.1")/TCP(dport=80, flags="S", seq=12345)
En este ejemplo, se crea un paquete TCP con una bandera SYN
, utilizada para iniciar conexiones, con un número de secuencia personalizado (seq=12345
).
dport
: Puerto de destino.
sport
: Puerto de origen.
flags
: Banderas TCP (S
, A
, F
, R
, etc.).
seq
: Número de secuencia.
ack
: Número de reconocimiento.
El envío de paquetes en Scapy se realiza con la función send()
o sendp()
, dependiendo del nivel de la capa (IP o Ethernet). Por ejemplo:
send(tcp_packet)
Esto envía el paquete creado anteriormente a través de la red. También se puede usar sr()
y sr1()
para enviar y recibir respuestas.
Scapy no solo permite la creación de paquetes, sino también la captura y análisis de tráfico. La función sniff()
captura paquetes que coinciden con ciertos filtros y puede usarse para crear scripts personalizados de análisis.
sniff()
La sintaxis básica para capturar paquetes es:
packets = sniff(count=10, filter="tcp and host 192.168.1.1")
Esto captura 10 paquetes que correspondan a tráfico TCP hacia la dirección 192.168.1.1
. Los parámetros comunes de sniff()
son:
count
: Número de paquetes a capturar.
filter
: Expresión de filtro BPF (similar a tcpdump
).
iface
: Interfaz de red (por defecto usa la primera).
show()
Cada paquete capturado puede analizarse utilizando la función show()
de Scapy, que despliega la estructura interna del paquete:
packets[0].show()
Esto muestra los campos de cada capa del primer paquete capturado, permitiendo entender mejor los atributos del tráfico de red.
Una característica avanzada de Scapy es la capacidad de modificar paquetes capturados y reenviarlos. Por ejemplo, cambiar el puerto de destino de un paquete TCP:
packets[0][TCP].dport = 8080
send(packets[0])
Esto puede ser utilizado para manipular tráfico en pruebas de seguridad, ataques de intermediario (Man-in-the-Middle) o pruebas de configuración de red.
La falsificación de paquetes se utiliza en muchas pruebas de seguridad para simular ataques como suplantación de IP (IP Spoofing) o envenenamiento ARP. A continuación, un ejemplo básico de cómo realizar IP Spoofing:
spoofed_packet = IP(src="10.0.0.1", dst="192.168.1.1")/TCP(dport=80, flags="S")
send(spoofed_packet)
Este paquete parece provenir de 10.0.0.1
, pero en realidad se envía desde la máquina local. Este tipo de técnicas requiere precaución y un entorno controlado para evitar consecuencias no deseadas.
Scapy soporta el manejo de tramas a nivel 2 (capa de enlace), lo que permite la manipulación de tramas 802.11. Por ejemplo, para desautenticar un cliente de una red Wi-Fi:
deauth_packet = RadioTap()/Dot11(addr1="ff:ff:ff:ff:ff:ff", addr2="00:11:22:33:44:55", addr3="00:11:22:33:44:55")/Dot11Deauth()
sendp(deauth_packet, iface="wlan0", count=100)
En este script, se inyectan 100 tramas de desautenticación (Dot11Deauth
) a través de la interfaz wlan0
.
sniff()
Scapy permite reaccionar a eventos en tiempo real. Un ejemplo sería responder a pings ICMP automáticamente:
def icmp_reply(packet):
if packet.haslayer(ICMP) and packet[ICMP].type == 8: # ICMP Echo Request
reply = IP(dst=packet[IP].src)/ICMP(type=0, id=packet[ICMP].id, seq=packet[ICMP].seq)
send(reply)
sniff(filter="icmp", prn=icmp_reply)
Este script escucha tráfico ICMP y responde a cada solicitud Echo Request
con un Echo Reply
adecuado.
Scapy es una herramienta extremadamente flexible y poderosa para la manipulación avanzada de protocolos de red. Permite a los usuarios crear, modificar y analizar paquetes de forma granular, lo que la hace indispensable en pruebas de seguridad, auditorías de red y análisis de tráfico. Con las técnicas descritas aquí, los profesionales pueden llevar a cabo tareas complejas de manipulación y análisis de red que antes requerían múltiples herramientas especializadas.
Sin embargo, es fundamental utilizar Scapy con responsabilidad y en entornos controlados, ya que la manipulación inadecuada de paquetes puede causar interrupciones de red o efectos no deseados.
Jorge García
Fullstack developer