Socat es conocido también como Netcat++ debido a que es una herramienta que extiende de manera significativa las potencialidades que proporciona Netcat. Permite realizar cosas (especialmente lo relacionado con diferentes tipos de conexiones) que con Netcat no es posible realizar por si solo, por otro lado es una herramienta mucho mas moderna y responde mejor a las necesidades de un hacker y/o administrador de red utilizando nuevas tecnologías en el campo de la conectividad y protocolos de comunicación. A diferencia de Netcat, esta herramienta cuenta con muchísimas mas opciones y su uso es un poco mas complejo, se necesitan conocimientos de redes de datos y conocer los protocolos de comunicación que se pueden utilizar con Socat para sacarle el máximo provecho a esta herramienta. Como ya se ha dicho, se trata de una herramienta un poco mas completa y compleja, por este motivo, esta será la primera entrada donde se planten las bases del uso de Socat y algunos conceptos teóricos necesarios para saltar a la practica y utilizar de forma adecuada las potencialidades que esta estupenda herramienta pone a nuestra disposición.

Uso de Socat

Socat soporta muchos tipos de conexión y cada tipo esta indicado por una “palabra reservada” que indica la utilidad de la conexión, en cualquier caso, cuando se ejecuta Socat desde linea de comandos es requerido que se indique como mínimo dos direcciones donde la primera indica el origen de la conexión y los paquetes que se definan en dicho nodo se transmitirán al destino de la conexión que es la segunda dirección IP que se indica en el comando, todas las conexiones son bidireccionales por defecto, es decir, que ambos nodos pueden leer y escribir datos hacia el otro extremo de la conexión, a menos que se indique que la conexión es unidireccional de forma explicita.

Todas las opciones del comando y la especificación de direcciones se encuentra en http://www.dest-unreach.org/socat/doc/socat.html es recomendable visitar dicho sitio para conocer en profundidad las opciones y especialmente las especificaciones de las direcciones, que son básicamente, el tipo de conexión que se intenta establecer en cada nodo. Esta entrada será más practica sin olvidar que los detalles teóricos son sumamente importantes, se intentará indicar ejemplos prácticos de socat explicando los conceptos teóricos que hay detrás de cada ejemplo.

  1. Conexiones desde un host local y un servidor web:

>socat STDIO TCP4:www.google.com:80

GET /

HTTP/1.0 302 Found

Location: http://www.google.es/

Cache-Control: private

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

Set-Cookie: PREF=ID=49f2096921fa6d91:FF=0:TM=1310154185:LM=1310154185:S=lNjkdH6GlBjoxARv; expires=Sun, 07-Jul-2013 19:43:05 GMT; path=/; domain=.google.com

Date: Fri, 08 Jul 2011 19:43:05 GMT

Server: gws

Content-Length: 218

X-XSS-Protection: 1; mode=block

<HTML><HEAD><meta http-equiv=»content-type» content=»text/html;charset=utf-8″>

<TITLE>302 Moved</TITLE></HEAD><BODY>

<H1>302 Moved</H1>

The document has moved

<A HREF=»http://www.google.es/»>here</A>.

</BODY></HTML>

El ejemplo anterior tiene una funcionalidad bastante similar a como se establece una conexión con Netcat, como se puede apreciar se ha indicado el origen de datos como la entrada estándar de la consola donde se ejecuta el comando y como segundo parámetro un servidor web que será el que reciba los paquetes enviados desde el origen. (NOTA: La palabra reservada STDIO tiene exactamente el mismo significado que el carácter “-” en Socat)

>socat -,readbytes=1024,connect-timeout=30 TCP4:www.google.com:www,crnl

GET /

HTTP/1.0 302 Found

Location: http://www.google.es/

Cache-Control: private

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

Set-Cookie: PREF=ID=90e467c6eaf44a9d:FF=0:TM=1310154943:LM=1310154943:S=dRpdMyrrvSGkvpiP; expires=Sun, 07-Jul-2013 19:55:43 GMT; path=/; domain=.google.com

Date: Fri, 08 Jul 2011 19:55:43 GMT

Server: gws

Content-Length: 218

X-XSS-Protection: 1; mode=block

<HTML><HEAD><meta http-equiv=»content-type» content=»text/html;charset=utf-8″>

<TITLE>302 Moved</TITLE></HEAD><BODY>

<H1>302 Moved</H1>

The document has moved

<A HREF=»http://www.google.es/»>here</A>.

</BODY></HTML>

