Seguimos con la serie dedicada a la representación / visualización de tráfico de red y más concretamente a la representación de scan de puertos mediante AfterGlow.
En esta ocasión vamos a usar, a parte de nmap, scapy / python para crear barridos de puertos desde múltiples orígenes. Esto se supone generará un gráfica bastante engorrosa y compleja. Para evitar este problema usaremos una carcterística de AfterGlow: clustering y la representación gráfica del tipo fdp. Veremos otras aplicaciones de la visualización con Argus (Auditoría tráfico red).
Scans nmap. Ordenando y clusterizando datos.
Tenemos un fichero de captura de red .pcap que nos dicen corresponde a un scan de puertos nmap detectado. Se quiere graficar dicho sca nde puertos atendiendo a
- ip origen
- puerto tdp destino
- ip destino
Como ya hemos estudiado, este esquema se corresponderá con:
- nodos source
- nodos event
- nodos target
Realizamos las operaciones oportunas como siempre (en este caso en windows):
tshark -r captura_nmap_5.cap -R «tcp» -T fields -E separator=, -e ip.src -e tcp.dstport -e ip.dst > captura_nmap_5.csv
abajo usamos un fichero de propiedades como el que viene por defecto con AfterGlow:
type captura_nmap_5.csv | perl afterglow.pl -c color.properties > captura_nmap_5.dot
neato -Tpng -o captura_nmap_5.png ./captura_nmap_5.dot
El resultado es este:
No sé ustedes, pero yo no lo veo claro. Un poco caótico. Vamos a limpiar y ordenar los datos para una gráfica más amigable.
Lo primero que vamos a hacer es ordenar los datos fuente .csv y eliminar líneas duplicadas. Para ello usaremos sort -u para UNIX/Linux y Windows (herramietna portada sort.exe):
tshark -r captura_nmap_5.cap -R «tcp» -T fields -E separator=, -e ip.src -e tcp.dstport -e ip.dst | sort -u > captura_nmap_5.csv
Clustering.
Ahora para los nodos event vamos a realizar clustering.
¿ Qué es clusteríng ?.
Se trata de agrupar un determinado tipo de nodo etiquetándolo de una forma generíca. Es decir, para nuestro caso: Me da igual los números de puertos menores de 1024. Los quiero agrupar todos en un solo nodo y ponerle una etiqueta que diga >1024. Para ello creamos un nuevo fichero de porpiedades (ejercicio.properties) y modificamos la parte de nodos event, dejando tal como están source y target:
color.event=»blue» if ($fields[1]<1024);
cluster.event=»<1024" if ($fields[1]<1024);
color.event=»lightblue»;
Esto significa que creamos un cluster llamado «<1024 " que agrupe todos los nodos event (tcp.dstport) que seran menores que 1024.
Ahora parseamos los datos con estas propiedades (ejercicio.properties):
type captura_nmap_5.csv | perl afterglow.pl -c ejercicio.properties > captura_nmap_5.dot
Gráfica fdp.
Un tipo de gráfica que cuando clarifica un poco más los resultados:
fdp -Tpng -o captura_nmap_5.png ./captura_nmap_5.dot
El resultado:
Ahora todos los nodos azules que correspondian a los puertos destino <1024 se integran en un solo nodo azul. El nodo amaillo de abajo es el host que realiza el scan de puertos.
Un zoom para ver mejor el cluster:
Otro ejemplo.
Tenemos otra captura cuyo destino del scan de puertos es toda una red local 102.168.1.0/24. No sé ahora cuantos host tiene esa red pero si son muchos es posible que la gráfica resulte muy engorrosa. Ni lo intento. Directamente voy a realizar clustering con las IP destino. Para este ejemplo no me interesan los puertos mayores de 1024, lo reflejaré en un cluster si exiten, solo los menores que los dejaré tal cual para saber cuales son. Vamos a tomar como base el anterior archivo de propiedades ejercicio.properties y realizamos la siguiente modificaciónes:
#para los nodos origen
color.source=»green» if ($fields[0]=~/^192\.168\..*/);
cluster.source=»Red Local origen» if ($fields[0]=~/^192\.168\..*/);
color.source=»red»
#para los nodos eventos
color.target=»yellow» if ($fields[2]=~/^192\.168\..*/);
cluster.target=»Red Local destino» if ($fields[2]=~/^192\.168\..*/);
color.target=»yellow»;
cluster.target=»Red Externa» if ($fields[2]!~/^192\.168\..*/);
#para los nodos destino
color.event=»lightcyan» if ($fields[1]<1024);
color.event=»lighsalmon» if ($fields[1]>1024);
cluster.event=»>1024» if ($fields[1]>1024);
shape.event=»box»
He marcado en negrita donde os tenéis que fijar.
He creado:
- un cluster para la red local de origen
- un cluster parala red local de destino
- cluster la Red Externa destino
- cluster para eventos de puerto destino mayor que 1024
Y usaré grafica fdp.
Empezamos:
tshark -r captura_nmap_3.cap -R «tcp» -T fields -E separator=, -e ip.src -e tcp.dstport -e ip.dst | sort -u > captura_nmap_3.csv
type captura_nmap_3.csv | perl afterglow.pl -c ejercicio.properties > captura_nmap_3.dot
fdp -Tpng -o captura_nmap_5.png ./captura_nmap_3.dot
El resultado:
Según hemos configurado en ejercicio.properties, tenemos una serie de nodos rojos que son IPs externas de origen. Cuadros azul claro son puertos menores de 1024. no parece el cluster para mayor de 1024, entonces que no existen. Se realizó el scan en un rango de 1-1024. Tenemos un nodo amarillo con una etiqueta de «Red local destino», así que el destino del escan fue toda la red local. El resto de cluster no aparecen luego no existen.
Por cierto, ¿ existe un solo puerto de origen o hay varios ?:
En el archivo de propiedades ejercicio.properties modificamos solo los nodos event. Nodo event con circulo para diferenciar algo más:
color.event=»lightcyan»
shape.event=»circle»
En la línea tshark el event lo cambiamos de tcp.dstport a tcp.srcport.
En la línea de fdp añado -s250 para dar más resluciñon a la imagen resultante.
El resultado, ampliado a una zona es:
El puerto de origen usado por los hosts externos es 56. Vemos el nodo red local amarillo. Una serie de conexiones entre cluster red local origen y destino, es decir entre hosts de la red local. Uno de estos puertos es 445.
Otros ejemplos.
Como curiosidad y aplicando lo aprendido.
¿ Cómo se relacionan los host de una red entre ellos y la red externa atendiendo al protocolo usado ?.
Creamos un archivo de propiedades color.proto:
color.source=»green» if ($fields[0]=~/^192\.168\..*/);
color.source=»invisible»; # solo me interesa la red local
color.target=»yellow» if ($fields[2]=~/^192\.168\..*/);
#crear cluster si la IP destino es distinta a la local
color.target=»greenyellow» if ($fields[2]!~/^192\.168\..*/);
cluster.target=»Red Externa» if ($fields[2]!~/^192\.168\..*/);
shape.target=»circle«;
label.event=»ICMP» if ($fields[1] eq «0x01«);
color.event=»salmon» if ($fields[1] eq «0x01«);
label.event=»TCP» if ($fields[1] eq «0x06«);
color.event=»orange» if ($fields[1] eq «0x06«);
label.event=»UDP» if ($fields[1] eq «0x11«);
color.event=»red» if ($fields[1] eq «0x11«);
color.event=»gray»;
shape.event=»box»;
color.edge=»lightblue»;
Generando los datos y gráfica:
Usamos un fichero de captura de un laboratorio de pruebas, algunos hosts son virtuales.
tshark -r 031110Vrt.cap -T fields -E separator=, -e ip.src -e ip.proto -e ip.dst | sort -u > protocolos.csv
type protocolos.csv | perl afterglow.pl -c color.proto > protocolos.dot
circo -Tpng -o protocolos.png protocolos.dot
El resultado:
Duración y total bytes transmitidos de las conexiónes.
Ya lo hemos visto en otros artículos. Con Argus y «dur» podemos representar el tráfico según la duración de la sconexiones.
racluster -m saddr daddr -c, -r lan031110.arg -s saddr dur daddr > lan031110b.csv
O por bytes o total de bytes transmitidos por cada conexión:
racluster -m saddr daddr -c, -r lan031110.arg -s saddr bytes daddr > lan031110c.csv
.
Enlaces Relacionados:
- Visualización gráfica trafico de red con AfterGlow. configurando color.properties. Modelando gráficas.
- Visualización gráfica tráfico de red con AfterGlow. Detectando eventos o tráfico sospechoso en nuestra red.
- Visualización gráfica tráfico de red con AfterGlow. Configurando color.properties. Etiquetas y variables
- Visualización gráfica Nmap Scan con Afterglow.
- Visualización gráfica de alertas Snort con Aferglow.
- Argus. Auditando el tráfico de red. Parte 4. Generación de gráficas con AfterGlow.
- ….
==================
Hasta aquí por hoy. En la Parte II vermos todo lo relacionado con las graficas scan scapy con clustering, variables, labels y funciones nuevas como regex_replace().
==================
alfonn se agradece un poco de aire fresco con tus aportes tan interesantes y distintos a lo habitual en la blogosfera respecto a temas de seguridad se refiere. Sigue así.
Pingback: Visualización interactiva de tráfico de red con INAV. | Seguridad y Redes
Muy buen artículo, este blog me ha sido de mucha ayuda, gracias por compartir
Pingback: Argus. Auditando el tráfico de red. Parte 6. Argus y Geolocalización con GeoIP. | Seguridad y Redes