El artículo se divide en dos secciones, una teórica y la otra práctica, la primera parte es la más interesante, la segunda parte es simplemente ejecutar comandos.

No hace mucho en la empresa tuvimos un cliente al cual para conectarnos a sus servidores necesitabamos una vpn (su elección fue openVPN), pero en determinado momento su ISP comenzó a bloquear las conexiones OpenVPN, así que nos dimos a la tarea de encontrar una manera de intentar saltarnos esta traba.

1- Bloqueos de tráfico

Existen varias formas tradicionales de bloquear comunicaciones en las redes de datos (DNS Blocking, IP Blocking, Port Blocking, DPI Blocking…).

La inspección profunda de paquetes (DPI) inspecciona cada paquete según el encabezado de su solicitud y los datos que transporta. Puede identificar el tipo de protocolo que utiliza la conexión incluso si está cifrada. DPI no es un mecanismo para descifrar lo que hay dentro de los paquetes, sino para identificar el «protocolo» o la aplicación que representa.

Con DPI se pueden realizar búsquedas por VPN, Tor y otros servicios filtrando los paquetes en la capa de aplicación del modelo de referencia OSI, analizarlos y luego bloquear las direcciones IP a las que los clientes intentan conectarse.

Incluso si está usando OpenVPN en el puerto https y no está usando un host VPN conocido (que podría estar bloqueado por IP y/o DNS), DPI puede inspeccionar el tráfico e identificarlo como OpenVPN, y bloquearlo basándose en esa inspección.

En este punto, la ofuscación del tráfico se convierte en un requisito para evadir DPI y, por lo tanto, proteger los servidores de ser bloqueados inmediatamente a través de IP. Los Pluggable Transports fueron desarrollados por primera vez por The Tor Project para proporcionar formas a los desarrolladores de herramientas para hacer que sus aplicaciones sean más resistentes al filtrado DPI.

Pero… Y cómo los Pluggable Transports ayudan?

Se podría «encriptar» “fácilmente” el tráfico para que no se parezca al tráfico que se está bloqueando. El uso de un cifrado César como ROT13, o ajustes mínimos en partes del tráfico que se utilizan para identificarlo son ejemplos, e incluso han funcionado durante un tiempo en algunos casos. Sin embargo, esto es fácilmente bloqueado.

Haciendo que parezca ruido

Un paso importante es trabajar para hacer que el tráfico parezca nada en absoluto. El objetivo aquí es eliminar cualquier característica de identificación del tráfico. Este es el enfoque en la línea de Transports «obfs» más famosa de Tor, y nos referimos a esto como Scrambling.

Para vencer la codificación, se debe seleccionar solo el tráfico de salida reconocido y «aprobado» (lista blanca), escanear el destino de cada flujo de tráfico no reconocido y determinar si es legítimo o una herramienta de elusión, o encontrar formas de interferir o identificar el tráfico.

Haciendo que parezca otra cosa

Otro enfoque es transformar el tráfico para que parezca tráfico conocido y aprobado. Esto enfrenta sus propios desafíos, ya que se convierte en una carrera armamentista para garantizar que este «cambio de forma» (shapeshifting) sea lo suficientemente bueno. Si, por ejemplo, está cambiando de forma su tráfico a http vanilla, el servidor deberá responder como un servidor web real.

Escondido en la multitud

Otro enfoque aprovecha los grandes proveedores de la nube que son social o económicamente difíciles de bloquear. Con Fronting, se puede enrutar el tráfico a través de un servicio permitido.

Otra variante de este enfoque es el uso de muchas conexiones efímeras de corta duración. Una incursión inicial en esto se llamó flashproxy, que aprovechó a los visitantes del sitio web como representantes de otros a través de javascript. Snowflake ha tenido más éxito, superando muchos de los desafíos que enfrenta flashproxy al usar WebRTC, una interfaz HTML5 que proporciona comunicación en tiempo real entre navegadores y dispositivos.

2- Conociendo los Transports

