A la caza de gusanos – Capítulo II

gusanos 2

Hoy traemos el segundo capítulo de esta entrada titulada “A la caza de gusanos”.

Para quienes tuvieron la posibilidad de leer la primer entrada publicada aquí, en esta segunda entrega vamos a cerrar el círculo agregando un poco de interacción, permitiendo generar alguna acción sobre el tráfico que acaba de pasar por nuestro firewall.

Recordarán que mediante herramientas estándares de nuestro firewall (como tcpdump), podíamos monitorear cuando detectábamos conexiones SMTP desde nuestra red hacia Internet.

 

Lo que les propongo hoy es, además de monitorear esos eventos, generar aglún tipo de acción preventiva, como puede ser bloquear el equipo y registrar dicha actividad.

 

Para ello, vamos a armar dos pequeños scripts en bash, utilizando lo que tenemos “a mano” en nuestro sistema operativo y sin necesidad de recurrir a herramientas de terceros.

 

Referido a los scripts, uno se va a encargar de monitorear y registrar la actividad en un archivo de log y el otro va a estar leyendo en tiempo real dicho archivo y cuando se presente la situación, registre y bloquee el equipo.

 

Estos scripts los vamos a llamar “captura_gusanos.sh” y “detengo_gusanos.sh”

 

captura_gusanos.sh

 

Este script contiene lo siguiente:

 

#!/bin/bash

 

> gusanos.log; tcpdump -i enp3s0f1 -l -nn -s0 -A port 25 | grep --line-buffered "mail from" | grep --line-buffered "SMTP:" > gusanos.log

 

Analicemos el mismo

 

* > gusanos.log - Esta línea se encarga de “truncar” el archivo de log llamado “gusanos.log”. El objetivo es que cuando iniciamos la captura, si tenemos una captura previa, no disparemos eventos innecesarios o reiterados, con lo cual limpiamos el log y comenzamos a capturar

 

* tcpdump - El viejo y querido capturador de paquetes, al cual le pasamos varios parámetros

-i enp3s0f1 - es la interfaz a capturar (puede variar dependiendo del equipo)

-l - Indispensable si queremos ver la información mientras la capturamos. Ideal para utilizar en conjunto con otro script

-nn - No resolver nombre de host y puerto

-s0 - Mostrar todo el contenido del paquete capturado

-A - Imprimir cada paquete en ASCII

 

* grep --line-buffered “mail from” - Filtramos solamente la línea que contiene el “mail from:”

* grep --line-buffered “SMTP” - Evitamos línea duplicada

(Los greps podrían ir en una sola sentencia, pero eso se los dejo para investigar.)

 

* > gusanos.log - Enviamos todo al archivo gusanos.log

 

Este comando registra en el archivo lo siguiente:

 

13:56:16.912853 IP 172.20.30.111.51586 > 144.208.69.31.25: Flags [P.], seq 9:30, ack 351, win 501, options [nop,nop,TS val 2540454866 ecr 3395417400], length 21: SMTP: mail from:john.doe@mail.com

 

 

detengo_gusanos.sh

 

Este segundo script tiene el siguiente contenido:

 

#!/bin/bash

 

tail -f gusanos.log  | awk '{ split($3,ip,"."); system("iptables -A FORWARD-p tcp --dport 25 -s "ip[1]"."ip[2]"."ip[3]"."ip[4]" -j LOG"); system("iptables -A FORWARD-p tcp --dport 25 -s "ip[1]"."ip[2]"."ip[3]"."ip[4]" -j DROP") }'

 

El mismo es muy simple también, lo que hace es lo siguiente:

 

Utiliza el comando “tail” para monitorear en tiempo real el archivo gusanos.log y cuando se da algún evento, envía su salida a la herramienta “awk” la cual parsea la dirección IP (ya que viene con el puerto origen incluído y hay que quitarlo) y luego ejecuta dos veces el comando “iptables”.

 

La primera vez agrega una entrada de LOG permitiendo dejar un registro en el sistema, mientras que la segunda vez bloquea el equipo.

 

Imaginemos que tenemos un equipo que tiene una dirección IP 192.168.20.10, los comandos que ejecuta el script serían los siguientes:

 

iptables -A FORWARD -p tcp --dport 25 -s 192.168.20.10 -j LOG

iptables -A FORWARD -p tcp --dport 25 -s 192.168.20.10 -j DROP

 

Esto lo interpretamos de la siguiente manera

 

iptables - La herramienta de fireall

