WebElektronika

Scannelési technikák az nmap használatánál I.

person access_time 2018.03.06.
Elkezdjük most részletesebben megismerni az nmap használatát. Az nmap nagyon fontos eszköz az IT biztonsággal, illetve az üzemeltetéssel foglalkozó szakembereknél. De hogyan működik? Hogyan lehet és érdemes a scannelési tulajdonságokat beállítani? Mi van a háttérben? Ezeket tekintjük át röviden ebben a cikkben, illetve kitérünk néhány kapcsoló (pl.: "-sS") alkalmazásának hátterére is.


Az nmap-ot saját hálózatunk (illetve a feltételek tudomásul vétele után a scanme.nmap.org) tesztelésére használhatjuk, ellenkező esetben akár bűncselekmény is megvalósítható az alkalmazásával.
Az nmap használatával különböző scannalési technikák alkalmazhatók. A cél felderítésének az eredménye attól függ, hogy a számítógép (vagy az előtte lévő tűzfal) milyen csomagokat küld vissza. Előfordulhat az is, hogy a tűzfal (számítógép) más csomagot küld vissza az nmap-nak, tehát félrevezetés történik.

A TCP protokoll egy ún. connection alapú protokoll, azaz, először felépül a kapcsolat, azután történik az adatküldés, ezt követően lebontjuk a kapcsolatot.

A kapcsolatfelépítésekor az ún. háromlépéses kézfogás történik, ezek a lépések a következők:

  1. a kliens csomagot küld a szervernek, beállítja a kliens a SYN flag-et. A kliens generál egy szekvencia számot is, ez véletlenszám. Ha hiba történik az átvitelben, akkor innen küldi újra a szerver az adatot. (SYN)
  2. a szerver válszolni fog a kliensnek. A szerver beállítja az ACK flag-et (visszaigazolás történik, hogy megkapta a szerver a szekvenciaszámot, a szerver visszaküldi a szekvenciaszám eggyel megnövelt értékét). A szerver is küld adatot, tehát itt is lehet hiba, ezért a szerver is generál egy véletlen számot, ez lesz a szerver szekvenciaszáma. Ezért a szerver beállítja a SYN flag-et is, amikor átadja a saját szekvenciaszámát. (SYN-ACK)
  3. A kliensnek vissza kell igazolni azt, hogy megkapta a szerver szekvenciaszámát. Ezért a kliens is küld egy ACK-ot, és a szerver szekvenciaszámának eggyel megnövelt értékét is visszaküldi a szerver felé. (ACK)

 

A fent említett háromlépéses kézfogás kell ahhoz, hogy a TCP kommunikáció kiépüljön a szerver és a kliens között. Ez a folyamat látható az első ábrán (SYN, SYN-ACK, SYN).

kep
1. ábra   A háromlépéses kézfogás a Wireshark-ban (kattints a képre)
 

Nézzük meg részletesebben például a szerver válaszát (SYN ACK), amely a kliens kérésére (SYN) született. Ehhez kattintani kellett a 288. sorra, majd a másik ablakban lévő "Transmission Control Protocol" feliratra (2. ábra).

kep
2. ábra   A szerver válasza a kliens felé (SYN-ACK kapcsolat)
 

Láthatjuk ezen a képen (2. ábra), hogy a szerver beállította a SYN és az ACK flageket, illetve a "seq" értékét, amelyet a kliens a 289. sorban vissza fog igazolni úgy, hogy az értékét eggyel megnöveli.

A háromlépéses kézfogás után történik a kommunikáció a kliens és a szerver között, majd a kommunikáció lezáráshoz a négylépéses kézfogás kell, amelyet bármelyik fél kezdeményezheti.

  1. FIN csomag küldése (bárki kezdeményezheti)
  2. a másik fél küld erre egy ACK-ot
  3. aki igazolta az ACK-ot, küld egy FIN-t
  4. aki megkapta a FIN-t, küld egy ACK-ot


Oké, de milyen flag-eket használunk a TCP protokoll során? 

  • ACK (Acknowledgement) : nyugtázás
  • FIN (Finish) : "rendben megtörtént a kommunikáció" jelzése
  • PSH (Push) : ennek a flag-nek a beállításától függ, hogy a szegmenst gyorsabbban kell-e továbbítani
  • RST (Reset Connection) : a küldő törli az összeköttetést
  • SYN : szinkronizáció
  • URG (Urgent) : sürgős

A rövid, néhány soros elmélet után nézzük meg a különböző scan-nelési eljárásokat! Nem törekszünk a részletes elmélet ismertetésére, inkább a gyakorlati oldalról közelítjük meg.

A scannelés során tapasztalni fogjuk, hogy a következő állapotok lehetnek egy portnál. Kaphatunk "open"-t, "filtered", "open|filtered" portokat, illetve "closed"-et is, igaz, ez nem (mindig) kerül megjelenítésre.

