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

  1. 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.

  2. 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.

  3. 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 &ecirc;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).


  4. 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.

  5. 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

  6. 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!

    1. 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.

    2. éé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

    3. 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

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

  8. 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.


  9. 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 ...