Los Pluggable Transports (no tiene una traducción literal, aunque me atrevería a sugerir algo como envases de transportes que pueden ser enchufados, aunque resulte gracioso) se han creado para ayudar a los desarrolladores a mantener conectados a sus usuarios cuando se produce la censura. Si bien los Transports se ajustan a una sola especificación, se conectan a la red utilizando una variedad de técnicas diferentes.

Hay muchos transportes diferentes que abordan una amplia variedad de estrategias de bloqueo. Desde un punto de vista de muy alto nivel, se pueden agrupar en tres estrategias: desvío (Diverting), codificación (Scrambling) y cambio de forma (Shapeshifting).

Diverting

En este caso, el tráfico se mueve por la red utilizando diferentes rutas para el tráfico web estándar. Una forma de desviar el tráfico se conoce como «domain fronting». Este enfoque aprovecha las plataformas en la nube que son social o económicamente difíciles de bloquear: empuja el tráfico a través de un «frente», que comúnmente es una dirección IP compartida por muchos sitios en el proveedor de la nube. Para bloquear de forma eficaz una aplicación mediante el uso de la interfaz de dominio, es necesario bloquear todo el proveedor de la nube y todos los demás servicios alojados por él. Otra forma de desviar el tráfico es utilizar puentes que se puedan subir y conectar fácilmente durante un corto período de tiempo. Una vez que se descubren estos dispositivos, la aplicación puede encontrar nuevos puentes y conectarse a través de ellos. Este tipo de enfoque requiere que muchos dispositivos actúen como puentes y que las aplicaciones tengan la inteligencia para descubrir nuevos puentes.

Scrambling

Este enfoque busca disfrazar el tráfico de formas que no sean identificables como ningún tipo de tráfico específico. La codificación tiende a funcionar mejor cuando no solo existe la voluntad de bloquear directamente a los grandes proveedores de plataformas, sino también de participar en el análisis de DPI del tráfico de Internet.

La codificación se basa en que los clientes puedan conocer o descubrir direcciones IP desbloqueadas, y un censor activo trabajará para descubrir y bloquear estas direcciones. Una vez que se conoce la dirección de un servidor, ya no se puede utilizar.

Shapeshifting (mi favorita)

El «cambio de forma» oculta el tráfico en formatos no objetables, lo que hace que parezca una llamada VOIP, tráfico web, juegos en línea o tráfico «normal» muestreado estadísticamente. Este enfoque derrota las limitaciones de tráfico de la lista blanca, pero es casi imposible de hacer «perfectamente» – incluso si el tráfico es indistinguible del tráfico «real», el cliente y el servidor generalmente se comportarán de manera diferente a un servidor «real», lo que significa que los adversarios avanzados pueden elegir gastar recursos (invertir en algo más caro que un DPI: analizadores de flujo) para realizar análisis de seguimiento en cada conexión sospechosa para verificar que el servidor actúa «correctamente» y bloquearlo si no es así.

3- Shapshifter

Shapeshifter es un implementador de plugable transport que es capaz de crear un proxy local. Proporciona una capa adicional de transformación que existe alrededor del tráfico de varios protocolos para enmascarar el tráfico.

La idea básica es la siguiente:

Se tiene una aplicación la cual será proxificada a través de un proxy local por el shepeshifter-dispatcher en modo cliente, que éste a su vez se conectará con el servidor shepeshifter-dispatcher que hará de pasarela para el tráfico de la aplicación a la cual se le desea ofuscar el tráfico.

El proyecto Shapeshifter proporciona a los protocolos de red una forma de cambiar su forma (shapeshifting) (también conocida como ofuscación). El propósito de esta tecnología es cambiar las características del tráfico de la red. Shapshifter es creado en el 2014 por The Operator Foundation.

Shapeshifter tiene dos componentes: los transportes (transport) y el despachador (dispatcher). Cada Transport proporciona un enfoque diferente al cambio de forma. Estos Transports se proporcionan como una biblioteca Go que se puede integrar directamente en las aplicaciones. El despachador (dispatcher) es una herramienta de línea de comandos que proporciona un proxy que envuelve el tráfico. Tiene varios modos de proxy diferentes y puede enviar tráfico tanto de TCP como de UDP.

