En las entradas anteriores se ha indicado el uso de Socat con algunos ejemplos básicos que permiten comprender su funcionamiento de una forma sencilla y practica, sin embargo, Socat es una herramienta bastante sofisticada para diferentes tareas en un entorno de red, por este motivo se van a dedicar unas cuantas entradas enfocadas en Socat y en sus funcionalidades un poco más avanzadas, con esto se definirán las bases de un próximo post que es bastante interesante, será sobre como utilizar Socat y otras herramientas para evadir IDS, Firewalls y proxys en un entorno de red restrictivo, como frecuentemente es un entorno de red empresarial, donde los empleados tienen fuertes restricciones de conectividad a determinados servicios y sitios en internet, utilizando Socat y siendo un poco creativos se pueden conseguir unos resultados muy interesantes.

En esta ocasión, se indicará el uso de Socat para conexiones seguras, por medio de OPENSSL/SSL que permitirán que el trafico entre dos puntos conectados viaje de forma “segura” cifrando los flujos de bytes. Para este fin Socat cuenta con algunas especificaciones de direcciones que cuentan con las opciones necesarias para establecer una conexión por SSL, a continuación se enseñan algunos ejemplos de como hacer este tipo de tareas.

  1. Conexión a servicio SSH

    >(sleep 3; echo passserver) | socat – EXEC:’ssh -l root 192.168.1.33′,pty,setsid,ctty

    Con el ejemplo anterior en primer lugar se envía a la terminar una cadena que corresponde a la clave del usuario que tiene acceso al servicio SSH, posteriormente en Socat se indica como primera especificación de dirección STDIO donde se recibirá y enviará las credenciales del servicio SSH a la maquina remota, posteriormente la segunda especificación de dirección es EXEC la cual intenta ejecutar el comando SSH correspondiente con las credenciales enviadas por STDIO. La opción pty del option group FORK establece la conexión con el subproceso (fork) utilizando una terminal en lugar de utilizar el socket, en este caso se utiliza la terminal para la comunicación entre socat y SSH, la opción setsid del option group PROCESS hace que la consola sea la propietaria del proceso que se ha iniciado, la opción ctty del option group PROCESS hace que la consola sea la que controle el subproceso.

  2. Conexión por medio de un proxy

>socat TCP4-LISTEN:223,reuseaddr,fork PROXY:proxy.organization.es:www.google.es:80,proxyauth=userAdastra:passAdastra

>nc localhost 223

GET /

Cache-Control: no-cache

Pragma: no-cache

Content-Type: text/html; charset=utf-8

Proxy-Connection: close

Connection: close

Content-Length: 691

<HTML><HEAD>

……………

