Mise en garde : Le but de cette séance de TP est d'acquérir une connaissance élémentaire des différents types d'attaques qui peuvent menacer les réseaux et dont un administrateur réseau doit savoir se prémunir. Il ne s'agit pas d'une incitation à réaliser de telles attaques en dehors de ce cadre pédagogique contrôlé. Afin d'éviter toute utilisation malveillante, les techniques étudiées dans le détail correspondent à des attaques désuètes.

Préparation

Ce TP est réalisé entièrement sous Netkit dans un lab fourni sur la page Celene du cours : labexploit.tar.gz.

L'ensemble des manipulations est à réaliser à l'intérieur du lab, sauf mention explicite. Le lab permet d'interagir avec 3 hôtes :

  • alice est une gentille victime du réseau 10.0.0.0/8 qui fait tourner un système qui n'est pas à jour ;
  • bob est une autre gentille victime du réseau 192.168.0.0/24 ;
  • oscar est un utilisateur malveillant du réseau 10.0.0.0/8 bien décidé à attaquer les autres hôtes.

À l'aide de wireshark écouter le trafic réseau sur lana et lanb tout au long des manipulations.

1. Manipulation de paquets avec Scapy

Scapy est un outil interactif de manipulation de paquets écrit en Python. C'est un couteau suisse réseau qui permet d'écouter, de générer, de combiner, de disséquer, de filtrer des paquets réseau de couche 2 ou 3. Il est installé sur chacun des hôtes dans le répertoire scapy-2.2.0 et s'invoque à l'aide de la commande run_scapy qui s'y trouve (ignorer les INFO et WARNING au démarrage) :

oscar# scapy-2.2.0/run_scapy
>>> 

Il s'agit d'un interprète python muni de quelques commandes bien pratiques :

  • ls() sans paramètre liste les formats de paquets supportés, avec paramètre liste les champs d'un format de paquet ;
  • lsc() liste les commandes prédéfinies, la commande help() de python permet d'en savoir plus sur chacune ;
  • / permet d'encapsuler des paquets les uns dans les autres.

Ainsi, l'envoi d'un ping vers alice et l'affichage de la réponse s'écrit simplement :

>>> sr1(IP(dst="10.0.0.1")/ICMP()/"bonjour")

Scapy est un outil très pratique qui sera utilisé pour la plupart des manipulations qui suivent. Prendre le temps de le découvrir en lisant attentivement son Tutoriel interactif (prévoir 30mn à 1h). Pour réaliser des tests, on pourra utiliser comme cible alice d'IP 10.0.0.1 et sur laquelle un certain nombre de services sont disponibles :

  • echo port 7 en UDP et TCP ;
  • chargen port 19 en UDP et TCP ;
  • telnet port 23 en TCP ;
  • tftp port 69 en UDP.

2. Usurpation : ARP poisoning

Une attaque d'empoisonnement du cache ARP permet à un adversaire d'usurper l'identité d'un hôte (souvent un routeur) afin de pouvoir écouter et répondre/altérer le trafic en provenance d'une victime.

Pour illustrer ce principe, oscar va empoisonner alice en se faisant passer pour sa passerelle 10.255.255.254 en envoyant toutes les secondes un paquet ARP forgé. On pourra utiliser les éléments Scapy suivants :

>>> help(sendp)
>>> help(getmacbyip)
>>> ls(Ether)
>>> ls(ARP)

À l'aide de Wireshark, observer le trafic avec et sans empoisonnement lorsque alice se connecte au service UDP echo de bob.

alice# nc -u bob echo
Bonjour bob!

À quoi une telle attaque peut-elle bien servir ? Cette usurpation passe-t-elle complètement inaperçue ? Comment se défendre contre une telle attaque ?

3. Déni de service : UDP Chargen

