OpenVPN pivoting

Como todos sabéis, pivotar o pivoting es un método que consiste básicamente en utilizar un sistema bajo nuestro control como pasarela para atacar otros sistemas y redes, evadiendo así restricciones como las reglas de un firewall intermedio. Podríamos dividir esta técnica en dos grandes tipos:

- Proxy pivoting: se canaliza el tráfico a través de un payload en el equipo mediante el cual pivotaremos. Se limita a determinados puertos TCP y UDP.
- VPN pivoting: consiste en crear un túnel cifrado contra el equipo mediante el cual pivotaremos para enrutar todo el tráfico de red, por ejemplo para ejecutar un escaneo de vulnerabilidades a otros equipos de su red o de otras redes a las que tiene acceso.

En mi caso, por versatilidad, necesito esta última técnica. Podría utilizar la versión Pro de Metasploit o Cobalt Strike que son herramientas excelentes para VPN pivoting, aunque también lo son de pago, así que según está la economía me decanto por OpenVPN :P


Os planteo el siguiente escenario:
 

 
Imaginad una topología con un servidor de monitorización con Nagios en la DMZ el cual, por su naturaleza, tiene habilitado además accesos a otros segmentos de red. Tengo el usuario root y ya accedo a la consola por SSH. Además, el firewall interno me permite acceder a otros puertos del servidor. 

Si realizo un escaneo desde mi portátil obtengo los siguientes resultados:
Nmap scan report for 192.168.2.50
Host is up (0.00s latency).
Not shown: 991 filtered ports
PORT     STATE  SERVICE
22/tcp   open   ssh
23/tcp   closed telnet
80/tcp   open   http
113/tcp  closed ident
161/tcp  closed snmp
1060/tcp open   polestar
2869/tcp open   icslap
8080/tcp open   http-proxy
8100/tcp open   xprint-server
 
Podría montar un túnel directamente sobre ssh, pero resultaría muy fácil meter la pata y perder la conexión con el servidor remoto, y no me gustaría tener que llamar al administrador de sistemas varias veces para que me reinicie el servidor ¬_¬ ... Así que utilizaré otro puerto abierto, por ejemplo el del telnet (por qué coño está abierto el puerto del telnet?).

Empezaré instalando OpenVPN. El servidor es Ubuntu así que esto es bastante trivial:

sudo apt-get install openvpn
 
OpenVPN tiene dos modos de funcionamiento, uno basado en claves estáticas pre-compartidas y otro en SSL/TLS usando certificados y claves RSA. Aunque no tan seguro, usaré el primero por simplicidad. A continuación, genero la clave privada:
openvpn --genkey --secret secret.key
 
Esta clave es simétrica, por lo que la tiene que tener tanto el servidor como el cliente, con lo cual, después de generarla la copiaré a mi portátil mediante SCP (con WinSCP puesto que mi SO es Windows 7) y la protegeré como oro en paño... por que no hace falta que os diga qué pasaría si un tercero se hiciera con ella...no?

El objetivo entonces es crear un túnel VPN punto a punto que se establecerá entre los interfaces virtuales (tun0) del servidor y mi portátil con una IP privada a cada extremo: 10.8.0.1 en el endpoint del servidor y 10.8.0.2 en el endpoint del cliente. Con el modo p2p (predeterminado) se establece una topología punto-a-punto en donde la dirección IP virtual del peer remoto de la interfaz tun del cliente siempre apunta a la dirección IP virtual local de la interfaz tun del servidor.

Creo el fichero /etc/openvpn/server.conf con la siguiente configuración:

mode p2p
dev tun
port 23
proto tcp-server
ifconfig 10.8.0.1 10.8.0.2
secret secret.key
;user nobody
;group nobody

keepalive 10 60
ping-timer-rem
persist-tun
persist-key

comp-lzo
 
Como véis, todas las comunicaciones entre ambos puntos irán cifradas y se realizarán sobre el puerto 23/TCP, ya que el telnet está permitido en el firewall interno el cual dejará "fluir" el tráfico del túnel como si nada... (ay ese deep inspection!).

No olvidemos que es necesario habilitar en el servidor el reenvío de paquetes:

echo 1 > /proc/sys/net/ipv4/ip_forward
 
Ni tampoco que tengo que enmascarar mi dirección IP para habilitar el tráfico de vuelta porque las redes a las que accederé no tienen porque conocer la ruta de vuelta si uso mi IP privada real. Y bueno, me da cierto anonimato:
iptables -t nat -A POSTROUTING -s 10.8.0.2 -o eth0 -j MASQUERADE
 
Por último, sólo activaré el túnel bajo demanda por lo que elimino todos los scripts de inicio:
update-rc.d -f openvpn remove
 
