domingo, 6 de mayo de 2007

GNU Netcat

Netcat es una herramienta de Unix utilizada para leer y escribir a través de conexiones de red mediante los protocolos TCP y UDP. GNU Netcat dispone de tres funcionalidades principales: modo conexión, modo escucha y modo tunel. A lo largo de este post se describen los tres modos.


Netcat fue desarrollado inicialmente por Hobbit, aunque actualmente se ha convertido en un proyecto open source basado en licencia GPL que reside en
netcat.sourceforge.net.



La instalación de Netcat es la típica de las herramientas Unix:


$ tar xvfz netcat-0.7.0.tar.gz
$ cd netcat-0.7.0
$ ./configure
$ make
$ make install


Una vez instalado, el parámetro -V, muestra la versión de netcat:


$ nc -V
netcat (The GNU Netcat) 0.7.0
Copyright (C) 2002 - 2003  Giovanni Giacobbi

This program comes with NO WARRANTY, to the extent permitted by law.
You may redistribute copies of this program under the terms of
the GNU General Public License.
For more information about these matters, see the file named COPYING.

Original idea and design by Avian Research ,
Written by Giovanni Giacobbi .


Con el parámetro -h obtenemos un listado con las opciones disponibles:


$ nc -h
GNU netcat 0.7.0, a rewrite of the famous networking tool.
Basic usages:
connect to somewhere:  netcat [options] hostname port [port] ...
listen for inbound:    netcat -l -p port [options] [hostname] [port] ...
tunnel to somewhere:   netcat -L hostname:port -p port [options]

Mandatory arguments to long options are mandatory for short options too.
Options:
-c, --close                close connection on EOF from stdin
-e, --exec=PROGRAM         program to exec after connect
-g, --gateway=LIST         source-routing hop point[s], up to 8
-G, --pointer=NUM          source-routing pointer: 4, 8, 12, ...
-h, --help                 display this help and exit
-i, --interval=SECS        delay interval for lines sent, ports scanned
-l, --listen               listen mode, for inbound connects
-L, --tunnel=ADDRESS:PORT  forward local port to remote address
-n, --dont-resolve         numeric-only IP addresses, no DNS
-o, --output=FILE          output hexdump traffic to FILE (implies -x)
-p, --local-port=NUM       local port number
-r, --randomize            randomize local and remote ports
-s, --source=ADDRESS       local source address (ip or hostname)
-t, --tcp                  TCP mode (default)
-T, --telnet               answer using TELNET negotiation
-u, --udp                  UDP mode
-v, --verbose              verbose (use twice to be more verbose)
-V, --version              output version information and exit
-x, --hexdump              hexdump incoming and outgoing traffic
-w, --wait=SECS            timeout for connects and final net reads
-z, --zero                 zero-I/O mode (used for scanning)

Remote port number can also be specified as range.  Example: '1-1024'

Netcat en modo conexión
El modo conexión de netcat es el más sencillo de los existentes. Se comporta de una forma similar a telnet, aunque es una herramienta mucho más avanzada. Por ejemplo, para realizar una conexión TCP (conexión por defecto) pasaremos como parámetro el nombre del host y el puerto:

$ nc localhost 22
SSH-1.99-OpenSSH_3.6.1p2


si deseamos que netcat se comporte como telnet añadiremos la opción -T:


nc -T localhost 23
Fedora Core release 1 (Yarrow)
Kernel 2.4.22-1.2135.nptl on an i686
login:


Añadiendo la opción -x, netcat ofrece la salida en hexadecimal:

$ nc -x localhost 22
SSH-1.99-OpenSSH_3.6.1p2
Received 25 bytes from the socket
00000000  53 53 48 2D  31 2E 39 39  2D 4F 70 65  6E 53 53 48  SSH-1.99-OpenSSH
00000010  5F 33 2E 36  2E 31 70 32  0A                        _3.6.1p2.


Otra opción que puede resultar interesante es -v (verbose) o -v -v que oferce cierta información sobre la conexión:
$ nc -v localhost 22
localhost [127.0.0.1] 22 (ssh) open
SSH-1.99-OpenSSH_3.6.1p2

$ nc -v -v localhost 22
Notice: Real hostname for localhost [127.0.0.1] is NEPTUNO
localhost [127.0.0.1] 22 (ssh) open
SSH-1.99-OpenSSH_3.6.1p2


Netcat trabaja con dos protocolos: TCP y UDP. El parámetro utilizado para las conexiones TCP es -t, aunque no es necesario, dado que esta es la opción por defecto. Para realizar conexiones UDP, puede utilizar el parámetro -u. Por ejemplo, enviar datos a un host + puerto UDP es tan sencillo como:

$ echo "datos enviados" | nc -u localhost 1234


Por ejemplo, realize la siguiente prueba: Abra tres terminales y escriba en el primero:

nc -u -l localhost -p 1234

(Este comando mantine a netcat a la escucha en un puerto udp, se estudiará con detalle en el siguiente apartado)



En el segundo:

$ /usr/sbin/tcpdump -s 0 -xX udp -i lo
tcpdump: listening on lo


y en el tercero:

echo "datos enviados" | nc -u localhost 1234



Observaremos que la salida de tcpdump con los datos UDP capturados es la
siguiente:

21:14:46.787266 NEPTUNO.32885 > NEPTUNO.1234: udp 15 (DF)
0x0000   4500 002b b17e 4000 4011 8b41 7f00 0001        E..+.~@.@..A....
0x0010   7f00 0001 8075 04d2 0017 79d5 6461 746f        .....u....y.dato
0x0020   7320 656e 7669 6164 6f73 0a                    s.enviados.


