Skip to Content

De la reconnaissance de système d’exploitation à distance au camouflage

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.

Dans la suite nous utiliseront deux machines (il est obligatoire d’avoir deux machines) :

la première machine :

  •  ip : 192.168.12.1
  •  mac : 00:10:AA:1B:CB:AA

    la deuxième machine :

  •  ip : 192.168.12.2
  •  mac : 00:06:25:AA:57:3A
  •  port : 22
  •  noyau : 2.4.24

    Il n’y a aucun firewall sur aucune des machines.

    Les services

    Pour lister les services de la machine distante nous allons utiliser nmap [1] :

    # nmap -sV 192.168.12.2

    Nous auront par exemple :

    80/tcp open http Apache httpd 2.0.50 ((YDL))

    Nous savons alors que c’est une yellow dog ;)

    Certains services sont plus courant sur un système ou un autre (par exemple netbios est courant sous windows et moins sous unix).

    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.

    Les implémentations réseaux

    Il y a des différences dans les implémentations réseaux. Nous allons voir trois outils qui utilise cette technique :

  •  nmap :

    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.

    # nmap -O 192.168.12.2 -p 22 -sS
    [...]
    Running: Linux 2.4.X|2.5.X
    OS details: Linux 2.4.0 - 2.5.20
    Uptime 12.063 days (since Wed Jan 26 22:15:44 2005)
  •  Xprobe2 [2]

    Xprobe2 travaille surtout au niveau ICMP

    # xprobe2 -p tcp:22:open 192.168.12.2
    [...]
    [+] Host 192.168.12.2 Running OS: "Linux Kernel 2.6.3" (Guess probability: 100%)[+] Other guesses:
    [+] 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%)
    [+] Host 192.168.12.2 Running OS: "Linux Kernel 2.4.27" (Guess probability: 100%)

    - p0f [3]

    Contrairement à nmap et Xprobe2 p0f ne se connecte à un serveur distant. Il attent qu’on se connecte à lui.

    # p0f

    Sur l’autre machine :

    # ssh 192.168.12.2

    Résultat :

    192.168.0.2:1456 - Linux 2.4/2.6 <= 2.6.7 (up: 333 hrs)
     -> 192.168.0.25:80 (distance 0, link: ethernet/modem)

    Exemple de particularité lié au système d’exploitation : le RTO

    Nous allons étudier le fonctionnement des sessions TCP.
    Pour établir une session, il faut procéder à trois étapes.

    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.


    ouverture de session TCP

    Suite à ce processus, comportant trois échanges, les deux machines sont synchronisées et la communication peut commencer.

    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.

    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 :

    # hping2 -S -a 192.168.12.3 192.168.12.2 -p 22 -I eth0 -c 1

    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 Jouons avec ARP) :

    ./send_arp 192.168.12.3 00:09:5B:B2:2D:78 192.168.12.2 00:10:A7:1B:CB:AD

    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.

    Contrer les détections

    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.

    Dans un premier test, nous allons limiter les réponses aux paquets mal-formatés.

    iptables -F
    iptables -P INPUT DROP
    iptables -P OUTPUT ACCEPT
    iptables -P FORWARD ACCEPT

    iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    iptables -A INPUT -p tcp -m state --state NEW --tcp-flags ALL SYN -j ACCEPT

    iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

    Avec nmap (en ajoutant l’option -vv), nous voyons qu’il se trompe. En effet, seuls deux des sept tests fonctionnent.

    Device type: general purpose|media device
    Running: Linux 2.4.X|2.6.X, Pace embedded
    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
    OS Fingerprint:
    TSeq(Class=RI%gcd=1%SI=328779%IPID=Z%TS=100HZ)
    T1(Resp=Y%DF=Y%W=16A0%ACK=S++%Flags=AS%Ops=MNNTNW)
    T2(Resp=N)
    T3(Resp=N)
    T4(Resp=N)
    T5(Resp=Y%DF=Y%W=0%ACK=S++%Flags=AR%Ops=)
    T6(Resp=N)
    T7(Resp=N)
    PU(Resp=N)

    xprobe2 et p0f sont moins précis.

    Nous allons changer quelques options de la couche TCP pour essayer de tromper les outils :

    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 :

    echo 128 > /proc/sys/net/ipv4/ip_default_ttl

    Enfin nous allons désactiver deux options TCP :

    echo 0 > /proc/sys/net/ipv4/tcp_window_scaling
    echo 0 > /proc/sys/net/ipv4/tcp_timestamps

    p0f et xprobe2 seront ainsi trompé.
    Attention, changer les options de la couche TCP peut avoir des conséquence sur les performances réseaux.

  • Fichier attachéTaille
    ouverture de session TCP15.98 Ko

    Commentaires

    > De la reconnaissance de système d’exploitation à distance au c

    Test de réponse suite au problème de Gnunux

    > De la reconnaissance de système d’exploitation à distance au c

    Quelques remarques :

  •  A quoi correspond le port 22 que tu indiques pour la deuxième machine
  •  Pour info, j’ai dû installer nmap (apt-get install nmap) et Xprobe2 (apt-get install xprobe2)
  •  Concernant p0F, que j’ai dû installer également (apt-get install p0f), Il serait peut-être mieux de prendre comme exemple la commande ssh que tout le monde connaît plutôt que links (Ou alors expliquer c’est quoi links)
    Pour la suite du document, j’ai décroché ;-)

    Au risque de me répéter, merci pour ton document