Les attaques par déni de services ont pour objectif de rendre inaccessible un service réseau, la plupart du temps en saturant une ou plusieurs ressources de la victime ou de son réseau. Une manière de procéder est de d'inonder la victime de paquets IP. L'attaque UDP Chargen repose sur un service de test qui était assez répandu par le passé : Character Generator Protocol (aujourd'hui ce service est désactivé par défaut sur la plupart des hôtes), il est aussi possible de déployer une attaque similaire en utilisant Echo Protocol.

Le principe de l'attaque est d'identifier, en plus de la victime, une ou plusieurs machines qui déploient elles aussi l'un des protocoles chargen ou echo. On forge alors un datagramme UDP qui circule entre les deux hôtes visés en utilisant ces services UDP comme source et destination. S'en suit une boucle qui génère périodiquement des paquets. En multipliant ce type de datagramme forgé, la pile réseau de la victime est saturée.

Dans un premier temps, utiliser Scapy pour effectuer une requête classique vers les services chargen puis echo de la machine alice et écouter l'échange à l'aide de Wireshark. On pourra utiliesr les éléments Scapy suivants :

>>> help(send)
>>> ls(IP)
>>> ls(UDP)

Générer ensuite une boucle d'échanges en forgeant un datagramme entre les services echo d'alice et de bob. Observer les résultat avec Wireshark. Pour arrêter la boucle on pourra stopper le service avec

bob# /etc/init.d/inetd stop

et le redémarrer avec

bob# /etc/init.d/inetd start

À quoi une telle attaque peut-elle bien servir ? Cette usurpation passe-t-elle complètement inaperçue ? Comment se défendre contre une telle attaque ?

4. Déni de service : smurf

Les attaques par déni de services par réflexion utilisent un ou plusieurs services sur des machines tiers pour amplifier les messages envoyés, augmentant leur nombre et/ou leur taille, de sorte que la victime croule sous la quantité de paquets reçus. L'attaque historique Smurf repose sur deux réglages qui étaient classiques et ont aujourd'hui disparu :

  • auparavant les routeurs retransmettaient les messages de broadcast ciblés ;
  • auparavant les hôtes avaient tendance à répondre aux ping envoyés en broadcast.

Dans le lab, le réseau 192.168.42.0/24 est configuré pour vérifier ces hypothèses.

À l'aide de Scapy, amplifier un unique message à destination de ce réseau pour engendrer un nombre important de messages à destination d'alice. Observer le résultat avec Wireshark.

À quoi une telle attaque peut-elle bien servir ? Cette usurpation passe-t-elle complètement inaperçue ? Comment se défendre contre une telle attaque ?

Consulter la configuration de la machine rt du lab (fichier rt.startup). Il y a là une astuce grossière, la comprendre et l'expliquer.

5. Déni de service : SYN flood

L'attaque par déni de service SYN flood vise à consommer les ressources TCP d'une victime pour rendre indisponible un service. Pour cela, des poignées de main TCP sont initiées sans jamais être terminées, saturant la pile réseau de la victime.

Un serveur telnet est disponible en TCP sur le port standard de la machine alice. Se connecter à ce service depuis bob et observer les échanges dans Wireshark, identifier la poignée de main TCP.

bob# telnet alice
login: guest
Password: 

À l'aide de Scapy, effectuer une attaque SYN flood sur le port 23 d'alice et vérifier qu'alors bob ne peut plus se connecter au service. Penser à utiliser une adresse IP source inexistante pour éviter que la poignée de main se termine et des ports sources différents pour chaque message.

À quoi une telle attaque peut-elle bien servir ? Cette usurpation passe-t-elle complètement inaperçue ? Comment se défendre contre une telle attaque ?

6. Prise de contrôle par dépassement de tampon

Une escalade de privilèges consiste à détourner un processus qui s'exécute avec des droits plus élevés que les siens de son comportement normal. Historiquement les attaques par dépassement de tampon sur des processus root ou sur des appels systèmes constituent l'essentiel de ces attaques. Il s'agit de réussir à écrire dans la pile pour écraser l'adresse de retour de la fonction en cours d'exécution et provoquer une indirection vers le code de son choix, par exemple un shellcode situé sur la pile. Face à cette attaque classique, les systèmes d'exploitation modernes tendent à mettre en œuvre des mécanismes de protection. Pour le bon déroulement de cet exercice, ces mécanismes sont désactivés sur oscar.

Lire et comprendre le principe du dépassement de tampon puis consulter le fichier source hello.c et identifier le problème que pose l'utilisation de la variable buf.

Exécuter le programme hello et provoquer une erreur d'exécution de type Segmentation fault. Que se passe-t-il ?

Le script exhello.py permet de construire un contenu de pile intéressant pour hello. Il attend en argument une adresse qui sera utilisée pour écraser l'adresse de retour. Par exemple en utilisant l'adresse de la fonction hello :

oscar# ./exhello.py 0x8048254 | ./hello

Qu'observe-t-on ? Pourquoi ?

Le script exhello.py ajoute au début de buf un shellcode (comme on en trouve de nombreux sur le web, par exemple dans la Shellcodes database). Combiner les commandes exhello.py, hello et cat de telle sorte qu'il soit possible d'exécuter n'importe quelle commande shell à travers le processus hello.

Que se passe-t-il ? Pourquoi ?

À quoi une telle attaque peut-elle bien servir ? Cette usurpation passe-t-elle complètement inaperçue ? Comment se défendre contre une telle attaque ?

7. Prise de contrôle : telnetd remote exploit

La prise de contrôle totale à distance d'une machine nécessite la conjonction de plusieurs facteurs : un service accessible à distance, qui possède une faille exploitable et qui s'exécute avec des privilèges élevés. C'est généralement le cas des services de connexion à distance comme telnet ou ssh. Ainsi en décembre 2011, une faille exploitable de certains démons telnetd a été rendue publique : CVE-2011-4862. Des exploits permettant d'exploiter cette faille ont été publiés, par exemple telnetd-encrypt_keyid.c. Bien entendu, tous les systèmes d'exploitation sérieux ont aussitôt corrigé le bug et proposé des mises à jour. La machine alice a volontairement été équipée d'une version de telnetd dans laquelle cette faille est encore présente.

L'exploit ci-dessus a été installé sur oscar et adapté à l'environnement du TP. Vérifier qu'il est effectivement possible d'obtenir sur oscar un shell root sur la machine alice sans connaître le mot de passe du super-utilisateur d'alice :

oscar# ./paf 10.0.0.1 23 3

Étudier à l'aide de Wireshark les messages échangés. Le protocole telnet est décrit dans de nombreuses RFC, les deux suivantes peuvent être utiles pour comprendre ce qui se passe lors de cette attaque : RFC854 et RFC2946.

À l'aide des observations, de la documentation fournie par CVE-2011-4862 et du code source paf.c de l'exploit, expliquer dans le détail comment fonctionne l'attaque.

Pour ne pas être vulnérable trop longtemps à ce genre d'attaque il est important de mettre régulièrement à jour les systèmes, de s'abonner à une liste d'alerte et d'éviter de déployer des services non sûrs avec des droits élevés !

8. Usurpation : TCP Hijacking

La commande telnet fait circuler en clair le texte de ses messages. Elle n'est protégée ni contre la lecture ni contre une modification du contenu des échanges par un adversaire malveillant. Attention, même déployée sur un réseau local elle peut être détournée par un adversaire présent sur le LAN. C'est pourquoi on lui préfère généralement une solution comme ssh.

Après s'être rafraichie la mémoire sur le principe de fonctionnement du protcole TCP, réaliser une attaque de type TCP Hijacking en utilisant une connexion telnet existante entre alice et bob pour faire exécuter à alice une commande shell choisie par oscar.

On pourra pour les besoins de l'exercice ajouter une autre machine virtuelle au lab sur le réseau lana pour écouter le trafic pendant qu'oscar utilise Scapy pour forger son message.

Expliquer comment cette attaque se combine avec une attaque de type ARP poisoning pour éviter quelques désagréments.

À quoi une telle attaque peut-elle bien servir ? Cette usurpation passe-t-elle complètement inaperçue ? Comment se défendre contre une telle attaque ?

9. Usurpation avancée : Man in the Middle

Une usurpation de type Man in the Middle consiste pour un adversaire à s'insérer entre deux hôtes en leur faisant penser qu'ils communiquent directement. Des outils de type ssh permettent de déjouer de telles attaques... en principe. Lire les documents suivants pour voir comment un bug permet parfois une telle attaque :

À quoi une telle attaque peut-elle bien servir ? Cette usurpation passe-t-elle complètement inaperçue ? Comment se défendre contre une telle attaque ?

10. Déni de service avancé : DNS, SNMP, NTP reflection DDOS

Les attaques modernes de grande ampleur de type déni de service utilisent généralement des réflecteurs et atteignent des débits très élevés de l'ordre de plusieurs centaines de gigaoctets par seconde. Pour en savoir d'avantage, lire :

Dernière modification le 17 March 2016