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

lunes, 31 de octubre de 2016

VPNs levantados simultaneamente con OPENVPN

Ya sabes que hace poco liberaron 4nonimizer, un script en bash que permite ocultar la IP con la que salimos a Internet usando un proveedor VPN que soporte OpenVPN. Inicialmente la herramienta levanta un único túnel pero, ¿por qué no levantar varios de forma concurrente?"



Imaginad la posibilidad de usar una "cadena de proveedores VPN", es decir, establecer una VPN teniendo previamente otra levantada, y así varias veces para ocultar la IP real detrás de varias "capas". O la posibilidad de distribuir tráfico paralelamente durante un escaneo de puertos multiplicando la rapidez y de paso facilitando la evasión de IDS/IPS. Por poner dos claros ejemplos...

Pues nada más fácil, simplemente hay que levantar cada uno de los túneles añadiendo cada ruta con una métrica diferente y pata ello sólo hay que especificarlo en cada fichero de configuración correspondiente del cliente openvpn (.ovpn).

El siguiente script levantará automáticamente tantos túneles VPN como indiquemos:
#!/bin/bash
cp pass.txt ./multivpn
rm ./multivpn/*.ovpn

echo introduce numero de vpns concurrentes
read novpns

# Copia 3 ficheros ovpn adicionales por si algún peer falla
novpns=$((novpns + 3))

currentnovpns=0
while [ $novpns != $currentnovpns ]
do    
    randomvpn=$(ls *.ovpn | shuf -n 1)
    if [ ! -f ./multivpn/$randomvpn ]; then
        cp $randomvpn ./multivpn/ 
        echo "Copiado el fichero $randomvpn"
    fi
    currentnovpns=`ls -1 ./multivpn/*.ovpn 2>/dev/null | wc -l`
done

novpns=$((novpns - 3))

# levanta cada tunel con diferentes metricas
metric="20"
INT=$(ls /sys/class/net/ | grep -E '^eth|^en' | head -1)
GW=$(ip route show 0.0.0.0/0 dev $INT | cut -d\  -f3 | sort -u)

for file in $(ls ./multivpn/*.ovpn) 
    do
    echo "route-metric $metric" >> $file
    echo "route-nopull 1" >> $file
    echo "route 0.0.0.0 0.0.0.0 vpn_gateway $metric" >> $file
    metric=$((metric + 1))
done

cd multivpn

musthavetun=1
tries=1

for file in $(ls *.ovpn) 
do

    currenttun=$(ifconfig | grep tun | awk '{print $1}' | wc -l)
    echo -en "\nNúmero de túneles levantados: $currenttun\n"

    nohup openvpn $file 2>/dev/null &

    echo "Levantando interfaz de túnel"
    while [[ $currenttun -lt $musthavetun ]]
        do
            echo -en "."
            tries=$((tries + 1))
            sleep 1
            currenttun=$(ifconfig | grep tun | awk '{print $1}' | wc -l)
            if [ "$tries" = 30 ]
            then
                break
            fi
        done
    
    route del default gw $GW $INT 2>/dev/null
    route add default gw $GW $INT 2>/dev/null
    sleep 3
    if [ "$currenttun" = "$novpns" ]
    then 
        break    
    else
        musthavetun=$((musthavetun + 1))
        echo "ok!"
    fi
done

echo -e " todos los túneles levantados."

Sólo tenéis que copiarlo (multivpn.sh) al directorio donde tengáis los .ovpn (con 4nonimizer en '/opt/4nonimizer/vpn/proveedor') y copiará aleatoriamente algunos de estos ficheros al subdirectorio 'multivpn' para ejecutarlos después con el cliente openvpn y establecer los túneles uno tras otro: 
# bash multivpn.sh 
introduce numero de vpns concurrentes
4
Copiado el fichero VpnProvider.Singapore-Singapore-NO-TORRENTS-TCP.ovpn
Copiado el fichero VpnProvider.Denmark-Lyngby-TCP.ovpn
Copiado el fichero VpnProvider.USA-NewJersey-NO-TORRENTS-TCP.ovpn
Copiado el fichero VpnProvider.Turkey-Istanbul-UDP.ovpn
Copiado el fichero VpnProvider.Latvia-Riga-NO-TORRENTS-UDP.ovpn
Copiado el fichero VpnProvider.Singapore-Singapore-NO-TORRENTS-UDP.ovpn
Copiado el fichero VpnProvider.Tunisia-Tunis-UDP.ovpn

Número de túneles levantados: 0
Levantando interfaz de túnel
....ok!

Número de túneles levantados: 1
Levantando interfaz de túnel
....ok!

Número de túneles levantados: 2
Levantando interfaz de túnel
.......ok!

Número de túneles levantados: 3
Levantando interfaz de túnel
.... todos los túneles levantados.

Después de su ejecución podéis comprobar que los interfaces de túnel (tun0, tun1, tun2, etc.) han sido creados:
# ifconfig
eth0 Link encap:Ethernet  HWaddr 50:7a:6d:f5:1a:12  
          inet addr:192.168.1.180  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:322235 errors:0 dropped:0 overruns:0 frame:0
          TX packets:215243 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:149725996 (149.7 MB)  TX bytes:17969308 (17.9 MB)
          Interrupt:16 Memory:e1300000-e1320000 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:1527 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1527 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1 
          RX bytes:9467111 (9.4 MB)  TX bytes:9467111 (9.4 MB)

tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          inet addr:10.8.0.10  P-t-P:10.8.0.9  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:48000  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

tun1      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          inet addr:10.9.0.42  P-t-P:10.9.0.41  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:48000  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

tun2      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          inet addr:10.8.0.6  P-t-P:10.8.0.5  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:48000  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

tun3      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          inet addr:10.9.0.14  P-t-P:10.9.0.13  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:48000  Metric:1
          RX packets:13 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100 
          RX bytes:1312 (1.3 KB)  TX bytes:0 (0.0 B)

Y que las rutas han sido creadas con las métricas establecidas:
# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    0      0        0 eth0
0.0.0.0         10.8.0.9        0.0.0.0         UG    20     0        0 tun0
0.0.0.0         10.9.0.41       0.0.0.0         UG    21     0        0 tun1
0.0.0.0         10.8.0.5        0.0.0.0         UG    22     0        0 tun2
0.0.0.0         10.9.0.13       0.0.0.0         UG    23     0        0 tun3
10.8.0.5        0.0.0.0         255.255.255.255 UH    0      0        0 tun2
10.8.0.9        0.0.0.0         255.255.255.255 UH    0      0        0 tun0
10.9.0.13       0.0.0.0         255.255.255.255 UH    0      0        0 tun3
10.9.0.41       0.0.0.0         255.255.255.255 UH    0      0        0 tun1
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth0
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 eth0

A partir de ahí lo que dictamine vuestra imaginación... por ejemplo, lanzar varios escaneos en paralelo con nmap simplemente especificando cada vez un interfaz distinto dentro de un loop:

nmap -sT -Pn -p$port_range -oX salida.xml $network -e tun$iface_number &

De esta manera podremos jugar como queramos como escanear cada rango de puertos de un mismo host desde ubicaciones geográficas diferentes, tal y como se muestra en la siguiente imagen (bmon) con 15 túneles simultáneamente:


¿Interesante verdad? Pues atentos porque pronto actualizaran 4nonimizer con ésta y otras interesantes opciones :)

viernes, 20 de mayo de 2016

Cómo firmar digitalmente los correos enviados desde Yahoo o Gmail.

Cada vez surgen nuevos y más sofisticados ataques de phishing o de suplantación de identidad mediante correos electrónicos fraudulentos que intentan engañar a los usuarios. El objetivo es que faciliten información confidencial, o que sigan un enlace e introduzcan sus credenciales en un portal falso, o que abran un fichero adjunto y se infecten, etc.

Por eso hoy en día es de vital importancia firmar digitalmente los mensajes, para dar al destinatario la posibilidad de comprobar su autenticidad e integridad. 


No voy a entrar en el detalle dequé es y cómo funciona la firma electrónica pues no es objeto de esta entrada que pretende ser principalmente práctica. Sólo recordaros que, a grandes rasgos, para firmar un mensaje se calcula su hash (message digest) y se firma con la clave privada del remitente. El resultado es la firma digital que se adjunta en el mensaje al enviarlo para que el destinatario pueda comprobarlo mediante su clave pública correspondiente, tal y como se muestra en la imagen de la derecha.

Si el destinatario no dispone de la clave pública del remitente este último puede también adjuntarlo en el mensaje, eliminando así la necesidad del intercambio manual previo o el acceso a una PKI, GAL o keyserver público, a diferencia que con el cifrado (asimétrico) que si necesitaría si o si y previamente la clave pública del destinatario. 

Es decir, tenemos la posibilidad de firmar digitalmente y de forma fácil nuestros mensajes para darle a nuestros contactos la posibilidad de comprobar quién ha enviado un correo somos realmente nosotros.

Entonces, ¿por qué no firmar nuestros correos si podemos hacerlo de manera gratuita, en unos sencillos pasos e incluso con las cuentas de correo de Yahoo o Gmail que usamos a diario? Veamos cómo hacerlo.


Obtención del certificado SSL

Primero necesitamos un certificado firmado por una CA pública y confiable y, a ser posible, gratis para uso personal ;) 


Esto nos lleva a Let's Encrypt o StartSSL. 

En esta entrada utilizaremos uno de clase 1 de StartSSL, así que accederemos ahttps://www.startssl.com/ y pincharemos en 'Start Now for Free SSL Certificate': 


Luego pulsaremos el botón 'Sign up' para iniciar un enrollment que nos llevará poco más de 1 minuto de nuestro tiempo y con el que conseguiremos el certificado (S/MIME):

  
Después introducimos el país y nuestra dirección de correo. Llama la atención que hay algunos dominios baneados, aunque he podido generar un certificado para una cuenta de Anonbox.net sin problemas... 

Pero hagámoslo bien y para el ejemplo utilizamos la dirección de correo de Yahoo de Hackplayers:

A continuación recibiremos un código de verificación que tenemos que introducir en el formulario.

Automáticamente se nos instalará en el navegador el certificado generado y podremos autenticarnos en la página con dicho certificado:





El último paso será hacer una copia del certificado en formato pkcs12 (.p12) para luego importarla en el cliente de correo. 

En Firefox tendremos que abrir la opciones e ir a la pestaña de Certificados en Avanzado y pulsar el botón "Hacer copia", eligiendo una contraseña de respaldo y el nombre del fichero deseado.


Configuración del cliente de correo

La mayoría de los servicios de webmail no permiten configurar certificados ni clasificar mensajes firmados, Gmail y Yahoo no son excepciones. Además si reciben un mensaje firmado suelen mostrar un email vacío con un adjunto smime.p7s (el cual contiene realmente el mensaje). Por ello necesitaremos un cliente de correo compatible con S/MIME o PGP, ambos estándares para criptografía de clave pública y firmado de correo electrónico. 

En mi caso y siguiendo con la "familia Mozilla" utilizo Thunderbird que puede configurarse perfectamente con cuentas de Yahoo y Gmail.

Sólo hay que ir a la configuración de la cuenta y en la parte de seguridad importar el certificado:


y seleccionarlo para el firmado digital:


Finalmente a la hora de redactar un mensaje podremos ver que el mensaje será firmado tal y como lo hemos configurado:


Y el receptor podrá comprobar en su cliente (compatible con S/MIME) que realmente el remitente es ser quién dice ser...


Próxima estación... cifrado, pero eso ya será otra historia...

lunes, 21 de marzo de 2016

SECURITY ONION: DISTRIBUCIÓN GNU/LINUX PARA ANÁLISIS DE RED




Muchas veces nos toca analizar el tráfico de red intercambiado entre una máquina e Internet, o incluso comprobar si un equipo tiene alguna variedad de malware que lleve a cabo actividad de red, ya sea para atacar a otras máquinas o para comunicarse con el C&C de una botnet.

En esas situaciones, o simplemente en un despliegue preventivo de sondas IDS, la distribución Linux opensource Security Onion,  de la que hablo en este post, puede servir de gran utilidad. 

Básicamente, incorpora de forma preinstalada, diversas herramientas ampliamente conocidas, un IDS comoSnort y/o Suricata (nos da a elegir qué herramienta deseamos usar), GUIs para monitorizar los eventos de forma automática (SquertSguil), herramientas específicas para análisis de PCAPs (WiresharkNetworkMiner) y herramientas populares de análisis forense de red como (Bro o Xplico). De algunas de ellas hemos hablado ampliamente en SbD en vidas pasadas.



En muchas ocasiones, pensamos que puede resultarnos interesante montar y elegir qué herramientas queremos habilitar para nuestro despliegue de sondas, y generalmente cuando me preguntan o en diversas formaciones, recomiendo hacer siempre una instalación mínima e instalar las herramientas justas y necesarias para cada caso. 

Sin embargo, a veces la configuración de determinadas herramientas como Bro, o la integración con PF_RING, para entornos de grandes necesidades de tráfico, pueden resultar problemáticas, y se agradece tener un punto de partida desde el cuál empezar con varias herramientas ya integradas, pudiendo deshabilitar aquello que no nos interese, dejando el resto.

En estos casos, es cuando Security Onion me ha resultado de gran utilidad, puesto que en pocos minutos ya trae todo lo necesario y con un único wizard se configura la mayoría de los productos. 


Está basada en Ubuntu y viene con entorno gráfico, así como varias herramientas que se pueden gestionar vía web. 

Una de las herramientas más interesantes que trae es ELSA (Enterprise Log Search and Archive), que permite hacer la vida cómoda al analista, de forma gráfica, cuando tiene que interactuar con Bro.


Con esta solución, se puede llegar a hacer un buen NSM (o sistema de gestión de red) permitiendo configurar un nodo como servidor y el resto como sondas, de manera que se pueda consultar toda la información recopilada desde un mismo punto centralizado.   

Por buscarle una pega, en la última versión de Security Onion, han eliminado de la lista de herramientas una de las interfaces para Snort que más me gustan, que es Snorby. Aun así, supongo que puede seguirse instalando manualmente.

Y si ya tengo un despliegue de sondas hecho, pero me interesan algunas de Security Onion ¿Qué hago?

Bueno pues otra de las ventajas que tiene Security Onion, es que no es necesario que instales la distribución entera y partas de ella, sino que puedes incorporar únicamente los repositorios al sources.list de otra distribución basada en Debian/Ubuntu e instales aquellos paquetes que te interesan, o todos juntos.

Para el nuevo curso de Análisis Forense Digital en Profundidad que vamos a dar en Securízame, en el módulo I, en la parte en la que daré pautas sobre cómo construir un Laboratorio Forense, demostraré cómo incorporar y configurar las herramientas de Security Onion en una distribución específica para forense como es Caine, de la que ya hemos hablado en SbD.

Bajo estas líneas, os dejo una lista de videos de Security Onion, en el que hay un How-to de cómo hacer la instalación, configuración y parte de la operación. 

jueves, 28 de enero de 2016

whatportis: un comando para buscar a qué número de puerto corresponde un servicio y viceversa.

¿Cuántas veces has buscado en Internet a qué servicio estándar corresponde un puerto TCP/UDP o viceversa? Hazlo como un pro desde tu consola con la utilidad whatportis.



Instalación:

$ pip install whatportis

Uso:

Buscar qué puerto está asociado con un servicio:

$ whatportis redis
+-------+------+----------+---------------------------------------+
| Name  | Port | Protocol | Description                           |
+-------+------+----------+---------------------------------------+
| redis | 6379 |   tcp    | An advanced key-value cache and store |
+-------+------+----------+---------------------------------------+

O a la inversa, qué servicio está asociado con un número de puerto determinado:

$ whatportis 5432
+------------+------+----------+---------------------+
| Name       | Port | Protocol | Description         |
+------------+------+----------+---------------------+
| postgresql | 5432 |   tcp    | PostgreSQL Database |
| postgresql | 5432 |   udp    | PostgreSQL Database |
+------------+------+----------+---------------------+

Además, podemos buscar patrones sin conocer exactamente el nombre simplemente añadiendo la opción --like:



$ whatportis mysql --like
+----------------+-------+----------+-----------------------------------+
| Name           |  Port | Protocol | Description                       |
+----------------+-------+----------+-----------------------------------+
| mysql-cluster  |  1186 |   tcp    | MySQL Cluster Manager             |
| mysql-cluster  |  1186 |   udp    | MySQL Cluster Manager             |
| mysql-cm-agent |  1862 |   tcp    | MySQL Cluster Manager Agent       |
| mysql-cm-agent |  1862 |   udp    | MySQL Cluster Manager Agent       |
| mysql-im       |  2273 |   tcp    | MySQL Instance Manager            |
| mysql-im       |  2273 |   udp    | MySQL Instance Manager            |
| mysql          |  3306 |   tcp    | MySQL                             |
| mysql          |  3306 |   udp    | MySQL                             |
| mysql-proxy    |  6446 |   tcp    | MySQL Proxy                       |
| mysql-proxy    |  6446 |   udp    | MySQL Proxy                       |
| mysqlx         | 33060 |   tcp    | MySQL Database Extended Interface |
+----------------+-------+----------+-----------------------------------+


Seguro que pensaran por qué no usar simplemente "grep /etc/services"... La razón es porque es un comando portable con un formato más agradable. Utiliza la web de Iana.org para obtener una listado oficial de puertos (ports.db) que próximamente podremos forzar a actualizar con update.

Fuentehttps://github.com/ncrocfer/whatportis