Ncat
Se trata de una herramienta de propósito general para leer, escribir, redirigir o cifrar datos a través de una red. Puede:
- Actuar como un simple cliente TCP/UPD/SCTP/SSL para interactuar con servidores de todo tipo a través de una red. Sirve para detectar problemas o analizar profundamente su funcionamiento. Permite ver el resultado sin filtros y tal cual es enviado.
- Actuar como un simple servidor en la red TCP/IP. Sirve para entender las peticiones que pueden hacer los clientes.
- Redirigir o hacer de proxy entre puertos. Puede ser una simple redirección a algún destino prefijado o actuar como un proxy SOCKS o HTTP donde el cliente especifica su destino.
- Encriptar mediante SSL.
- Actuar como puerta de enlace de comandos del sistema. Algo similar al cat, pero para la red.
- Actuar como "connection broker" y actuar como un simple chat.
Uso básico
Ncat puede operar en modo connect o listen.
- En modo connect, ncat inicia una conexión o envia datos UTP a un servicio que está escuchando.
- En modo listen, espera a una conexión.
Para usarlo en modo connect se hace:
$ ncat <host> [<puerto>]
El modo listen es igual, pero con -l
$ ncat -l [<host>] [<puerto>]
En modo listen, <host> indica la IP de la que escucha, es opcional. Su puerto por defecto, si no se especifica es el 31337. Normalmente, los usuarios no pueden abrir un puerto por debajo del 1024. Un puerto TCP normalmente acepta sólo una conexión y termina cuando el cliente desconecta. Si se da la opción --keep-open (-k), ncat acepta múltiples conexiones. Cuando envía algo, lo envía por igual a todos los clientes. Por defecto, ncat actúa con IPv4 y TCP a menos que se especifique -u para udp o -6 para IPv6.
Ejemplo de modo Connect
$ ncat -C scanme.nmap.org 80 GET / HTTP/1.0
HTTP/1.1 200 OK Date: Thu, 05 Feb 2009 15:31:40 GMT Server: Apache/2.2.2 (Fedora) Last-Modified: Mon, 19 May 2008 04:49:49 GMT ETag: "fc8c91-2e3-44d8e17edd540" ....
Hemos hecho la conexión y luego el GET / HTTP/1.0 para que nos devuelva algo. El -C es para que interprete el fin de línea como CRLF
La respuesta comienza con HTTP/1.1 200 OK, el protocolo, versión, código 200 y OK que significa que todo ha ido bien. A continuación, la cabecera HTTP y el HTML de la web.
Ejemplo de modo Listen
Vamos a simular un servidor HTTP. Creamos un fichero hello.httpd con este contenido:
HTTP/1.0 200 OK
<html> <body>
Hello, world!
</body> </html>
Ahora ejecutamos el comando:
$ ncat -l localhost 8080 < hello.http
Tan pronto como reciba una petición, ncat volcará el contenido del fichero hello.http. Se puede probar con un navegador web. El navegador puede que espere a que se cierre la conexión.
ncat y SSL
Se pueden enviar los datos encriptados mediante la opción --ssl. Por ejemplo, para conectarse a un servidor HTTPS:
ncat -C --ssl <servidor> 443
También puede ser servidor con ssl
$ ncat -v -l --ssl
El -v sirve para ver más detalles de la conexión, como la clave que se va a usar. Com --ssl-cert y --ssl-key se puede usar una clave existente o verificada.
Ejecución de comandos
Ncat puede ejecutar comandos después de establecer la conexión. La entrada y salida estándar se redirigen a la conexión. Cualquier cosa recibida por la conexión se considerará como el stdin y cualquier cosa que salga por stdout se irá a parar a la conexión. Para ello se puede usar la opción -e o --exec.
$ ncat -l --exec "/bin/echo Hello"
Es necesario poner la ruta absoluta del comando, ya que --exec no lo busca en el PATH. Con --sh-exec sí busca en el PATH. Por ejemplo, para que muestre el directorio donde se ha ejecutado:
$ ncat -l --sh-exec 'pwd'
La opción -e se puede usar en modo connect y en modo listen.
Ejemplo. Crear el siguiente script:
#!/bin/bash echo "Hola, dime tu nombre" read nombre echo "Hola: $nombre"
Ejecutar:
$ ncat -l --sh-exec './hola.sh'
En otra terminal:
$ ncat localhost 31337
Opciones de salida
Ncat leer de la entrada estándar y escribe en la estándar, menos cuando tiene la opción --exec que lo hace del comando o script que se ejecuta.