A portscannelés során SYN=1-eket küldünk a célgép portjaira. Ha erre SYN=1, ACK=1 érkezik, akkor az adott port nyitott. Ha a válasz SYN=1, RST=1, akkor az a port zárt állapotban van. Ha a válasz ICMP, akkor az "filtered" lesz. 

Először scanneljük a nmap tesztoldalát (scanme.nmap.org), de előtte olvassuk el a használati feltételeket! Ha nem állítunk be scanmódot, akkor az "-sS" kerül felhasználásra, azaz a Stealth módot alkalmazzuk (3. ábra).

kep
3. ábra   A default (-sS) scan alkalmazása
 

Végezzünk el az nmap tesztoldalán egy újabb kisérletet úgy, hogy megadjuk a "-sS" kapcsolót is az nmap-os lekérésünknél. Látjuk, hogy az előző scannelési eredményt kapjuk (4. ábra).

kep
4. ábra   Az nmap futtatásánal beállítottuk a Stealth módot
 

Ez a scannelési eljárás nagyon elterjedt (ez a default is, nem véletlenül), mert gyors, illetve rejtett, mert a teljes TCP kapcsolat soha nem épül fel.

Ebben a módban (stealth scan) a portscanner véletlenszerűen választja ki a lekérdezendő portokat, és egyéb jelzőflag-eket is állítanak, hogy a portscannelés detektálását megnehezítsék.

A tesztelő küld egy SYN-t (és persze egy portszámot is) a célgép felé, ha erre a SYN-re a tesztelendő gép egy SYNACK-kel válaszol, akkor kiépülhet(ne) a  TCP kapcsolat, mert a tesztelendő gépen az adott port nyitott. Ha a SYN kérésre a tesztelendő gép egy RST-t küld vissza, akkor az adott port "closed" állapotban van.

A teljes TCP kapcsolat soha nem épül fel. Elküldjük a SYN-t, és várakozunk, hogy a szerver SYNACK-et vagy RST küldjön. Ha nem jön válasz, akkor ez a SYN küldés (és várakozás) megismétlődik. Ha több ilyen kérésre sem érkezik SYNACK vagy RST válasz, akkor az adott port "filtered"-ként kerül majd megjelenítésre.

Nézzük meg a következő lehetőséget, a "TCP Connect Scan"-t, amelynek a használatához a "-sT" kapcsolót kell alkalmaznunk. Ez a háromlépcsős kézfogást alkalmazza. Ennél a megoldásnál az nmap nem a "saját" csomagjait alkalmazza, hanem az operációs rendszer meghívja a connect()-et, amely a kapcsolat  felépítését fogja elvégezni. Tehát nem az nmap fogja (közvetlenül) a scan-nelést elvégezni, hanem a connect(). Nagyon megbízható, ennek a megoldásnak az eredményét látjuk az 5. ábrán. Ennél a scannelésnél kiépül a teljes TCP kapcsolat, ellentétben az előző lehetőséggel, ahol a kapcsolat csak "félig" épül fel.

kep
5. ábra   Az "-sT" kapcsoló használatának eredménye
 

Nem csak a TCP protokoll alkalmazható a hálózat szkennelésére, hanem az UDP is, amely nem kapcsolatalapú. Ehhez a -sU kapcsolót kell alkalmaznunk a kérés elindításához (6. ábra).

kep
6. ábra   UDP használata az nmap alkalmazásánál
 

A portok scannelését általában TCP protokollal oldják meg, mert a nyitott portok könnyebben megtalálhatók, az UDP protokoll erre a feladatra kevésbé hatékony. Ezt a scannelési megoldást szokták ötvözni a TCP-s megoldással.

A "-sF" kapcsoló alkalmazásával egy FIN flag-gel rendelkező csomagot küldünk. A nyitott portok nem küldenek erre választ, a zárt portok pedig RST-t küldenek válaszul (7. ábra). Előfordulhat az, hogy noha a tűzfal megfogja a SYN-t, de a FIN-t átengedi.

kep
7. ábra   Az "-sF" alkalmazása
 

A következő ábrán találjuk az "-sN" kapcsoló alkalmazásának az eredményét. Ezzel a kapcsolónak a használatával  NULL scan-t végzünk el a tesztelendő hálózaton. "NULL"-t alkalmazva nem állítunk be flag-eket a scannelés során (8. ábra).

kep
8. ábra   NULL scan futtatásának eredménye
 

Ha azt szeretnénk, hogy a scannelés során az FIN, PSH, URG flag-ek kerüljenek felhasználásra, akkor az "-sX" kapcsolót kell alkalmaznunk. Ezt a megoldást "Xmas"-nak is nevezik (9. ábra).

kep
9. ábra   Xmas scan alkalmazása
 

Az "-sA" beállítás segítségével a vizsgált számítógép előtt lévő tűzfalat tudjuk tesztelni, hiszen ennél a beállításnál mindig RST-t kapunk vissza. Itt például a rossz portbeállításokat tudunk tesztelni (10. ábra). Az nmap ACK-et küld a scannelés során.

kep
10. ábra   Az ACK scan alkalmazása