IMA3/IMA4 2020/2022 P6
Sommaire
Présentation
Contexte
De nos jours, de plus en plus d’appareils électroniques ont besoin d’une connexion internet pour fonctionner. En outre, la majeure partie de nos données sont conservées sur le cloud et transitent par le biais d’internet. Il est donc nécessaire pour des grandes entreprises ou même des particuliers de pouvoir sécuriser ces données et ces appareils. Le réseau doit être protégé de toutes attaques malveillantes. Une manière de sécuriser le réseau est de détecter qui peut être un utilisateur malveillant, c'est que nous allons faire dans ce projet.
Description
Pour identifier les utilisateurs suspects voir malveillant, nous allons écouter le réseau et au travers des différents paquets échangés essayer de détecter les tentatives de connexions suspectes. La récupération des données du paquet suspect nous permet d'identifier la machine et permettrait d'isoler ou de bannir cette utilisateur du réseau mais ce n'est pas dans le cadre du projet. Pour écouter le réseau nous utilisons Wireshark, l'écoute génère un fichier avec l'extension .pcap que nous allons traiter en Python. Le fichier est .pcap est la liste des paquets écoutés. Avec python, nous allons analyser ces listes de paquets avec TensorFlow un outil open source d'apprentissage automatique et la bibliothèque Keras permettant d'interagir avec les algorithmes de langages d'apprentissage profond. L'objectif est d'analyser les différents paquets pour en identifier les comportements suspects. Cependant, nous devons définir ce qu'est un comportement suspect en analysant les différents protocoles wifi.
Etat de l'art
Partie Réseau
La partie du réseau que nous allons étudier/analyser est la Wi-Fi. Nous nous pencherons donc sur la composition des trames Wi-Fi qui se basent sur le standard IEE 802.11.
Trame 802.11
Voici la description d'une trame Wi-Fi, ce qui nous intéresse dans notre projet ce sont les données MAC. Le préambule ainsi que l'en-tête PLCP sont présents pour permettre une connexion ainsi qu'une synchronisation avec les points d'accès (couche physique/niveau 1).
Explication des différents champs
-Contrôle de trame (2 octets) : donne des informations sur la nature de la trame
-Durée (2 octets) : donne la durée de la séquence en ms
-Adresse 1,2 et 3 (3*6 octets) : Tout dépend du mode de fonctionnement (ad-hoc ou infrastructure). Le plus souvent ce sera en mode infrastructure avec l'adresse 1 qui désigne l'adresse MAC du point d'accès, l'adresse 2 désignant la station source et l'adresse 3 désignant la station destination.
-Contrôle séquence (2 octets) : composé d'un numéro de séquence attribué à chaque trame sur 12 bits ainsi que numéro de fragment sur 4 bits si la trame est fragmentée.
-Corps de la trame(0 à 2312 octets) : trames de niveaux supérieurs qui sont encapsulés dans la trame 802.11
-CRC (4 octets) : somme de contrôle
Mode moniteur
Maintenant que nous comprenons le contenu d'un paquet Wi-Fi, nous souhaitons capturer tous ces paquets afin de les étudier. Il faut savoir qu'il existe plusieurs mode de fonctionnement d'une carte réseau. Le plus courant est le mode infrastructure qui va permettre de communiquer avec les autres appareils. Il existe aussi le mode moniteur qui nous permet d'écouter le trafic réseau et de capturer les paquets. Le mode moniteur permet l'écoute et l'analyse passive des données circulant sur le réseau. Dans notre projet, nous utiliserons ce mode de fonctionnement pour sniffer les trames 802.11 à l'aide d'un logiciel de sniffing. Cependant, une fois dans ce mode, il nous est impossible de communiquer avec d'autres appareil au travers de ce réseau puisque l'appareil n'est pas connecté à un point d'accès (elle n'a pas d'adresse IP définie).
Capture Réseau
Aujourd'hui, beaucoup d'utilitaire sont développés afin de capturer des paquets réseau et les analyser. Les logiciels vont analyser les paquets afin de décrypter et ressortir les infos qu'ils transportent. Les logiciels comme Kismet et Wireshark permettent à un utilisateur de faire de la surveillance réseau manuellement. L'utilitaire Aircrack quant à lui permet de cracker des clés Wi-Fi en s'appuyant sur le mode moniteur de la carte réseau. Nous nous appuierons donc sur ces logiciels afin de réaliser notre projet.
Réalisation du projet
Nous avons décidé de décomposer notre projet en deux grandes parties :
-la capture réseau et la récupération des différentes données à étudier.
-le développement de l'algorithme de machine learning qui va analyser les données par lui même afin de détecter les potentielles menaces.
Partie réseau
En ce qui concerne, la partie réseau nous devons récupérer un fichier .pcap à partir de commandes Wireshark pour ensuite l'analyser avec les différents outils python. Pour utiliser Wireshark dans un terminal nous utilisons Dumpcap.
Concernant l'analyse du fichier pcap (donc des paquets utilisés), nous pourrons utiliser le logiciel scapy qui va nous permettre de récupérer les données utiles de chaque paquet pour notre surveillance.
Liste des commandes utilisées:
- -f
- Permet de capturer seulement certain types de paquets. Par exemple -f arp permet de capturer seulement les paquets ARP
- -I
- Met la carte en mode routeur et nous permet de capturer tous les paquets 802.11 circulant sur le réseau
- -P
- Permet d'obtenir un fichier d'extension pcap à la place d'un fichier pcapng.
En analysant les différents trames Wifi, nous serons capable de récupérer l'adresse de MAC la machine émettant le paquet, l'adresse mac de la balise relayant ce paquet et l'adresse mac de la machine devant recevoir ce paquet.
Partie Machine learning
Notre projet consiste à surveiller le réseau et les utilisateurs de ce réseau. La question qui se pose est alors la suivante : comment surveiller et analyser les milliers de données qui transitent sur ce réseau tous les jours ? Comment reconnaître un comportement malveillant ? C'est alors là que le machine learning devient intéressant. En effet,la détection d'un comportement malveillant revient à chercher une aiguille dans une botte de foin. Mais les algorithmes de Machine Learning permettent de traiter efficacement d'immenses quantités de données.
Réseaux de neurones convolutionnels
Les algorithmes de Machine Learning reposent sur des réseaux de neurones convultionnels (CNN). Ces derniers sont composés de couches de neurones où chaque neurone est relié à tous les neurones de la couche précédente. En python, avec la commande "model.add" nous pouvons ajouter les couches nécessaires à notre réseau en décrivant chaque couche avec différents paramètres.
Pour notre projet, nous utilisons le Deep Learning. Le Deep Learning est une forme spécifique de Machine Learning où des couches cachées sont présentes entre les différentes couches de neurones. Il est préférable d'utiliser le Deep Leraning pour deux raisons :
- Notre algorithme se forme tout seul, nous avons juste à lui fournir des données pour s'entraîner
- Le Deep Learning est plus efficace que le Machine Learning grâce à ses réseaux de neurones profonds
Paramètres choisis pour sureviller le réseau
Nous avons différents paramètres à sélectionner qui vont nous permettre de surveiller le réseau. Ces paramètres constituent notre couche d'entrée du réseau de neurones. La couche de sortie nous donnera la classification des comportements malveillants. Nous avons donc choisi d'extraire du réseau les 16 paramètres suivants :
- la durée totale de l'enregistrement - le nombre de paquets envoyés de la destination à la source - le nombre d'octets envoyés de la source à la destination - le nombre d'octets envoyés de la destination à la source - le nombre de paquets par seconde - Time To Live (TTL) de la source à la destination - TTL de la destination à la source - Nombre de bits par seconde pour la source - Nombre de bits par seconde pour la destination - Moyenne de la taille des paquets de flux transmis par l'adresse IP source - Moyenne de la taille des paquets de flux transmis par l'adresse IP destination - Ratio de connexions vers une même adresse IP destination parmi 100 connexions - Ratio de connexions vers une même adresse IP source vers un même port destination parmi 100 connexions - Ratio de connexions vers une même adresse IP destination depuis un même port source parmi 100 connexions - Ratio de connexions depuis une même adresse IP source vers une même adresse IP destination parmi 100 connexions - Index fonction de l'état de la connexion et du TTL à la source et/ou à la destination
Travailler avec ces 16 paramètres différents nous permet de détecter 9 types d'attaque différents : fuzzers, analysis, backdoors, DoS, exploits, generic, shellcode, worms et reconnaissance.
Réalisation de l'algorithme
Pour créer notre algorithme de Deep Learning maintenant bien défini, nous allons utiliser Python. Ainsi, nous pourrons utiliser deux bibliothèques écrites en Python particulièrement utiles pour créer notre algorithme : Tensorflow et Keras.
Tensorflow est un outil open source d'apprentissage automoatique. C'est un outil très utilisé dans le domaine de l'intelligence artificielle et plus particulièrement de l'apprentissage machine.
Keras est quant à lui permet d'interagir avec les algorithmes de réseaux de neurones profonds et d'apprentissage automatique comme Tensorflow cité précedemment.
La combinaison de ces deux bilbiothèques nous permet de créer notre algorithme de Deep Learning.
Avancé du projet
Séance 1
Lors de cette séance nous avons du redéfinir les objectifs de notre projet pour repartir sur de bonnes bases. Les travaux que nous avons fait lors du semestre précédent sont à abandonner. Nous devons comme expliquer précédemment récupérer les paquets avec un fichier .pcap et ensuite les analyser pour trouver les comportements suspects avec un différents outils comme Tensorflow. Nous allons devoir définir ce qui est un comportement suspect et ce qui ne l'est pas. Nous nous sommes répartis les tâches. Théo et Tristan vont travailler sur l'analyse des données en Python et Simon et Valentin vont travailler sur la récupération des données grâce à Wireshark et ses différents fonctionnalités.
Séance 2
Lors de cette séance, nous devons continuer notre formation sur les différents outils pour l'analyse des données et nous devons continuer à améliorer la récupération des données en réfléchissant sur quelles données des vont nous être utiles pour déterminer le comportement des utilisateurs. Valentin et Simon se sont concentrés sur la capture de paquets avec l'utilitaire dumpcap. Ils ont notamment pu capturer des paquets de protocole Wi-Fi.
Séance 3
Le but de cette séance pour Valentin et Simon est de comprendre la structure d'un paquet Wi-Fi afin de déduire certains comportements suspects. Ils continuent aussi leurs recherches sur l'analyse automatique des paquets afin qu'ils soient traités par la suite par l'algorithme de machine learning. Du côté de Tristan et Théo, on se forme au machine learning (suivi des tutoriels de base de tri d'image...) et on essaie de voir quelles données traiter et comment les traiter pour réaliser notre projet.
Séance 4
Nous avons trouvé plusieurs bonnes documentations sur le Net Monitoring par Machine Learning (ou même Deep Learning). Nous essayons de mettre en place les techniques apprises, c'est ici que nous rencontrons plusieurs difficultés.Concernant la partie de capture et d'analyse des paquets, nous avons continué nos recherches afin d'obtenir les informations importantes du fichier pcap. Nous nous penchons donc vers l'utilisation de scapy.
Séance 5
Nous continuons nos recherches pour récupérer les informations du fichier pcap. A l'aide de scapy, nous avons réussi à ressortir des données importantes des paquets (addresse de destination, type de paquet,..). Un problème s'oppose à nous : les paquets malformés. Nous devons trouver un moyen d'ignorer ces paquets dans notre analyse afin d'avoir un paquet de données cohérent.
Séance 6
Au vu des données souhaitées par Théo et Tristan, nous passons sur l'utilisation de tshark pour l'analyse des paquets. En effet, tshark va nous permettre d'obtenir des données statistiques sur les discussions entre deux adresses. Nous utiliserons ainsi dumpcap pour la capture et tshark pour l'analyse des données capturées. L'utilisation de scapy devient donc inutile si nous réussissons à extraire les données avec tshark.