<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&aacute;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 &eacute;&eacute;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 
&quot;belangwekkende&quot; (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 &lt; 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
        &lt; 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
        &lt; 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 &lt; 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&lt;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 &lt;
        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 
&quot;aanvallende&quot; 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 &quot;S&quot; 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 &quot;R&quot; 
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 &quot;F&quot; 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 &lt; 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 &quot;F&quot; achter 864 in regel 1), die wordt 
beantwoordt met een RST-pakketje (zie de &quot;R&quot; 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 &gt;
          house2.tau.org.ar.pop3: F 0:0(0) win 2048<BR>
           4) 06:50:48.251147 192.168.255.20.35601 &gt;
          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] &amp; 7 != 0 and dst 192.168.255.20 ' &gt;/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] &amp; 1 != 0 and dst 192.168.255.20 ' &gt;/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] &amp; 2 != 0 and dst 192.168.255.20 ' &gt;/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: -->