Mostrando entradas con la etiqueta defensa. Mostrar todas las entradas
Mostrando entradas con la etiqueta defensa. Mostrar todas las entradas

28 septiembre 2013

Portspoof, o cómo atacar al atacante




¿Cuántas veces, revisando los logs de nuestros servidores, vemos intentos de conexión SSH, escaneos completos de sistema o escaneos web? Dado lo que es la justicia en Internet, ¿cuántas veces hemos cogido una IP que nos está dando brasa y la hemos contra-escaneado "a ver qué tiene"? En mi caso, reconozco que muchas veces lo he hecho porque, como será un nodo zombie de una botnet, quiero saber de una forma rápida quién me está arreando, por qué, y cómo se lo han cepillado a él previamente. Si detecto que tiene el TCP/3389 abierto, por ejemplo, tengo claro lo que hay,… A nivel IP, intento ver a qué organización pertenece y, si se puede, notifico que tienen, al menos, una máquina comprometida, que está atacando indiscriminadamente por Internet. En casos que no he podido identificar de quién se trata, incluso he estado tentado de acceder a la máquina por Terminal Services (si un bot pudo, yo también) y dejar de fondo de pantalla un mensaje indicando que han tenido un compromiso previo. Menos mal que revisando el código penal, se me pasan las ganas,… pero la culpa es de ellos por atacar primero!

Así pues, de la mano de Mike, un lector amigo de Costa Rica, llegaba a mis manos la existencia de una herramienta llamada Portspoof, que actúa a modo de Honeypot pero con capacidades ofensivas. Por una parte, en un sistema UNIX podemos simular un puerto concreto o incluso varios que por una regla de NAT entrante, redirija el tráfico que iba al puerto original hacia el puerto en el que escucha portspoof, por defecto el 4444 (mira que me suena ese puerto). Por otro lado, permite incluso contraatacar a la IP que hace el escaneo. Y os preguntaréis, ¿cómo ante un simple NMAP puedo responder de forma que logre incluso una shell en el equipo atacante? Pues en el video que aparece en la web de portspoof, y que os incorporo bajo estas líneas, se ve que si, en el Nmap que os lanzan, se han tomado la molestia de ejecutar determinados scripts NSE, en algunos casos, es posible hacer que portspoof devuelva un payload malicioso que fuerza la ejecución de código remoto o el envío de una shell desde la máquina atacante, imagino que con los permisos con los que se ejecuta nmap. 




Aunque no he probado la herramienta en profundidad, y parece que sólo permite hacer un honeypot de un único servicio por cada instancia de portspoof, me ha venido a la cabeza, una idea que me comentó Yago hace un montón de años. Se trataba de hacer un programa que "bindeara" un socket en todos aquellos puertos menores al 1024, que no fuesen servicios de verdad. Es decir, que si un sistema necesita tener como servicios escuchando en la red el SSH, HTTP y FTP por ejemplo, este programa crearía un socket en todos los demás puertos (o en unos cuantos). Cuando se recibiese un escaneo NMap normal (TCP SYN), el sistema devolvería que TODOS los puertos hasta el 1024 están abiertos. En aquella época, quizá fuese suficiente. Ahora con los anchos de banda disponibles, los escaneos son mucho más elaborados e incorporan, como bien cuenta Paulino Calderón en su libro "NMap 6: Network Exploration and Security Auditing Cookbook", infinidad de opciones y ejecución de scripts que hacen que NMap haya dejado de ser una herramienta puramente de reconocimiento, para jugar un papel mucho más ofensivo. 


Por ello, creo que una herramienta que combinase ambas ideas, la de "bindear" sockets en diferentes puertos, así como generar servicios fake aleatorios escuchando en los mismos, para confundir al atacante, podría ser francamente interesante. Si alguno de nuestros lectores se anima a hacerla, estaremos encantados de probarla y comentarla en SbD.
Leer más...

24 noviembre 2010

Construyendo tu Host IPS a medida

Sí, bueno, ya sé que igual es un poco ambicioso el título, pero no sé qué nombre puede encajar mejor para el mecanismo de defensa que os voy a proponer a continuación.

Después de muchos años integrando, configurando y afinando este tipo de dispositivos en diferentes organizaciones, me dí cuenta que los IPS comerciales son capaces de detectar/bloquear un amplio porcentaje de ataques dirigidos hacia las redes internas. Sin embargo, debido a que se basan en ataques que son de "sota, caballo y rey", no resultan efectivos para detectar/bloquear aquellos eventos que para mí son una amenaza, aunque para otros puedan no serlo.

Perl es un lenguaje de programación que personalmente me encanta. Con perl eres capaz de hacer lo mismo que en lenguajes de más bajo nivel, siempre y cuando el rendimiento al milisegundo no sea tan importante, permitiéndote lograr tu cometido en pocas líneas de código, con un nivel de abstracción muy grande. Se pensó inicialmente para el tratamiento de cadenas de texto y ficheros por lo que para lo que pensamos hacer, nos viene como anillo al dedo.

Lo primero que debemos saber, es qué queremos proteger, qué servicios tenemos expuestos al exterior, o son importantes y por ello debemos prestarles nuestra máxima atención. El siguiente paso es conocer la ubicación y la estructura de los diferentes ficheros de log en los que estos servicios registran su actividad.

Utilizaremos el módulo File::Tail de Perl para hacer lo mismo que el comando tail en UNIX. Por cada línea escrita en el fichero, nuestro IPS lo monitorizará y podrá reaccionar según definamos.

Vamos allá con un ejemplo práctico. Supongamos que disponemos de un servidor QMail que requiere autenticación para SMTP. Para nosotros una amenaza ante la que reaccionar podría ser un ataque de fuerza bruta que intente averiguar un par de usuario/contraseña válida. 

El formato de una línea de una autenticación errónea es el siguiente:

Nov  8 11:51:52 s_sys@Carmen vpopmail[18129]: vchkpw-smtp: vpopmail user not found guyt@:123.123.123.123

#!/usr/bin/perl

use File::Tail; #el módulo nombrado
my $tail_file_smtp="/var/log/maillog"; #fichero donde se registra la actividad SMTP
my $puerto_destino_smtp=25; #puerto que queremos proteger

$file_maillog=File::Tail->new(name => $tail_file_smtp, maxinterval=>1); 
while (defined($linea=$file_maillog->read))  #si hay linea nueva en el fichero
        {
                if ($linea=~ m/vchkpw-smtp: vpopmail user not found/) #Si coincide con el patrón que queremos bloquear
                {
                        my @trozos=split (/:/,$linea); 
                        my $ip=$trozos[5]; #La IP atacante. En el ejemplo 123.123.123.123
                        chop ($ip) #Eliminamos el retorno de carro
                        blacklistea ($ip,$puerto_destino_smtp,"correla_smtp vpopmail user not found"); #Reaccionamos
                }
        }

En este caso, la reacción es llamar a una función que se llama blacklistea y que recibe como parámetros la IP atacante, el puerto destino, y una descripción. El contenido de la función blacklistea es bastante más complejo, con comprobaciones varias en base a  llamadas a otras cuantas funciones. Fundamentalmente lo que hace es añadir al IPTables de la máquina una regla que bloquea el acceso al puerto 25 desde la IP considerada como atacante y notificar a quien corresponda que se ha bloqueado esa IP a ese puerto por la razón especificada como "Descripción". Asimismo esa misma información queda reflejada junto con la fecha/hora en una base de datos. Hay otro proceso que cada minuto lee de esa base de datos y, si ha pasado un tiempo especificado desde que se añadió esa IP, quita la regla de bloqueo. Si alguien tiene interés en más detalle, que nos lo indique y se lo enviaré o lo publicaré en una segunda parte.

Al igual que se hace con el fichero /var/log/mailog para ese tipo de ataque, se puede proteger los accesos incorrectos a otros servicios como: FTP, POP3, HTTP, HTTPS, etc,… siendo una defensa reactiva fabricada a medida para ajustarse a nuestros servicios según nuestro criterio, ante lo que es un ataque y lo que no lo es.

Para ampliar la detección y reacción a otros servicios, lo mejor será lanzar un thread por cada uno de ellos, además de una adaptación de GeoIPS, y de una rutina de comprobación de diferentes checks de la máquina. Esto quedará de la siguiente manera en el arranque del programa principal:
#MAIN
.... 
<snip>
.... 
$thr_www = threads->new(\&correla_www); #Comprobaciones para el servidor web
$thr_vpop3s = threads->new(\&correla_vpop3s); #Para Pop3s
$thr_qmail_log = threads->new(\&correla_qmail_log); #Antispam
$thr_smtp = threads->new(\&correla_smtp); #SMTP
$thr_ftp = threads->new(\&correla_ftp); #FTP
$thr_geo_firewall = threads->new(\&geofirewall); #Adaptación propia de GeoIPS
$thr_checks=threads->new(\&do_checks); #Checks varios de carga, espacio en particiones,...

#Bucle infinito
for (;;)
{
        chequea_bloqueadas; #Función que valida si una IP en cuarentena debe ser ya desbloqueada o no
        sleep ($frecuencia_chequeo);
}

Leer más...