Aan de slag met nmap

ArticleCategory:

System Administration

AuthorImage:

[Photo of the Author]

TranslationInfo:

original in es Danilo Lujambio

es to en Iván Rojas Aguilar

es to en Javier Palacios

en to en Lorne Bailey

en to nl Tom Uijldert

AboutTheAuthor:

Abstract:

ArticleIllustration:

[Illustratie]

ArticleBody:

Introductie

Waarom zijn snuffelaars (scanners) zo belangrijk voor de beveiliging van een systeem? Vooral omdat dit belangrijke hulpmiddelen zijn voor diegene die een systeem willen binnendringen. De voorbereidingen van een aanval door een cracker kunnen er als volgt uitzien. Het is voor een systeembeheerder met enig gevoel voor beveiliging van essentieel belang dat hij dit aftasten op zwakke plekken zelf doet, voordat een ander met minder goede bedoelingen dat voor hem doet.

Voor dit doel zijn er meerdere scanners te verkrijgen maar dit artikel gaat alleen in op nmap. nmap is één van de meest complete in dit genre.

nmap stelt de systeembeheerder in staat zijn netwerken af te tasten om te kunnen zien welke servers er draaien en welke diensten deze aanbieden. Hiervoor heeft nmap een aantal technieken in huis. Dit artikel zal op een aantal daarvan dieper ingaan waarmee tegelijk aspecten van het TCP protocol, hopelijk op een leerzame manier, worden behandeld.

De aanpak in dit artikel zal eruit bestaan dat het normale gebruik van nmap wordt getoond om zo meer informatie over een systeem te verkrijgen. Tegelijkertijd zal het laten zien wat voor sporen dit aftasten achterlaat op de machine die wordt onderzocht.

nmap kun je ophalen bij www.insecure.org. Geef hierna de volgende commando's om het geheel te installeren:

$ tar zxvf nmap-2.30BETA17.tgz
$ cd ....../nmap-2.30BETA17/
$ ./configure
$ make
$ make install
De uitvoer van nmap bestaat meestal uit een lijst van "belangwekkende" (actieve) poorten op de machine die is besnuffeld. Deze geven je de naam van de dienst, de status en het gebruikte protocol.

Aftasten met TCP, het drievoudig connectie maken met TCP (optie -sT)

De simpelste vorm van aftasten kan met de optie -sT en is gebaseerd op de manier waarop connecties worden gemaakt met TCP. De stappen [1] worden hieronder (ruwweg) beschreven:
  1. De server moet klaar zijn (en bereid) voor het opzetten van een connectie (meestal via de functies socket(), bind() en listen()).
  2. De client probeert nu een connectie tot stand te brengen via de connect()-functie. Hiermee wordt een SYN segment naar de server gestuurd met daarin het initial sequence number dat de client zal gebruiken voor het versturen van data over de connectie. Deze SYN bevat meestal IP-informatie, TCP-informatie en mogelijk nog andere TCP-opties.
  3. De server moet dit beantwoorden met een ACK en een SYN met daarin zijn sequence number (in hetzelfde TCP- pakketje).
  4. De client moet hier vervolgens weer met een ACK op reageren.
Deze methode van snuffelen heeft twee voordelen: Het heeft echter ook een groot nadeel. Het is eenvoudig te detecteren en gemakkelijk om uit te filteren.

