OpenVPN pivoting.

Iniciado por morodog, Abril 18, 2013, 12:26:22 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Abril 18, 2013, 12:26:22 PM Ultima modificación: Agosto 08, 2014, 09:58:01 PM por Expermicid
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.

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:

Código: php
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:

Código: php
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:

Código: php
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:

Código: php
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...

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

Código: php
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:

Código: php
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:

Código: php
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:

Código: php
#! /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:

Código: php
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:

Código: php
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ódigo: php
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.

Saludos.

FUENTE: hack players