<p class="spip">Les différents systèmes d’exploitation ont des caractèristiques particulières. La reconnaissance d’un système d’exploitation passe par la récolte d’information qui va nous permettre de déterminer le système d’exploitation distant.</p>

<p class="spip">Dans la suite nous utiliseront deux machines (il est obligatoire d’avoir deux machines) :</p>

<p class="spip">la première machine :
<br /></p>
<li> ip : 192.168.12.1
<br /><li> mac : 00:10:AA:1B:CB:AA
<p class="spip">la deuxième machine :
<br /></p>
<li> ip : 192.168.12.2
<br /><li> mac : 00:06:25:AA:57:3A
<br /><li> port : 22
<br /><li> noyau : 2.4.24
<p class="spip">Il n’y a aucun firewall sur aucune des machines.</p>

<p class="spip"><strong class="spip"> <i class="spip">Les services</i> </strong></p>

<p class="spip">Pour lister les services de la machine distante nous allons utiliser nmap [<a href="#nb1" name="nh1" id="nh1" class="spip_note" title='[1] http://www.insecure.org/nmap/' >1</a>] :</p>

<p class="spip"><code class='spip_code' dir='ltr'># nmap -sV 192.168.12.2</code></p>

<p class="spip">Nous auront par exemple :</p>

<p class="spip">80/tcp open  http    Apache httpd 2.0.50 ((YDL))</p>

<p class="spip">Nous savons alors que c’est une yellow dog ;)</p>

<p class="spip">Certains services sont plus courant sur un système ou un autre (par exemple netbios est courant sous windows et moins sous unix).</p>

<p class="spip">Pour se protéger, il faut limiter le nombre de service sur les machines. De plus, il est possible bien souvent de retirer les bannières des services.</p>

<p class="spip"><strong class="spip"> <i class="spip">Les implémentations réseaux</i> </strong></p>

<p class="spip">Il y a des différences dans les implémentations réseaux. Nous allons voir trois outils qui utilise cette technique :</p>

<li> nmap :
<p class="spip">Nmap est une boite à outil du scan. Il se sert principalement des paquets TCP (souvent mal formaté) pour déterminer une empreinte d’un système.</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code># nmap -O 192.168.12.2 -p 22 -sS<br />
[...]<br />
Running: Linux 2.4.X|2.5.X<br />
OS details: Linux 2.4.0 - 2.5.20<br />
Uptime 12.063 days (since Wed Jan 26 22:15:44 2005)<br />
</code></div>
<li> Xprobe2 [<a href="#nb2" name="nh2" id="nh2" class="spip_note" title='[2] http://xprobe.sourceforge.net/' >2</a>]
<p class="spip">Xprobe2 travaille surtout au niveau ICMP</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code># xprobe2 -p tcp:22:open 192.168.12.2<br />
[...]<br />
[+] Host 192.168.12.2 Running OS: "Linux Kernel 2.6.3" (Guess probability: 100%)[+] Other guesses:<br />
[+] Host 192.168.12.2 Running OS: "Linux Kernel 2.6.2" (Guess probability: 100%)[+] Host 192.168.12.2 Running OS: "Linux Kernel 2.6.7" (Guess probability: 100%)[+] Host 192.168.12.2 Running OS: "Linux Kernel 2.6.6" (Guess probability: 100%)[+] Host 192.168.12.2 Running OS: "Linux Kernel 2.6.5" (Guess probability: 100%)[+] Host 192.168.12.2 Running OS: "Linux Kernel 2.6.4" (Guess probability: 100%)[+] Host 192.168.12.2 Running OS: "Linux Kernel 2.6.1" (Guess probability: 100%)[+] Host 192.168.12.2 Running OS: "Linux Kernel 2.6.0" (Guess probability: 100%)[+] Host 192.168.12.2 Running OS: "Linux Kernel 2.4.28" (Guess probability: 100%)<br />
[+] Host 192.168.12.2 Running OS: "Linux Kernel 2.4.27" (Guess probability: 100%)<br />
</code></div>
<p class="spip">- p0f [<a href="#nb3" name="nh3" id="nh3" class="spip_note" title='[3] http://lcamtuf.coredump.cx/p0f.shtml' >3</a>]</p>

<p class="spip">Contrairement à nmap et Xprobe2 p0f ne se connecte à un serveur distant. Il attent qu’on se connecte à lui.</p>

<p class="spip"><code class='spip_code' dir='ltr'># p0f</code></p>

<p class="spip">Sur l’autre machine :</p>

<p class="spip"><code class='spip_code' dir='ltr'># ssh 192.168.12.2</code></p>

<p class="spip">Résultat :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>192.168.0.2:1456 - Linux 2.4/2.6 <= 2.6.7 (up: 333 hrs)<br />
  -> 192.168.0.25:80 (distance 0, link: ethernet/modem)<br />
</code></div>
<p class="spip"><strong class="spip"> <i class="spip">Exemple de particularité lié au système d’exploitation : le RTO</i> </strong></p>

<p class="spip">Nous allons étudier le fonctionnement des sessions TCP.
Pour établir une session, il faut procéder à trois étapes.</p>

