El viejo y querido Netcat


¿Por qué es viejo? Porque nació en el año 1996 y, para ser un software ¡eso es mucho tiempo! ¿Por qué es querido? Porque es una herramienta excelente, simple, eficaz y muy potente! Netcat es un programa que nos permite leer y escribir datos utilizando conexiones TCP y UDP: esto nos será de mucha ayuda tanto para utilizarlo como un programa individual como para complementarlo con otras herramientas.


Algunas de las cosas que vamos a poder hacer con Netcat son: escanear puertos, transferir archivos, caputrar banners, redireccionar puertos y abrir puertas traseras.

Como nos permite hacer tantas cosas, esta herramienta debe estar presente en cada equipo destinada a realizar penetration tests, análisis de vulnerabilidades, ethical hacking y cualquier otro tipo de actividad divertida.


Instalación

Este software ya viene pre-empaquetado en TODAS las distribuciones Linux y BSD. Para el caso de Windows, podemos utilizar el siguiente link:
http://www.portantier.com/downloads/netcat_nt_1.10.zip

En el cual vamos a encontrar tanto el ejecutable como los archivos de código fuente.

NOTA: Si tenemos instalada la herramienta nmap en su versión 4.85BETA1 o posterior, ésta ya viene con netcat incluído.

Pueden descargar nmap con netcat incluído desde:
http://nmap.org/download.html

Modos de ejecución

Podemos utilizar dos modalidades diferentes, cliente y servidor. Obviamente, con el modo cliente nos conectamos y con el modo servidor esperamos conexiones.

cliente: nc [-options] hostname port[s] [ports]
servidor: nc –l –p port [options] [hostname] [port]

Es una herramienta de línea de comandos, y no posee interfaz gráfica.

Escaneo de puertos

Si bien existen muchas herramientas especializadas para escanear puertos (y recomiendo su uso, sobre todo de nmap), es bueno saber que con netcat también podemos hacerlo.

Las opciones que nos interesan para el escaneo de puertos son las siguientes:

–i segs Intervalo en segundos entre cada puerto escaneado
–r Aleatorización de los puertos de origen y destino
–u Puertos UDP (por defecto utiliza puertos TCP)
–v Modo explicativo (si utilizamos -vv será aún más explicativo)
–z No realiza una conexión completa (interesante para los escaneos)

Así que, para escanear los puertos TCP 50, 100 y 105 de www.escaneame.com, podemos hacer lo siguiente:

fabian@debian:~$ nc -vv -i1 -r -z www.escaneame.com 25, 53, 80, 110
www.escaneame.com [ip.ip.ip.ip] 80 (www) open
www.escaneame.com [ip.ip.ip.ip] 53 (domain) : Connection refused
www.escaneame.com [ip.ip.ip.ip] 110 (pop3) : Connection refused
www.escaneame.com [ip.ip.ip.ip] 25 (smtp) : Connection refused

Como podemos observar, de los puertos que probamos, sólo el 80 (HTTP) está abierto.

También podemos utilizar rangos de puertos, por ejemplo, para escanear los puertos desde el 1 hasta el 3000:

nc -vv -i1 -r -z www.escaneame.com 1-3000

Banner Grabbing

Esta es una técnica de enumeración, que consiste en capturar los banners que muestran las aplicaciones al conectarnos a ellas. Podremos obtener información como el tipo de software, la versión y el sistema operativo. Esto se torna de vital importancia cuando estamos buscando vulnerabilidades en un sistema.

Por ejemplo, para capturar el banner del puerto 25 de smtp.gmail.com podemos hacer lo siguiente:

Podemos hacer lo mismo con HTTP (puerto 80). Una vez conectados, enviamos un requerimiento, para anlizar la respuesta.
En este caso, el requerimiento a enviar será “HEAD / HTTP/1.0″, que solicita los encabezados del servidor. (NOTA: Tenemos que presionar dos veces la teclar ‘ENTER’ después de haber escrito el requerimiento para que el servidor lo procese).

Borré los datos del servidor para no comprometer a nadie, pero ustedes podrían obtener algo así:

fabian@debian:~$ nc -v servidorweb.com 80
servidorweb.com [ip.ip.ip.ip] 80 (www) open
HEAD / HTTP/1.0

HTTP/1.1 200 OK
Date: Thu, 28 Apr 2011 05:33:50 GMT
Server: Apache/2.0.59 (CentOS)
X-Powered-By: PHP/5.1.6
Content-Type: text/html; charset=iso-8859-1
Connection: close

Si analizamos la respuesta, veremos que el servidor utilizado es Apache 2.0.59, corriendo sobre un sistema operativo CentOS.

También podemos hacerlo con los servidores SMTP, con:

fabian@debian:~$ nc -vv smtp.gmail.com 25

Obtendremos una respuesta similar a la siguiente:

220 mx.google.com ESMTP g69sm740211yhc.88

Lo cual significa “Service Ready”, según la RFC-821 (http://www.ietf.org/rfc/rfc0821.txt). Básicamente nos está diciendo que el servicio SMTP está listo para recibir órdenes.

Conociendo un poco más acerca de los servidores SMTP
Cada vez que nos conectamos a un servidor SMTP, podemos solicitarle información acerca de los comandos que soporta, pasando el requerimiento “EHLO”, de la siguiente manera:

fabian@debian:~$ nc -vv smtp.gmail.com 25
gmail-smtp-msa.l.google.com [74.125.45.109] 25 (smtp) open
220 mx.google.com ESMTP s21sm751894yhn.93
EHLO
250-mx.google.com at your service, [ip.ip.ip.ip]
250-SIZE 35882577
250-8BITMIME
250-STARTTLS
250 ENHANCEDSTATUSCODES

De esta forma podemos obtener información acerca del servidor SMTP al cuál nos estamos conectando. Este tipo de peticiones se utiliza por varios clientes de correo para saber qué tipo de comandos soporta el servidor, qué métodos de autenticación, etc.

Probando servidores de mail ‘Open Relay’

Los servidores de mail open relay son aquellos que permiten enviar un mail desde cualquier origen a cualquier destino, por lo que son excelentes candidatos a ser utilizados por los Spammers. Es importante aclarar que estos servidores están MAL configurados, y nosotros podemos hacer la prueba que explico más abajo para detectar malas configuraciones y corregirlas.

Por ejemplo, vamos a conectarnos al puerto smtp (TCP 25) de mail.algo.com, así: nc -vv mail.algo.com 25

220 ESMTP Sendmail 8.14.2/8.14.2; Sun, 24 Feb 2008 11:16:40 -0500
MAIL FROM:gbush@whitehouse.gov
250 2.1.0gbush@whitehouse.gov… Sender ok
RCPT TO: bill.gates@microsoft.com
250 2.1.5 bill.gates@microsoft.com… Sender ok

Con “MAIL FROM:” estamos definiendo el mail de origen, y con “RCTP TO:” estamos definiendo el destinatario. En este caso, el servidor no tiene relación con los dominios ‘whitehouse.gov’ ni con ‘microsoft.com’. Igualmente, nos ha contestado con “OK” y nos permitiría enviar el correo. Esta es una configuración errónea que suele estar corregida en la gran mayoría de las configuraciones por defecto de los software de correo, pero aún podemos encontrar alguno que otro por la red.

Para conocer mejor cómo interactuar con cada uno de los servicios estándar de internet, les sugiero investigar las RFC correspondientes a cada estándar. No es necesario que lean toooda la RFC, generalmente los comandos aceptados se encuentran en resumenes, por wikipedia u otras fuentes.

Redireccionando ejecutables

De todas sus opciones, sin dudas la mas poderosa que tiene netcat es “-e”, con la cual especificamos qué programa queremos ejecutar cuando recibamos una conexión (sólo disponible en el modo servidor).

nc –l –p 1234 -v –e /bin/bash

Este ejemplo pone a escuchar en el puerto 1234 y, al recibir una conexión, ejecuta el programa /bin/bash

Para el caso de una plataforma Windows, podríamos usar lo siguiente:

nc –l –p 1234 -v –e cmd.exe

(la opción “-v” es para que nos muestre más detalles)

Una vez que tengamos el puerto en escucha, podemos conectarnos utilizando netcat en modo cliente, así:

nc [ip-de-destino] [puerto]

nc 172.16.66.128 1234

Como lo vemos en la imagen, en la que estoy conectandome desde mi laptop a una máquina virtual VMWare:



Debemos tener en cuenta que esto nos proporciona acceso a una shell, sin pedirnos ninguna autenticación y con los privilegios del usuario que ejecutó netcat. Tampoco estaríamos encriptando la información. Así que no lo utilicen como un reemplazo a SSH, porque es una opción muy insegura. Pero, como vamos a ver más adelante, es una opción de muchísima utilidad para otras cosas.

Como podrán imaginar, gran parte de los backdoors existentes, utilizados por troyanos y rootkits, están basados en el uso de la herramienta netcat.

Algo importante a tener en cuenta es que, cuando finaliza el programa que estamos ejecutando, netcat se va a cerrar. Por lo cual nos sirve solamente para una sesión. Esto podemos evitarlo de las siguientes formas:

En sistemas Windows, podemos utilizar la opción “-L” cuando ejecutamos netcat en modo servidor, para que automáticamente se vuelva a poner en escucha.

En sistemas Unix-like, vamos a tener que escribir un script que automatice el reinicio de netcat. Algo igual o similar a esto:

#!/bin/bash

while 1
do
netcat -v -l -p 1234 -e /bin/bash
done

Esto es algo bastante sencillo, pero podemos extender el script para que, por ejemplo, guarde un archivo de log con las conexiones que se establecieron, etc, etc.

Pensemos que hasta podríamos implementar un pequeño honeypot (http://es.wikipedia.org/wiki/Honeypot) con la ayuda de netcat y algunos scripts en bash o cualquier otro lenguaje.

Transferencia de archivos

Si, si, también podemos transferir archivos utilizando netcat. Para qué? Puede ser por diversión, pero también porque no siempre contamos con herramientas exclusivas para transferir archivos, o porque no tenemos ganas de levantar un servidor FTP. O, porque netcat deja muchas menos huellas, lo podemos hacer escuchar facilmente en cualquier puerto y es más automatizable

Enviar un archivo desde el cliente al servidor:

Servidor:
nc -l -p [puerto] > [archivo de destino]
nc -l -p 1234 > salida.txt

Cliente:
nc -w3 [ip-del-servidor] [puerto ] < [archivo-que-queremos-enviar]
nc -w3 172.16.66.128 1234 < /etc/passwd

Enviar un archivo desde el servidor al cliente:

Servidor:
nc -l -p [puerto] < [archivo-a-enviar]
nc -l -p 1234 < /etc/passwd

Cliente:
nc -w3 [ip-del-servidor] [puerto] > [archivo-de-salida]
nc -w3 172.16.66.128 1234 > salida.txt

El poderoso “relay”

Mezclando un poco de todo lo que vimos, podemos hacer algo realmente fascinante. Crearemos un archivo especial, y lo conectaremos con nectat, de modo que todo lo que escribamos en el archivo, sea enviado a través de la red hacia otra máquina. (Les dije que era fascinante).

No hace falta explicar para qué podría servirnos tal característica, básicamente porque eso queda librado a su imaginación y a la necesidad que tengamos en el momento. Pero, créanme, es un excelente recurso en situaciones adversas.

ACLARACIÓN: Lo que voy a explicar a continuación aplica sólo para plataformas Unix-like. Debido a que, por cuestiones de diseño, en Windows es muchísimo más complicado contruir lo que se conoce como “named pipes”. Aunque puede hacerse. Para más información: http://en.wikipedia.org/wiki/Named_pipe#Named_pipes_in_Windows

Cliente:

Primero que nada, debemos crear un archivo FIFO:

cd /tmp
mkfifo fifo

Si no tenemos el comando “mkfifo” podemos utilizar el siguiente (que hace exactamente lo mismo)

mknod fifo p

Ahora, creamos el script del cliente:

#!/bin/bash
while [ true ]
do
line=`cat fifo`
echo $line | netcat -q 1 172.16.66.128 1234
done

Este script monitorea constantemente el archivo “fifo” y hace que todo lo escrito en el mismo sea redirijido a netcat, el cual lo envía a través de la red al servidor

Servidor:

Creamos el siguiente script:

#!/bin/bash

echo “” > salida.txt

while [ true ]
do
netcat -l -p 1234 >> salida.txt
done

Lo que hace el script es poner a escuchar netcat, y redireccionar la información entrante al archivo salida.txt

Ahora, simplemente tenemos que escribir en el archivo fifo del cliente, para que la información sea enviada al servidor.

Podemos hacerlo, por ejemplo, utilizando el comando “echo”, así:

echo “Buen día” > fifo

Con eso, vamos a recibirlo del otro lado, como podemos ver en la captura de pantalla.




Como siempre, estos scripts pueden mejorarse y personalizarse en base a nuestras necesidades. Pero con esto es suficiente para darnos una buena idea de las grandes capacidades que tiene netcat y los beneficios que podemos obtener de esta genial herramienta.



Herramientas derivadas

En base al éxito que ha tenido netcat durante varios años, y que es una herramienta de código abierto, se han creado varios herramientas que agregan funcionalidades o están enfocadas en ciertas tareas particulares, como por ejemplo:

cryptcat – Permite transferir archivos encriptando las comunicaciones con el algoritmo Twofish
netcat6 – Netcat con soporte para IPv6
netrw – Similar a Netcat, enfocado a transferir archivos


Fuente: http://www.redusers.com/noticias/escuela-de-hacking-el-viejo-y-querido-netcat-parte-i/

Comentarios

Entradas populares de este blog

¿Como atacar Kerberos?

El Modelado de Amenazas de Seguridad

MPLS vs. Ethernet: ¿Qué opción de conectividad WAN es mejor?