Instalando el Shapeshifter:

Se va a una carpeta en donde se va a descargar:

cd /opt && \
git clone https://github.com/OperatorFoundation/shapeshifter-dispatcher && \
cd shapeshifter-dispatcher/

Se necesitara del lenguaje de programación golang, por lo que se instala usando snap o apt:

# Instalar usando snap
snap install go --classic

# Instalar usando apt
apt install golang-go

Una vez se termina la instalación, solo falta compilarlo:

go build

Solo resta esperar que se termine la instalación.

NOTA: ESTE PROCESO DE INSTALACION SE REALIZARA TANTO EN EL SERVIDOR COMO EN EL CLIENTE

Estableciendo la comunicación:

Se utilizará Netcat para probar la ofuscación de tráfico. Se levantara un servidor netcat en el puerto 80/tcp en un servidor. En su forma más simple, la información ingresada en el cliente se puede mostrar en el servidor y viceversa.

Primeramente será necesario abrir el puerto que se va a utilizar para establecer la comunicación:

# Abrir el puerto si se utiliza iptables (como los hombres)
iptables -I INPUT -p tcp -m tcp --dport 80 -j ACCEPT

# Abrir el puerto si se utiliza ufw
ufw allow proto tcp from any to any port 80

En el servidor:

nc -l 80

En el cliente:

nc [IP.del.servidor.netcat] 80

Ahora todo lo que se escriba tanto en el server como el cliente, se reflejará en el otro lado.

Estableciendo la comunicación, pero ahora ofuscada:

Ahora que se sabe que se puede usar Netcat, se puede configurar el shapeshifter para usarlo. En este caso, el shapeshifter recibe el tráfico en el servidor y lo pasa al puerto que está escuchando Netcat. En el cliente, Netcat envía su tráfico a shapeshifter para ofuscarlo y enviarlo al servidor. Esto significa que la ruta de los datos enviados al servidor y viceversa es:

Se va a usar obfs2 para este primer ejemplo, que es la configuración más simple para shapeshifter. Para prepararse, se debe saber qué puertos usar y es posible que deban ser habilitados en el servidor.

Primero, configuremos el servidor para usar Netcat en el puerto 80 (previamente abierto) y shapeshifter en el puerto 2233. Deberemos asegurarnos de que el puerto 2233 esté abierto:

# Abrir el puerto si se utiliza iptables (como los hombres)
iptables -I INPUT -p tcp -m tcp --dport 2233 -j ACCEPT

# Abrir el puerto si se utiliza ufw
ufw allow proto tcp from any to any port 2233

Obfs2

Qué es obfs2?

Obfs2 realiza un intercambio de claves simétricas, esta clave intercambiada se usa para cifrar el tráfico al puente, esto no es para «proteger» el tráfico sino para ocultar el protocolo subyacente de un observador pasivo. Sin embargo, esto tiene un problema, ya que no realiza el intercambio de claves mediante criptografía asimétrica. Esto significa que un observador pasivo también ve la clave y puede quitar trivialmente el cifrado y ver los detalles del protocolo subyacente (Tor) y bloquearlo.

No proporciona autenticación ni integridad de datos. No oculta las tamaños de los paquetes. Es más adecuado para proporcionar una capa de ofuscación para un protocolo autenticado existente, como SSH o TLS. El protocolo tiene dos fases: en la primera fase, las partes establecer claves. En la segunda, las partes intercambian tráfico super_encifrado.

En este primer ejemplo, se usará obfs2 (un estudio más profundo del protocolo aquí), el transporte (transport) más simple de configurar con shapeshifter. En una ventana, se ejecuta el comando shapeshifter, sustituyendo la dirección [IP.del.servidor.shapeshifter] con la dirección IP de su servidor:

cd /opt/shapeshifter-dispatcher
./shapeshifter-dispatcher -server -transparent -ptversion 2 -transports obfs2 -state state -bindaddr obfs2-[IP.del.servidor.shapeshifter]:2233 -orport 127.0.0.1:3344 -enableLogging -logLevel DEBUG

