VPNs concurrentes con OpenVPN

Ya sabéis que hace poco liberamos 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 actualizaremos 4nonimizer con ésta y otras interesantes opciones :)

4 comentarios :

  1. Buen trabajo, casi todos los dias pruebo a actualizar 4nonimizer jeje. Super interesante esta funcionalidad.

    ResponderEliminar
    Respuestas
    1. Gracias! Tenemos una versión casi para sacar del horno: corregimos bugs, añadimos algún proveedor vpn más y estamos trabajando para poder seleccionar la IP por ubicación geográfica (país o continente)

      Eliminar
  2. Un saludo hackplayers! Tengo una pregunta directa y concreta!
    Es IPvanish un proveedor de VPN legitimo si o no? Ya que su costo es un poco alto pweo quisiera saber si en verdad es tan bueno como dicen.... alguien podría sacarme de la duda

    ResponderEliminar
  3. Saludos amigo, a pesar de que se indica que se puede ejecutar en entornos Debian, en mi distribución PointLinux basada en Debian no se ejecuta y muestra el siguiente mensaje:
    "[*] Your distro is not supported"
    Pueden por favor indicar si se debe instalar algunas paqueterías extras?

    Otra cosa, he intentado con multivpn, copiando multivpn.sh a /opt/4nonimizer-master/vpn/torguard y genera el siguiente mensaje:
    root@androidf0r3ns3:/opt/4nonimizer-master/vpn/torguard# ./multivpn.sh
    rm: no se puede borrar «./multivpn/*.ovpn»: No es un directorio
    introduce numero de vpns concurrentes
    2
    ls: no se puede acceder a *.ovpn: No existe el fichero o el directorio
    cp: falta el fichero de destino después de «./multivpn/»
    Pruebe 'cp --help' para más información.
    Copiado el fichero

    Gracias por la ayuda que puedan prestarme..

    ResponderEliminar