Este ejemplo funciona de forma similar al anterior, sin embargo puede apreciarse que en ambos extremos de la conexión se han indicado opciones adicionales, esto es debido a que en Socat cada una de las especificaciones de direcciones tiene asociadas opciones útiles y uno o varios OPTION GROUP (ver documentación de Socat en el enlace anterior) que indica un conjunto de opciones que se aplican a cada especificación de dirección con el fin de personalizar su comportamiento antes, durante y/o después de establecer la conexión. En este caso concreto, STDIO tiene la opción readbytes que indica el número máximo de bytes a leer desde la dirección (STDIO), la opción connect-timeout pertenece al option group SOCKET y establece el tiempo de espera en segundos para abortar la conexión cuando se realiza una petición y se espera una respuesta por parte del otro extremo, la opción www de la especificación de dirección TCP4 indica el nombre del servicio y opción crnl pertenece al Option Group APPLICATION e indica que los caracteres de terminación de linea (\n, 0X0a) deben ser convertidos a (\r, 0x0d) en el momento de escribir o leer sobre el canal.

  1. Establecimiento de un puerto en escucha en la maquina local y forwarding de la conexión hacia un destino

    >socat TCP4-LISTEN:3333 TCP4:www.google.com:www

    Con la especificación TCP4-LISTEN indica que se debe abrir un puerto en la maquina local que esperará por conexiones remotas, luego las conexiones que entren por el puerto 3333 serán redireccionadas hacia el host “www.google.com” en el puerto web (puerto 80) para establecer una conexión desde una maquina remota se puede ejecutar el siguiente comando:

    socat – TCP4:192.168.1.34:3333

    GET /

    HTTP/1.0 302 Found

    Location: http://www.google.es/

    Cache-Control: private

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

    Set-Cookie: PREF=ID=f5eb983e6dd2b12c:FF=0:TM=1310158604:LM=1310158604:S=2MxaujKRDF2JEboo; expires=Sun, 07-Jul-2013 20:56:44 GMT; path=/; domain=.google.com

    Date: Fri, 08 Jul 2011 20:56:44 GMT

    Server: gws

    Content-Length: 218

    X-XSS-Protection: 1; mode=block

    <HTML><HEAD><meta http-equiv=»content-type» content=»text/html;charset=utf-8″>

    <TITLE>302 Moved</TITLE></HEAD><BODY>

    <H1>302 Moved</H1>

    The document has moved

    <A HREF=»http://www.google.es/»>here</A>.

    </BODY></HTML>

    Como puede apreciarse se ha ingresado por consola el comando “GET /” y este ha sido enviado a la maquina que ha definido la especificación TCP4-LISTEN dicha maquina a su vez ha recibido el comando y lo ha redireccionado al host “www.google.com” en el puerto web (puerto 80).

  2. Estableciendo asociaciones de direcciones y restricciones por segmentos de red, uso del atributo bind en cada nodo de la conexión.

    socat -d -d TCP4-LISTEN:82,bind=192.168.1.34,su=nobody,fork,range=192.168.1.0/24,reuseaddr TCP4:www.google.com:80,bind=192.168.1.34

    2011/07/09 01:55:49 socat[8843.526243584] N listening on AF=2 192.168.1.34:82

    2011/07/09 01:56:17 socat[8843.526243584] N accepting connection from AF=2 192.168.1.33:51341 on AF=2 192.168.1.34:82

    2011/07/09 01:56:17 socat[8843.526243584] N forked off child process 8844

    2011/07/09 01:56:17 socat[8843.526243584] N listening on AF=2 192.168.1.34:82

    2011/07/09 01:56:17 socat[8844.526243584] N opening connection to AF=2 74.125.39.105:80

    2011/07/09 01:56:17 socat[8844.526243584] N successfully connected from local address AF=2 192.168.1.34:33336

    2011/07/09 01:56:17 socat[8844.526243584] N starting data transfer loop with FDs [4,4] and [3,3]

    2011/07/09 01:56:35 socat[8844.526243584] N socket 2 (fd 3) is at EOF

    2011/07/09 01:56:35 socat[8844.526243584] N socket 1 (fd 4) is at EOF

    2011/07/09 01:56:35 socat[8844.526243584] N socket 2 (fd 3) is at EOF

    2011/07/09 01:56:35 socat[8844.526243584] N exiting with status 0

    socat – TCP4:192.168.1.34:82

    GET /

    HTTP/1.0 302 Found

    Location: http://www.google.es/

    Cache-Control: private

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

    Set-Cookie: PREF=ID=69ed8bfbd3314e02:FF=0:TM=1310169397:LM=1310169397:S=17TPBbuSyjvme_3w; expires=Sun, 07-Jul-2013 23:56:37 GMT; path=/; domain=.google.com

    Date: Fri, 08 Jul 2011 23:56:37 GMT

    Server: gws

    Content-Length: 218

    X-XSS-Protection: 1; mode=block

    <HTML><HEAD><meta http-equiv=»content-type» content=»text/html;charset=utf-8″>

    <TITLE>302 Moved</TITLE></HEAD><BODY>

    <H1>302 Moved</H1>

    The document has moved

    <A HREF=»http://www.google.es/»>here</A>.

    </BODY></HTML>

    Como puede apreciarse en los comandos anteriores, en primera instancia se abre el puerto 82 en la maquina 192.168.1.34, se usa la opción bind que pertenece al option group SOCKET para fijar el valor de la conexión utilizando la función del sistema operativo bind() en realidad se produce un “traspaso” de referencia de sockets, posteriormente se indican los atributos su del option group PROCESS, para especificar los privilegios de ejecución del usuario (lo mas restrictivos posible suele ser una buena elección) fork del option group CHILD que permite el soporte a múltiples conexiones por medio de un mecanismo de “bifurcación”, cuando una nueva conexión llega, se crea un proceso hijo que permite al proceso padre de socat continuar su ejecución normal y aceptar otras peticiones, con la opción range del option group RANGE se verifica que solamente se acepten conexiones desde una maquina en el segmento de red, reuseaddr del option group SOCKET permite a otros sockets establecer conexión con la dirección incluso cuando el puerto asociado a esta se encuentra ocupado por socat.

    Finalmente, el siguiente comando ejecutado desde la maquina del cliente indica el proceso de conexión, donde lo que se digita en la consola es enviado a la maquina remota (192.168.1.34) en el puerto 82, la cual a su vez, establece las propiedades de conexiones indicadas en el párrafo anterior y posteriormente redirecciona la petición a www.google.com

  3. Ejecución de comandos de forma remota

    socat – EXEC:’echo HOLA’

    HOLA

    La forma de ejecución de comandos mas básica utilizando socat desde una maquina local, donde la primera especificación de dirección que se indica es STDIO y la segunda es EXEC

    socat – EXEC:’ssh -p 22 root@192.168.1.34′,pty,setsid,ctty

    root@192.168.1.34’s password: pepitodelospalotes

    Linux debian 2.6.32-5-amd64 #1 SMP Wed May 18 23:13:22 UTC 2011 x86_64

    The programs included with the Debian GNU/Linux system are free software;

    the exact distribution terms for each program are described in the

    individual files in /usr/share/doc/*/copyright.

    Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent

    permitted by applicable law.

    Last login: Sat Jul 9 23:45:56 2011 from 192.168.1.33

    root@debian:~#

    Este ejemplo ejecuta el comando ssh para establecer una conexión con un servidor remoto, todo lo que se ingresa por consola es enviado desde STDIO hacia la conexión EXEC, se establece 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, por este motivo, como puede apreciarse el password aparece en texto claro.

  4. Conexiones Bidireccionales y Unidireccionales

    Por defecto, todas las conexiones con Socat son bidireccionales, es decir, tanto origen como destino pueden leer y escribir datos, sin embargo, este comportamiento puede ser cambiado para que la información viaje en un solo sentido, esto es útil cuando se desea restringir de algún modo la información que viaja por el canal entre el nodo origen y destino.

    >socat -u TCP4-LISTEN:3334,reuseaddr,fork OPEN:/tmp/in.log,creat,append

    >socat – TCP4:192.168.1.33:3334

    TESTING SOCAT

    FLUJO UNIDIRECCIONAL

    >cat /tmp/in.log

    TESTING SOCAT

    FLUJO UNIDIRECCIONAL

    Como puede apreciarse en el caso anterior, se ha indicado la opción “-u” que indica que la conexión es unidireccional de izquierda a derecha, en este caso, cuando exista una conexión TCP por el puerto 3334, esta será redirigida al fichero in.log

    Los atributos reuseaddr y fork ya se han explicado anteriormente sin embargo a modo de recordatorio, permiten reutilizar una dirección/puerto determinado (reuseaddr) y bifurcar una conexión en un subproceso hijo, permitiendo que nuevas conexiones se establezcan en el proceso padre para permitir múltiples clientes. Por otro lado la especificación de dirección OPEN simplemente abre un archivo utilizando la llamada del sistema open() la opción creat del option group OPEN crea un nuevo fichero en el sistema de archivos si este no existe, append del option group FD escribe datos al final del fichero.

    Ahora, un ejemplo de comunicación unidireccional en el sentido contrario (es decir, de derecha a izquierda) puede ser el siguiente:

    socat -U OPEN:/tmp/in.log,creat,append TCP4-LISTEN:3334,reuseaddr,fork

    socat – TCP4:192.168.1.33:3334

    CANAL UNIDIRECCIONAL

    cat /tmp/in.log

    CANAL UNIDIRECCIONAL

    Este ejemplo es similar al anterior, la diferencia radica en que el sentido de la información ha viajado de Derecha a Izquierda con el uso de la opción “-U” notar que en el caso de que sea de izquierda a derecha la opción va en minúscula, mientras que si va de derecha a izquierda va en mayúscula.

  5. Limitando el flujo de bytes de la conexión

    >socat – TCP4:192.168.1.34:80,readbytes=100

    GET /

    <!DOCTYPE HTML PUBLIC «-//W3C//DTD HTML 3.2 Final//EN»>

    <html>

    <head>

    <title>Index of /</title>

    Con este ejemplo solamente se leen los 100 primeros bytes transferidos de la respuesta, el atributo readbytes pertenece al option group APPLICATION y solamente admite valores enteros mayores a cero.