listening on  152.206.201.144:2233

Téngase en cuenta que esto vincula obfs2 al puerto 2233, mientras que enviará tráfico al puerto 3344, donde Netcat estará escuchando.

Se puede checkear si se el servicio está habilitado:

netstat -putona | grep 2233
tcp        0      0 [IP.del.servidor.shapeshifter]:2233    0.0.0.0:*               LISTEN      12421/./shapeshifte  off (0.00/0/0)

Ahora, en una ventana separada de la anterior:

nc -l 3344

Ahora se cambia al PC/VM cliente. En esta máquina, se va a configurar shapeshifter cliente para hablar con el shapeshifter servidor y para que Netcat se conecte a través de shapeshifter.

Para hacer esto, se configurará un puerto proxy en el cliente para conectar Netcat. Este es el puerto en el que escuchará el shapeshifter, y en este ejemplo se usará el puerto 4455. No olvide cambiar la dirección [IP.del.servidor.shapeshifter] por la dirección IP de su servidor.

./shapeshifter-dispatcher -transparent -client -state state -target [IP.del.servidor.shapeshifter]:2233 -transports obfs2 -proxylistenaddr 127.0.0.1:4455 -logLevel DEBUG -enableLogging

Ahora, en otra ventana en el cliente, simplemente:

nc 127.0.0.1 4455

Y la comunicación queda hecha, solamente escriba en su cliente o servidor y vera reflejada la escritura en la otra parte.

Obfs4

El siguiente nivel para configurar shapeshifter es usar obfs4. Esta es una configuración un poco más complicada, pero permite una mejor ofuscación de su tráfico. Se usarán los mismos puertos que se usó en el ejemplo de obfs2. Primero, ejecutará shapeshifter en una ventana en su servidor, nuevamente sustituyendo la dirección IP [IP.del.servidor.shapeshifter] con la dirección IP de su servidor:

./shapeshifter-dispatcher -transparent -server -state state -orport 127.0.0.1:3344 -transports obfs4 -bindaddr obfs4-[IP.del.servidor.shapeshifter]:2233 -logLevel DEBUG –enableLogging

listening on  152.206.201.144:2233

Esto creará un archivo en el directorio state, llamado obfs4_bridgeline.txt. Para ver ese archivo, escriba el comando:

cat /opt/shapeshifter-dispatcher/state/obfs4_bridgeline.txt

El valor que necesita para la máquina cliente es la larga cadena de caracteres después de cert= y antes del siguiente espacio. En el ejemplo, eso sería:

PS9KSAXHMukTqFOrWcYHlil6z/gf6IZI4KtObc3TRKN3MltOIan5RZbkjCoqsA3lyB9XOQ

En la máquina cliente, editar el archivo obfs4.json en el directorio de shapeshifter:

cd /opt/shapeshifter-dispatcher
nano ConfigFiles/obfs4.json

Y editar el cert, quedando asi:

#{"cert": #"AQUÍ VAN LOS CARACTERES COPIADOS ANTERIORMENTE", #"iat-mode": "0"}
{"cert": "PS9KSAXHMukTqFOrWcYHlil6z/gf6IZI4KtObc3TRKN3MltOIan5RZbkjCoqsA3lyB9XOQ", "iat-mode": "0"}

Ahora, en la máquina cliente, puede ejecutar shapeshifter-dispatcher y pedirle que use ese archivo de configuración, cambiando la dirección [IP.del.servidor.shapeshifter] a la dirección del servidor:

./shapeshifter-dispatcher -transparent -client -state state -target [IP.del.servidor.shapeshifter]:2233  -transports obfs4 -proxylistenaddr 127.0.0.1:4455 -optionsFile ./ConfigFiles/obfs4.json -logLevel DEBUG -enableLogging

checking for optionsFile
Dialing  152.206.201.144:2233

Y ahora se puede correr, en nuevas ventanas, tanto el server nc (obviamente en el server) como el cliente (en el cliente):

# En el server:
nc -l 3344

