IMPORTANT: Per accedir als fitxer de subversion: http://acacha.org/svn (sense password). Poc a poc s'aniran migrant els enllaços. Encara però funciona el subversion de la farga però no se sap fins quan... (usuari: prova i la paraula de pas 123456)

El GNU Netcat (network cat) és un programa per a administradors de xarxes i/o hackers utilitzat per a enviar dades per connexions TCP/UDP/IP. Va ser creat per Hobbit i segons les seves propies paraules netcat és:

una navalla suiza per a la transferència de dades en xarxes TCP/IP

Existeixen ports per Windows.

Versions

Hi ha diferents versions de netcat, a Ubuntu/Debian podeu consultar quina versió teniu amb:

$ dpkg -l | grep netcat
ii  netcat-openbsd                        1.89-3ubuntu2                                   TCP/IP swiss army knife

A l'exemple la versió utilitzar és la de OpenBSD. Desgraciadament cada versió té la seva propia sintaxi i difereixen lleugerament en el seu funcionament.

Instal·lació

$ sudo apt-get install netcat-traditional
$ sudo update-alternatives --config nc

i seleccioneu:

/bin/nc.traditional

GNU netcat

Existeix versió als repositoris d'Ubuntu/Debian?

Es pot instal·ar a mà amb:

$ wget http://downloads.sourceforge.net/project/netcat/netcat/0.7.1/netcat-0.7.1.tar.gz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fnetcat%2Ffiles%2Fnetcat%2F0.7.1%2Fnetcat-0.7.1.tar.gz%2Fdownload&ts=1297058850&use_mirror=heanet
$ tar xvfz netcat-0.7.1.tar.gz
$ cd netcat-0.7.1
$ ./configure
$ make
$ sudo make install

Un cop instal·lat podeu mostrar la versió amb:

$ netcat -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 .

IMPORTANT: Si teniu un altre versió de netcat instal·lada, per exemple la de OpnBSD, podreu utilitzar una o l'altre depenent si utilitzeu l'ordre netcat (GNU) o nc (openBSD)

OpenBSD netcat

IMPORTANT: sembla ser que que és la versió per defecte de netcat a Ubuntu 10.10 (--acacha 06:02, 7 feb 2011 (UTC))

$ sudo apt-get install netcat-openbsd

netcat traditional

$ sudo apt-get install netcat-traditional

Establir un connexió amb nc

$ nc www.upc.edu 80

Pot simular telnet (de fet Telnet és una eina que també es pot utilitzar per obrir connexions TCP/IP) amb:

$ nc -T localhost 23

Afegint l'opció -x, netcat mostra la sortida 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.

Enviar dades entre un client i un servidor

A la màquina que rebrà les dades executem

$ nc -l -p 2048

La l indica que heu d'obrir el socket en mode Listen i que utilitzeu el port TCP 2048.

I al client ara executem:

$ nc ip_servidor 2048

I el que escrivim es mostrarà al servidor. El servidor podria guardar les dades a un fitxer:

$ nc -l -p 2048 > fitxer

Depurar/Comprendre una connexió TCP

NOTA: Podeu utilitzar byobu o simplement una eina de terminal qualsevol com gnome-terminal amb suport per a pestanyes, o Terminator.

Obriu una pestanya i inicieu el servidor:

$ nc -l -p 2048

NOTA: A ubuntu 10.4 sembla que cal fer:

$ sudo apt-get remove --purge netcat-openbsd

per tal que funcioni l'exemple anterior.

Obriu una altre pestanya i executeu:

$ sudo tcpdump -x -i lo port 2048

Ara inicieu la connexió TCP:

 $ nc ip_servidor 2048

El text que apareixerà a la pestanya on heu executat tcpdump:

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 96 bytes
07:32:46.601961 IP localhost.52858 > localhost.2048: Flags [S], seq 642364979, win 32792, options [mss 16396,sackOK,TS val 660232 ecr 0,nop,wscale 6], length 0
        0x0000:  4500 003c a53b 4000 4006 977e 7f00 0001
        0x0010:  7f00 0001 ce7a 0800 2649 b633 0000 0000
        0x0020:  a002 8018 c984 0000 0204 400c 0402 080a
        0x0030:  000a 1308 0000 0000 0103 0306
07:32:46.601988 IP localhost.2048 > localhost.52858: Flags [S.], seq 642864006, ack 642364980, win 32768, options [mss 16396,sackOK,TS val 660232 ecr 660232,nop,wscale 6],  
length 0
       0x0000:  4500 003c 0000 4000 4006 3cba 7f00 0001
       0x0010:  7f00 0001 0800 ce7a 2651 5386 2649 b634
       0x0020:  a012 8000 3ca2 0000 0204 400c 0402 080a
       0x0030:  000a 1308 000a 1308 0103 0306
