Crear fácilmente un chat multiusuario cifrado (SSL) en terminal con NCat
NCat es una utilidad de red repleta de funcionalidades que lee y escribe datos a través de la red desde la terminal. Pertenece al proyecto Nmap y es una reimplementación mejorada de del venerable Netcat. Utiliza TCP y UDP para la comunicación y permite entre otras cosas SSL / STCP para cifrar conexiones.
Para crear un chat cifrado que pueden utilizar varios usuarios desde la terminal, ya sea de forma local, en remoto o en ambos a la vez, se debe hacer lo siguiente.
Servidor. Su única función es servir y no recibe mensajes de clientes, pero si se escribe en la terminal, todos los clientes reciben sus notificaciones / mensajes como “<user0>”).
ncat --listen --chat --ssl 192.168.178.50 8000
Cliente 1: host remoto que accede a través del nombre de dominio / ip pública del servidor (<user0>).
ncat --ssl 222.111.222.111 8000 <announce> 37.35.174.11 is connected as <user4>. <announce> already connected: nobody.
Cliente 2: usuario local del sistema que hace de servidor.
ncat --ssl 192.168.178.50 8000
Ejemplo de conversación visto desde la terminal del cliente número 1 (<user4>)
ncat --ssl busindrewu.mooo.com 8000 <announce> 32.15.154.11 is connected as <user4>. <announce> already connected: nobody. <announce> 192.168.178.50 is connected as <user5>. <announce> already connected: 32.15.154.11 as <user4>. Hola user5, eres el creador del server? <user5> No, me lo dejó un compi puesto esta mañana. <user0> ***** Hoy se reinicia el servidor a las 21:32 ***** <user5> Yo solo tengo un usuario en el host, me llamo Sara. y estás solita en casa ahora? <user5> (u_U) NO,... ?! <user5> me salgo, eres un baboso. <announce> <user5> is disconnected.
Script para facilitar sintaxis y colorear el chat de forma básica.
- chatroom-sh
#!/bin/bash # Script: http://hacktracking.blogspot.de/2013/09/chatroom-encrypted-conversations-using.html basename=`which basename` cat=`which cat` nc=`which ncat` tput=`which tput` function client { $nc --ssl $ip $port > >(while read line; do prompt=`echo $line | awk '{print $1}'` message=`echo $line | sed "s/$prompt//"` if [ "$prompt" == "<user0>" ] || [ "$prompt" == "<announce>" ]; then echo -e "\e[35m<announce>\e[0m\e[90m$message\e[0m" else echo -e "\e[32m$prompt\e[0m\e[36m$message\e[0m" fi $tput setaf 3 done) echo -e "\e[35m<announce>\e[0m \e[90moperator closes the chatroom.\e[0m" reset } function reset { $tput sgr0; } function server { $nc --listen --chat --ssl $ip $port } function usage { $cat << eof Usage: `$basename $0` [-h] {-m c|s} {-i ip} {-p port} Options: -m: Mode c: Client s: Server -i: IP -p: Port eof } conns='' ip='' port='' while getopts "hm:i:p:" option; do case $option in h) usage && exit ;; m) mode=$OPTARG ;; i) ip=$OPTARG ;; p) port=$OPTARG ;; esac done if [ -z $ip ] || [ -z $port ] ; then usage && exit fi trap reset SIGINT case $mode in c) client ;; s) server ;; *) usage && exit esac
Forma de utilizar el script.
Servidor.
chatroom -m s -i 192.168.1.55 -p 1234
Clientes.
chatroom -m c -i 192.168.1.55 -p 1234