public:training:scapy

Scapy

Scapy es una herramienta interactiva de manipulación de paquetes.

En otras palabras, permite crear un paquete de red al gusto - especificando todos los campos de todas las cabeceras y el payload - para enviarlo por un interfaz cualquiera del sistema.

Para hacer funcionar Scapy en un sistema, primero clonar el repositorio de Scapy:

git clone https://github.com/secdev/scapy

Una vez clonado, podemos crear tantos scripts como queramos, dentro del directorio scapy.

Editamos el archivo scapy/ejemplo1.py:

snippet.python
from scapy.all import *
from scapy.contrib.coap import CoAP
 
e = Ether(src="08:00:27:65:65:50", dst="0a:00:27:00:00:00")
i = IPv6(src="fe80::0A00:27FF:FE54:2E4A", dst="fe80::0800:27ff:fe00:0000")
u = UDP(sport=5683,dport=59355)
 
c = CoAP(type='ACK', code='2.01 Created', msg_id=0, paymark=b'\xff')
 
p = e/i/u/c # The packet p is a concatenation of all the above headers.
 
print("Sending example packet: ");
p.show()
 
print("Example packet hexdump: ");
hexdump(p)
 
sendp(p, iface="enp7s0")

En ejemplo1.py se crea un paquete p CoAP ACK código 2.01 con un MSG_ID de valor 0 y sin payload. Las direcciones IPv6 están especificadas en i y las direcciones Ethernet en e. Este paquete es lanzado por la interfaz de red enp7s0.

NOTA la dirección Ethernet 0a:00:27:00:00:00 corresponde con una dirección ethernet multi-cast a nivel de enlace.

Para ejecutarlo:

snippet.sh
sudo python3 ./ejemplo1.py

NOTA necesita ejecutarse como sudo por que crea el paquete con detalles de la capa de enlace Ethernet y eso el kernel de linux no deja hacerlo a nivel de usuario normal.

Otros ejemplos del formato para escribir las cabeceras CoAP incluyen:

snippet.python
c = CoAP(type='ACK', code='2.01 Created', token='ab', msg_id=0, options=[('Location-Path', 'storage'),(92, b'\xCA\xFE'), (92, b'\xBE\xAF\xBE\xAF\xBE\xAF\xBE\xAF\xBE\xAF\xBE\xAF\xBE\xAF\xBE\xAF\xBE\xAF\xBE\xAF')], paymark=b'\xff')
c = CoAP(type='ACK', code='2.01 Created', msg_id=0, options=[('Location-Path', 'storage')], paymark=b'\xff')

A parte de simplemente enviar un mensaje, se puede crear un servidor customizado que responda a peticiones.

Otro ejemplo

snippet.python
from scapy.all import *
from scapy.contrib.coap import CoAP
import datetime
import os # os.urandom()
 
 
try:
	while True:
		# We wait for a packet with dst port 5683.
		# {
 
		print("Listening for Uplink Packet udp and port 5683");
		uplink_rx = sniff(iface='eth1', count=1, filter="udp and port 5683");
 
		print("Uplink packet received");
		# Print packet
		uplink_rx[0].show();
		print("Uplink packet hexdump");
		hexdump(uplink_rx[0])
		# }
 
		#
		# Paquete 1
		# {
		print("Sending downlink packet: ");
		e = Ether(src="08:00:27:65:65:50", dst="0a:00:27:00:00:00")
		i = IPv6(src="fe80::a00:27ff:fe65:6550", dst="fe80::800:27ff:fe00:0")
		u = UDP(sport=10001,dport=10001)
 
		# c = CoAP(type='ACK', code='2.01 Created', token='ab', msg_id=0, options=[('Location-Path', 'storage'),(92, b'\xCA\xFE'), (92, b'\xBE\xAF\xBE\xAF\xBE\xAF\xBE\xAF\xBE\xAF\xBE\xAF\xBE\xAF\xBE\xAF\xBE\xAF\xBE\xAF')], paymark=b'\xff')
		c = CoAP(type='ACK', code='2.01 Created', token='ab', msg_id=0, options=[('Location-Path', 'storage')], paymark=b'\xff')
 
		# d = b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
		p = e/i/u/c
		p.show()
		hexdump(p)
		sendp(p, iface="eth1")
		# }
		#
 
#
# We catch CTRL+C to stop the script. We need to capture
# the interrupt outside of the loop and then ignore it.
# {
except KeyboardInterrupt:
	pass
# }

Este ejemplo espera a la recepción de cualquier paquete que coincida con el filtro filter="udp and port 5683" recibido en el interfaz eth1.

Cada vez que un paquete de esas características es recibido, lo imprime por pantalla y genera un paquete p que envía también por el interfaz eth1.

  • public/training/scapy.txt
  • Last modified: 2024/10/09 08:53
  • (external edit)