We zullen eens gaan kijken naar het resultaat wanneer we nmap laten draaien met de optie -sT, waarbij op de te besnuffelen machine tcpdump draait. nmap draait op machine 192.168.255.20 en onderzoekt machine house2.xxx.xxx.xxx via Ethernet.
1) 08:24:18.393108 192.168.255.20.1024 house2.xxx.xxx.xxx.653: S 2632227152:2632227152(0) win 16060 < mss 1460,sackOK,timestamp 232602[|tcp] (DF)
2) 08:24:18.393167 house2.xxx.xxx.xxx.653 192.168.255.20.1024: R 0:0(0) ack 2632227153 win 0
3) 08:24:18.393227 192.168.255.20.1025 house2.xxx.xxx.xxx.6141: S 2644226118:2644226118(0) win 16060 < mss 1460,sackOK,timestamp 232602[|tcp] (DF)
4) 08:24:18.393258 house2.xxx.xxx.xxx.6141 192.168.255.20.1025: R 0:0(0) ack 2644226119 win 0
5) 08:24:18.453343 192.168.255.20.1298 house2.xxx.xxx.xxx.pop3: S 2640612362:2640612362(0) win 16060 < mss 1460,sackOK,timestamp 232608[|tcp] (DF)
6) 08:24:18.453542 house2.xxx.xxx.xxx.pop3 192.168.255.20.1298: S 1658259980:1658259980(0) ack 2640612363 win 16060 < mss 1460,sackOK,timestamp 243353[|tcp] (DF)
7) 08:24:18.458667 192.168.255.20.1298 house2.xxx.xxx.xxx.pop3:. ack 1 win16060<nop,nop,timestamp 232609 243353 (DF)
8) 08:24:18.461280 192.168.255.20.1298 house2.xxx.xxx.xxx.pop3: F 1:1(0) ack 1 win 16060 < nop,nop,timestamp 232609 243353 (DF)
De regelnummers zijn er ter referentie aan toegevoegd. De eerste regel laat zien hoe de "aanvallende" machine, te weten 192.168.255.20, een SYN stuurt vanaf poort 1024 naar poort 653 op house2.xxx.xxx.xxx. De SYN kan men herkennen aan de "S" na het poortnummer (653). Dit is als beschreven in punt 2) van de uitleg over het leggen van een verbinding.
In de tweede regel zien we het antwoord in de vorm van een RESET (zie de "R" achter poort 1024) die aangeeft dat hier geen dienst op draait.
Regels 3 en 4 geven hetzelfde weer met dit verschil dat het nu om poort 6141 gaat.
Regel 5 laat een SYN zien naar de POP3-poort van de aangevallen machine (poort 110) en deze laat een ACK zien van het verzoek met daarin het sequence number. Merk op dat dit pakket bits SYN en ACK aan heeft staan. Dat kun je zien in regel 6 en rondt het leggen van de verbinding af (als uitgelegd in punt 3).
Regel 7 laat zien hoe machine 192.168.255.20 dit accepteert met een ACK, als beschreven in punt 4).
Regel 8 laat het sluiten van de verbinding zien met een FIN (let op de "F" na pop3).

Dit voorbeeld liet zien hoe nmap heeft gedetecteerd dat poort 110 (pop3) op machine house2 actief is.

Zoals reeds gezegd is een dergelijke snuffelactie gemakkelijk te detecteren door de log die is achtergelaten in bestand /var/log/messages (hoewel dit afhangt van de manier waarop syslog is ingesteld). Wat er gebeurt in regels 5 en 8 geeft de volgende uitvoer:

May 6 08:24:01 house2 in.pop3d[205]: connect from root@192.168.255.20

Aftasten met SYN (half open, optie -sS)

Dit kun je uitvoeren door nmap op te starten met de optie -sS. Deze techniek opent de verbinding slechts half door een SYN te sturen en, nadat een ACK is ontvangen, het geheel met een RESET onmiddellijk weer af te breken. Als we in plaats van een ACK een RST ontvangen dan is de poort (en dus ook de dienst) niet actief. Probleem hierbij is dat, om dit uit te voeren, je rechten nodig hebt van gebruiker root. Voordeel is hier dat het moeilijker te detecteren is op de aangevallen machine.

Laten we dit weer eens op dezelfde manier bekijken:

1) 22:25:45.856936 192.168.255.20.40175 house2.tau.org.ar.946: S 1292785825:1292785825(0) win 3072
2) 22:25:45.857078 house2.tau.org.ar.946 192.168.255.20.40175: R 0:0(0) ack 1292785826 win 0

Regels 1 en 2 lijken veel op die uit het vorige voorbeeld, alleen gaat het in dit geval om de niet- actieve poort 946.
3) 22:25:45.970365 192.168.255.20.40175 house2.tau.org.ar.pop3: S 1292785825:1292785825(0) win 3072
4) 22:25:45.976022 house2.tau.org.ar.pop3 192.168.255.20.40175: S 185944428:185944428(0) ack 1292785826 win 16080 < mss 536 (DF)
5) 22:25:45.979578 192.168.255.20.40175 house2.tau.org.ar.pop3: R 1292785826:1292785826(0) win 0
Regels 3, 4 en 5 laten wederom de ontdekking zien van activiteit op poort 110 (pop3). Zoals gezegd wordt hier de verbinding niet gelegd maar wordt onmiddellijk een RESET gestuurd op het moment dat de ACK wordt ontvangen.

Dit laat geen sporen achter in het bestand /var/log/messages, zoals in het vorige voorbeeld.

Aftasten met FIN

Deze vorm van aftasten is gebaseerd op het gegeven dat inactieve poorten reageren met een RST-pakketje op het ontvangen van een FIN-pakketje, terwijl actieve poorten dit pakket gewoon negeren. De lijst van belangwekkende poorten wordt nu dus gevormd door diegene die niet reageren. Dit gaat niet op voor machines waarop een Microsoft operating systeem draait daar deze een niet-standaard implementatie van het TCP-protocol hebben.

Er zijn drie varianten op deze vorm van aftasten: -sF, -sX en -sN. We zullen hier weer een voorbeeld analyseren met de optie -sF.

1) 06:50:45.643718 192.168.255.20.35600 casahouse.tau.org.ar.864: F 0:0(0) win 2048
2) 06:50:45.643865 house2.tau.org.ar.864 192.168.255.20.35600: R 0:0(0) ack 0 win 0

In regels 1 en 2 zien we de FIN (zie de "F" achter 864 in regel 1), die wordt beantwoordt met een RST-pakketje (zie de "R" in regel 2 na 35600). nmap trekt de conclusie dat de dienst op poort 864 op machine house2 niet actief is.

3) 06:50:47.933227 192.168.255.20.35600 > house2.tau.org.ar.pop3: F 0:0(0) win 2048
4) 06:50:48.251147 192.168.255.20.35601 > house2.tau.org.ar.pop3: F 0:0(0) win 2048

In regels 3 en 4 zien we de pop3-poort afgetast worden. Regel 3 laat de FIN zien, waarbij regel 4 een verrassing oplevert. Waarschijnlijk is dit een extra FIN van nmap om te controleren of er daadwerkelijk geen reactie is. In beide gevallen heeft house2 niet gereageerd, wat bij nmap tot de conclusie leidt dat de poort actief is.

Functionaliteit in tcpdump waar je wat aan hebt

In de paragraaf over het leggen van een verbinding zag je hoe dit aftasten sporen achter liet. In de daaropvolgende paragrafen werden met de opties -sS en -sF geen sporen nagelaten. We kunnen hier tcpdump inzetten voor het detecteren van dergelijk gesnuffel op de machine die wordt aangevallen. Het probleem met tcpdump is dat het een enorme hoeveelheid gegevens kan genereren waardoor je in de problemen kan komen met opslag en het analyseren van de gegevens. We zullen hier enkele expressies geven die als filters kunnen fungeren waardoor de hoeveelheid gegenereerde gegevens behapbaar blijft.

Om deze expressies te kunnen begrijpen laten we hier eerst het formaat van een TCP-pakketje zien [2].

TCP (RFC793)

0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Source Port          |        Destination Port       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         Sequence Number                       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      Acknowledgement Number                   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Offset |  Reserver |U|A|P|R|S|F|             Window            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           Checksum            |         Urgent Pointer        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                  Options                      |    Padding    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                              Data                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
We zien dat het 13de byte de vlaggen bevat die het type pakketje bepaalt (SYN, FIN etc.). Met deze kennis en het gebruik van de AND-operatie (&) kunnen we vervolgens bits maskeren en daarmee expressies opbouwen als:
$ tcpdump ' tcp[13] & 7 != 0 and dst 192.168.255.20 ' >/tmp/out7
Waardoor alleen nog pakketjes worden doorgelaten waarvan het R, S of F-bit actief is (het masker is hier 00000111) en die de machine 192.168.255.20 als bestemming hebben.

Met de volgende expressie:

$ tcpdump ' tcp[13] & 1 != 0 and dst 192.168.255.20 ' >/tmp/out1
detecteren we FIN-pakketten (het masker is 00000001). Dit kan handig zijn om te detecteren of nmap actief is met de optie -sF. En met:
$ tcpdump ' tcp[13] & 2 != 0 and dst 192.168.255.20 ' >/tmp/out2
krijgen we alleen pakketten met het SYN-bit actief, om zo te achterhalen of iemand met de optie - sS aan het snuffelen is.

Voor deze laatste variant (optie -sS) zijn er speciale detectieprogramma's verkrijgbaar [3].

Afronding

Programma's zoals nmap zijn nuttig voor het verhogen van de veiligheid van een systeem door naar netwerken te kijken door de ogen van een cracker. We hebben hier slechts een beperkt aantal van de mogelijkheden laten zien maar hopen dat je toch wat meer hebt geleerd over de principes van aftast-programmatuur.

Bibliografie

[1] W. Richard Stevens Unix Network Programming Volume 1
[2] RFC 793
[3] zie ook nmap documentatie