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