Red: la librería Scapy
Introducción
Según la documentación oficial (man Scapy), Scapy es un potente programa interactivo de manipulación de paquetes. Se pueden crear o decodificar paquetes de un gran número de protocolos, emitirlos, capturarlos, hacer corresponder peticiones y respuestas y mucho más. Permite manipular la mayoría de herramientas de scan, traceroute, sonda, pruebas unitarias, ataques o descubrimiento de red (que reemplaza fácilmente hping, el 85% de nmap, arpspoof, arp-sk, arping, tcpdump, tethereal, p0f, etc.). Se comporta igual de bien sobre un gran número de tareas que una cantidad considerable de programas no es capaz de manipular, como enviar tramas inválidas, inyectar sus propias tramas 802.11, combinar técnicas (VLAN hopping+ARP cache poisoning, VOIP decoding sobre canal codificado en WEP...), etc.
El autor de Scapy es Philippe Biondi. Es autor de muchas aplicaciones, la mayoría escritas en lenguaje Python. Encontrará el conjunto de sus publicaciones, conferencias y software en su sitio.
Scapy es una herramienta multi-uso, siendo un:
-
falsificador de paquetes;
-
snifer;
-
escaner;
-
herramienta de prueba (máquina/servicio activo);
-
herramienta de fingerprint;
-
herramienta de ataque (valores no previstos en los protocolos...).
Puede sustituir a muchas de las herramientas existentes: ethereal/wireshark, tcpdump, dsniff, excalibur, ping, traceroute, nmap, xprobe, ettercap...
No tiene...
Programación de red con Scapy
1. Lista de protocolos soportados
Scapy nos permitirá trabajar con muchos protocolos. Encontrará a continuación la lista de protocolos soportados por Scapy.
Si desea conocer todos los protocolos utilizados bastará, una vez lanzado Scapy (ponerse en consola shell y luego escribir scapy), con introducir el comando ls(IP).
ARP: ARP
ASN1_Packet: None
BOOTP: BOOTP
CookedLinux? : cooked linux
DHCP: DHCP options
DNS: DNS
DNSQR: DNS Question Record
DNSRR : DNS Resource Record
Dot11: 802.11
Dot11ATIM: 802.11 ATIM
Dot11AssoReq: 802.11 Association Request
Dot11AssoResp: 802.11 Association Response
Dot11Auth: 802.11 Authentication
Dot11Beacon: 802.11 Beacon
Dot11Deauth: 802.11 Deauthentication
Dot11Disas: 802.11 Disassociation
Dot11Elt: 802.11 Information Element
Dot11ProbeReq: 802.11 Probe Request
Dot11ProbeResp: 802.11 Probe Response
Dot11ReassoReq: 802.11 Reassociation Request
Dot11ReassoResp: 802.11 Reassociation Response
Dot11WEP: 802.11 WEP packet
Dot1Q: 802.1Q
Dot3: 802.3
EAP: EAP
EAPOL: EAPOL
Ether: Ethernet
GPRS: GPRSdummy
GRE: GRE
HCI_ACL_Hdr: HCI ACL header
HCI_Hdr: HCI header
HSRP: HSRP
ICMP: ICMP
ICMPerror: ICMP in ICMP
IP: IP
IPerror: IP in ICMP
IPv6: IPv6 not implemented here.
ISAKMP: ISAKMP
ISAKMP_class: None
ISAKMP_payload: ISAKMP payload
ISAKMP_payload_Hash: ISAKMP Hash
ISAKMP_payload_ID: ISAKMP Identification
ISAKMP_payload_KE: ISAKMP Key Exchange
ISAKMP_payload_Nonce: ISAKMP Nonce
ISAKMP_payload_Proposal: IKE proposal
ISAKMP_payload_SA: ISAKMP SA
ISAKMP_payload_Transform: IKE Transform
ISAKMP_payload_VendorID: ISAKMP Vendor ID
IrLAPCommand: IrDA Link Access Protocol Command
IrLAPHead: IrDA Link Access Protocol Header
IrLMP: IrDA Link Management Protocol
L2CAP_CmdHdr: L2CAP command header
L2CAP_CmdRej: L2CAP Command Rej
L2CAP_ConfReq: L2CAP Conf Req
L2CAP_ConfResp: L2CAP Conf Resp
L2CAP_ConnReq: L2CAP Conn Req
L2CAP_ConnResp: L2CAP Conn Resp
L2CAP_DisconnReq: L2CAP Disconn Req
L2CAP_DisconnResp: L2CAP Disconn Resp
L2CAP_Hdr: L2CAP header
L2CAP_InfoReq: L2CAP Info Req
L2CAP_InfoResp: L2CAP Info Resp
LLC: LLC
MGCP: MGCP
MobileIP: Mobile IP (RFC 3344)
MobileIPRRP: Mobile IP Registration Reply (RFC 3344)
MobileIPRRQ: Mobile IP Registration Request (RFC 3344)
MobileIPTunnelData: Mobile IP Tunnel Data Message (RFC 3519)
NBNSNodeStatusResponse: NBNS Node Status Response
NBNSNodeStatusResponseEnd: NBNS Node Status Response
NBNSNodeStatusResponseService: NBNS Node Status Response Service
NBNSQueryRequest:...
Scapy e IPv6
1. Nociones de IPv6
a. Aspectos generales
El número de direcciones IPv4 disponibles está limitado a 4 294 967 296, es decir 232. En su momento, este número parecía que nunca podría alcanzarse.
En 1992, estas direcciones IP se abrieron al comercio en Internet.
Un año más tarde fuimos testigos del inicio de un plan de emergencia, ya que no había más direcciones de clase B disponibles:
-
Se creó la notación CIDR, donde se consigue una disminución del desperdicio de espacio de direcciones y una disminución del tamaño de las tablas de enrutamiento.
-
Se procede a la creación y puesta en marcha de un plan de direccionamiento privado y NAT.
Las medidas técnicas provocan limitaciones y nuevos problemas, los protocolos dinámicos deben ser tratados independientemente (ej. FTP) y es obligatoria una capa de seguridad para garantizar la integridad de la confidencialidad.
Una primera versión de IPv6 se propone en 1995, y aparece una versión definitiva en 1998.
El RIPE anuncia el final de la distribución de IPv4 en febrero de 2011 (para la IANA) y el final de la distribución en noviembre para los representantes regionales de la IANA.
IPv6 está codificado en 128 bits (32 para IPv4), sus 64 bits de mayor peso representan la red y los 64 bits de menor peso representan la identificación de los hosts.
Las direcciones están representadas en forma de 8 dígitos hexadecimales; cada dígito representa 16 bits en formato hexadecimal.
b. IPv6: RFC 2373
Las direcciones IP se pueden escribir en esta forma:
-
2001:470:1f14:10b9:0000:0000:0000:2
-
2001:470:1F14:10b9::2
La escritura de un conjunto de ceros contiguos puede simplificarse, pero no más de una vez en una dirección:
-
2:0000:0000:0000:2:0000:0000:2
-
2::2::2 => no válida
-
2::2:0000:0000:2 => válida
-
2:0000:0000:0000:2::2 => válida
Parte de la red
Las direcciones están estructuradas según un modelo agregado.
La calificación utilizada para caracterizar los agregados es la notación CIDR (RFC 1519).
Con la dirección 2001:0DB8:ac4D:0001::
-
2001:0DB8:ac4d se denomina...
Otros ejemplos
Deseamos escuchar los paquetes TCP en el puerto 80 del equipo y mostrar el resultado en la pantalla.
Queremos ahora aplicar una función a cada paquete recibido. Podríamos utilizar la variable prn que servirá para aplicar una función a en cada paquete. También podríamos, por supuesto, utilizar una función lambda para ayudarnos.
Necesitaremos hacer un MITM (Man in the Middle) para probar la red en una auditoría. Existen por supuesto herramientas especializadas, pero tenemos la posibilidad de hacerlo con Scapy. Esta técnica MITM utiliza ARP cache poisoning.
En un ataque de tipo ARP poisoning, un hacker se introducirá entre los datos enviados por el usuario y el router.
Debemos utilizar el protocolo ARP, de ahí el uso de la función ARP() con los siguientes parámetros:
-
Comando ARP (1).
-
dst: dirección MAC de destino (si es necesario).
-
hwsrc: dirección MAC que quiere poner en la tabla ARP remota (atacante).
-
pdst: dirección IP del equipo remoto cuya tabla ARP quiere infectar (víctima).
-
psrc: dirección IP de la pasarela (gateway).
Ahora debemos poner nuestro equipo en modo forward IP (/proc/sys/net/ipv4/ip_forward) y ejecutar el script anterior, así como un sniffer (con Scapy o directamente Wireshark) para capturar los paquetes.
Conclusión
Acabamos de descubrir las principales funcionalidades de Scapy. Existen muchas otras y si desea profundizar sus conocimientos puede encontrar en la red documentación y ejemplos de utilización.
Solo su imaginación puede frenarle en el uso de Scapy, es una herramienta potente, llena de recursos, y solo su uso frecuente le permitirá controlar sus recovecos.
Puesta en práctica
1. Canal encubierto IP
Enunciado
Requisitos previos: Python, Scapy, conocimientos de red
Objetivo: realizar un script Python que utilice un canal encubierto IP.
Enunciado:
Un canal encubierto IP (covert channel IP) es un canal de comunicación entre dos equipos que utilizan el ancho de banda de otro canal con el objetivo de transmitir información sin la autorización o conocimiento del propietario de la información o el administrador de la red.
Prepare este script Python empleando Scapy.
Corrección
cap3_exo2.py
#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-
from scapy.all import *
conf.verb=0
def trataPaquete(p):
if p[IP].ttl > 230:
print ""
sys.exit(0)
sys.stdout.write(chr(p[IP].id))
sniff(
filter = "icmp and src //@victim//",
lfilter = lambda p: p.haslayer(ICMP) and p[IP].id < 256,
prn = trataPaquete,
#}Para tratamiento en vivo
store = 0,
#}
)
2. Detección de Rogue AP (Access Point)
Enunciado
Requisitos previos: Python, Scapy...