Y con esto he finalizado la configuración del servidor. Podré levantar el servicio OpenVPN con el comando 'openvpn --config /etc/openvpn/server.conf &' o crearme un cutre-script como el siguiente:
#! /bin/sh
case "$1" in
        start)
                /bin/echo 1 > /proc/sys/net/ipv4/ip_forward
                /usr/sbin/openvpn --config /etc/openvpn/server.conf &
                /sbin/iptables -t nat -A POSTROUTING -s 10.8.0.2 -o eth0 -j MASQUERADE
            ;;
        stop)
                /bin/echo 0 > /proc/sys/net/ipv4/ip_forward
                /usr/bin/killall openvpn
                /sbin/iptables -t nat -F
                /sbin/iptables -t nat -X
           ;;
        *)
          echo "Uso: ovpn|start|stop"
          exit 1
          ;;
    esac
 
Como veis al levantar el túnel lo hará también el dispositivo virtual:
ps -ef | grep openvpn
root      5976     1  0 12:39 ?        00:00:01 /usr/sbin/openvpn --config /etc/openvpn/server.conf

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.1  P-t-P:10.8.0.2  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:9523 errors:0 dropped:0 overruns:0 frame:0
          TX packets:10414 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:1156752 (1.1 MB)  TX bytes:4833017 (4.8 MB)
 
Ahora sólo me queda configurar el cliente OpenVPN de mi portátil. Para ello creo el fichero pivoting.ovpn en C:\Program Files (x86)\OpenVPN\config con la siguiente configuración:
mode p2p
remote 192.168.2.50
dev tun
port 23
proto tcp-client
ifconfig 10.8.0.2 10.8.0.1
secret "C:\\Program Files (x86)\\OpenVPN\\config\\secret.key"
comp-lzo
dhcp-option DNS 192.168.2.36
route-metric 15
route 192.168.3.0 255.255.255.0 10.8.0.1
verb 
 
Fijaros que añado un DNS a mi elección y la ruta de la red de servidores (192.168.3.0/24) para que mi cliente Windows encamine correctamente los paquetes.

Para terminar compruebo que llego al interfaz virtual del tunel y a un equipo de la VLAN de servidores:

C:\Users\vmotos>ping -n 1 10.8.0.1

Haciendo ping a 10.8.0.1 con 32 bytes de datos:
Respuesta desde 10.8.0.1: bytes=32 tiempo=1ms TTL=64

Estadísticas de ping para 10.8.0.1:
    Paquetes: enviados = 1, recibidos = 1, perdidos = 0
    (0% perdidos),
Tiempos aproximados de ida y vuelta en milisegundos:
    Mínimo = 1ms, Máximo = 1ms, Media = 1ms

C:\Users\vmotos>tracert 192.168.3.12
Traza a 10.20.16.12 sobre caminos de 30 saltos como máximo.

  1     1 ms     1 ms     1 ms  SERVIDOR [10.8.0.1]
  2     6 ms     2 ms     2 ms  192.168.2.1
  3     2 ms     2 ms     2 ms  192.168.3.12
  
Traza completa.
 
¡Y ya está! Ya estoy pivotando a través del servidor de monitorización mediante el túnel VPN.

Tened en cuenta que el servidor de este ejemplo lo gestiono lícitamente. Si comprometemos un servidor, obtenemos acceso como root y queremos utilizar openvpn para vpn pivoting, habrá que pensar también en utilizar algún rootkit u otras técnicas para ocultar al menos el interfaz virtual y el proceso, pero eso ya lo veremos en otra entrada... ;)

5 comentarios :

  1. nmap no indica que el puerto 23 esta cerrado?

    ResponderEliminar
  2. está cerrado porque en el servidor no había ningún demonio de telnet levantado pero sin embargo si está permitido el "paso" a través del firewall

    ResponderEliminar
  3. está cerrado porque en el servidor no había ningún demonio de telnet levantado pero sin embargo si está permitido el "paso" a través del firewall

    ResponderEliminar
  4. Bien! Hoy en día, hay una gran cantidad de proveedores de VPN en el mundo. Yo uso Hotspot Shield Elite para ocultar mi IP desde fuera del mundo. Este vpn proporciona seguridad. Después de conseguir el servicio VPN, puedo comprobar mi dirección IP utilizando Ip-details.com . Me sorprende, mi ip se cambia.

    ResponderEliminar
  5. Hola estimado compañero, una duda, cual serial el procedimiento a seguir si en el escenario que propones el firewall externo solo permitiera trafico saliente por los puertos HTTP, HTTPS, DNS, SMTP, POP3?

    ResponderEliminar