jueves, 24 de octubre de 2013

Puertos Serie Virtuales - Compartir un Dispositivo Serie por la Red en GNU/Linux [Socat Netcat++]

FUENTES:
http://thehackerway.com/2011/08/08/herramientas-para-hacking-en-entornos-de-red-%E2%80%93-conectividad-con-socat-parte-iii/
http://blog.marcelofernandez.info/2013/05/como-compartir-un-dispositivo-serie-por-la-red-en-linux/


Socat es similar a netcat pero para streams bidireccionales. 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.
"Socat es una herramienta basada en línea de comandos que establece dos flujos de bytes bidireccionales y los datos de las transferencias entre ellos. Debido a que las corrientes pueden ser construidos a partir un gran conjunto de diferentes tipos de sumideros y fuentes de datos, socat se puede utilizar para muchos propósitos diferentes ".

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.

Si tenemos la necesidad de utilizar un puerto serial (por ejemplo, un dispositivo con un adaptador USB/Serie en /dev/ttyUSB0, un módem 3G o una placa Arduino en /dev/ttyACM0, etc.) conectado físicamente a una máquina en la red, que por diferentes motivos (distancia, pereza, lo que sea), lo queremos acceder como si fuera local.

En la PC-A el programa para acceder al Arduino en /dev/ttyACM0, y el Arduino conectado en PC-B de la red. La idea es que el programa acceda al Arduino como si estuviera directamente conectado en la PC-A, haciendo de alguna manera “transparente” la red que separa PC-A y PC-B.

Para esto vamos a utilizar la herramienta socat, que es como netcat pero para streams bidireccionales. Los pasos son:

//tanto en PC-A “servidor” como en PC-B “cliente”.
# sudo apt-get install socat                                           

//Ejecutar en el servidor
# socat -d -d -d OPEN:/dev/ttyACM0 TCP4-LISTEN:31337                  

//Ejecutar en el cliente
# socat -d -d -d TCP4:<IP PC-A>:31337 PTY,link=/dev/ttyACM0        

# sudo chown USER:USER -vR /dev/ttyACM0 ; sudo chown USER:USER -vR /dev/pts
# sudo chmod 775 -vR /dev/ttyACM0 ; sudo chmod 775 -vR /dev/pts


Lo que estamos haciendo es que socat en PC-A "Server" habrá el archivo /dev/ttyACM0 (el dispositivo serie a compartir), y además abra un socket en modo LISTEN (escuchando por conexiones) en todas las interfaces del equipo, particularmente en el puerto 31337. Las opciones -d -d -d son opcionales y sirve para habilitar los mensajes de debug.


Y en PC-B "Cliente" se conecte a la IP 192.168.X.X:31337, y que localmente lo haga ver como un nuevo dispositivo serial (pseudo terminal) creado por socat mismo en /dev/pts/X, y además haga un symlink de éste al archivo /tmp/ttyACM0. A partir de éste momento en /tmp/ttyACM0 existe un archivo que puede ser abierto y ser utilizado como un dispositivo serie local.

Notese el cambio de usuario y permisos para poder acceder de PC-B al puerto serie "Virtual" desde cualquier usuario y/o programa.

Un detalle, cuando se cierra la conexión del socat en el cliente hacia el servidor, en el servidor también se termina la ejecución del socat (y viceversa), por lo que en caso de volver a establecer la sesión, es necesario ejecutar nuevamente en ambos equipos.

No hay comentarios:

Publicar un comentario