En el caso anterior, se ha indicado en primer lugar como especificación de dirección TCP4-LISTEN lo que permitirá a una maquina remota conectarse con socat por medio del puerto 223, se emplean las opciones reuseaddr y fork para permitir múltiples conexiones. La segunda especificación permite realizar una conexión a un sitio determinado pasando por medio de un proxy, en este caso el proxy corresponde a “proxy.organization.es” y el sitio con el cual será establecida la conexión es www.google.com como puede verse, se ha establecido el puerto 80 para el destino, el puerto es de uso obligatorio. Por otro lado, el puerto por defecto para el proxy es el 8080, sin embargo este valor es posible cambiarlo en el caso de que se trate de uno distinto con la opción proxyport. Si el proxy tiene algún mecanismo de autenticación basado en usuario y clave se indica la opción proxyauth

  1. Utilizando conexiones seguras por OpenSSL

    Con Socat es posible establecer conexiones seguras utilizando SSL para que de esta forma todo el trafico que viaja entre dos o más puntos de la conexión viajen cifrados vía SSL. Para esto se utiliza OpenSSL (se detallará en mayor profundidad en próximas entradas) para generar certificados del lado del cliente y servidor así como las claves compartidas para establecer la conexión.

    SERVIDOR:

    >openssl genrsa -out server.key 1024

    Generating RSA private key, 1024 bit long modulus

    …………….++++++

    …………..++++++

    e is 65537 (0x10001)

    >openssl req -new -key server.key -x509 -days 3653 -out server.crt

    You are about to be asked to enter information that will be incorporated

    into your certificate request.

    What you are about to enter is what is called a Distinguished Name or a DN.

    There are quite a few fields but you can leave some blank

    For some fields there will be a default value,

    If you enter ‘.’, the field will be left blank.

    —–

    >cat server.key server.crt > server.pem

    >chmod 600 server.key server.pem

    CLIENTE:

    >openssl genrsa -out client.key 1024

    Generating RSA private key, 1024 bit long modulus

    ..++++++

    ……………………………………………………..++++++

    e is 65537 (0x10001)

    >openssl req -new -key client.key -x509 -days 3653 -out client.crt

    You are about to be asked to enter information that will be incorporated

    into your certificate request.

    What you are about to enter is what is called a Distinguished Name or a DN.

    There are quite a few fields but you can leave some blank

    For some fields there will be a default value,

    If you enter ‘.’, the field will be left blank.

    >cat client.key client.crt > client.pem

    >chmod 600 client.key client.pem

    Lo anterior es el uso básico de OpenSSL para la creación de certificados en cliente y servidor para el establecimiento seguro de la conexión, con estos ficheros ubicados en sus correspondientes maquinas (cliente-servidor) se puede comenzar a establecer conexiones SSL de la siguiente forma:

    SERVIDOR:

    >socat OPENSSL-LISTEN:7888,reuseaddr,fork,cert=server.pem,cafile=client.crt –

    ENVIO DATOS

    CLIENTE:

    >socat – OPENSSL:localhost:7888,cert=client.pem,cafile=server.crt

    ENVIO DATOS

    En el ejemplo anterior se ha establecido un puerto abierto (7888) que acepta conexiones SSL utilizando la especificación de dirección OPENSSL-LISTEN. Los atributos reuseaddr y fork permiten múltiples conexiones sin finalizar el proceso padre. Las opciones cert y cafile pertenecen al option group OPENSSL. La opción cert es utilizada para indicar el certificado y clave privada para autenticación, la opción cafile es utilizada para especificar el fichero con los certificados de confianza, este fichero debe estar en formato PEM y debe contener uno o mas certificados

  2. Creando conexiones de redes virtuales (TUN)

    Una interfaz TUN es simplemente una simulación de una interfaz de red física, esta interfaz puede transferir y recibir datos por medio de los canales de comunicación estándar, ademas de que el sistema operativo trata este tipo de interfaces como si se tratara de un dispositivo físico, es decir, puede tener una dirección física, dirección IP, etc. Una de las principales ventajas de este modelo es que con este tipo de interfaces virtuales se puede crear lo que se conoce como una red virtual que puede operar del mismo modo que lo hace una red convencional, solamente que existe un software que crea y administra los recursos de cada una de las interfaces virtuales. En Socat es posible crear este tipo de dispositivos virtuales, de tal modo que cada instancia de socat en una maquina remota puede ejecutarse como interfaz TUN y establecer una red virtual de múltiples ordenadores interconectados, incluso en internet donde pueden existir muchos puntos de acceso que los separa.

    En primer lugar es necesario definir el “punto de acceso” y el segmento de red que se utilizara, por ejemplo

>socat -d -d TCP-LISTEN:6789,reuseaddr TUN:5.5.5.1/24,up

2011/07/11 22:36:31 socat[8675] N listening on AF=2 0.0.0.0:6789

2011/07/11 22:38:00 socat[8675] N accepting connection from AF=2 192.168.1.34:58554 on AF=2 192.168.1.33:6789

2011/07/11 22:38:00 socat[8675] N creating tunnel network interface

2011/07/11 22:38:00 socat[8675] N starting data transfer loop with FDs [4,4] and [3,3]

Como puede apreciarse se ha utilizado la especificación de dirección TUN la cual es útil para crear interfaces virtuales, por otro lado se ha especificado la opción “up” que indica que la interfaz de red debe ser iniciada inmediatamente.

Si una maquina desea “unirse” a esta red virtual, debe conectarse al puerto en ejecución del punto de acceso iniciado anteriormente de la siguiente forma:

>socat TCP:192.168.1.33:6789 TUN:5.5.5.2/24,up

Después de esto, con un simple comando “ifconfig” podrá verse la nueva interfaz de red recién creada, por otro lado, desde dicha maquina se podrán establecer conexiones a la maquina remota por medio de la interfaz virtual, en este caso, si desde la maquina cliente se ejecuta un comando “ping” a la dirección 5.5.5.1 se podrá ver que existe conectividad entre ambas maquinas utilizando la red virtual.
NOTA: Anteriormente en este blog se ha indicado algo similar utilizando aircrack-ng para crear un punto de acceso falso, el concepto es basicamente el mismo, la creacion de una interfaz virtual. Ver dicha entrada aquí