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.
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.
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.
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 ?
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 ?
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 :
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.
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 ?
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 ?
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 !
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 ?
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 ?
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 :