LX-SVS-PRAK-netcat
updated okt/04/10 21:40
praktijkoefening: ontdek netcat
Vrij vertaald en aangepast naar:
http://www.catonmat.net/blog/unix-utilities-netcat
Peter Krumins' blog about programming, hacking, software reuse, software ideas, computer security, google and technology.
Netcat is een "zwitsers zakmes" voor netwerken. Je kan er mee aan de slag voor onder andere port scanning, file transfer, port listening en je kan netcat ook gebruiken als backdoor.
In 2006 werd netcat vierde in de "Top 100 Network Security Tools".
Een homepage van netcat is http://netcat.sourceforge.net/
We haalden ook nog informatie uit http://www.stearns.org/doc/nc-intro.v0.80.html
-
netcat versies
Er zijn heel wat versies van netcat, en allemaal zijn ze gedeeltelijk verschillend.
sourceforge levert een versie met een binary /usr/local/bin/netcat
# netcat -V
netcat (The GNU Netcat) 0.7.1
Copyright (C) 2002 - 2003 Giovanni Giacobbi
Original idea and design by Avian Research <hobbit@avian.org>,
nmap installeren levert een binary /usr/bin/ncat
# ncat --version
Ncat version 5.00 ( http://nmap.org/ncat )
http://nmap.org/ncat/guide/index.html
In de debian repositories zijn er nog drie verschillende versies:
netcat.traditional -> /bin/nc.traditional met link naar nc via /etc/alternatives/nc
# nc -h
[v1.10-38]
netcat.openbsd -> /bin/nc.openbsd met link naar nc via /etc/alternatives/nc
# nc -h
OpenBSD netcat (Debian patchlevel 1.89-4)
netcat6 -> levert /bin/nc6
# nc6 --version
nc6 version 1.0 - Copyright (C) 2001-2006 - <http://www.deepspace6.net>
Mauro Tortonesi - Chris Leishman - Simone Piunno - Filippo Natali
Alle voorbeelden in dit document zijn gemaakt met de versie netcat.traditional van debian. Dat is tevens de versie die standaard wordt geinstalleerd als je met apt verwijst naar netcat. We gebruiken altijd de binary nc.
|
-
netcat installeren
In debian, ubuntu of mint kun je netcat installeren als volgt:
# apt-get install netcat
The following extra packages will be installed:
netcat-traditional
The following NEW packages will be installed:
netcat netcat-traditional
...
Dit is is duidelijk netcat traditional.
Onder RedHat, CentOS of Fedora doe je het zo:
# yum install netcat
Vanaf source kan het ook:
Eerst de gzip versie downloaden vanaf http://netcat.sourceforge.net/download.php
Daarna installeren als volgt:
# tar -zxf nc-version.tar.gz
# cd nc-version
# ./configure
# make
# make install
Onder MAC met MacPorts:
# port install netcat
En onder windows kan je een versie downloaden van securityfocus.
-
netcat gebruiken
We beginnen met een eenvoudig voorbeeld, en bouwen hierop verder. Het eenvoudigste gebruik van nc is als vervanging van telnet:
$ nc perdu.com 80
GET / HTTP / 1.0
HOST: www.perdu.com
<ENTER>
HTTP/1.1 200 OK
Date: Mon, 04 Oct 2010 07:52:15 GMT
Server: Apache
Last-Modified: Tue, 02 Mar 2010 18:52:21 GMT
ETag: "4bee144-cc-dd98a340"
Accept-Ranges: bytes
Content-Length: 204
Vary: Accept-Encoding
Connection: close
Content-Type: text/html
X-Pad: avoid browser bug
<html><head>
<title>Vous Etes Perdu ?</title>
</head><body>
<h1>Perdu sur l'Internet ?</h1>
<h2>Pas de panique, on va vous aider</h2>
<strong><pre> * <----- vous êtes ici</pre></strong>
</body></html>
nc is eigenlijk praktischer dan telnet:
je kan om het even wanneer de verbinding sluiten met <CTRL><C>
en binaire data worden gezien als gewone data (geen escape).
- Probeer nu zelf nc uit op een pop3, een smtp, een samba en een lpd server.
Probeer zelf uit wat er gebeurt als je de opties -v of -vv gebruikt.
-
netcat als server
Je kan nc gebruiken als server. nc luistert op poort 12345 (op alle netwerkkaarten). Kijk naar het volgende voorbeeld:
$ nc -l -p 12345
uit de man pagina's:
-l Used to specify that nc should listen for an incoming connection rather
than initiate a connection to a remote host.
-p source_port
Specifies the source port nc should use, subject to privilege restrictions
and availability.
Probeer nu vanaf een ander station (of vanaf een andere terminal naar localhost) een verbinding te maken. Alles wat je nu intikt op het ene scherm, versschijnt op het andere scherm. Je kan chatten.
Pas op, bij sommige versies van netcat mag je de -p optie niet specifieren achter de -l
optie. Dat is o.a. zo op MAC.
uit de man pagina's:
-p source_port
Specifies the source port nc should use, subject to privilege restrictions
and availability. It is an error to use this option in conjunction with
the -l option.
De syntax wordt dan als volgt:
$ nc -l 6666
-
nc -l in de pipe
Je kan de twee netcats, client en server, redirecten of pipen naar en van linux commando's of processen. We doen dan I/O over het netwerk!
- transfer van een volledige directory
Probeer het volgende:
Op computer A met IP 192.168.1.10
$ tar -cf - /data | nc -l -p 6666
Op computer B
$ nc 192.168.1.10 6666 | tar -xf -
Combineer nu met pipe viewer om het proces op te volgen.
- één enkele file kopieren
Probeer wat volgt zelf uit:
Op computer A met IP 192.168.1.10
$ cat file | nc -l -p 6666
Op computer B
$ nc 192.168.1.10 6666 > file
- een volledige schijf kopieren
Op computer A met IP 192.168.1.10
$ cat /dev/hdb | nc -l -p 6666
Op computer B
$ nc 192.168.1.10 6666 > /dev/hdb
-
netcat als port scanner
Een minder gebruikelijke toepassing van netcat is port scanning. De meest populaire port scanner is nog steeds nmap.
Test zelf even het volgende op de lokale server:
$ nc -v -n -z -w 1 172.16.31.101 1-1000
(UNKNOWN) [192.168.0.8] 445 (microsoft-ds) open
(UNKNOWN) [192.168.0.8] 139 (netbios-ssn) open
(UNKNOWN) [192.168.0.8] 80 (www) open
(UNKNOWN) [192.168.0.8] 22 (ssh) open
De opties:
-v: verbose (dat wist je al)
-n: do not do any DNS or service lookups
-z: nc should just scan for listening daemons, without sending any data to them
-w 1: connection timeout after 1 second of inactivity
Test zelf even wat er gebeurt als je één voor één telkens een parameter weglaat.
Kijk ook even wat er gebeurt met -vv.
-
netcat als proxy
Met netcat kun je poorten en hosts redirecten.
stap 1
Tik even het volgende:
$ nc -l -p 10080 | nc linux800.be 80
Ga nu naar je browser en gebruik http://localhost:10080 als url.
Er gebeurt blijkbaar niets in je browser, maar een stuk webpagina (in dit geval een gif file) kwam terecht in de terminal met de netcat pipe:
HTTP/1.1 200 OK
Date: Mon, 04 Oct 2010 13:41:51 GMT
Server: Apache/2.2.3 (Debian) mod_jk/1.2.18 mod_python/3.2.10 Python/2.4.4 PHP/5.2.0-8+etch16 mod_ssl/2.2.3 OpenSSL/0.9.8c mod_perl/2.0.2 Perl/v5.8.8
Last-Modified: Fri, 06 Jul 2007 09:40:31 GMT
ETag: "5e4010-44d-160461c0"
Accept-Ranges: bytes
Content-Length: 1101
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: image/gif
GIF89aX <binary data...>
stap 2
Kunnen we die webpagina niet opnieuw doorsluizen naar de browser?
Een linux pipe werkt maar in één richting. We hebben een extra pipe nodig.
Dat kan als volgt:
$ mknod backpipe p
$ nc -l -p 10080 <backpipe | nc linux800.be 80 >backpipe
Met mknod maken we een linux pipe, en die stuurt de output van het rechter lid naar de input van het linker lid .. en als we dan op onze browser surfen op http://localhost:10080 krijgen we dit:
swsoft - plesk
Server Default page
If you see this page it means:
1. hosting for this domain is not configured
or
2. there's no such domain registered in Plesk
What you can do:
Using Plesk, you can create domains with web hosting on a single physical server.
|
De virtual hosting apache webserver kreeg van ons niet linux800.be als domeinnaam, maar gewoon localhost. Bijgevolg toont deze de default homepage.
stap 3
We gaan nog een stap verder. We willen nu op onze terminal ook nog de data waarnemen die over en weer gaat. Dat kunnen we doen met het commando tee.
tee extraheert data uit een pipe of redirect zonder ze aan te tasten. Het is alsof je een afluisterapparaat hangt midden de pipe.
We breiden het vorige commando uit als volgt:
$ nc -l -p 10080 <backpipe | tee -a inflow | nc linux800.be 80 | tee -a outflow >backpipe
We surfen weer op onze browser naar http://localhost:10080
(een refresh doet meestal het werk).
En dan kunnen we kijken naar de capture:
$ cat inflow
GET / HTTP/1.1
Host: localhost:10080
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.8) Gecko/20100722 Linux Mint/1 (Debian) Firefox/3.6.8
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
If-Modified-Since: Mon, 04 Oct 2010 11:55:12 GMT
If-None-Match: "5e4af3-dc3-37796800"
Cache-Control: max-age=0
GET /css/winxp.blue.css HTTP/1.1
Host: localhost:10080
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.8) Gecko/20100722 Linux Mint/1 (Debian) Firefox/3.6.8
Accept: text/css,*/*;q=0.1
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: http://localhost:10080/
If-Modified-Since: Fri, 06 Jul 2007 09:40:31 GMT
If-None-Match: "5e4019-2788-160461c0"
Cache-Control: max-age=0
GET /img/common/logo.gif HTTP/1.1
Host: localhost:10080
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.8) Gecko/20100722 Linux Mint/1 (Debian) Firefox/3.6.8
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: http://localhost:10080/
If-Modified-Since: Fri, 06 Jul 2007 09:40:31 GMT
If-None-Match: "5e4014-510-160461c0"
Cache-Control: max-age=0
$ cat outflow
HTTP/1.1 304 Not Modified
Date: Mon, 04 Oct 2010 14:02:20 GMT
Server: Apache/2.2.3 (Debian) mod_jk/1.2.18 mod_python/3.2.10 Python/2.4.4 PHP/5.2.0-8+etch16 mod_ssl/2.2.3 OpenSSL/0.9.8c mod_perl/2.0.2 Perl/v5.8.8
Connection: Keep-Alive
Keep-Alive: timeout=15, max=100
ETag: "5e4af3-dc3-37796800"
Vary: Accept-Encoding
HTTP/1.1 304 Not Modified
Date: Mon, 04 Oct 2010 14:02:20 GMT
Server: Apache/2.2.3 (Debian) mod_jk/1.2.18 mod_python/3.2.10 Python/2.4.4 PHP/5.2.0-8+etch16 mod_ssl/2.2.3 OpenSSL/0.9.8c mod_perl/2.0.2 Perl/v5.8.8
Connection: Keep-Alive
Keep-Alive: timeout=15, max=99
ETag: "5e4019-2788-160461c0"
HTTP/1.1 304 Not Modified
Date: Mon, 04 Oct 2010 14:02:20 GMT
Server: Apache/2.2.3 (Debian) mod_jk/1.2.18 mod_python/3.2.10 Python/2.4.4 PHP/5.2.0-8+etch16 mod_ssl/2.2.3 OpenSSL/0.9.8c mod_perl/2.0.2 Perl/v5.8.8
Connection: Keep-Alive
Keep-Alive: timeout=15, max=98
ETag: "5e4014-510-160461c0"
En we zien de conversatie gaande tussen onze browser en de webserver.
Probeer zelf even of je nog andere virtuele default webpages kun ophalen.
www.whitehouse.com 80
ftp.belnet.be 21
bijvoorbeeld ... maar er zijn ook nog leuke andere.
- netcat verandert een proces in een backdoor service
Eén van de krachtigste mogelijkheden van netcat maken we duidelijk met het volgende voorbeeld:
$ nc -l -p 12345 -e /bin/bash
De optie -e stuurt de input en output van /bin/bash het netwerk op.
Als je nu een verbinding maakt met poort 12345 kun je bash gebruiken:
$ nc localhost 12345
ls -las
total 4288
4 drwxr-xr-x 15 pkrumins users 4096 2009-02-17 07:47 .
4 drwxr-xr-x 4 pkrumins users 4096 2009-01-18 21:22 ..
8 -rw------- 1 pkrumins users 8192 2009-02-16 19:30 .bash_history
4 -rw-r--r-- 1 pkrumins users 220 2009-01-18 21:04 .bash_logout
...
Dit is een gevaarlijke mogelijkheid. Een goed systeembeheerder moet regelmatig kijken of er geen backdoors open staan op haar servers.
Met netcat onder windows kun je cmd.exe open zetten met een gelijkaardig gevolg.
Probeer beide mogelijkheden uit, zowel bash onder linux als cmd.exe onder windows.
Probeer ook een andere binary uit zoals mc ...