0 votos

(Bash y Scapy) ¿ Como analizar en tiempo real el trafico de red especificamente ICMP para ejecutar una accion automatizada ?

Hola amigos.. Recién estoy haciendo un Script bash, cacharreando un poco y aprendiendo a trabajar con bash, estoy creando un Script juntando algunas herramientas que me gustan bastante para pentesting en la red y se me ocurrió lo dicho en el titulo.

primero ejecute lo siguiente:

sudo tcpdump -s 0 -A -n -l | egrep -i "ICMP echo request"

Para capturar los paquetes ICMP, pero de esta forma no tengo como guardar la salida con el filtro ICMP.

Luego utilice tcpdump con el siguiente filtro:

sudo tcpdump -w /tmp/LAB/ICMP_dump.log -s 0 -A -n -l 'icmp[icmptype] = icmp-echo and icmp[icmptype] != icmp-echoreply'

Para capturar los paquetes ICMP, pero se me complica la cosa porque la salida va cifrada.

para leer el archivo de salida y exportarlo de nuevo para que sea legible tengo que detener la captura y luego ejecuto esto:

sudo tcpdump -r /tmp/LAB/ICMP_dump.log >> /tmp/LAB/ICMP_dump2.log

No se como leerlo en tiempo real y no se si "tshark" brinde mejores opciones. O talvez aunque no se mucho de Scapy este sea una solucion.

La idea es cuando se capture el trafico con la correspondiente IP que hace la peticiones ICMP, ejecutar un script automatico para analizar este host con Nmap u otros por ejemplo.

Muchas gracias Se agradece cualquier ayuda, saludos

1voto

Shinigami Puntos 10

E estado investigando un poco y creo que Scapy es una gran herramienta que me puede permitir hacer lo que quiero, lo que no tengo conocimientos de programación por lo que me dificulta mucho el trabajo este.

hasta ahora lo que tengo es el siguiente codigo:

[ code ]

 #!/usr/bin/env python
 from scapy.all import *
 def dissect(pck):
      if pck.haslayer("ICMP"):
           pck.show()
 sniff(iface="eth0", prn=lambda x:dissect(x), store=0)

La salida del anterior código se ve algo así:

[ Ethernet ]

 dst       = 00:00:00:00:00:d2
 src       = 00:00:00:00:00:d1
 type      = IPv4

[ IP ]

 version   = 4
 ihl       = 5
 tos       = 0x0
 len       = 60
 id        = 12543
 flags     = 
 frag      = 0
 ttl       = 128
 proto     = icmp
 chksum    = 0xf0e7
 src       = 10.10.10.1
 dst       = 10.10.10.2
 \options   \

[ ICMP ]

    type      = echo-request
    code      = 0
    chksum    = 0x433f
    id        = 0x1
    seq       = 0xa1c

[ Raw ]

       load      = 'abcdefghijklmnopqrstuvwabcdefghi'

[ Ethernet ]

 dst       = 00:00:00:00:00:d1
 src       = 00:00:00:00:00:d2
 type      = IPv4

[ IP ]

 version   = 4
 ihl       = 5
 tos       = 0xc0
 len       = 106
 id        = 25089
 flags     = 
 frag      = 0
 ttl       = 64
 proto     = icmp
 chksum    = 0xfef7
 src       = 10.10.10.2
 dst       = 10.10.10.1
 \options   \

[ ICMP ]

    type      = dest-unreach
    code      = port-unreachable
    chksum    = 0x1623
    reserved  = 0
    length    = 0
    nexthopmtu= 0

[ IP in ICMP ]

       version   = 4
       ihl       = 5
       tos       = 0x0
       len       = 78
       id        = 12544
       flags     = 
       frag      = 0
       ttl       = 128
       proto     = udp
       chksum    = 0xf0c4
       src       = 10.10.10.1
       dst       = 10.10.10.2
       \options   \

[ UDP in ICMP ]

          sport     = netbios_ns
          dport     = netbios_ns
          len       = 58
          chksum    = 0x6ca

[ NBNS query request ]

             NAME_TRN_ID= 41098
             FLAGS     = 0
             QDCOUNT   = 1
             ANCOUNT   = 0
             NSCOUNT   = 0
             ARCOUNT   = 0
             QUESTION_NAME= '*'
             SUFFIX    = workstation
             NULL      = 0
             QUESTION_TYPE= NBSTAT
             QUESTION_CLASS= INTERNET

Guardo la salida de los paquetes ICMP capturados en un .log:

 localhost:~ $ sudo python /tmp/LAB/scapy_icmp_sniff.py >> /tmp/LAB/ICMP.log

Y esta es la parte que mas me esta costando... que no tengo ni idea de como hacerlo: lo que hice fue:

 localhost:~ $ tail -f /tmp/LAB/ICMP.log | grep -o " [0-9]*\.[0-9]*\.[0-9]*\.[0-9]*"

Con la idea de ver solamente las ip para guardarlas y no visualizar lo demas.. para luego ejecutar un comando con esa ip como target.

Ejemplo:

 #!/bin/bash
 ip1=$(tail -f /tmp/LAB/ICMP.log | grep -o " [0-9]*\.[0-9]*\.[0-9]*\.[0-9]*")
 sudo nmap $ip1

Esa es la idea pero logicamente no funciona ya que constantemente van apareciendo las ip que estan haciendo ping y no se detiene, ademas sale tambien mi ip y solo quiero la ip del host remoto que hace ping.. la salida se ve algo similar a esto:

 10.10.10.1
 10.10.10.2
 10.10.10.2
 10.10.10.1
 10.10.10.1
 10.10.10.2
 10.10.10.2
 10.10.10.1

y asi sucesivamente......

Bueno esa es la idea, me gustaria saber la mejor forma de hacerlo, con los comandos mas optimos para aplicar ese tipo de filtros, etc.

Se agradece la ayuda.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: