A 2. oldal tartalma
- oldal: TCP és UDP portok szkennelése az nmap parancs használatával
- oldal: TCP és UDP portok szkennelése a Netcat implementációk használatával
Tartalom
Folytatás
Az előző oldalon áttekintettük az nmap parancs alapszintű használatát, ezen az oldalon a Netcat parancsok különböző implementációinak alapszintű használatával ismerkedünk meg.
A leírás ezen oldalán szereplő példákat is ugyanúgy az asztali gépemről futtatva a Debian 10 (Buster) tökéletes szerver 1.0 virtuális gép utódján, az 1.1-es változaton hajtom végre.
Netcat implementációk és parancsok
A Netcat egy olyan parancssori segédeszköz, amely adatokat ír és olvas hálózati kapcsolatokon keresztül, TCP vagy UDP protokoll használatával. Ez az egyik leghatékonyabb eszköz a rendszergazdák arzenáljában, ezért a hálózati eszközök svájci bicskájaként is szokták emlegetni. A Netcat többplatformos, így több operációs rendszeren is elérhető, mint például Linux, macOS, Windows és BSD. A Netcat használható hálózati kapcsolatok hibakeresésére, figyelésére, nyitott portok keresésére, adatok átvitelére, stb.
ncat
Az ncat egy olyan funkciókat tartalmazó hálózati segédprogram, amely a parancssorból olvas és ír adatokat a hálózatokon keresztül. Az ncat az eredeti Netcat program - jelenleg szétszakadt családjának az - NMAP projekt által készített "reinkarnációja". Úgy tervezték, hogy megbízható háttéreszköz legyen, amely azonnali hálózati kapcsolatot biztosít más alkalmazások és felhasználók számára. Az Ncat nem csak az IPv4-el és IPv6-tal működik, hanem gyakorlatilag korlátlan számú lehetséges felhasználási lehetőséget biztosít a felhasználó számára.
Az ncat biztosítja az eredeti kivitelezésekben meglévő funkciók többségét, valamint számos újat is beletettek, viszont a portszkennelés támogatását kivették belőle (de ettől függetlenül alapszinten használható portszkennelési célokra is).
Telepítése
Az ncat parancs némely rendszereken előre is fel lehet telepítve, de általában telepítenünk kell. Debian és Ubuntu rendszereken telepítsük az ncat csomagot:
sudo apt-get install ncat
Ha a csomag feltelepült - és ez az egyetlen vagy alapértelmezett Netcat változat -, akkor az alábbi parancsokkal használhatjuk:
- ncat: Ez a program dedikált parancsa. Az ncat parancs minden esetben az ncat programot jelenti, függetlenül az alapértelmezett beállítástól, ami a - jelenlegi leírás alapjául szolgáló - Debian 10 (Buster) operációs rendszerben a 7.70.
- nc: "Közös" parancs. Ez a parancs mindig az alapértelmezett Netcat változatra mutató szimbolikus link, így ennek használatakor ellenőrizzük a Netcat verziószámot mielőtt például scriptekben használnánk. Ha nincs más Netcat változat a számítógépünkön csak az ncat, vagy több változat is van, de ez az alapértelmezett beállítás, akkor ez a parancs az ncat parancsra mutat.
- netcat: Ez is közös használatú parancs, ugyanaz érvényes itt is, mint az "nc" esetében.
Az nc és a netcat parancsok tehát ebben az esetben az ncat "szinonimái". Erről a readlink és a which parancsok segítségével is meggyőződhetünk:
readlink -f $(which nc)
readlink -f $(which netcat)
/usr/bin/ncat /usr/bin/ncat
nc -> /usr/bin/nc -> /etc/alternatives/nc -> /usr/bin/ncat netcat -> /usr/bin/netcat -> /etc/alternatives/netcat -> /usr/bin/ncat
Az ncat kizárólagos (csak ez van telepítve) vagy alapértelmezettként történő használata esetében tehát mindhárom parancs használható.
Jelen leírás készítésekor nálam mindhárom Netcat implementáció fel van telepítve így most ennek a fejezetnek az elkészítéséhez az ncat van beállítva alapértelmezettként.
Alapértelmezett Netcat változat beállítása
Ha az én esetemhez hasonlóan több változat van a számítógépen telepítve, akkor az alapértelmezett Netcat változatot az update-alternatives paranccsal állíthatjuk be:
sudo update-alternatives --config nc
És itt válasszuk az ncat opcióját.
Most pedig jöjjenek a port szkennelési feladatok. Ebben a részben tehát a Debian 10 (Buster) rendszerre telepített ncat 7.70 változatot tekintjük át, az egyszerűség kedvéért pedig innentől az nc parancs változatot használjuk.
TCP portok szkennelése
Az nc parancs szintaxisa:
nc [opciók] hoszt port
Az nmap-hoz hasonlóan az ncat parancs is a TCP portokat kezeli alapértelmezetten, ezért itt is ezeket vizsgáljuk kiindulásnak. Az alábbi paranccsal végezhetünk egyéni TCP port vizsgálatot:
nc -vz debian10.linuxportal.vm 21
Ebben a példában a 21-es (FTP) portot vizsgáljuk. A kapcsolók jelentése a következő:
- -v: Verbose mode: Bőbeszédű mód. Ha ezt nem tesszük bele, akkor a program nem ad semmilyen kimenetet. Erről lejjebb részletesebben.
- -z: Zéró-I/O mód. A kapcsoló hatására csak a kapcsolat állapotáról ad tájékoztatást.
UDP portok szkennelése
Az UDP portokat a -u kapcsolóval kérdezhetjük le:
nc -vzu debian10.linuxportal.vm 53
Szolgáltatások lekérdezése
A portok mögött figyelő szolgáltatásokról úgy tudhatunk meg többet, ha a fenti parancsokból kivesszük a -z kapcsolót. Ekkor az ncat program nem zero I/O módban működik, hanem megnyit egy kommunikációs csatornát, amiben megkapjuk a szolgáltatás üdvözlő szövegét is. Példák néhány ismert TCP portra, és a végén egy zárt portra:
nc -v debian10.linuxportal.vm 21
nc -v debian10.linuxportal.vm 25
nc -v debian10.linuxportal.vm 80
nc -v debian10.linuxportal.vm 110
nc -v debian10.linuxportal.vm 3306
nc -v debian10.linuxportal.vm 45
Itt láthatjuk az ismert portszámok mögött figyelő szolgáltatásoktól érkező válaszokat. A 21-es porton lévő Pure-FTPd egész szép kis bejelentkező üzenetet küld, míg más szolgáltatás nem ad magáról semmilyen információt. Ilyen például a 80-as port is (HTTP kiszolgáló). Végül pedig egy biztosan zárva lévő TCP portot is lekérdeztem, hogy látható legyen egy zárt portról érkező válasz is.
Érdekességképpen a 3306-os port (MariaDB) azt a választ adta, hogy ez a kiszolgáló (amiről indítottuk az ncat parancsot) nem jogosult a hozzáférésre. Ez azért van, mert a LAMP szerver telepítésekor annak idején az adatbázist biztonságossá tettük, aminek részeként letiltásra került az adatbázishoz történő távoli kapcsolódás is. Ennek eredményeképpen nem is enged semmilyen távoli csatlakozást.
Kimenet nélküli mód
Az ncat parancsot úgy is használhatjuk, hogy nem kérünk kimenetet, és zéró I/O módban használjuk. Ekkor nem ad semmilyen kimenetet, és egyből ki is lép. A lekérdezett port állapotáról pedig a $? kilépési kód változóból tájékozódhatunk. Így például automatizáltan, scriptekben tudjuk hatékonyan használni a programot. Példák az előző portokkal:
nc -z debian10.linuxportal.vm 21
echo $?
nc -z debian10.linuxportal.vm 25
echo $?
nc -z debian10.linuxportal.vm 80
echo $?
nc -z debian10.linuxportal.vm 110
echo $?
nc -z debian10.linuxportal.vm 3306
echo $?
nc -z debian10.linuxportal.vm 45
echo $?
Itt tehát a parancsoknak nincs kimenetük, hanem csak az állapot változó lekérdezésével tudhatjuk meg a portok állapotát. Ahol a $? változó értéke 0, ott a parancs nem adott hibát, azaz a lekért port nyitva van. Ahol a $? értéke 1, ott a parancs hibakóddal lépett ki, azaz a lekért porton nem talált semmit, tehát zárva volt.
Ennek segítségével például shell scriptek ciklusaiban, stb kérdezgethetjük le a portokat.
Egyszerre több port vizsgálata
Ahogy az ncat bevezető részében is említettem, hogy az egyszerre több port vizsgálatára irányuló funkciók kikerültek a Debian disztribúciókon lévő OpenBSD változatból, ezért a port felsorolások és port tartományok lekérdezését különböző kerülő megoldásokkal végezhetjük el. Ebben a részben nézzük át ezeket a megoldásokat.
Porttartomány vizsgálata
Az ncat-al porttartományt legegyszerűbben Bash ciklusokkal tudunk lekérdezni. Ezt összetettebb mivolta miatt célszerű egy pár soros script-be betenni, ahol áttekinthetőbb:
1 2 3 4 5 6 7 8 #!/bin/bash for i in {1..1000} do nc -z debian10.linuxportal.vm $i if [ $? -eq 0 ]; then echo "Nyitott port: " $i fi done
De ha egy sorban szeretnénk futtatni, akkor ezt is megtehetjük:
for i in {1..1000}; do nc -z debian10.linuxportal.vm $i; if [ $? -eq 0 ]; then echo "Nyitott port: " $i; fi done
A ciklus kimenete pedig nálam az alábbi:
A script illetve parancs működése egyszerű, a korábban már említett kimenet nélküli módon alapul: Ciklusban lefuttatjuk az nc/ncat parancsot a -v kapcsoló nélkül, ami miatt nem ad kimenetet a program. Majd megvizsgáljuk a kilépési kódot tartalmazó $? változót, és ahol 0 értéket kapunk, ott kiírjuk hogy nyitva van a port a ciklus változójával.
Ha UDP portokat szkennelünk ezzel a ciklussal, akkor le kell lassítani a ciklust, mert ha egymás után hívjuk meg sűrűn az nc programot, akkor minden x-edik alkalommal nyitott portot fog érzékelni. Ha ezekre a portokra utólag külön ránézünk, akkor természetesen zárt állapotot mutatnak. Tehát ha túl gyorsan "engedjük" egymás után az UDP letapogatásokat, akkor pontatlan eredményt kapunk. De ha beteszünk egy 1 másodperces sleep-et a ciklusba, akkor már pontos eredményt ad.
Az alábbi példában lefuttatok egy UDP porttartomány szkennelést. Mivel ez eleve lassabb folyamat, így most csak az 1-100 tartományban futtatom a ciklust. Így ebbe pont beleesik az 53-as nyitott UDP port, ezen kívül más nem lehet nyitva. Az első parancs tehát a sima UDP ciklussal, a másodikban pedig az 1 másodperces sleep-ekkel:
for i in {1..100}; do nc -zu debian10.linuxportal.vm $i; if [ $? -eq 0 ]; then echo "Nyitott port: " $i; fi done
for i in {1..100}; do nc -zu debian10.linuxportal.vm $i; if [ $? -eq 0 ]; then echo "Nyitott port: " $i; fi; sleep 1; done
Itt látható az első parancs esetén, hogy irreális eredményt adott. Viszont ha közelebbről megnézzük van szabályszerűség benne, mert minden x-edik portra jelezte, hogy nyitva van. Ahogy elkezdtem emelni a ciklusban a sleep értékét (0.1-től indulva), úgy ritkultak a hibás eredmények. Míg végül az 1 másodperces várakozásokkal kaptam pontos eredményt, ahol az egyetlen, valóban nyitva lévő 53-as UDP portot adta ki. Tehát az ncat parancsot az UDP portok esetében 1 másodperces késleltetéssel kell futtatni, akkor ad pontos eredményt. Természetesen más körülmények között (hálózat, kiszolgáló sebessége, stb.) ettől eltérő eredmény is lehet.
A ciklusban az if-then szerkezet helyett használhatunk grep parancsos megoldást is:
for i in {1..1000}; do nc -vz debian10.linuxportal.vm $i 2>&1 | grep "Connected"; done
Itt annyi történik, hogy mivel az ncat a -v verbose módja a hibakimenetre ír (stderr), ezt előbb át kell irányítani a szabványos kimenetre (stdout), majd utána már szűrhetünk a grep paranccsal a megfelelő kulcsszóra. Csak ügyeljünk a nagy kezdőbetűre, vagy használjuk a grep -i kapcsolóját.
UDP portok esetén pedig a grep-es megoldás:
for i in {1..100}; do nc -vzu debian10.linuxportal.vm $i 2>&1 | grep -C 1 "successfully"; sleep 1; done
Itt a művelet lassúsága miatt csak 1-100-as porttartományban szkennelünk, és a "successfully" kulcsszóra keresünt, valamint a -C 1 opcióval kiterjesztjük a grep által a találatok előtt és után kiiratott sorok számát 1-1 sorra, mivel ebben a kimenetben nem ugyanabban a sorban van a port száma, mint a keresett kulcsszó, így enélkül nem látnánk a portszámokat tartalmazó sorokat. És végül ne felejtsük ki innen se az 1 másodperces sleep-et sem.
Felsorolt portok vizsgálata
Ha konkrét portokat kell szkennelnünk, akkor erre a legkényelmesebb megoldás a GNU parallel parancs használata. A parallel programot először telepítsük az alábbi paranccsal:
sudo apt-get install parallel
Ezután már használhatjuk is.
Az nc/ncat parancsot pedig az alábbi módon használhatjuk, ha egy port felsorolást szeretnénk szkennelni. Az első példában TCP portokat vizsgálunk, a másodikban pedig UDP portokat:
parallel nc -vz debian10.linuxportal.vm ::: 22 80 110 143 3306 8080
parallel nc -vzu debian10.linuxportal.vm ::: 20 53 200
Amint láthatjuk, a parallel parancs segítségével rendkívül egyszerűen lehet több portot szkennelni.
A második parancs érdekessége, hogy a kimenet nem a megadott felsorolás sorrendje szerint alakult. Ez azért van, mert a parallel parancs - a shell ciklusokkal szemben - párhuzamosan futtatja le a parancsokat, és mivel a példában lévő három UDP port közül az egyetlen nyitott port letapogatása tartott a leghosszabb ideig, ezért annak az eredménye érkezett meg a legkésőbb.
nc.traditional (Netcat traditional)
Az nc.traditional (Netcat traditional) egy egyszerű unix segédprogram, amely adatokat olvas és ír hálózati kapcsolatokon keresztül, TCP vagy UDP protokoll használatával. Úgy tervezték, hogy egy megbízható "backend" eszköz legyen, amely közvetlenül használható, vagy könnyen vezérelhető más programok és szkriptek által. Ugyanakkor egyben funkciókban gazdag hálózati hibakereső és felderítő eszköz is, hiszen szinte bármilyen kapcsolatot képes létrehozni, amire csak szükség lehet, és számos érdekes beépített képességgel rendelkezik.
Telepítése
A Netcat tradicionális implementációja általában a Debian szerver változatokon alapértelmezetten telepített program, de a Debian asztali változatain vagy például Ubuntu rendszereken viszont telepíteni kell. Ha tehát olyan rendszert használunk, ahol nincs fent alapból, akkor telepítsük az netcat-traditional csomagot:
sudo apt-get install netcat-traditional
Ubuntu rendszereken az alapértelmezett csomagtárban a netcat-traditional csomag nem érhető el, hanem csak a universe csomagtárban. A universe csomagtár beállítását az alábbi paranccsal tehetjük meg, amennyiben még eddig nem volt beállítva:
sudo add-apt-repository universe
Ezután már az Ubuntu rendszereken is telepíthető a netcat-traditional csomag.
Ha a csomag feltelepült - és ez az egyetlen vagy alapértelmezett Netcat változat-, akkor az alábbi parancsokkal használhatjuk:
- nc.traditional: Ez a program dedikált parancsa. Az nc.traditional parancs minden esetben a Netcat tradicionális implementációját jelenti, függetlenül az alapértelmezett beállítástól, ami a - jelenlegi leírás alapjául szolgáló - Debian 10 (Buster) operációs rendszerben az 1.10-41.
- nc: "Közös" parancs. Ez a parancs mindig az alapértelmezett Netcat változatra mutató szimbolikus link, így ennek használatakor ellenőrizzük a Netcat verziószámot mielőtt például scriptekben használnánk. Ha nincs más Netcat változat a számítógépünkön csak az nc.traditional, vagy több változat is van, de ez az alapértelmezett beállítás, akkor ez a parancs az nc.traditional parancsra mutat.
- netcat: Ez is közös használatú parancs, ugyanaz érvényes itt is, mint az "nc" esetében.
Az nc és a netcat parancsok tehát ebben az esetben az nc.traditional "szinonimái". Erről a readlink és a which parancsok segítségével is meggyőződhetünk:
readlink -f $(which nc)
readlink -f $(which netcat)
/usr/bin/nc.traditional /usr/bin/nc.traditional
nc -> /usr/bin/nc -> /etc/alternatives/nc -> /usr/bin/nc.traditional netcat -> /usr/bin/netcat -> /etc/alternatives/netcat -> /usr/bin/nc.traditional
Az nc.traditional kizárólagos (csak ez van telepítve) vagy alapértelmezettként történő használata esetében tehát mindhárom parancs használható.
Jelen leírás készítésekor nálam mindhárom Netcat implementáció fel van telepítve így most ennek a fejezetnek az elkészítéséhez az nc.traditional van beállítva alapértelmezettként.
Alapértelmezett Netcat változat beállítása
Ha az én esetemhez hasonlóan több változat van a számítógépen telepítve, akkor az alapértelmezett Netcat változatot itt is az update-alternatives paranccsal állíthatjuk be:
sudo update-alternatives --config nc
És itt válasszuk az nc.traditional opcióját.
Most pedig jöjjenek a port szkennelési feladatok. Ebben a részben tehát a Debian 10 (Buster) rendszerre telepített nc.traditional 1.10-41 változatot tekintjük át, az egyszerűség kedvéért pedig innentől itt is az nc parancs változatot használjuk.
TCP portok szkennelése
Az nc parancs szintaxisa:
nc [opciók] hoszt port
Az előző parancsokhoz hasonlóan az nc.traditional is a TCP portokat kezeli alapértelmezetten, ezért itt is ezeket vizsgáljuk kiindulásnak. Az alábbi paranccsal végezhetünk egyéni TCP port vizsgálatot:
nc -vz debian10.linuxportal.vm 21
nc -vz debian10.linuxportal.vm 22
nc -vz debian10.linuxportal.vm 80
nc -vz debian10.linuxportal.vm 110
nc -vz debian10.linuxportal.vm 57345
nc -vz debian10.linuxportal.vm 58100
A kapcsolók jelentése a következő:
- -v: Verbose mode. Bőbeszédű mód. Ennek hatására jelennek meg a látható kimeneti sorok. Ha duplán használjuk, részletesebb adatokkal szolgál.
- -z: Zero-I/O mode. Szkenneléshez használatos. Ha nem adjuk meg, akkor perzisztens kapcsolatot nyit a megadott porttal és nem lép ki a programból.
Itt többmindenre is láthatunk példát:
- Ismert nyitott portok (pl. 21, 80, 110)
- ismert zárt portok (pl. 22)
- ismeretlen nyitott portok (pl. 57345)
- ismeretlen zárt portok (85100)
Ahogy láthatjuk, az nc.traditional is rendelkezik egy saját adatbázissal, ami kiírja az ismert porszámok mögötti ismert szolgáltatások neveit. Persze ha valamelyik szolgáltatásunk portszámát átállítjuk, akkor már gondban van a Netcat, mivel alapból nem derül ki, hogy milyen szolgáltatás van a nem ismert, de nyitott port mögött. Például korábban az SSH kiszolgálót állítottam át az 57345-ös portszámra.
UDP portok szkennelése
UDP portok szkenneléséhez használjuk a -u kapcsolót:
nc -vzu debian10.linuxportal.vm 53
nc -vzu debian10.linuxportal.vm 60
Itt láthatunk egy nyitott és egy zárt port szkennelési kimenetet. Az 53-as port jelen esetben a BIND DNS szerverhez tartozik, ami a korábban elkészített tökéletes szerver telepítése során került fel.
Ismeretlen szolgáltatások felderítése
A TCP portok között az SSH szolgáltatás át lett állítva más portra, amit nem ismert fel a Netcat. Persze csak ebben az esetben tudjuk, hogy az 57345-ös portszám egy SSH kiszolgálót takar, mert saját beállítás, de ha ki szeretnénk deríteni egy valóban ismeretlen szolgáltatást akkor hagyjuk ki a -z kapcsolót. Ebben az esetben - ahogy korábban már említettem - a Netcat program egy perzisztens kapcsolatot létesít a porttal, ahol esélyünk van rá, hogy a csatornán elküldi a szolgáltatás a "bemutatkozó szövegét". Nézzünk néhány példát:
nc -v debian10.linuxportal.vm 57345
nc -v debian10.linuxportal.vm 21
nc -v debian10.linuxportal.vm 80
nc -v debian10.linuxportal.vm 110
Itt látható, hogy ahány szolgáltatás, annyi féle válasz érkezik. Természetesen mindegyik esetében a CTRL-C -vel meg kell szakítanunk a kapcsolatot, mert magától csak X perc tétlenség után szakad meg. Így tehát ki tudjuk deríteni a szolgáltatások zömét, ha az átkerül egy másik portra.
Érdekesség: adatok küldése egy adott portra
Nem tartozik szorosan a port szkenneléshez, de érdekességképpen megér pár mondatot:
A 80-as (HTTP) portról értelemszerűen nem érkezett semmilyen válasz, mivel oda el kell küldenünk egy fejlécet, ahogyan a böngészők is teszik azt. Nézzünk rá például a google.hu-ra. Először elküldünk egy nagyon egyszerű HEAD, majd egy GET lekérést:
printf 'HEAD / HTTP/1.1\r\nHost: google.hu\r\nAccept: \r\n\r\n' | nc -v google.hu 80
printf 'GET / HTTP/1.1\r\nHost: google.hu\r\nAccept: \r\n\r\n' | nc -v google.hu 80
A kimenet pedig:
Az első paranccsal a HEAD lekérésben válaszul megkapjuk a lekért oldal fejléceit, a második, GET lekérésben pedig a fejlécek után a weboldal HTML tartalma is érkezik. Szerencsére itt rögtön kaptunk is egy 301-es átirányítást, így kifért a forrás egy ablakba. Ilyenkor a böngészők már ugranak is tovább a cél címre. Jelen esetben itt kaptunk egy www-re történő átirányítást, mivel csak a domain nevet adtam meg a lekérésben www nélkül. Ha követnénk az átirányítást, akkor vagy bejönne az oldal, vagy kapnánk még egy HTTP -> HTTPS átirányítást is. Mindezek persze a böngészőkben pillanatok alatt megtörténnek, amivel a felhasználóknak nem is kell tudomást venniük.
Így tehát a Netcat programból shell scriptek segítségével akár webes robotokat is lehet építeni, ami például "ugrál" az oldalakon talált linkeken és indexeli az oldalakat, vagy éppen email címeket gyűjt róla email adatbázisok építéséhez, stb (persze az más kérdés, hogy az így összegyűjtött címlisták nem legálisak). A többi már csak jól összeállított reguláris kifejezések kérdése, ami feldolgozza a kapott forráskódokat. Természetesen számtalan letölthető vagy akár online program létezik ilyen célokra, ezt csak mint érdekességet írtam le, hogy szemléltessem a Netcat program sokoldalúságát.
Egyszerre több port vizsgálata
Ellentétben az ncat paranccsal az nc.traditional segítségével lehetőségünk van egyszerre több portot is szkennelni.
Porttartomány szkennelése
Az első példában megnézzük a teljes porttartományt, azaz az 1-65535-ig terjedő portokat, aminek a futási idejét megmérjük a time parancs segítségével:
time nc -vz debian10.linuxportal.vm 1-65535
Az nc.traditional érdekessége, hogy csökkenő sorrendben szkenneli a portokat. A teljes tartomány szkennelése 13 másodpercet vett igénybe. Itt még a 4949-es porton figyelő Munin node-ot is felismerte, amit szintén korábban telepítettem erre a szerverre. Nyilván ezt is a központi adatbázis alapján jelezte ki.
UDP portok esetén pontosan ugyanaz a helyzet, mint az ncat program esetén volt korábban: ha nem használunk időzítést, akkor jóformán minden UDP portot nyitottnak lát, amikor tartományban kérdezzük le őket. Lássunk erre egy példát:
nc -vvzu debian10.linuxportal.vm 40-60
Itt duplán tettem bele a -v kapcsolót, így a zárt portok is megjelennek a kimenetben. A 40-60 -as tartományt vizsgáljuk, hasonlóan a korábbi ncat-hoz, így itt is beleesik az 53-as valóban nyitott port a tartományba:
Itt is ugyanúgy járunk ilyenkor, mint az ncat esetén: az időzítés nélküli gyors UDP port szkennelés sok nyitott portot eredményez. Ami természetesen nem egyezik a valósággal. A különbség csak annyi, hogy mivel itt fordított sorrendben történik a szkennelés, így a magasabb portokról indulva kezdte az első néhány portot megfelelően kezelni, majd jöttek itt is a nyitott portok.
A helyes működéshez használjunk itt is 1 másodperces időközöket. Itt azonban nem nekünk kell a saját magunk által készített ciklusokban bűvészkedni, hanem erre van az nc.traditional parancs -i paramétere, aminek másodperces alapon megadhatjuk a portokra küldött adatok közötti eltöltött időt. Ennek megfelelően tehát a parancsunk:
nc -vvzui 1 debian10.linuxportal.vm 40-60
Így már hibátlan eredményt kaptunk. Az 53-as port van nyitva egyedül ezen a szerveren az UDP portok között. Valamint itt még talált egy tacacs nevű szolgáltatást is, persze a port zárva, csak az adatbázis alapján itt előfordulhat egy ismert szolgáltatás. Ezt pedig itt tudjuk megnézni. Ez egy "Login Host Protocol (TACACS)" nevű szolgáltatás.
Az nc.traditional tehát rendelkezik beépített időzítővel is, így az UDP portokat is gond nélkül tudjuk vele szkennelni.
Felsorolt portok szkennelése
Portok felsorolását pedig szóközökkel elválasztott felsorolással adhatjuk meg.
Példa TCP portokra:
nc -vvz debian10.linuxportal.vm 21 22 25 53 80 110 143 8080 12000
Felsorolás esetén is használhatjuk a dupla -v kapcsolót, így láthatjuk a zárt portok válaszait is, de mégsem zavaró módon, mivel kevés portról van szó.
UDP portok esetén ilyenkor is használjunk időzítést, mert kb 5 egymás után gyorsan lekérdezett port esetén már nyitott állapotokat mutat. Itt lekérdezünk néhány portot, köztük a nyitva lévő 53-as portot is. az első parancsnál nem használtam 1 másodperces időzítőt, a másodiknál igen:
nc -vvzu debian10.linuxportal.vm 1 2 3 4 5 6 7 8 9 10 53 60 70 80 90 100 200 300 400
nc -vvzui 1 debian10.linuxportal.vm 1 2 3 4 5 6 7 8 9 10 53 60 70 80 90 100 200 300 400
Itt jól látszik egy képernyőn az időzítés nélküli és az 1 másodperces időzítéssel indított port szkennelés eredménye. Míg az első esetben az első néhány portig jó eredményeket produkált, utána már minden portot nyitottnak jelzett. Az időzítéses parancs viszont megfelelő eredményt adott: csak a valóban nyitva lévő 53-as portot jelezte nyitottnak.
Ebben a felsorolásban is akad néhány ismertebb szolgáltatás portszáma - amik ezen a szerveren természetesen nem futnak -, amiket a már korábban is mutatott linken ellenőrizhetünk, ha kíváncsiak vagyunk ezekre szolgáltatásokra.
A tanulság tehát, hogy UDP portok csoportos lekérdezése esetén mindig használjunk 1 másodperces időközöket, ha az ncat vagy az nc.traditional változatokat használjuk. Ha saját ciklusokkal dolgozunk, akkor abban helyezzünk el sleep-eket, vagy ha egy nc paranccsal kérdezünk le egyszerre több UDP portot, akkor ennek adjuk meg az időzítési paramétert. Persze ez kicsit még mindig "fapadosabb" megoldás, mint az nmap belső szabályzó rendszere, de egy fokkal viszont már jobb, mint az ncat esetében ahol nekünk kellett a ciklusban időzítéseket elhelyeznünk.
nc.openbsd (Netcat OpenBSD)
Az nc.openbsd (Netcat OpenBSD) segédprogram szinte mindenre használható, beleértve a TCP, UDP vagy UNIX-domain socketekkel kapcsolatos dolgokat. Képes TCP-kapcsolatokat nyitni, UDP-csomagokat küldeni, tetszőleges TCP- és UDP-portokon figyelni, port szkennelést végezni, és kezelni az IPv4-es és IPv6-os hálózatokat is. A telnet-tel szemben az nc szépen szkriptez, és a hibaüzeneteket is megfelelően a szabványos hibakimenetre (stderr) küldi a szabványos kimenet (stdout) helyett, mint ahogyan a telnet.
Telepítése
A Netcat OpenBSD implementációja az Ubuntu szerver és asztali változataiban általában előre telepítve vannak, Debian rendszereken történő használatához telepítsük a netcat-openbsd csomagot:
sudo apt-get install netcat-openbsd
Ha a csomag feltelepült - és ez az egyetlen vagy alapértelmezett Netcat változat-, akkor az alábbi parancsokkal használhatjuk:
- nc.openbsd: Ez a program dedikált parancsa. Az nc.openbsd parancs minden esetben a Netcat OpenBSD implementációját jelenti, függetlenül az alapértelmezett beállítástól, ami a - jelenlegi leírás alapjául szolgáló - Debian 10 (Buster) operációs rendszerben az 1.195.2.
- nc: "Közös" parancs. Ez a parancs mindig az alapértelmezett Netcat változatra mutató szimbolikus link, így ennek használatakor ellenőrizzük a Netcat verziószámot mielőtt például scriptekben használnánk. Ha nincs más Netcat változat a számítógépünkön csak az nc.openbsd, vagy több változat is van, de ez az alapértelmezett beállítás, akkor ez a parancs az nc.openbsd parancsra mutat.
- netcat: Ez is közös használatú parancs, ugyanaz érvényes itt is, mint az "nc" esetében.
Az nc és a netcat parancsok tehát ebben az esetben az nc.openbsd "szinonimái". Erről a readlink és a which parancsok segítségével is meggyőződhetünk:
readlink -f $(which nc)
readlink -f $(which netcat)
/usr/bin/nc.openbsd /usr/bin/nc.openbsd
nc -> /usr/bin/nc -> /etc/alternatives/nc -> /usr/bin/nc.openbsd netcat -> /usr/bin/netcat -> /etc/alternatives/netcat -> /usr/bin/nc.openbsd
Az nc.openbsd kizárólagos (csak ez van telepítve) vagy alapértelmezettként történő használata esetében tehát mindhárom parancs használható.
Jelen leírás készítésekor nálam mindhárom Netcat implementáció fel van telepítve így most ennek a fejezetnek az elkészítéséhez az nc.openbsd van beállítva alapértelmezettként.
Alapértelmezett Netcat változat beállítása
Ha az én esetemhez hasonlóan több változat van a számítógépen telepítve, akkor az alapértelmezett Netcat változatot itt is az update-alternatives paranccsal állíthatjuk be:
sudo update-alternatives --config nc
És itt válasszuk az nc.openbsd opcióját.
Most pedig jöjjenek a port szkennelési feladatok. Ebben a részben tehát a Debian 10 (Buster) rendszerre telepített nc.openbsd 1.195.2 változatot tekintjük át, az egyszerűség kedvéért pedig innentől itt is az nc parancs változatot használjuk.
TCP portok szkennelése
Az nc parancs szintaxisa:
nc [opciók] hoszt port
Az előző parancsokhoz hasonlóan az nc.openbsd is a TCP portokat kezeli alapértelmezetten, ezért itt is ezeket vizsgáljuk kiindulásnak. Az alábbi paranccsal végezhetünk egyéni TCP port vizsgálatot:
nc -vz debian10.linuxportal.vm 21
nc -vz debian10.linuxportal.vm 22
nc -vz debian10.linuxportal.vm 80
nc -vz debian10.linuxportal.vm 110
nc -vz debian10.linuxportal.vm 57345
nc -vz debian10.linuxportal.vm 58100
Itt a parancs kapcsolóinak a működése és a kapott eredmények is ugyanazok, mint az nc.traditional esetében, egyedül a kimenet néz ki egy kicsit másképpen: szögletes zárójelek között kapjuk a szolgáltatások nevét, és a nyitott portok esetén az "open" helyett "succeeded!" feliratokat kapunk.
Ezeken kívül nincs semmi különbség az nc.traditional-hoz képest, így mehetünk is tovább.
UDP portok szkennelése
Itt is a -u kapcsolóval válthatunk UDP módra:
nc -vzu debian10.linuxportal.vm 53
nc -vzu debian10.linuxportal.vm 60
Itt van több eltérés is az nc.traditional változathoz képest:
- UDP módban a zárt portok esetében nem ad kimenetet, ellentétben az nc.traditional változattal, ahol kiírta hogy "Connection refused". Amint láthattuk, az előbb a TCP portok esetén a zárt portoknál adott kimenetet, itt az UDP portoknál nem. Ez talán lehet egy bug is a programban.
- A dupla -v kapcsoló itt nem működik, ha esetleg azzal próbálnánk rávenni a programot hogy adjon még bővebb kimenetet, tehát a dupla verbose mód itt nem érhető el, az nc.openbsd nem támogatja. Ez a súgójából is kiderül.
Így tehát az nc.openbsd használatánál a zárt UDP portok esetén (és természetesen a nyitottaknál is) a $? változóból tudhatjuk meg biztosan az eredményt.
Ismeretlen szolgáltatások felderítése
Itt is lefuttatjuk az nc.traditional esetén használt példákat:
nc -v debian10.linuxportal.vm 57345
nc -v debian10.linuxportal.vm 21
nc -v debian10.linuxportal.vm 80
nc -v debian10.linuxportal.vm 110
Itt nincs eltérés az nc.traditional változathoz képest, csak a szögletes zárójelek, amiket már említettem.
Egyszerre több port vizsgálata
Átnézzük itt is az egyszerre több port szkennelését.
Porttartomány szkennelése
Itt is lefuttatom az nc.traditional esetén alkalmazott példát a TCP porttartomány szkenneléséhez:
time nc -vz debian10.linuxportal.vm 1-65535
Itt ismét vannak eltérések az nc.traditional-hoz képest:
- Itt a másik végletet kapjuk, mint az UDP portok esetén: itt a zárt portokat is kiírja. Ellentétben az nc.traditional esetén, ahol csak a nyitott portokat jelenítette meg.
- A portokat itt növekvő sorrendben szkenneli. Ellentétben az nc.traditional esetével, ahol csökkenő módban szkennelt.
Ez egy ekkora tartomány esetén kezelhetetlen kimenetet ad, így magunknak kell megoldanunk a kimenet szűrését:
time nc -vz debian10.linuxportal.vm 1-65535 2>&1 | grep -v "refused"
Ahogy már fentebb az ncat fejezetben is említettem, a Netcat implementációk a -v kapcsoló által "kért" kimeneteket a szabványos kimenet (stdout) helyett a szaványos hibakimenetre (stderr) küldi. Ezért először a kapott kimenetet át kell irányítanunk a hiba kimenetről a szabványos kimenetre a "2>&1" résszel, majd utána a grep paranccsal már szűrhetünk. Itt én a "refused" kulcsszóra szűrtem, hogy csak az ilyen típusú hibákat szűrje ki a kimenetből (esetleg előfordulhatnak másféle hibák is, azok ilyenkor is bent maradnak a kimenetben).
Az UDP porttartomány szkenneléséhez is lefuttatjuk a korábbi példánkat:
nc -vvzu debian10.linuxportal.vm 40-60
Mivel itt nincs hatása a dupla -v kapcsolónak, ezért lefuttatom szimpla -v kapcsolóval is, hogy ne legyen a parancsban felesleges kapcsoló:
nc -vzu debian10.linuxportal.vm 40-60
Itt is vannak eltérések:
- UDP módban porttartomány szkennelése esetén sem ad kimenetet a zárt portoknál. Ez mondjuk nem zavaró, mert itt nem kell külön szűrnünk semmire.
- Kötegelt UDP portok esetén az nc.openbsd-nél működik az automatikus időzítés, nem kell külön a -i kapcsolót használni.
Felsorolt portok szkennelése
Futtassuk a korábbi, nc.traditional parancsnál használt példánkat itt is:
nc -vz debian10.linuxportal.vm 21 22 25 53 80 110 143 8080 12000
Itt csak annyi apróbb eredménybeli különbség van, hogy ugyanazt az eredményt itt sima -v opcióval érjük el, mert az nc.openbsd a sima -v kapcsoló hatására is megjeleníti a zárt TCP portokat, míg a korábbi nc.traditional parancsnál -vv kapcsolóval lehetett rávenni, hogy a zárt TCP portokat is megjelenítse.
Itt nincs más különbség, csak a szokásos szögletes zárójelek, stb.
UDP portok esetén a korábbi példa parancsunk:
nc -vzu debian10.linuxportal.vm 1 2 3 4 5 6 7 8 9 10 53 60 70 80 90 100 200 300 400
Itt is szimpla -v kapcsolót használok...
Itt ahogy az nc.openbsd esetén most már megszoktuk, az UDP portok esetén nem ad kimenetet a zárt portokról. Ellentétben az nc.tradicional parancsnál, ahol a zárt UDP portokat is kiírta.
Itt más különbség nincs, az egyetlen nyitott portot megtalálta, az 53-as (domain) portot.
Ennyi volna a Netcat implementációk áttekintése. Vannak működésbeli eltérések a három változat között, így használatkor mérlegeljünk, hogy melyik az optimálisabb számunkra. Pl mikor ad, mikor nem ad kimenetet, szükségünk van-e tartomány szkennelésére, stb.
Konklúzió
A portok szkennelését alapszinten ezzel kiveséztük az nmap paranccsal és a Netcat mindhárom implementációjával.
A Netcat program egy kiváló hálózati segédeszköz, de port szkennelés tekintetében eléggé korlátozott képességekkel rendelkezik az nmap-hoz képest. Az nmap például támogatja a több célpont egyidejű szkennelését is, míg a Netcat esetében ezt script-ekbe ágyazva lehet csak megoldani. Valamint még sok egyéb extra funkciót is tartalmaz az nmap, aminek a használata túlmutat ezen a leíráson.
Összességében tehát port szkennelési képességek tekintetében az nmap a professzionálisabb megoldás, de azért a Netcat program implementációival is szkennelhetünk alapszinten, ami végül is ennek a leírásnak a célja is volt. A Netcat esetéban a port szkennelést tekintsük inkább amolyan kiegészítő funkcióként, mint a svájci bicska esetén egy eszközt a sok közül. Az nmap ezzel szemben célirányosan a port szkennelésre fókuszál professzionális szinten.
Természetesen port szkennelésre létezik még sok másik program is, azonban a leírás célja a saját szerverünk biztonságának ellenőrzése, amit ezekkel az eszközökkel is kiválóan el tudunk végezni.
- Hogyan ellenőrizhetjük Debian vagy Ubuntu Linux operációs rendszerünk használatban lévő, illetve szabad TCP/UDP portjait?
- Hogyan változtathatjuk meg SSH kiszolgálónk alapértelmezett 22-es tcp portját Debian vagy Ubuntu Linux szerverünkön a nagyobb biztonság érdekében?
- Manual oldal - socket (2)
- Manual oldal - nc / ncat
- Manual oldal - nc.openbsd (Netcat OpenBSD)
- Manual oldal - nc.traditional (Netcat traditional)
- nmap.org
- nmap.org - Nmap Referencia Útmutató (Kézikönyv) (magyar nyelvű)
Lapozó
- A hozzászóláshoz regisztráció és bejelentkezés szükséges
- 61 megtekintés