<HTML> <HEAD> <STYLE type="text/css"> <!-- pre { font-familiy:monospace,Courier } --> </STYLE> </HEAD> <BODY> <H1>Aan de slag met nmap</H1> <H4>ArticleCategory:</H4> System Administration <H4>AuthorImage:</H4> <IMG SRC="../../common/images/DaniloLujambio.gif" ALT="[Photo of the Author]" WIDTH=75 HEIGHT=98> <H4>TranslationInfo:</H4> <P>original in es <A href="mailto:danilo@tau.org.ar">Danilo Lujambio</A> <P>es to en <A href="mailto:iv_nr@hotmail.com">Iván Rojas Aguilar</A> <P>es to en <A href="mailto:javier.pb@linuxfocus.org">Javier Palacios</A> <P>en to en <A href="mailto:sherm_pbody@yahoo.com">Lorne Bailey</A> <P>en to nl <A HREF="mailto:tom.uijldert@linuxfocus.org">Tom Uijldert</A> <H4>AboutTheAuthor:</H4> <H4>Abstract:</H4> <H4>ArticleIllustration:</H4> <IMG SRC="../../common/images/article170/nmap.gif" ALT="[Illustratie]" HSPACE=10 WIDTH=400 HEIGHT=51> <H4>ArticleBody:</H4> <H2>Introductie</H2> Waarom zijn snuffelaars (<EM>scanners</EM>) 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 <EM>cracker</EM> kunnen er als volgt uitzien. <UL> <LI>Tast een aan te vallen machine of netwerk af en kijk welke diensten er draaien en op welke operating systemen. Ga vervolgens aan het werk met bekende zwakke plekken in de beveiliging van een gevonden dienst of operating systeem. <LI>Tast willekeurige netwerken en/of machines af op specifieke diensten of operating systemen met een bekende zwakke plek in de beveiliging. </UL> 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. <P> Voor dit doel zijn er meerdere scanners te verkrijgen maar dit artikel gaat alleen in op <SAMP>nmap</SAMP>. <SAMP>nmap</SAMP> is één van de meest complete in dit genre. <P> <SAMP>nmap</SAMP> 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 <SAMP>nmap</SAMP> 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. <P> De aanpak in dit artikel zal eruit bestaan dat het normale gebruik van <SAMP>nmap</SAMP> 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. <P> <SAMP>nmap</SAMP> kun je ophalen bij <A href="http://www.insecure.org/">www.insecure.org</A>. Geef hierna de volgende commando's om het geheel te installeren: <PRE> $ tar zxvf nmap-2.30BETA17.tgz $ cd ....../nmap-2.30BETA17/ $ ./configure $ make $ make install </PRE> De uitvoer van <SAMP>nmap</SAMP> 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. <H2>Aftasten met TCP, het drievoudig connectie maken met TCP (optie -sT)</H2> 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: <OL> <LI>De server moet klaar zijn (en bereid) voor het opzetten van een connectie (meestal via de functies <CODE>socket(), bind()</CODE> en <CODE>listen()</CODE>). <LI>De client probeert nu een connectie tot stand te brengen via de <CODE>connect()</CODE>-functie. Hiermee wordt een <CODE>SYN</CODE> segment naar de server gestuurd met daarin het <EM>initial sequence number</EM> dat de client zal gebruiken voor het versturen van data over de connectie. Deze <CODE>SYN</CODE> bevat meestal IP-informatie, TCP-informatie en mogelijk nog andere TCP-opties. <LI>De server moet dit beantwoorden met een <CODE>ACK</CODE> en een <CODE>SYN</CODE> met daarin zijn <EM>sequence number</EM> (in hetzelfde TCP- pakketje). <LI>De client moet hier vervolgens weer met een <CODE>ACK</CODE> op reageren. </OL> Deze methode van snuffelen heeft twee voordelen: <UL> <LI>Het is snel (<SAMP>nmap</SAMP> heeft zelfs nog extra opties om het nog sneller te maken over langzame verbindingen maar die zullen we hier niet behandelen). <LI>Men heeft geen speciale rechten nodig om dit te doen op de machine van waaruit men snuffelt. </UL> Het heeft echter ook een groot nadeel. Het is eenvoudig te detecteren en gemakkelijk om uit te filteren. <P> We zullen eens gaan kijken naar het resultaat wanneer we <SAMP>nmap</SAMP> laten draaien met de optie -sT, waarbij op de te besnuffelen machine <SAMP>tcpdump</SAMP> draait. <SAMP>nmap</SAMP> draait op machine <SAMP>192.168.255.20</SAMP> en onderzoekt machine <SAMP>house2.xxx.xxx.xxx</SAMP> via Ethernet. <TABLE> <TR> <TD bgcolor="#9999FF"><SMALL>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)<BR> 2) 08:24:18.393167 house2.xxx.xxx.xxx.653 192.168.255.20.1024: R 0:0(0) ack 2632227153 win 0<BR> 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)<BR> 4) 08:24:18.393258 house2.xxx.xxx.xxx.6141 192.168.255.20.1025: R 0:0(0) ack 2644226119 win 0<BR> 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)<BR> 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)<BR> 7) 08:24:18.458667 192.168.255.20.1298 house2.xxx.xxx.xxx.pop3:. ack 1 win16060<nop,nop,timestamp 232609 243353 (DF)<BR> 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)</SMALL> </TD> </TR> </TABLE> De regelnummers zijn er ter referentie aan toegevoegd. De eerste regel laat zien hoe de "aanvallende" machine, te weten <SAMP>192.168.255.20</SAMP>, een SYN stuurt vanaf poort 1024 naar poort 653 op <SAMP>house2.xxx.xxx.xxx</SAMP>. 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. <BR> 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. <BR> Regels 3 en 4 geven hetzelfde weer met dit verschil dat het nu om poort 6141 gaat. <BR> 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 <EM>sequence number</EM>. 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). <BR> Regel 7 laat zien hoe machine <SAMP>192.168.255.20</SAMP> dit accepteert met een ACK, als beschreven in punt 4). <BR> Regel 8 laat het sluiten van de verbinding zien met een FIN (let op de "F" na pop3). <P> Dit voorbeeld liet zien hoe <SAMP>nmap</SAMP> heeft gedetecteerd dat poort 110 (pop3) op machine <SAMP>house2</SAMP> actief is. <P> Zoals reeds gezegd is een dergelijke snuffelactie gemakkelijk te detecteren door de log die is achtergelaten in bestand <SAMP>/var/log/messages</SAMP> (hoewel dit afhangt van de manier waarop <SAMP>syslog</SAMP> is ingesteld). Wat er gebeurt in regels 5 en 8 geeft de volgende uitvoer: <PRE> May 6 08:24:01 house2 in.pop3d[205]: connect from root@192.168.255.20 </PRE> <H2>Aftasten met SYN (half open, optie -sS)</H2> Dit kun je uitvoeren door <SAMP>nmap</SAMP> 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 <EM>root</EM>. Voordeel is hier dat het moeilijker te detecteren is op de aangevallen machine. <P> Laten we dit weer eens op dezelfde manier bekijken: <TABLE> <TR> <TD bgcolor="#9999FF"> <P><SMALL>1) 22:25:45.856936 192.168.255.20.40175 house2.tau.org.ar.946: S 1292785825:1292785825(0) win 3072<BR> 2) 22:25:45.857078 house2.tau.org.ar.946 192.168.255.20.40175: R 0:0(0) ack 1292785826 win 0<BR> </SMALL></P> </TD> </TR> </TABLE> Regels 1 en 2 lijken veel op die uit het vorige voorbeeld, alleen gaat het in dit geval om de niet- actieve poort 946. <TABLE> <TR> <TD bgcolor="#9999FF"><SMALL>3) 22:25:45.970365 192.168.255.20.40175 house2.tau.org.ar.pop3: S 1292785825:1292785825(0) win 3072<BR> 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)<BR> 5) 22:25:45.979578 192.168.255.20.40175 house2.tau.org.ar.pop3: R 1292785826:1292785826(0) win 0<BR> </SMALL> </TD> </TR> </TABLE> 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. <P> Dit laat geen sporen achter in het bestand <SAMP>/var/log/messages</SAMP>, zoals in het vorige voorbeeld. <H2>Aftasten met FIN</H2> 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. <P> Er zijn drie varianten op deze vorm van aftasten: -sF, -sX en -sN. We zullen hier weer een voorbeeld analyseren met de optie -sF. <TABLE> <TR> <TD bgcolor="#9999FF"> <P><SMALL>1) 06:50:45.643718 192.168.255.20.35600 casahouse.tau.org.ar.864: F 0:0(0) win 2048<BR> 2) 06:50:45.643865 house2.tau.org.ar.864 192.168.255.20.35600: R 0:0(0) ack 0 win 0</SMALL></P> </TD> </TR> </TABLE> 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). <SAMP>nmap</SAMP> trekt de conclusie dat de dienst op poort 864 op machine <SAMP>house2</SAMP> niet actief is. <TABLE> <TR> <TD bgcolor="#9999FF"> <P><SMALL>3) 06:50:47.933227 192.168.255.20.35600 > house2.tau.org.ar.pop3: F 0:0(0) win 2048<BR> 4) 06:50:48.251147 192.168.255.20.35601 > house2.tau.org.ar.pop3: F 0:0(0) win 2048</SMALL></P> </TD> </TR> </TABLE> 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 <SAMP>nmap</SAMP> om te controleren of er daadwerkelijk geen reactie is. In beide gevallen heeft <SAMP>house2</SAMP> niet gereageerd, wat bij <SAMP>nmap</SAMP> tot de conclusie leidt dat de poort actief is. <H2>Functionaliteit in tcpdump waar je wat aan hebt</H2> 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 <SAMP>tcpdump</SAMP> inzetten voor het detecteren van dergelijk gesnuffel op de machine die wordt aangevallen. Het probleem met <SAMP>tcpdump</SAMP> 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. <P> Om deze expressies te kunnen begrijpen laten we hier eerst het formaat van een TCP-pakketje zien [2]. <H3>TCP (RFC793)</H3> <PRE> <FONT color= "#330000">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 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+</FONT> </PRE> 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: <PRE> $ tcpdump ' tcp[13] & 7 != 0 and dst 192.168.255.20 ' >/tmp/out7 </PRE> Waardoor alleen nog pakketjes worden doorgelaten waarvan het R, S of F-bit actief is (het masker is hier <SAMP>00000111</SAMP>) en die de machine <SAMP>192.168.255.20</SAMP> als bestemming hebben. <P> Met de volgende expressie: <PRE> $ tcpdump ' tcp[13] & 1 != 0 and dst 192.168.255.20 ' >/tmp/out1 </PRE> detecteren we FIN-pakketten (het masker is <SAMP>00000001</SAMP>). Dit kan handig zijn om te detecteren of <SAMP>nmap</SAMP> actief is met de optie -sF. En met: <PRE> $ tcpdump ' tcp[13] & 2 != 0 and dst 192.168.255.20 ' >/tmp/out2 </PRE> krijgen we alleen pakketten met het SYN-bit actief, om zo te achterhalen of iemand met de optie - sS aan het snuffelen is. <P> Voor deze laatste variant (optie -sS) zijn er speciale detectieprogramma's verkrijgbaar [3]. <H2>Afronding</H2> Programma's zoals <SAMP>nmap</SAMP> zijn nuttig voor het verhogen van de veiligheid van een systeem door naar netwerken te kijken door de ogen van een <EM>cracker</EM>. 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. <H2>Bibliografie</H2> [1] W. Richard Stevens Unix Network Programming Volume 1<BR> [2] RFC 793<BR> [3] zie ook <SAMP>nmap</SAMP> documentatie </BODY> </HTML> <!-- vim: set sw=2 ts=2 et tw=74: -->