Instalando Scapy y entendiendo su funcionamiento
Que es Scapy?
Scapy es una herramienta de manipulación de paquetes para redes de computadoras, escrita en Python por Philippe Biondi. Puede forjar o decodificar paquetes, enviarlos por cable, capturarlos y hacer coincidir solicitudes y respuestas. También puede manejar tareas como el escaneo, el seguimiento de trazas, el sondeo, las pruebas unitarias, los ataques y el descubrimiento de redes. En pocas palabras Scapy es una navaja suiza que nos permite manipular todo a bajo nivel.
Instalando Scapy
sudo pip3 install scapy
Cómo funciona Scapy?
Tiene 2 formas de funcionamiento, el interactivo y el programático. En el interactivo es igual al tener la consola de Python pero con todo el paquete de Scapy importado. El modo programático funciona igual que una biblioteca cualquiera de Python. Para un funcionamiento correcto de Scapy se necesita permisos de root
root@vay3t:~# scapy -H
INFO: Can't import matplotlib. Won't be able to plot.
INFO: Can't import PyX. Won't be able to use psdump() or pdfdump().
WARNING: No route found for IPv6 destination :: (no default route?)
WARNING: IPython not available. Using standard Python shell instead.
AutoCompletion, History are disabled.
Welcome to Scapy (2.4.3)
>>>
Ayuda en Scapy
Cuando estemos en el modo interactivo tenemos la posibilidad de usar ciertas funciones que nos proporcionarán ayuda necesaria para poder usar Scapy.
ls()
: Lista los protocolos compatibles con Scapylsc()
: Lista las funciones disponibles en Scapyhelp()
: Nos proporciona los detalles de cada elemento en Scapy<TAB><TAB>
: (Doble tabulación) Lista todos los elementos de Scapy
Construyendo paquetes
Para poder construir paquetes en Scapy tenemos que entender primero el modelo TCP/IP (https://es.wikipedia.org/wiki/Modelo_TCP/IP) que es en que se basa la herramienta. Se construye desde la capa más baja a la más alta:
pkt = Ether()/IP()/TCP()
En caso de que no brindemos información en las capas, estas serán rellenadas con valores por defecto:
Si nos damos cuenta tenemos destino y origen de la capa 1 con el protocolo Ethernet
:
Tenemos la versión, el ttl, el origen y destino de la capa 2 con el protocolo IP
:
Y el puerto de origen y destino de la capa 3 con el protocolo TCP
:
Estos son los valores más comunes que podremos asignarle a un paquete creado.
Haciendo un ping
Como demostración para poder entender mejor Scapy haremos un sencillo ejemplo, haciendo un ping al Gateway. Para eso necesitaremos crear un paquete antes de enviarlo.
>>> pkt = IP(dst="192.168.100.1")/ICMP()
>>> pkt
<IP frag=0 proto=icmp dst=192.168.100.1 |<ICMP |>>
>>> pkt.show()
###[ IP ]###
version= 4
ihl= None
tos= 0x0
len= None
id= 1
flags=
frag= 0
ttl= 64
proto= icmp
chksum= None
src= 192.168.100.232
dst= 192.168.100.1
\options\
###[ ICMP ]###
type= echo-request
code= 0
chksum= None
id= 0x0
seq= 0x0
Donde dst
es el destino. Luego de crear el paquete nos toca enviarlo.
>>> send(pkt)
.
Sent 1 packets.
Si nos damos cuenta no recibimos ningún tipo de respuesta, eso es porque la función send
sólo se encarga de enviar el paquete, pero no de esperar una respuesta. Para poder recibir una respuesta usaremos sr1
(también se puede usar sr
pero esta captura y recibe paquetes continuamente). Lo que hace es enviar un paquete y esperar la respuesta de ese paquete. Podremos guardar la respuesta en una variable para su posterior análisis.
>>> ans = sr1(pkt)
Begin emission:
Finished sending 1 packets.
*
Received 1 packets, got 1 answers, remaining 0 packets
>>> ans
<IP version=4 ihl=5 tos=0x0 len=28 id=47006 flags= frag=0 ttl=64 proto=icmp chksum=0x7908 src=192.168.100.1 dst=192.168.100.232 |<ICMP type=echo-reply code=0 chksum=0xffff id=0x0 seq=0x0 |>>
Ahora, si nos ponemos a analizar el resultado nos damos cuenta que tenemos la respuesta del host donde src=192.168.100.1
es la IP proveniente del host y dst=192.168.100.18
vendría siendo nuestra IP.