Alapszintű port szkennelés - Avagy hogyan ellenőrizhetjük Linux szerverünk biztonságát az illetéktelen behatolókkal szemben (2. oldal)

botond küldte be 2022. 10. 23., v – 09:35 időpontban

A 2. oldal tartalma

  1. oldal: TCP és UDP portok szkennelése az nmap parancs használatával
  2. 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.

A Linux operációs rendszereken a Netcat program többféle implementációja is elérhető, amik egyszerre is fent lehetnek a számítógépen. Sokan előszeretettel használják őket párhuzamosan, mivel mindegyiknek van olyan funkciója, ami nincs a másikban. Így a Netcat program több változatának együttes használata erőteljes hálózati arzenált biztosít a rendszergazdák számára. Ha egyszerre több Netcat implementáció van telepítve a számítógépünkön, akkor célszerű beállítani az alapértelmezett változatot (Az update-alternatives --config nc paranccsal), hogy a "közös" használatú nc és netcat parancsok is arra mutassanak. De a különböző implementációk dedikált parancsai - az alapértelmezett beállítástól függetlenül - mindig a saját programot jelentik. Ezekről lejjebb olvashatunk majd. Most lássuk a parancsok telepítését és a port szkennelésre történő használatukat.

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.
Ha shell scriptekben használjuk a Netcat programot, célszerű a dedikált parancsot használni, így egy esetleges későbbi alapértelmezés-átváltás nem teszi működésképtelenné scriptjeinket.

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.

Program alternatíva beállítása - nc

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

Ncat - TCP portok szkennelése

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

Ncat - UDP portok szkennelése

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

 Ncat - Szolgáltatások lekérdezése

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.

Amint a képen is látható, az egyes parancsok kimenetei között ^C jelek vannak, amik a kapcsolatok CTRL+C -vel történő megszakításaiból erednek. Mint ahogy fentebb már írtam, az Ncat program egy általános célú kommunikációs program, ami a megadott portokkal kapcsolatot létesít, és a kapcsolaton keresztül adatokat küld és fogad. Ezért ilyenkor egy perzisztens csatorna jön létre a nyitott porton keresztül. A fentebb bemutatott -z kapcsoló használata pont erre a célra szolgál, hogy a port nyitott állapotáról csak tájékoztatást ad, majd le is zárja a kapcsolatot.

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 $?

Ncat - Kimenet nélküli mód

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:

Ncat - Porttartomány vizsgálata shell ciklusban futtatva

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

Ncat - UDP porttartomány vizsgálata shell ciklusban futtatva

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.

Jelen esetben egy sima shell ciklusból futtatjuk a parancsot, így a ciklus sebessége adja a letapogatási tempót. És mivel az nc/ncat program nem támogatja az egyszerre több port letapogatását, ezért a program nem rendelkezik belső időzítőkkel, hanem ahogy futtatásra kerül, úgy indítja a kommunikációt a portok felé. Az UDP portok esetén viszont időzítés szükséges, amit itt a ciklusban történő futtatás során magunknak kell megoldanunk. Persze ez messze nem olyan kifinomult módszer, mint mondjuk az nmap parancs intelligens belső szabályzó rendszere, de a célnak megfelel.

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

Ncat - TCP porttartomány vizsgálata shell ciklusban futtatva

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.

Ncat - UDP porttartomány vizsgálata shell ciklusban futtatva

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

Ncat - Felsorolt portok vizsgálata a parallel parancs segítségével

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.
Ha shell scriptekben használjuk a Netcat programot, célszerű a dedikált parancsot használni, így egy esetleges későbbi alapértelmezés-átváltás nem teszi működésképtelenné scriptjeinket.

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.

Program alternatíva beállítása - nc

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

nc.traditional - TCP portok szkennelése - Egyéni portok vizsgálata

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

nc.traditional - UDP portok szkennelése - Egyéni portok vizsgálata

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

nc.traditional - Ismeretlen szolgáltatások felderítése

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:

nc.traditional - HEAD és GET lekérések a 80-as porton

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

nc.traditional - Porttartomány vizsgálata

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:

nc.traditional - UDP Porttartomány vizsgálata időzítés nélkül

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

nc.traditional - UDP Porttartomány vizsgálata 1 másodperces időzítésekkel

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

nc.traditional - Felsorolt TCP portok szkennelése

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

nc.traditional - Felsorolt UDP portok szkennelése

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.
Ha shell scriptekben használjuk a Netcat programot, célszerű a dedikált parancsot használni, így egy esetleges későbbi alapértelmezés-átváltás nem teszi működésképtelenné scriptjeinket.

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.

Program alternatíva beállítása - nc

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.

 

Az nc.openbsd port szkennelés tekintetében szinte teljesen ugyan úgy működik, mint az nc.traditional. Ezért itt csak gyorsan átfutjuk az nc.traditional részben leírtakat,  és csak az eltéréseket nézzük át, ahol vannak.

 

 

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

nc.openbsd - TCP portok szkennelése - Egyéni portok vizsgálata

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.

Ezeknél a szövegekben lévő különbségeknél esetleg akkor érdemes odafigyelni, ha például szkriptekben használjuk a parancsokat ahol grep-el szűrjük az eredményeket. Mert ha ilyenkor esetleg áttérünk az nc.traditional változatról az nc.openbsd változatára (vagy fordítva), akkor a keresőszavakat is át kell írnunk. De más jelentősége nincs ezeknek sem.

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

nc.openbsd - UDP portok szkennelése

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.

A kimenet nélküli állapotra nem célszerű támaszkodni például szkriptek használata esetén, mert ha ez egy bug, és később javítják, akkor az a szkriptünk hibás működéséhez vezet. Így tehát szkriptekben használjuk a $? exit kód változó ellenőrzését inkább. Vagy esetleg ha mindenképpen grep paranccsal szeretnénk szűrni a kimenetet, akkor a grep -v kapcsolójával zárhatjuk még ki a sikeres (nyitott port) kimenetet, hogy megkapjuk a zárt állapotot.

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

Ismeretlen szolgáltatások felderítése

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

nc.openbsd - TCP Porttartomány vizsgálata

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"

nc.openbsd - TCP Porttartomány vizsgálata szűréssel

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

nc.openbsd - UDP Porttartomány vizsgálata

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

nc.openbsd - Felsorolt TCP portok szkennelése

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

nc.openbsd - Felsorolt UDP portok szkennelése

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.

 

 

Lapozó

Ez a leírás több oldalból áll: