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 de pasar por nuestro firewall.
Recordarán que mediante herramientas estándares de nuestro firewall (como tcpdump), podíamos monitorear cuando detectabamos conexiones SMTP desde nuestra red hacia Internet.
Lo que les propongo hoy es, además de monitorear esos eventos, generar alú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 parametros
-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 !