07:32:46.602013 IP localhost.52858 > localhost.2048: Flags [.], ack 1, win 513, options [nop,nop,TS val 660232 ecr 660232], length 0
       0x0000:  4500 0034 a53c 4000 4006 9785 7f00 0001
       0x0010:  7f00 0001 ce7a 0800 2649 b634 2651 5387
       0x0020:  8010 0201 23c5 0000 0101 080a 000a 1308
       0x0030:  000a 1308

El protocol TCP és orientat a connexió. El següent diagrama mostra el protocol d'establiment d'una connexió:

300px-Tcp-handshake.png

Podeu observar a la captura TCP els 3 paquets. També podeu utilitzar wireshark per fer la captura:

ExempleCapturaTCPIP.png

i aquest altre diagrama mostra el procés de terminació d'una connexió:

300px-Fin de conexión TCP.svg.png

Com vegeu la connexió la pot aturar el servidor o el client. Podeu simular un cas o l'altre acabant amb Ctrl+C l'ordre netcat de servidor o la de client.

Exemple de connexió UDP

Per defecte nc utilitza TDP. Podem utilitzar UDP amb l'opció -U. Vegem un exemple amb UDP. A una terminal executeu:

$ nc -u -l localhost -p 1234

A una segona terminal executeu

$ sudo tcpdump -s 0 -xX udp -i lo
tcpdump: listening on lo

I en un tercer:

echo “datos enviados” | nc -u localhost 1234

La sortida de tcpdump és:

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

Mostrar més informació (verbose)

$ 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

Canviar la Ip d'origen

$ nc -s 192.168.99.254 192.168.47.3 25

Utilitzar nc amb UDP

$ nc -u 192.168.100.17 3000

Associar un programa a netcat. Exemple de backdoor

A la màquina que ens volem connectar escriviu:

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

Ara podem obtenir una bash amb:

$ nc localhost 1234

netcat traditional

$ netcat -h
[v1.10-38]
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
	-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').


Netcat en mode túnel

GNU Netcat pot utilitzar-se per crear túnels de forma senzilla.

NOTA: Sembla que no funciona amb la versió openbsd:

$ dpkg -l | grep netcat
ii  netcat-openbsd                        1.89-3ubuntu2                                     TCP/IP swiss army knife
$ netcat
usage: nc [-46DdhklnrStUuvzC] [-i interval] [-P proxy_username] [-p source_port]

[-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_protocol] [-x proxy_address[:port]] [hostname] [port[s]]

El següent exemple enllaça el port telnet (23) d'una màquina remota al port 1234 de la màquina local:

$ nc -L IP_REMOTA:23 -p 1234
nc -L 10.36.253.172:80 5000
nc: invalid option -- 'L'
nc -h for help


NOTA: Aquest tipus de túnels envien les dades sense xifrar. Si voleu xifrar millor utilitzar SSH, concretament consulteu túnels SSH

En un altre terminal ens connectem al túnel:

$ 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:

Pot ser interessant l'opció -x que mostra tota la informació que passa pel túnel.

$ 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                 

On Linux, NetCat can be used for port forwarding. Below are nine different ways to do port forwarding in NetCat (-c switch not supported though):

nc -l -p port1 -c ' nc -l -p port2'
nc -l -p port1 -c ' nc host2 port2'
nc -l -p port1 -c ' nc -u -l -p port2'
nc -l -p port1 -c ' nc -u host2 port2'
nc host1 port1 -c ' nc host2 port2'
nc host1 port1 -c ' nc -u -l -p port2'
nc host1 port1 -c ' nc -u host2 port2'
nc -u -l -p port1 -c ' nc -u -l -p port2'
nc -u -l -p port1 -c ' nc -u host2 port2'

Proxying

Another useful behavior is using netcat as a proxy. Both ports and hosts can be redirected. Look at this example:

$ nc -l -p 12345 | nc www.google.com 80

Port 12345 represents the request

This starts a nc server on port 12345 and all the connections get redirected to google.com:80. If a web browser makes a request to nc, the request will be sent to google but the response will not be sent to the web browser. That is because pipes are unidirectional. This can be worked around with a named pipe to redirect the input and output.

mkfifo backpipe
nc -l -p 12345  0<backpipe | nc www.google.com 80 1>backpipe

The "-c" option may also be used:

nc -l -p 12345 -c 'nc www.google.com 80'

Vegeu també túnels.

Netcat com a escànner de ports.

Netcat es pot utilitzar com un escàner de port senzill. Cal utilitzar el paràmetre -z:

$ nc -v -z localhost 20-24
localhost [127.0.0.1] 22 (ssh) open
localhost [127.0.0.1] 23 (telnet) open

Vegeu també nmap.

Transferir fitxers

TCP

UDP

Recursos:

Servidor web

# joe index.html
# while true ; do nc -l 8090  < index.html ; done

Per provar-los:

$ telnet localhost 8090
Trying 127.0.0.1... 
Connected to localhost. 
Escape character is '^]'.
Prova
Connection closed by foreign host.

Vegeu també

Enllaços externs