Seguimos con la serie dedicada a Scapy. Ya vimos como instalar Scapy y estudiamos, en forma de primeros pasos, alguna de sus funcionalidades en la primera parte: Scapy. Manipulación avanzada e interactiva de paquetes. Parte 1.
En esta segunda parte vamos a profundizar un poco más en la visualización de datos, función sniff, formateo de datos, decodes, modo offline de Sniff y condicionales.
Visualizando datos con show() y show2().
Vamos a ver la diferencia entre estas funciones de muestra de datos de un paquete, como siempre, con un ejemplo. Construimos un paquete de la forma:
NOTA:
- La barra \ sirve para escribir en varias líneas.
- La barra / sirve para la composición entre capas a lconstruir nuesdtro paquete. En este caso IP/TCP.
Visualizamos ahora los datos con show():
y a continuación mostramos con show2():
Tenemos vatias diferencias. La más importante es la carga de datos Raw que hemos introducido com la función Raw() y argumento RandString(size=75), es decir generación de datos de forma aleatoria. También tenemos diferencia en campos como Version, cheksum, etc.
Show2() muestra los datos, en caso de ser enviados mediante scapy, tal como serían ser transmitidos pero de forma legible, con el checksum y el paquete ensamblado. Show() nos mostrará el paquete tal como lo hemos construido.
Sniff(). Visualización y formateo de datos.
Ya estudiamos en la primera parte algo de la función de captura de paquetes de scapy Sniff(). Vamos a profundizar un poco más con prn lambda y sprintf.
Vimos que podíamos ver los campos de las cabeceras de un paquete y protocolos encapsulados:
Pues bien, podemos formastear la salida de Sniff() de tal forma que se adapte justo a los datos de queremos ver y ordenarlos como queramos. Por ejemplo. Vamos a capturar una sesión SMTP. En principio queremos captura con el filtro activado: «tcp and (port 25 or port 110)» y usando prn=lamba x: x.sprintf. queremos mostrar los siguientes datos y de la siguiente forma:
- IP origen y puerto origen
- IP destino y puerto destino
- una separación x entre columnas
- Banderas TCP o Flags
- y la carga o playload del segmentto TCP
Mientras capturamos, escribo un correo a mis lectores.
Entonces introducimos las siguientes líneas:
El resultado:
Efectivamente, vemos las datos que qeríamos, el diálogo SMTP con el servidor y haasta el cuerp del mensaje.
Otro ejemplo. queremos formatear los datos de salida y mostrar con claridad los datos en columnas, introduciendo la separación entre ellas. Ojo con los detalles:
….digo ojo con los detalles, porque la salida informativa del protocolo no es ahora de forma TCP, UDP, etc. si no su valor hexadecimal:
- 006 se refiere al campo IP PROTOCOL: 06 Protocolo. Se refiere al protocolo de siguiente nivel que se usa en la parte de datos. Longitud 8 bits. En este caso hex(06) (00000110) = TCP en decimal sería 6.
- 2, 16, 18, 24, etc. se refiere a los Flags de la cabecera TCP que se expresan en esta caso en hexadecimal. Por ejemplo 18 sería en binario 11000 que, como ya sabemos,sería para ACK+PSH activados.
Todo lo anterior está reflejado en las directivas.
Directivas de sprintf()
Son las que comienzan y finalizan por %. Ya lo vimos en la primera parte de esta serie. Son directivas:
- %.time%
- %IP.chksum%
- etc,
Otras formas de directivas.
Si cambiamos, por ejemplo %-15s por %-5s… veremos que la distancia entre columnas cambia. También observamos %r para que nos muestre los datos en formato raw. Vemos, entonces como se aplica todo esto para formar una directiva:
- %-15s,IP.src%
- %03xr,IP.proto%
- etc,
Me preguntareis que significa eso de %03rx. Haced la prueba y cambiais un valo, por ejemplo a %09xr …..:
La clase decode_payload_as()
Otra forma de sacar o filtrar datos de nuestras capturas es usando las clases. Vimos en la primera parte que usando la función ls():
Hay mucho mas. Nos centraremos en la decodificación del payload relativo a, por ejemplo, sesiones SMB, para ilustrar el uso de decode_payload_as:
De esta forma si usamos Sniff() mientras usamos algún recurso de nuestra red:
Sniff() en modo offline
Podemos usar Sniff() de modo offline leyendo un fichero .pcap como de usáramos la función rdpcap() que ya viemos en la primera parte. Usaremos las siguientes líneas que además incluyen formateo de los datos.:
Añadiendo notas informativas a nuestras capturas. Trabajando con condicionales.
Tanto para Sniff() en modo online u offline, podemos añadir carteles o notas informativas a la salida de los datos. Lo ilustramos con un caso, quizá poco práctico, pero que da ide de lo que podemos hacer para capturas más complicadas o para añadir información en presentaciones ,etc.
Observamos, fácilmente, como trabaja scapy con las condicionales usando las formas:
- {TCP: TCP} para el caso en que se trate de un paquete TCP
- {UDP: UDP} caso en que se trate de un paquete UDP
- {ICMP:n ICMP} caso en que se trate de un paquete ICMP
Profundizaremos sobre las condicionales más a delante.
————————————————————————-
Esto es todo por hoy. Nos vemos en la Parte 3 de esta serie.
Pingback: Seguridad Python (manipulación de paquetes) | darkuskyo.net