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.
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.
$ sudo apt-get install netcat-traditional $ sudo update-alternatives --config nc
i seleccioneu:
/bin/nc.traditional
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)
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
$ sudo apt-get install netcat-traditional
$ 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.
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
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ó:
Podeu observar a la captura TCP els 3 paquets. També podeu utilitzar wireshark per fer la captura:
i aquest altre diagrama mostra el procés de terminació d'una connexió:
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.
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 [email protected]@..A…. 0×0010 7f00 0001 8075 04d2 0017 79d5 6461 746f …..u….y.dato 0×0020 7320 656e 7669 6164 6f73 0a s.enviados.
$ 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
$ nc -s 192.168.99.254 192.168.47.3 25
$ nc -u 192.168.100.17 3000
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 -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').
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'
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 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.
Recursos:
# 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.