Netcat en modo escucha
El modo de escucha de netcat es un complemento interesante. Este nos permite abrir sockets en la máquina local, a los que posteriormente poderemos conectarnos. En el apartado anterior (modo conexión) se ha realizado un ejemplo sencillo del modo de escucha.



Se utiliza la opción -l para indicarle a netcat que deseamos ejecutar la herramienta en modo escucha (listen), indicamos con la opción -p, el puerto en el que deseamos abrir el socket y añadimos -u si deseamos utilizar el protocolo UDP. Recordemos que por defecto netcat utiliza TCP:
nc -u -l localhost -p 1234


Con netstat podemos ver los puertos abiertos de nuestro sistema y el programa asociado a esos puertos:

$ netstat -lunp | grep nc
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
udp        0      0 0.0.0.0:1234            0.0.0.0:* 3624/nc



Una opción que ha sido utilizada durante mucho tiempo como puerta trasera simple, es la opción -e de netcat. Esta opción permite asociar un programa a la conexión establecida.

Por ejemplo, con el siguiente comando dejamos una shell escuchando en el puerto 1234.


$ nc -l  localhost -p 1234 -e /bin/bash



Podemos conectarnos a ella con netcat y utilizarla de un modo similar a la utilidad Telnet:

$ nc localhost 1234
uname -o
GNU/Linux
date
jue dic 18 21:50:07 CET 2003


Netcat en modo tunel
GNU Netcat puede utilizarse para crear túneles de una forma sencilla. Veamos un ejemplo en el que enlazamos el puerto de telnet (23) de una máquina remota al puerto 1234 de la máquina local.

En un terminal escribimos:
$ nc -L remoto:23 -p 1234

En otro terminal nos conectamos al tunel:
$ telnet localhost 1234
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Fedora Core release 1 (Yarrow)
Kernel 2.4.22-1.2135.nptl on an i686
login:



De esta forma hemos conectado el puerto remoto 23 de la máquina "remoto" al puerto local 1234.

En modo tunel puede resultar interessante la opción -x, que realizará un volcado de toda la información que pase por el tunel.


$ nc -L localhost:23 -p 1234 -x
Sent 12 bytes to the socket
00000000  FF FD 18 FF  FD 20 FF FD  23 FF FD 27               ..... ..#..'
Received 12 bytes from the socket
00000000  FF FB 18 FF  FB 20 FF FB  23 FF FB 27               ..... ..#..'
Sent 24 bytes to the socket
00000000  FF FA 20 01  FF F0 FF FA  23 01 FF F0  FF FA 27 01  .. .....#.....'.
00000010  FF F0 FF FA  18 01 FF F0                            ........
Received 107 bytes from the socket
00000000  FF FA 20 00  33 38 34 30  30 2C 33 38  34 30 30 FF  .. .38400,38400.
00000010  F0 FF FA 23  00 4E 45 50  54 55 4E 4F  3A 30 2E 30  ...#.NEPTUNO:0.0
00000020  FF F0 FF FA  27 00 03 58  41 55 54 48  4F 52 49 54  ....'..XAUTHORIT
00000030  59 01 2F 68  6F 6D 65 2F  64 6C 65 72  63 68 2F 2E  Y./home/dlerch/.
00000040  58 61 75 74  68 6F 72 69  74 79 00 44  49 53 50 4C  Xauthority.DISPL
00000050  41 59 01 4E  45 50 54 55  4E 4F 3A 30  2E 30 FF F0  AY.NEPTUNO:0.0..
00000060  FF FA 18 00  58 54 45 52  4D FF F0                  ....XTERM..
Sent 15 bytes to the socket
00000000  FF FB 03 FF  FD 01 FF FD  1F FF FB 05  FF FD 21     ..............!
Received 24 bytes from the socket
00000000  FF FD 03 FF  FC 01 FF FB  1F FF FA 1F  00 50 00 28  .............P.(
00000010  FF F0 FF FD  05 FF FB 21                            .......!
Sent 73 bytes to the socket
00000000  FF FB 01 46  65 64 6F 72  61 20 43 6F  72 65 20 72  ...Fedora Core r
00000010  65 6C 65 61  73 65 20 31  20 28 59 61  72 72 6F 77  elease 1 (Yarrow
00000020  29 0D 0A 4B  65 72 6E 65  6C 20 32 2E  34 2E 32 32  )..Kernel 2.4.22
00000030  2D 31 2E 32  31 33 35 2E  6E 70 74 6C  20 6F 6E 20  -1.2135.nptl on
00000040  61 6E 20 69  36 38 36 0D  0A                        an i686..
Sent 7 bytes to the socket
00000000  6C 6F 67 69  6E 3A 20                               login:
Received 3 bytes from the socket
00000000  FF FD 01                                            ...


Uso de Netcat como scanner
Las funciones de escaner de netcat son muy simples. Puede utilizarse para detectar los servicios de una máquina, pero no dispone de las funciones de escaneo avanzadas de que disponen escáneres como nmap.


El parámetro utilizado para el escaneo es -z. A continuación se especifica la máquina y el rango de puertos a escanear.
nc -v -z localhost 20-24
localhost [127.0.0.1] 22 (ssh) open
localhost [127.0.0.1] 23 (telnet) open

No hay comentarios: