Uso de netcat

netcat

Netcat es una utilidad que permite el envío y recepción de datos vía TCP/UDP desde la consola. Inicialmente desarrollada para Unix, se ha portado al menos a Windows y OS X. Hay varios forks con distintas capacidades; en resumen, está en todas partes y sirve para… muchas cositas.

Sintaxis

De la versión instalada por defecto en Debian Jessie:

root@jessie:~# nc -h
[v1.10-41]
connect to somewhere:	nc [-options] hostname port[s] [ports] ...
listen for inbound:	nc -l -p port [-options] [hostname] [port]
options:
	-c shell commands	as `-e'; use /bin/sh to exec [dangerous!!]
	-e filename		program to exec after connect [dangerous!!]
	-b			allow broadcasts
	-g gateway		source-routing hop point[s], up to 8
	-G num			source-routing pointer: 4, 8, 12, ...
	-h			this cruft
	-i secs			delay interval for lines sent, ports scanned
        -k                      set keepalive option on socket
	-l			listen mode, for inbound connects
	-n			numeric-only IP addresses, no DNS
	-o file			hex dump of traffic
	-p port			local port number
	-r			randomize local and remote ports
	-q secs			quit after EOF on stdin and delay of secs
	-s addr			local source address
	-T tos			set Type Of Service
	-t			answer TELNET negotiation
	-u			UDP mode
	-v			verbose [use twice to be more verbose]
	-w secs			timeout for connects and final net reads
	-C			Send CRLF as line-ending
	-z			zero-I/O mode [used for scanning]
port numbers can be individual or ranges: lo-hi [inclusive];
hyphens in port names must be backslash escaped (e.g. 'ftp\-data').

Con las opciones mínimas, netcat abrirá una conexión TCP (UDP si se utiliza la opción -u) al host y puerto indicado. Tened en cuenta que, en general, nc y netcat son alias del mismo comando (vamos, que se puede usar uno u otro indistintamente).

Comunicación a través de netcat

Uno de los usos más habituales es el establecimiento de conexiones entre dos sistemas -dos netcats- en modo cliente-servidor. Para ello, tenemos que hacer escuchar a una máquina (opción -l) en el puerto pertinente mientras enviamos datos desde la otra.

Por ejemplo, nos ponemos a escuchar en el puerto 8090…

root@rxhost-a# netcat -l -p 8090

…y transmitimos desde otro sistema a ese puerto:

root@txhost-b# nc rxhost-a 8090

Si ahora escribimos algo en la consola de txhost-a, aparecerá en la de rxhost-b. Muy bien, pero la gracia está en que esto permite enviar ficheros. Por ejemplo, supongamos que queremos transferir el contenido de un fichero arbitrario desde txhost-b a rxhost-a. Pues haremos lo siguiente en el host donde lo vamos a recibir:

root@rxhost-a# netcat -l -p 8090 > recibido.txt

y lo transmitimos:

root@txhost-b# netcat rxhost-a 8090 < /etc/passwd

Utilizando pipes podremos hacer cosas interesantes, como enviar ficheros o directorios completos en un tarball:

root@rxhost-a# netcat -l -p 8090 | tar zxvf -
root@txhost-b# tar -czf - * | netcat rxhost-a 8090

Otra forma es utilizando dd, que permite enviar no ya ficheros, sino dispositivos de bloque enteros. Por ejemplo, una adquisición forense de un disco, un backup bit a bit…

root@rxhost-a# netcat -l -p 8090 >id_rsa.pub
root@txhost-b# dd if=.ssh/id_rsa.pub | nc rxhost-a 8090

Se puede servir un fichero vía “web”:

root@hosta:~# nc -l -p 80 <index.html
GET / HTTP/1.1
Host: 192.168.56.100
User-Agent: curl/7.49.1
Accept: */*

Y, en el otro extemo recibirlo:

user@hostb:~$ curl 192.168.56.100:80
<h1>Hola, mundo!</h1>

Otro clásico: backdoor shells

user@host-a:~$ nc -l -p 8090 -e /bin/bash

¡También en Windows!

c:\> nc -l -p 8090 -e cmd.exe

En el sistema remoto:

user@host-a:~$ nc host-a -p 8090
hostname
host-b

Más adelante añadiré otro post con cosas sobre shells inversas…

Un poquito más complejo: extracción del disco completo de un dispositivo Android. Partimos de un dispositivo rooteado (necesitaremos acceder al disco en modo bloque con dd) y conectado vía USB con adb. El dispositivo móvil tiene busybox instalado.

Primero, haremos forward de un socket mediante adb usando un puerto arbitrario:

santoku@santoku:~$ adb forward tcp:8888 tcp:8888
santoku@santoku:~$ nc 127.0.0.1 8888 > dd.img

En el dispositivo (vía shell):

santoku@santoku:~$ adb shell
shell@android:/ $ su
shell@android:/ # dd if=/dev/block/mmcblk0 | busybox nc -l -p 8888

Y a esperar que se transfiera…