<p class="spip">La machine voulant établir une connexion envoi un paquet SYN avec un numéro de séquence. La machine distante répond par un paquet avec l’option ACK et le numéro de séquence + 1. Dans le même paquet, la machine distance demande si la machine est prête à ouvrir la session avec avec l’option SYN et un numéro de séquence. Enfin la première machine répond avec un paquet ACK avec les deux numéros de séquence + 1.</p>

<p class="spip"><span class='spip_document_103 spip_documents spip_documents_center' >
<img src='http://download.tuxfamily.org/assocoagul/drupal-files/spip/tcp.png' width="489" height="266" alt="ouverture de session TCP" title="ouverture de session TCP" /></span><p>

<p class="spip">Suite à ce processus, comportant trois échanges, les deux machines sont synchronisées et la communication peut commencer.</p>

<p class="spip">Le but du RTO (retransmission timeout) est d’envoyer un paquet SYN et de ne jamais renvoyer la réponse ACK. Suivant les systèmes d’exploitation, le comportement est différent.</p>

<p class="spip">Voyons en pratique ce que cela donne :
Nous envoyons un paquet (-c 1) de type SYN (-S) avec l’adresse source mystifié de 192.168.12.3 (machine qui n’existe pas) sur le port ouvert 22 :</p>

<p class="spip"><code class='spip_code' dir='ltr'># hping2 -S -a 192.168.12.3 192.168.12.2 -p 22 -I eth0 -c 1</code></p>

<p class="spip">Linux envoi une requête ARP pour connaître l’adresse MAC de la machine 192.168.12.3. Il nous faut mystifier une réponse ARP (voir <a href="http://www.coagul.org/article.php3?id_article=208" class="spip_out">Jouons avec ARP</a>) :</p>

<p class="spip"><code class='spip_code' dir='ltr'>./send_arp 192.168.12.3 00:09:5B:B2:2D:78 192.168.12.2 00:10:A7:1B:CB:AD</code></p>

<p class="spip">Sous linux nous remarquons qu’il envoi 6 paquets avec un intervalle de plus en plus loin. Sous freeBSD 4.8 il n’y aurait eu que 4 paquets à intervalle régulier. N’ayant pas de RFC décrivant explicitant la marche à suivre, chaque système à une implémentation de façon différente.</p>

<p class="spip"><strong class="spip"> <i class="spip">Contrer les détections</i> </strong></p>

<p class="spip">Il n’y a pas de technique sûr pour contrer ce genre d’attaque. Nous pouvons jouer sur les options réseaux pour tromper les tests.</p>

<p class="spip">Dans un premier test, nous allons limiter les réponses aux paquets mal-formatés.</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>iptables -F<br />
iptables -P INPUT DROP<br />
iptables -P OUTPUT ACCEPT<br />
iptables -P FORWARD ACCEPT<br />
 <br />
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT<br />
iptables -A INPUT -p tcp -m state --state NEW --tcp-flags ALL SYN -j ACCEPT<br />
 <br />
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT<br />
</code></div>
<p class="spip">Avec nmap (en ajoutant l’option -vv), nous voyons qu’il se trompe. En effet, seuls deux des sept tests fonctionnent.</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>Device type: general purpose|media device<br />
Running: Linux 2.4.X|2.6.X, Pace embedded<br />
OS details: Linux 2.4.21 (Suse, X86), Linux 2.4.6 - 2.4.21, Linux 2.6.8 (Debian), Pace digital cable TV receiver<br />
OS Fingerprint:<br />
TSeq(Class=RI%gcd=1%SI=328779%IPID=Z%TS=100HZ)<br />
T1(Resp=Y%DF=Y%W=16A0%ACK=S++%Flags=AS%Ops=MNNTNW)<br />
T2(Resp=N)<br />
T3(Resp=N)<br />
T4(Resp=N)<br />
T5(Resp=Y%DF=Y%W=0%ACK=S++%Flags=AR%Ops=)<br />
T6(Resp=N)<br />
T7(Resp=N)<br />
PU(Resp=N)<br />
</code></div>
<p class="spip">xprobe2 et p0f sont moins précis.</p>

<p class="spip">Nous allons changer quelques options de la couche TCP pour essayer de tromper les outils :</p>

<p class="spip">D’abord, nous allons augmenter la valeur de ttl (ttl représente le TimeToLive ou la durée de vie du paquet). De 64, nous passons à 128 :</p>

<p class="spip"><code class='spip_code' dir='ltr'>echo 128 > /proc/sys/net/ipv4/ip_default_ttl</code></p>

<p class="spip">Enfin nous allons désactiver deux options TCP :</p>

<div style='text-align: left;' class='spip_code' dir='ltr'><code>echo 0 > /proc/sys/net/ipv4/tcp_window_scaling<br />
echo 0 > /proc/sys/net/ipv4/tcp_timestamps</code></div>
<p class="spip">p0f et xprobe2 seront ainsi trompé.
Attention, changer les options de la couche TCP peut avoir des conséquence sur les performances réseaux.</p>