# En el cliente:
nc 127.0.0.1 4455

Y la comunicación ofuscada queda establecida!!!

4- Ofuscando una conexión openvpn:

Una VPN es un servicio fácil de administrar que puede ayudar a los usuarios a acceder a contenido en países donde hay bloqueo de DNS, puertos, direcciones IP y protocolos.

Sin embargo, las VPN son cada vez más fáciles de prevenir. La inspección profunda de paquetes (DPI) puede bloquear cualquier aplicación o protocolo específico. Como los cortafuegos DPI actúan según el tipo de paquete, no el número de puerto, los «trucos» simples como cambiar el puerto no ayudarán.

Los Pluggable Transports hacen posible eludir dicho filtrado sin modificar la propia VPN, pero transfiriendo el tráfico a túneles ofuscados que son significativamente más difíciles de identificar y/o costosos de bloquear para permitir el paso del tráfico.

Instalando OpenVPN y configurando

Tutoriales para instalar y configurar OpenVPN hay varios (puede verse aquí, y aquí) así que las explicaciones en este punto serán pocas.

En este paso, se instalará y configurará OpenVPN Server (versión 2.4.7, que es la que se encuentra en los repos de/) en Ubuntu Server 20.04 LTS, con IP [192.168.43.100].

Para una instalación rápida de todos los servicios se utilizará un script bash desarrollado por el usuario Nyr, que no solo inicia y configura un server básico de OpenVPN, sino que también crea un usuario y da la posibilidad de crear más.

wget https://git.io/vpn -O openvpn-install.sh && bash openvpn-install.sh

Una vez que comience el proceso, el mismo script guiará el proceso de instalación:

Welcome to this OpenVPN road warrior installer!

Which protocol should OpenVPN use?
   1) UDP (recommended)
   2) TCP
Protocol [1]: 2

What port should OpenVPN listen to?
Port [1194]: 443

Select a DNS server for the clients:
   1) Current system resolvers
   2) Google
   3) 1.1.1.1
   4) OpenDNS
   5) Quad9
   6) AdGuard
DNS server [1]: 2

Enter a name for the first client:
Name [client]: idiot

OpenVPN installation is ready to begin.
Press any key to continue...

La configuración del server (que se encuentra en /etc/openvpn/server/server.conf) sería algo así por defecto:

local 152.206.119.171
port 443
proto tcp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh.pem
auth SHA512
tls-crypt tc.key
topology subnet
server 10.8.0.0 255.255.255.0
push "redirect-gateway def1 bypass-dhcp"
ifconfig-pool-persist ipp.txt
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
keepalive 10 120
cipher AES-256-CBC
user nobody
group nogroup
persist-key
persist-tun
verb 3
crl-verify crl.pem

El servidor openvpn es bien básico, se le pueden agregar opciones de encriptación, compresión y autenticación pero por ahora funciona como ejemplo.

No no haberse instalado el shapeshifter se instala, y luego:

./shapeshifter-dispatcher -server -transparent -ptversion 2 -transports obfs2 -state state -bindaddr obfs2-192.168.43.100:8888 -orport 127.0.0.1:443

# El cual responderá con:
listening on  192.168.43.100:8888

Para comprobar que tiene los puertos abiertos:

netstat -putona | egrep '8888|443'

tcp        0      0 192.168.43.100:8888     0.0.0.0:*               LISTEN      10100/./shapeshifte  off (0.00/0/0)
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      8967/openvpn         off (0.00/0/0)

Una vez el script terminó se tiene un servidor OpenVPN funcional. El script genera el archivo para el cliente, pero hay que realizarle una pequeña modificación antes. Así que simplemente se comenta la línea del remote, y se agrega lo otra, apuntando al 127.0.0.1 por el puerto en el que el shapeshifter-dispatcher cliente levantara su proxy:

nano /root/idiot.ovpn

[….]
proto tcp
#remote 152.206.119.171 443
remote 127.0.0.1 2233
resolv-retry infinite
[….]

Ahora solo resta copiar los criptomateriales y hacérselos llegar al cliente:

mkdir /home/user/ss && \
cp /root/idiot.ovpn /home/user/ss/

Se puede dejar corriendo también otra instancia, pero esta vez usando OBFS4:

./shapeshifter-dispatcher -transparent -server -state state -orport 127.0.0.1:443 -transports obfs4 -bindaddr obfs4-192.168.43.100:2234 -logLevel DEBUG –enableLogging -mode

Cliente linux:

Ya con los cripto materiales del lado del cliente solo resta instalar los paquetes openvpn, golang y el shapeshipter-dispatcher al cliente.

apt install openvpn golang && \
cd /opt && \
git clone https://github.com/OperatorFoundation/shapeshifter-dispatcher && \
cd shapeshifter-dispatcher && \
go build

Ahora se inicia shapeshifter-dispatcher en modo cliente, se apunta al servidor y se pone a escuchar por el puerto 2233:

./shapeshifter-dispatcher -transparent -client -state state -target 192.168.43.100:8888 -transports obfs2 -proxylistenaddr 127.0.0.1:2233 -logLevel DEBUG -enableLogging

Ahora solo resta iniciar la conexión utilizando el cripto material:

openvpn /ruta/a/los/criptos/idiot.ovpn

Y como se ve, ha quedado establecida la conexion vpn ofuscada!!!

NOTA: En las pruebas realizadas no se fue capaz de realizar una conexión utilizando obfs4 en el cliente Linux.

Cliente Windows:

También existe una forma de ofuscar la conexión usando un cliente Windows!!! Para ello se generan nuevos criptos, sencillamente corriendo nuevamente el script.

bash /donde/se/descargo/el/script/setup.sh

Y rellenar los datos. Una vez completado, se copian los archivos a una carpeta:

mkdir /opt/idiot-win
cp /root/idiot-win.ovpn /opt/idiot-win/

Ahora se hacen llegar los criptos al cliente Windows y copiarlos en la carpeta de instalación del OepnVPN GUI (usualmente C:\Program Files\OpenVPN\config).

Se necesitará descargar el shapeshifter para Windows. Una vez descargado y descomprimido hay que modificar la línea que establece la conexión con el servidor:

# Como originalmente está:
shapeshifter-dispatcher64.exe -transparent -client -state state -target %serverip%:21194  -transports obfs4 -proxylistenaddr 127.0.0.1:999 -optionsFile obfs4.json -logLevel DEBUG –enableLogging

# Como queda luego de la modificación:
shapeshifter-dispatcher64.exe -transparent -client -state state -target %serverip%:2233  -transports obfs2 -proxylistenaddr 127.0.0.1:1234 -logLevel DEBUG -enableLogging

Ahora toca ejecutarlo (tener en cuenta la arquitectura de nuestro micro):

El script pide el IP del servidor y una vez ingresado se pone en modo escucha :

Usar el cliente de Windows para conectarse a la VPN:

El client Windows conectado:

Feedback del shapeshifter de Windows:

Y como se ve, ha quedado establecida la conexion vpn ofuscada!!!

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Autores:

  • Frank Morales
  • Franco Díaz

¿De cuánta utilidad te ha parecido este contenido?

Frank Morales

Ver comentarios

Compartir
Publicado por
Frank Morales

Entradas recientes

Alta disponibilidad de sus base de datos con Percona XtraDB Cluster en Kubernetes

Uno de los grandes retos al que nos podemos enfrentar cuando una aplicación crece, es…

8 meses hace

Home automation (Parte 3) – ESPHome

Qué es lo que deseo hacer en este capítulo? Básicamente un sonoff, quiero encender/apagar las…

1 año hace

Home automation (Parte 2) – Home Assistant

Hace algunos meses estoy escuchando hablar del proyecto Home Assistant (HA). En palabras literales del…

1 año hace

Home automation (Parte 1)

Desde hace varios meses vengo con la idea de automatizar la casa donde vivo. Poco…

1 año hace

Cocinando una imagen personalizada de OpenWRT

El artículo describe el uso para un caso particular de OpenWRT y la creación de…

1 año hace