A FORWARD - Agregar en la tabla de FORWARD (tráfico no destinado a nosotros sino que es solamente de pasaje)

p tcp - Protocolo tcp

dport 25 - Puerto destino 25 (SMTP)

-j LOG - Agregar una entrada de LOG en los logs del sistema

-j DROP - Bloquear esa IP

 

Ahora sí tenemos todo pronto.

 

Lo que nos falta es lanzar ambos scripts (recordar ejecutarlos con “sudo” si no somos root, lo cual es lo aconsejable) y luego nos sentamos a esperar que se genere actividad:

 

sudo bash captura_gusanos.sh &

sudo bash detengo_gusanos.sh &

 

(Podemos ejecutarlos en background mediante el “&” o lanzar cada uno en una terminal independiente)

 

Cuando se da un intento de envío de correo, podemos ver que el archivo “gusanos.log” registra lo siguiente:

 

alejandro@alejo:~/Descargas/cap2$ cat gusanos.log

 12:24:56.289408 IP 172.20.10.31.35646 > 144.208.69.31.25: Flags [P.], seq 22:58, ack 394, win 501, options [nop,nop,TS val 3272152958 ecr 3562498886], length 36: SMTP: mail from:john.doe@mail.com

 

en la salida del comando “dmesg” o el archivo “syslog” o “kern.log” (dependiendo la distro), algo similar a esto:

 

Mar 15 12:24:56 alejo kernel: [ 8829.864731] IN= OUT=enp3s0f1 SRC=172.20.10.31 DST=144.208.69.31 LEN=77 TOS=0x10 PREC=0x00 TTL=64 ID=62740 DF PROTO=TCP SPT=35646 DPT=25 WINDOW=501 RES=0x00 ACK PSH FIN URGP=0

 

y si hacemos un “iptables -L” vamos a ver lo siguiente:

 

alejandro@alejo:~/Descargas/cap2$ sudo iptables -L -nv

Chain INPUT (policy ACCEPT 141 packets, 13027 bytes)

 pkts bytes target     prot opt in     out     source               destination        

 

 

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)

 pkts bytes target     prot opt in     out     source               destination        

  45  3119  LOG        tcp  --  *      *       172.20.10.31         0.0.0.0/0            tcp dpt:25 LOG flags 0 level 4

  45  3119  DROP       tcp  --  *      *       172.20.10.31         0.0.0.0/0            tcp dpt:25

 

Chain OUTPUT (policy ACCEPT 135 packets, 13357 bytes)

 pkts bytes target     prot opt in     out     source               destination    

 

 

Nótese que en la tabla FORWARD tenemos dos entradas, la primera es un LOG que simplemente registra la información.

 

Dado que el firewall trabaja de manera secuencial y el destino “LOG” no es terminal (es decir que no finaliza la ejecución del recorrido por las reglas), el tráfico va a continuar y se va a encontrar con la próxima regla que le indica que la acción final es “DROP”, lo cual significa descartar de manera silenciosa.

 

Cual es el efecto que vemos desde el lado de quien está intentando enviar el correo ? el siguiente:

 

alejandro@alejo:~$ telnet mail-server.com 25

Trying 144.208.69.31...

Connected to mail-server.com.

Escape character is '^]'.

220-mail-server ESMTP SMTP XXX #2 Mon, 15 Mar 2021 08:20:50 -0700

220-We do not authorize the use of this system to transport unsolicited,

220 and/or bulk e-mail.

ehlo mail.com

250-mail-server.com Hello rX-X-X-X.dialup.adsl.anteldata.net.uy [X.X.X.X]

250-SIZE 52428800

250-8BITMIME

250-PIPELINING

250-AUTH PLAIN LOGIN

250-CHUNKING

250-STARTTLS

250 HELP

mail from:john.doe@mail.com

250 OK

quit

rcpt to:alejandro@i-guardian.biz

421 mail-server.com:

SMTP command timeout - closing connection

Connection closed by foreign host.

 

 

Nótese como la conexión queda en espera y termina cerrando por timeout.

 

Esto indica que el cliente quedo intentando comunicar con el servidor de correo, pero al no obtener respuesta (producto del corte) la conexión se aborta luego de un tiempo.

 

Con esto cerramos esta entrega de “A la caza de Gusanos”.

 

Espero que la misma haya sido de vuestro agrado y desde GuardiaN estamos gustosos de que nos contacten por cualquier consulta, duda o necesidad que puedan tener.

 

Saludos!

Alejandro Martínez - Director GuardiaN

EnglishSpanish