Au fur et à mesure que des systèmes de drones plus avancés sont mis en place et intégrés dans divers secteurs, il devient de plus en plus important de prendre en compte les vulnérabilités qu'ils peuvent présenter afin d'assurer la sécurité de leurs applications.
Depuis que je me suis intéressé à la cybersécurité aérospatiale , une chose que j'ai toujours voulu trouver un moyen de pirater était les drones. Dans cet article, je décris les étapes que j'ai suivies pour désosser les drones DJI en utilisant des techniques de surveillance de paquets avec Wireshark et plonger dans les détails de la dissection de paquets et comment vous pouvez développer votre propre dissecteur de protocole en utilisant le langage de programmation Lua.
Bien que l'ingénierie inverse des drones ne soit pas une tâche facile, ils sont toujours vulnérables à un large éventail de cybermenaces qui pourraient avoir de graves répercussions. En décrivant le processus que j'ai suivi pour faire de l'ingénierie inverse dans les drones DJI afin d'exposer les informations sensibles stockées dans les données par paquets, j'espère que la recherche mettra en évidence les vulnérabilités existantes afin de trouver de meilleures alternatives pour protéger les systèmes de drones existants.
Un véhicule aérien sans pilote (UAV en abrégé) est un aéronef qui ne transporte ni pilote ni passagers à bord. La plupart du temps, le terme s'applique aux drones, mais d'autres types de véhicules UAV existent, tels que le Global Hawk de la NASA, qui est un UAV à haute altitude et longue endurance destiné à des fins de recherche. Les UAV sont utilisés pour une grande variété d'applications telles que les missions de recherche et de sauvetage, la collecte de données, l'armée et l'application de la loi, la photographie aérienne, etc. Comparés aux aéronefs conventionnels, les UAV possèdent une forme compacte, présentent une agilité, une exactitude et une précision accrues manœuvres et s'avèrent rentables, ce qui les rend largement favorisés pour diverses applications commerciales et grand public telles que les services de livraison et les levés aériens.
Comme cet article se plongera dans la criminalistique des drones, il est important de fournir un aperçu rapide des composants qui composent le DJI Phantom 4. S'il convient de noter que les composants hébergés par un drone peuvent varier en fonction de la marque ou de la version, la plupart des drones partagent une grande majorité des composants.
Châssis : le châssis du drone est le cadre physique qui maintient ensemble tous les composants. le châssis est généralement construit avec des matériaux légers tels que du plastique ou de la fibre de carbone pour réduire les performances de vol globales du drone en réduisant la traînée et le poids
Moteur de drone : les drones utilisent des moteurs pour créer la quantité de portance nécessaire au vol. la plupart des drones ont généralement une configuration quadricoptère composée de quatre moteurs : deux moteurs tournant dans le sens des aiguilles d'une montre et deux moteurs tournant dans le sens inverse des aiguilles d'une montre pour égaliser la force de rotation. Cette configuration existe parce que la troisième loi de Newton stipule que pour chaque action, il y a une réaction égale et opposée, donc avoir le même nombre de moteurs dans le sens inverse et dans le sens horaire fournit au drone une coordination de vol grâce à une force de rotation égalisée.
Drone Flight Controller : le contrôleur de vol d'un drone agit comme son cerveau. le contrôleur de vol reçoit des entrées de capteurs à bord du drone tels que le module GPS afin de donner des instructions spécifiques aux contrôleurs de vitesse électroniques (ESC) pour contrôler les moteurs
Module GPS : le module GPS (Global Positioning Satellite) utilise deux systèmes de positionnement global différents pour localiser l'emplacement du drone. À l'aide du module GPS, le drone peut calculer sa géolocalisation en fonction du temps qu'il a fallu pour que les signaux transmis arrivent de différents satellites
Contrôleur de vitesse électronique (ESC) : les ESC sont l'intermédiaire entre le tableau de distribution d'alimentation du drone et les moteurs. Ils utilisent les signaux du contrôleur de vol pour contrôler la quantité de puissance allouée à un moteur
Module de port d'alimentation : le port d'alimentation est un module qui affiche la quantité d'énergie provenant de la batterie et distribue cette alimentation aux ESC et au contrôleur de vol du drone
Capteurs d'évitement d'obstacles : certains drones incluent des capteurs de vision stéréo sur leur châssis. Ces capteurs calculent la distance entre le drone et l'obstacle devant le capteur en calculant la profondeur via les pixels d'image capturés par chaque capteur
Cardan 3 axes : le cardan stabilise la caméra attachée au drone pour stabiliser les images. Lorsque les capteurs remarquent un mouvement autour de n'importe quel axe, ils signalent au cardan de faire les ajustements appropriés pour lisser les images de la caméra
Batterie de drone : les batteries alimentent le drone. Certaines batteries incluent également des fonctionnalités telles que la protection contre les surcharges, la communication de sortie de puissance, etc.
Drone Camera : la caméra du drone est utilisée pour filmer des séquences et prendre des photos. Le capteur d'image de l'appareil photo capte les rayons de lumière entrants et les transforme en une image numérique
Antennes de drone : les antennes de drone agissent comme un système de transmission pour relayer les informations entre le contrôleur et le drone
Capteur d'évitement d'obstacles à ultrasons vers le bas : ces capteurs sont utilisés pour calculer la hauteur du drone au-dessus du sol. La hauteur peut être calculée en envoyant une impulsion sonore à haute fréquence à partir d'un capteur et en mesurant le temps nécessaire à l'autre capteur pour la recevoir
LED de vol : les LED de vol sont généralement utilisées pour indiquer la direction dans laquelle vole le drone. Deux feux rouges clignotants indiquent l'avant du drone et des feux verts clignotants indiquent l'arrière
Joysticks : les joysticks sont utilisés pour contrôler le drone en traduisant le mouvement physique des sticks en informations que le contrôleur peut communiquer au drone sous forme de directions de mouvement
Carte de télécommande principale : la carte de télécommande récupère la télémétrie utile sur le drone, comme son altitude, son emplacement et les images de la caméra
Carte de caméra principale : la carte de caméra traite les données du capteur d'imagerie et des moteurs de cardan pour synthétiser des séquences stables
Bien que les drones soient utilisés pour un large éventail d'applications, comme tout autre appareil doté d'un système informatique embarqué, ils sont vulnérables à une gamme de menaces de cybersécurité. Certaines des menaces de cybersécurité les plus courantes avec les UAV incluent :
Accès non autorisé : les drones sont vulnérables aux personnes non autorisées par de mauvais acteurs qui peuvent intercepter ou usurper les signaux sans fil utilisés pour contrôler le drone. Cela permet au pirate de contrôler le drone ou de leur voler passivement des informations.
Vol de données : les drones sont équipés d'une grande variété de capteurs qui collectent activement des informations sur leur environnement, telles que des photos, des vidéos et des lectures de télémétrie. Ces données peuvent être susceptibles d'être interceptées par des pirates qui peuvent les utiliser à des fins malveillantes
Déni de service : une attaque plus spécifique que les pirates peuvent employer pour pirater des drones est un déni de service. Cela se produit lorsqu'un pirate lance un DOS sur le même système de communication sans fil du drone, perturbant sa capacité à recevoir ou à transmettre des données
Alors que de plus en plus de vulnérabilités de sécurité sont découvertes avec la popularité croissante des UAV, il est nécessaire que les chercheurs en sécurité analysent de manière médico-légale les appareils à des fins malveillantes. Un sous-domaine de la cybersécurité appelé analyse médico-légale se concentre sur la collecte et l'analyse des données d'une attaque à des fins d'enquête .
Ce processus est pratique dans des scénarios de crime réels lorsque les informations numériques d'un système informatique sont saisies et doivent faire l'objet d'une enquête. Souvent, la grande majorité des informations sur la machine ne sont pas liées au crime et doivent être filtrées pour décomposer les scénarios de crime.
Il existe un large éventail d'applications illégales de drones telles que les largages de contrebande dans des zones non autorisées, les largages de drogue au-delà des frontières étrangères et la surveillance non sollicitée. À la suite de bon nombre de ces scénarios, la criminalistique numérique est utilisée pour déterminer des informations telles que la propriété de l'appareil et toutes les données liées au crime.
Une étude menée sur des modèles de drones courants dans diverses scènes de crime a démontré que des informations telles que des fichiers multimédias au format photo ou vidéo, des schémas de vol, des emplacements et des informations sur le propriétaire étaient les plus propices au succès des affaires de criminalistique numérique menées par des enquêteurs des forces de l'ordre. Bien que les enquêteurs de l'étude aient pu filtrer les informations sur le crime à l'aide de techniques de criminalistique numérique, l'étude a déclaré que la législation étatique et fédérale n'a pas correctement géré les réglementations relatives à la technologie des drones et laisse par conséquent de nombreuses parties prenantes vulnérables. Dans l'ensemble, ils ont conclu que le manque d'outils médico-légaux et de structure de drone universelle rendait nécessaire le développement de davantage de méthodes d'extraction de données.
Pour jouer un rôle dans la lutte contre le manque d'outils de criminalistique UAV, je montrerai comment j'ai créé un script de dissection de paquets pour Wireshark en utilisant le langage de programmation Lua pour trouver des informations réseau utiles lors de scénarios de criminalistique numérique. L'outil est une application de première main des compétences en criminalistique numérique pour recueillir des informations utiles sur les UAV qui pourraient être utilisées lors d'enquêtes pour recueillir davantage de données liées au crime qui a eu lieu.
Le reniflage de paquets est l'acte d'intercepter et d'examiner des paquets de données lorsqu'ils sont transmis sur un réseau spécifié. Cette technique est utilisée par les professionnels de la cybersécurité pour traquer les vulnérabilités, diagnostiquer les pannes et les performances de leur réseau ou découvrir les menaces.
Sur un ordinateur, la carte d'interface réseau (également connue sous le nom de NIC) est un composant matériel qui comprend une carte de circuit imprimé intégrée qui permet à l'ordinateur de s'interfacer avec les réseaux et d'effectuer un reniflage de paquets. Un reniflage plus élaboré à des fins de cybersécurité ou de piratage nécessite souvent que la carte réseau soit mise en mode promiscuité , ce qui permet à l'ordinateur de récupérer le trafic réseau environnant. À l'aide d'un processus de décodage, les renifleurs peuvent accéder aux informations codées stockées dans les paquets de données lorsqu'ils sont transportés sur un réseau. Le reniflement peut être divisé en deux catégories générales : le reniflement actif et passif .
Reniflement passif
Le reniflage passif consiste à n'écouter que les paquets qui sont envoyés en tant que trafic réseau. Il est souvent utilisé comme technique de reconnaissance pour évaluer les informations pertinentes sur le trafic et le type de données transmises sur un réseau. Cela permet aux professionnels de la sécurité d'analyser le réseau pour détecter toute anomalie ou activité suspecte, comme le dépannage du réseau (en utilisant le trafic réseau comme mesure des problèmes de réseau) et l'optimisation des performances en identifiant les zones de congestion.
Reniflage actif
Le reniflage actif est une technique utilisée dans les applications d'injection/usurpation de paquets destinées à obtenir une réponse des périphériques réseau. Par exemple, un attaquant peut envoyer un paquet spécifique afin de tromper un appareil ou une application spécifique pour qu'il réponde avec des informations sensibles. Cela pourrait être utilisé pour mener plusieurs activités malveillantes telles que l'orchestration d'une attaque de l'homme du milieu (MiTM) et le détournement de sessions réseau. Le reniflage actif est un peu plus délicat à détecter que le reniflage passif car il a été conçu pour se faire passer pour le trafic réseau environnant. Le reniflage actif est effectué en entrant intentionnellement des paquets de protocole de résolution d'adresse (ARP) afin de surcharger la table de mémoire d'adresse de contenu (CAM) du commutateur. Cela conduit au transport du trafic réseau légitime vers différents ports qui servent de base aux attaques d'usurpation telles que l'usurpation ARP, les attaques DHCP (Dynamic Host Configuration Protocol) et l'empoisonnement DNS (système de noms de domaine).
Modèle OSI
Le modèle OSI (connu sous le nom d'Open Systems Interconnection) est utilisé pour conceptualiser la façon dont les composants disparates d'un réseau communiquent entre eux. Le modèle est présenté comme un modèle à sept couches qui comprend un ensemble de règles normalisées sur la manière dont différents appareils et programmes peuvent communiquer entre eux via le réseau.
Le modèle OSI peut être segmenté en plusieurs couches : Application, Présentation, Session, Transport, Réseau, Liaison de données et Physique.
Couche physique
Ceci décrit les caractéristiques physiques du réseau responsable de la connexion physique entre les périphériques tels que le câblage, les connecteurs et la signalisation. Dans cette couche, les données sont transférées via des bits .
Couche de liaison de données
Dans cette couche, les données sont formatées en paquets et transmises sur le réseau. La couche de liaison de données garantit également que vos données ne contiennent aucune erreur interne. Les données sont transférées à l'aide de trames .
Couche réseau
La couche réseau gère la manière dont les paquets sont adressés et envoyés sur le réseau en trouvant le moyen optimal d'envoyer le paquet. Dans cette étape, les adresses IP sont attachées à l'en-tête du paquet.
Couche transport
La couche transport est la transition entre les couches réseau et session. Cette couche utilise des protocoles réseau tels que UDP et TCP afin de déterminer comment transmettre les données entre les applications. Les données transportées dans cette couche sont appelées un segment .
Couche Session
Cette couche définit la manière dont les applications établissent et maintiennent des connexions entre elles.
Couche de présentation
La couche de présentation convertit les données des segments dans un format plus lisible par l'homme. Cette couche couvre également le chiffrement et le déchiffrement des paquets.
Couche d'application
La couche application est ce qui est utilisé pour s'interfacer avec les utilisateurs. Il définit les protocoles et les interfaces qui peuvent être utilisés par les applications pour communiquer avec le réseau.
Répartition des informations sur les paquets
En réseau, un paquet est un petit segment d'un message plus grand. Toute forme de données transmise sur un réseau est divisée en paquets. Une fois qu'ils ont traversé le réseau, ces paquets sont reconstruits par l'appareil qui les reçoit.
Les paquets envoyés sur un réseau ont l'en-tête, la charge utile et la fin inclus dans leur structure. J'utiliserai le paquet IPv4 comme exemple pour démontrer le type d'informations contenues dans un paquet.
1. En-tête de paquet
L'en-tête de paquet est la partie initiale d'un paquet. Il contient l'adressage et d'autres données nécessaires pour que le paquet atteigne sa destination. L'en-tête IPv4 contient 13 champs…
- Version : numéro de version du protocole internet utilisé (ex. IPv4)
- Longueur d'en-tête Internet (IHL) : longueur de l'en-tête IP complet
- Explicit Congestion Notification : informations sur les informations de congestion vues en route
- Longueur totale : longueur de l'ensemble du paquet IP (y compris l'en-tête et le corps)
- Identification : si le paquet IP est fragmenté, chaque paquet contiendra un numéro d'identification correspondant pour identifier le paquet IP d'origine auquel il appartient
- Flags : indique si le paquet est suffisamment grand pour être fragmenté
- Fragment Offset : positionnement du fragment dans le paquet IP
- Time to Live (TTL) : le nombre de routeurs qu'il reste au paquet à traverser pour éviter le bouclage du réseau
- Protocole : la couche réseau de l'hôte de destination auquel appartient le paquet (c'est-à-dire TCP = 6, UDP = 17 et ICMP = 1)
- Header Checksum : valeur de la somme de contrôle de l'en-tête entier utilisée pour confirmer que le paquet ne contient aucune erreur
- Adresse source : adresse 32 bits de l'expéditeur (source) du paquet
- Adresse de destination : adresse 32 bits du récepteur (destination) du paquet
- Options : champ facultatif pouvant contenir des informations telles que Record Route, Timestamps, etc.
2. Charge utile
La charge utile d'un paquet comprend les données réelles que le paquet a l'intention de transporter jusqu'à sa destination. Dans le cas du paquet IPV4, la charge utile reçoit un remplissage de 0 bits pour garantir que le paquet se termine dans la limite de 32 bits.
3. Remorque
Parfois, les paquets peuvent contenir une fin à leur paquet appelée la fin. Bien que la structure de paquet IPV4 ne contienne pas de fin, les trames Ethernet contiennent une fin pour inclure les informations dont les adaptateurs réseau sur Ethernet ont besoin pour traiter la trame.
Wireshark est un protocole réseau et un outil d'analyse de paquets largement utilisés et open source. Il vous permet de capturer des paquets réseau à partir de sources telles que sans fil (IEEE.802.11), Bluetooth, Ethernet, Token Rings, etc. Wireshark inclut également une capacité de filtrage de paquets qui vous permet de filtrer le flux de journaux de paquets tels qu'ils sont affichés sur votre écran. .
Utilisation de Wireshark pour l'analyse de paquets
L'interface Wireshark contient différents volets pour afficher les informations sur les paquets. Le panneau principal affiche la liste de tous les paquets circulant sur le réseau. Si vous sélectionnez un paquet individuel, deux volets devraient apparaître près du bas de l'écran contenant des données de paquet plus spécifiques. Les détails de chacune des catégories de colonnes dans le panneau principal sont les suivants :
N° : le numéro de paquet dans le fichier de capture
Heure : l'heure à laquelle ce paquet a été capturé après le lancement du reniflage de paquets
Source : adresse IP et numéro de port de l'appareil émetteur
Destination : adresse IP et numéro de port de l'appareil de réception
Protocole : le type de paquet (c.-à-d. TCP, UDP, HTTP, etc.)
Info : contenu plus informatif sur le paquet qui variera selon le type de paquet capturé
Ce sont les colonnes d'information préconfigurées dans Wireshark, mais il y a beaucoup plus de colonnes disponibles à afficher dans l'outil telles que TTL, somme de contrôle, etc. en les sélectionnant dans les paramètres "Colonnes".
La section Détails du paquet de l'outil vous montre des informations plus interprétables sur le paquet qui varient en fonction du type de paquet. Le volet inférieur, Packet Bytes , affiche le contenu du paquet au format hexadécimal pur.
Filtres de capture Wireshark
Les filtres de capture dans Wireshark limitent les paquets capturés par le filtre inséré. Si vous l'avez peut-être remarqué, les filtres de capture Wireshark suivent le même format que tcpdump qui est un autre outil de capture de paquets réseau populaire. La syntaxe des captures de paquets respecte les expressions de syntaxe du filtre de paquets Berkeley (BPF). Certains filtres de capture courants pour Wireshark incluent…
Capturez le trafic uniquement vers et depuis l'adresse IP 172.18.5.4 :
host 172.18.5.4
Capturez le trafic vers ou depuis une plage d'adresses IP :
net 192.168.0.0/24
OU
net 192.168.0.0 mask 255.255.255.0
Capturez le trafic à partir d'une plage d'adresses IP :
src net 192.168.0.0/24
OU
src net 192.168.0.0 mask 255.255.255.0
Capturez le trafic DNS (port 53) :
port 53
Capturez sauf tout le trafic ARP et DNS :
port not 53 and not arp
Capturez uniquement les paquets IPv4 :
ip
Capturer uniquement les paquets Ethernet (EAPOL) :
ether proto 0x888e
La fonction de filtres d'affichage de Wireshark vous permet d'affiner le type de paquets affichés dans la liste des paquets capturés. Voici des exemples courants de filtres d'affichage :
Filtres basés sur le protocole :
Vous pouvez filtrer le trafic de paquets en fonction du protocole réseau
http
L'exemple ci-dessus ne montre que les paquets avec le protocole HTTP
Filtrer les paquets par adresse (c.-à-d. Filtrage d'adresse IP) :
Vous pouvez filtrer les paquets via l'adresse de l'expéditeur ou du destinataire
ip.src == xxxx
Ce qui précède montre le trafic provenant d'une adresse IP spécifique
Filtres basés sur les ports :
Vous pouvez filtrer le trafic de paquets en fonction du numéro de port utilisé
http
L'exemple ci-dessus ne montre que les paquets TCP avec le port 80
Filtres basés sur le temps :
Vous pouvez filtrer les paquets en fonction de l'heure à laquelle ils ont été capturés
frame.time >= "YYYY-MM-DD HH:MM:SS" && frame.time <= "YYYY-MM-DD HH:MM:SS
L'exemple ci-dessus ne montre que les paquets dans une plage de temps sélectionnée
Filtres basés sur le contenu :
Vous pouvez filtrer les paquets en fonction du contenu des paquets
frame contains google
L'exemple ci-dessus montre des paquets dont le contenu contient le mot-clé "google"
Alors que le processus d'analyse des paquets est utilisé pour obtenir un aperçu général des modèles de trafic réseau, la dissection des paquets implique une approche beaucoup plus étroite. La dissection de paquets fait référence au processus de dissection de paquets individuels en leurs composants distincts (c'est-à-dire les en-têtes, le contenu de la charge utile, etc.) pour acquérir des connaissances précieuses sur les processus réseau ou le périphérique surveillé. Certaines applications pour lesquelles les dissections de paquets peuvent être utilisées incluent l'analyse de protocole et la criminalistique.
Heureusement pour nous, Wireshark contient un ensemble d'outils intégrés pour effectuer une dissection approfondie des paquets sur chaque paquet transporté sur un réseau. Certaines techniques pour effectuer la dissection des paquets comprennent…
Décodage de protocole : vous pouvez afficher les détails du protocole pour chaque paquet en développant les détails de la couche dans le volet des détails du paquet. Ceci est utile pour décoder divers protocoles tels que TCP, UDP, DNS, etc.
Flux TCP : Wireshark contient également une fonctionnalité qui affiche le flux TCP de tous les paquets circulant via une connexion TCP. Pour utiliser cette fonctionnalité, sélectionnez un paquet qui appartient à une connexion TCP, cliquez avec le bouton droit sur le paquet et sélectionnez "Suivre > Flux TCP"
Codage couleur : vous pouvez également visualiser les paquets en fonction de critères spécifiques tels que la longueur des paquets ou le type de protocole. Pour voir cette fonctionnalité, allez dans "Affichage" et cliquez sur "Règles de coloration"
Graphiques de flux : Wireshark a une fonctionnalité qui affiche un graphique de flux montrant les détails de synchronisation et de séquence d'un paquet entre deux machines. Pour configurer un graphe de flux, allez dans « Filtre de conservation » et sélectionnez l'option « TCP ». Cela crée un filtre qui affiche tous les paquets transmis entre deux machines. Ensuite, sélectionnez "Statistics" et "TCP Stream Graphs" pour créer le graphique de flux
La dissection de paquets peut être appliquée afin d'analyser quels types de protocoles réseau sont utilisés et comment ils sont utilisés. Pour essayer l'analyse de protocole avec Wireshark, commencez par capturer des paquets avec l'interface réseau que vous avez sélectionnée. Ensuite, à mesure que les paquets sont capturés, ils doivent transmettre divers protocoles tels que HTTP (port 80), HTTPS (port 443), SSH (port 22) et SNTMP, etc. Utilisons HTTP pour notre exemple de dissection de paquets. Commencez par sélectionner un paquet avec le protocole HTTP qui lui est assigné comme ci-dessous en filtrant avec le mot-clé http...
Une fois le paquet sélectionné, développez le menu TCP (Transmission Control Protocol) pour voir les informations pertinentes pour le paquet.
Une fois les détails du paquet développés, vous pouvez analyser différents champs du protocole tels que les adresses IP source et de destination, les ports source et de destination, la méthode HTTP utilisée (GET, POST, DELETE, etc.) et le code de réponse HTTP.
La dissection de paquets peut également être utilisée pour la criminalistique numérique afin d'extraire des informations derrière des incidents de réseau particuliers. Par exemple, imaginez une situation où un pirate envoie des informations sensibles sur votre réseau à un serveur distant. Nous pouvons utiliser des filtres d'affichage dans Wireshark pour isoler le trafic provenant de la machine du pirate en utilisant l'adresse IP de l'appareil du pirate et l'adresse IP du serveur distant. Ensuite, nous pouvons utiliser les outils de dissection de paquets proposés par Wireshark tels que la fonctionnalité "Follow TCP Stream" afin de reconstruire le flux de données TCP entre le pirate et le serveur distant. En utilisant ces informations, vous pouvez révéler des informations cachées que le pirate a envoyées au serveur distant, comme le transfert de fichiers ou d'images malveillants. Cette application de dissection de paquets peut également être appliquée pour analyser le trafic réseau et détecter toute activité criminelle.
La rétro-ingénierie est le processus de déconstruction et d'analyse d'un système afin de comprendre comment il fonctionne « sous le capot » et d'en extraire des informations pertinentes. Ce processus se fait souvent par le biais d'un processus itératif déconstruisant des aspects spécifiques d'un système, analysant ses spécifications techniques et son code, et exécutant des tests spécifiques pour examiner ses résultats. Comme dans le cas du piratage d'UAV, nous pouvons appliquer des principes d'ingénierie inverse pour analyser le logiciel et le micrologiciel d'un drone, extraire des informations de télémétrie et identifier les vulnérabilités à exploiter. Pour cette expérience de recherche, j'ai décidé de rétroconcevoir le DJI Mini 2 - un petit drone compact conçu pour un usage récréatif développé par une société de drones populaire appelée DJI.
Étant donné que l'écoute passive ne renvoie aucun résultat d'ingénierie inverse, j'ai plutôt utilisé une configuration de réseau artificielle et conviviale pour permettre à la communication sans fil entre le drone et l'opérateur d'être inspectable et interceptable en suivant la configuration ci-dessous :
a) Drone : le done initialise le processus en démarrant un point d'accès utilisé pour la communication directe avec ses pairs du réseau
b) AP MITM : nous établissons un deuxième réseau virtuel avec notre machine se faisant passer pour l'AP pour le client mobile
c) Client MITM : le client MITM se connecte directement au drone en transmettant les réseaux du point d'accès MITM au drone et vice versa
d) Machine MITM : la machine MITM est le dispositif utilisé pour l'écoute clandestine en connectant via le NAT (Network Address Translation) les points d'accès MITM virtuels avec la carte réseau interne du client MITM.
e) Opérateur : l'opérateur est l'appareil mobile exécutant l'application DJI qui se connecte via Wi-Fi au représentant du drone (MITM-AP)
Configuration du point d'accès
Afin de configurer le MITM AP, j'ai utilisé le create_ap commande pour créer un point d'accès virtuel sur la ligne de commande sur ma machine.
sudo create_ap wlan0 wlan0 Operator 12345678 -w 2 -c 2 -m nat --freq-band 2.4 --country US
Cette commande a été conçue pour éliminer le nombre de perturbations entre la connexion en se concentrant sur la fréquence 2,4 GHz et en établissant les paramètres suivants :
-w 2
WPA2-PSK en mode de chiffrement CCMP -c 2
utilisation d'un canal inoccupé arbitraire et statique -m nat
NAT pour se connecter entre l'AP virtuel et la carte réseau physique --freq-band 2.4
sélectionner uniquement la bande 2,4 GHz --country US
mettre le bon code pays pour se conformer aux réglementations localesIntercommunication sur écoute
Pour l'écoute clandestine, j'ai utilisé l'outil de ligne de commande afin d'optimiser les performances du réseau MITM. Avec tcpdump, les paquets réseau capturés seront stockés dans un fichier PCAP correspondant qui pourra ensuite être analysé par un ensemble de programmes d'analyse de réseau. J'ai également implémenté des filtres supplémentaires pour réduire la plage de la sortie capturée afin qu'elle ne se compose que de paquets réseau pertinents entre le drone et la machine.
sudo tcpdump --interface=ap0 -n udp host 192.168.2.1 -w /tmp/dumps/capture.pcap
-n
évite les résolutions DNS udp
ignore tous les paquets TCP host 192.168.2.1
garantit que les paquets affichés sont liés aux dronesPour mener des recherches en criminalistique numérique sur le DJI Mini 2, j'ai essayé de désosser le protocole DJI Wi-Fi en analysant les paquets réseau envoyés par le drone à l'aide de Wireshark. Pour déterminer la structure exacte du protocole des paquets transmis par le drone, j'ai utilisé un raisonnement au bit près classique pour chaque bit individuel. Tout au long du processus, j'ai trouvé que les prédicats de filtre suivants dans Wireshark étaient les plus utiles :
!dns && !mdns && !icmp
étant donné que seuls les paquets réseau au niveau de l'application sont pertinents pour ce processus, nous pouvons exclure les protocoles DNS, Internet Control Message Protocol (ICMP) et Multicast DNS (MDNS) de notre recherche. ip.src == 192.168.2.1
L'adresse IP 192.168.2.1 représente l'adresse IP du drone. Ici, nous spécifions la source et la destination à filtrer par cette adresse IP. data.len == 1472
Dans cet exemple, seuls les paquets d'une longueur de 1472 octets sont inclus dans la vue des résultats affichant les paquets de drones avec cette taille de charge utile exacte data.data[0] == 0x00
cela compare la valeur hexadécimale statique au contenu de la charge utile de l'index initial. Ceci est utile car l'inspection des paquets en cours de vol se concentre sur les changements corrélés entre le protocole et les instructions de contrôle du drone de l'opérateur.Avec les paquets obtenus à l'aide de Wireshark, je me suis concentré sur la charge utile de l'index 0x2A à la longueur de trame Ethernet. Bien que le paquet entier inclue des informations, les octets de données de 0x2A à la fin suffisent à des fins de rétro-ingénierie. J'ai inclus le tableau des couches de modèle Ethernet OSI ci-dessous pour référence :
Chiffrement de la charge utile
Bien que l'intégralité du flux de communication soit cryptée, le flux de données décrypté peut toujours compromettre l'intégrité du cryptage. Une méthode de décryptage des informations avec les systèmes UAV consiste à effectuer une comparaison côte à côte entre plusieurs charges utiles pour identifier les modèles. Le mode de livre de code électronique (ECB) produit une séquence de données déterministes appliquant la même permutation pseudo-aléatoire à chaque bloc de texte en clair pour créer des blocs de texte chiffré répéteurs. Nous pouvons appliquer cela dans notre processus d'ingénierie inverse pour éventuellement rencontrer une charge utile pseudo-aléatoire ou deux charges utiles identiques dans les paquets UDP. Bien que je n'aie pas pu trouver de charges utiles identiques, il y en avait beaucoup qui étaient très similaires les unes aux autres. Par exemple, les images ci-dessous montrent deux paquets où seuls 5 octets diffèrent. Les deux charges utiles sont très similaires et indiquent même une incrémentation de celle qui est évidente d'un flux de données non chiffré.
Raisonnement déductif
La principale approche que j'ai utilisée pour la rétro-ingénierie du DJI Mini 2 consistait à appliquer un raisonnement déductif pour comparer les charges utiles en fonction des entrées corrélées de l'opérateur. En utilisant les instructions de contrôle direct du drone (c.-à-d. atterrissage, mouvement, décollage, etc.), j'ai forcé l'opérateur à signaler le paquet réseau représentatif. Les instructions de contrôle étaient capables de signaler le type de commande et le contenu de la charge utile. Ensuite, les paquets ont été comparés les uns aux autres en utilisant la technique de comparaison binaire susmentionnée révélant la structure de commande et les valeurs des paramètres. L'analyse des paquets a révélé un protocole à fort trafic composé principalement de paquets drone-opérateur qui s'appuyaient sur l'unité de transmission maximale (MTU).
Raisonnement au bit près
Afin de recueillir plus d'informations sur les données stockées dans les paquets transmis, une technique appelée raisonnement au bit près a été utilisée pour l'analyse des bits dans les charges utiles de 56 octets afin de porter des jugements spécifiques sur la propriété de chaque paquet. Pour simplifier le processus, des clusters ont été utilisés pour agréger les charges utiles afin que chacune ait exactement la même longueur. Je recommande fortement de lire ce document de recherche qui plonge profondément dans la méthode de précision au bit près pour les drones de rétro-ingénierie pour en savoir plus sur cette technique. Le tableau ci-dessous affiche un aperçu général des informations qui ont pu être extraites à l'aide d'un raisonnement au bit près.
Tout au long de ce processus de recherche, j'ai appris que la dissection de paquets pour la reconnaissance et pour la criminalistique numérique/l'ingénierie inverse appellent des approches totalement disparates. Heureusement, la dissection de paquets utilisant la reconnaissance passive et un dissecteur de communication réseau s'est avérée très utile pour analyser les interfaces de communication du DJI Mini 2.
Pour commencer le processus de dissection des paquets, j'ai téléchargé les fichiers PCAP répertoriés dans ce référentiel de vidages de paquets de communication DJI, qui comprend un vaste journal de données de communication pour toutes sortes de drones DJI utilisant Wireshark. Une fois les fichiers PCAP téléchargés, je les ai analysés à l'aide de Wireshark en utilisant différents dissecteurs.
Analyser les formats d'informations
Avant d'approfondir le processus de dissection de paquets spécifique des vidages de paquets DJI, il convient de mentionner tous les
Communication UART : UART signifie Universal Asynchronous Receiver-Transmitter est un protocole série couramment utilisé pour transmettre des informations entre des appareils électroniques qui utilisent le flux asynchrone de bits de données de manière séquentielle sur une seule ligne de communication.
Flux DUML : DUML signifie DJI Universal Markup Language qui décrit le protocole de source proche pour la communication DJI. Il est utilisé pour contrôler les paramètres internes de l'appareil ou pour lancer les mises à jour du micrologiciel
Fichiers KML : également connus sous le nom de Keyhole Markup Language, ce sont des fichiers XML par cœur utilisés pour afficher spécifiquement des données géographiques dans un logiciel de cartographie. Les fichiers KML contiennent des données sur des emplacements, des formes, des chemins et d'autres caractéristiques géographiques spécifiques
Journaux de vol DAT : DAT signifie Bande audio numérique. Ils se réfèrent aux données de vol enregistrées stockées sur des bandes audio numériques. Les fichiers DAT incluent des informations de vol pertinentes pour l'analyse
Le fichier PCAP dans le référentiel de vidage de paquets DJI contient un énorme vidage de journaux de communication provenant de divers matériels DJI. Ce stockage des journaux de communication nous permet de déchiffrer les communications internes des protocoles ainsi qu'un point de référence précis pour rechercher les problèmes matériels au sein du matériel. Par exemple, le premier fichier journal p3x_ofdm_to_center_run1 contient un vidage de communication du vidage UART de la carte récepteur DJI P3X. Le vidage de données comporte une communication bilatérale entre un OFDM (Orthogonal Frequency Division Multiplexing) MCU (Microcontroller Unit) et FC (Flight Controller) sur le drone à l'aide d'un câble plat et du programme comm_serial2pcap.py .
Configuration de Wireshark
Afin de mettre en place une dissection de communication DJI fondamentale, j'ai utilisé les fichiers de dissection de communication répertoriés dans les outils du micrologiciel DJI. Les outils de dissection de communication offrent les fonctionnalités suivantes :
- Afficher les champs dans les paquets DUML capturés à partir d'une source de drone
- Afficher les champs dans les paquets stockés en vol binaire
- Enregistrer les fichiers DAT
- Visualisez les vols via la fonction d'exportation KML
Les outils vous permettent également d'analyser les commandes de protocole via les options suivantes :
- Fichiers PCAP basés sur le flux DUML
- Fichiers PCAP contenant des vidages de communication USB/Ethernet dans les charges utiles DUML intégrées
- Fichiers PCAP basés sur le journal de vol DAT
Pour commencer à configurer votre environnement, téléchargez tous les fichiers .lua répertoriés sous ce lien . Ensuite, dans Wireshark, ouvrez le menu À propos de Wireshark et accédez à l' onglet Dossiers .
Ensuite, cliquez sur la référence du chemin de fichier vers Personal Lua Plugins et collez tout le contenu du fichier .
Une fois cela configuré, actualisez Wireshark à l'aide de la commande Ctrl + Maj + L pour charger tous les outils de dissection de communication. Une fois chargé, ouvrez
Preferences -> Protocols -> DLT_USER -> Edit
et faites les affectations selon l'image ci-dessous: Une fois la table DLT initialisée, accédez à
Preferences -> Appearance -> Columns
et ajustez les paramètres pour afficher les informations de protocole souhaitées. Voici un exemple d'une manière de le configurer : Dissection de la communication
A partir des outils de dissection de communication, nous pouvons extraire les informations suivantes des protocoles de communication DJI :
Structure du fichier du micrologiciel : le dissecteur peut délimiter des informations sur la structure des fichiers du micrologiciel comme les en-têtes, les sections et les sections de données
Composants du micrologiciel : les outils peuvent également extraire des composants de micrologiciel individuels tels que le chargeur de démarrage, le micrologiciel de contrôle de vol, le micrologiciel de la caméra, le micrologiciel du cardan, etc.
Paramètres de configuration : les paramètres de configuration peuvent également être examinés, ce qui fournit des informations sur les paramètres de composants tels que la caméra, les commandes de vol et les capteurs.
Scripts : des extraits de code et des fichiers binaires exécutables peuvent également être découverts dans le fichier du micrologiciel
Cryptage : selon la situation, le dissecteur peut également être capable de décrypter et de crypter des parties de fichiers de micrologiciel révélant des informations sur le processus de cryptage du micrologiciel
Contenu du système de fichiers : si un fichier de micrologiciel inclut un système de fichiers, les outils peuvent également extraire et analyser le contenu de ce système de fichiers
Dans Wireshark, un dissecteur est responsable de l'interprétation et du décodage des protocoles réseau. Les dissecteurs sont utiles car ils analysent les paquets réseau capturés et en extraient des informations utiles telles que la structure, les champs et les règles de codage du protocole, et les affichent dans un format lisible par l'homme.
Wireshark vous permet également de développer vos propres dissecteurs personnalisés à l'aide d'un langage de programmation appelé Lua . Bien que Wireshark ait été écrit en C et que les dissecteurs du programme soient généralement écrits en C, cependant, Wireshark permet également aux dissecteurs d'être écrits dans le langage de programmation Lua pour rendre la courbe d'apprentissage moins abrupte pour les personnes qui débutent dans le développement. Lua est un langage de programmation multi-paradigme, procédural et fonctionnel avec des fonctionnalités orientées objet intégrées. Bien que le choix de Lua comme langage pour le développement de dissecteurs compromette la vitesse, il est favorable dans la plupart des cas en raison de sa légèreté et de sa facilité d'apprentissage.
Introduction de base à Lua
Comme je l'ai mentionné précédemment, Lua présente une syntaxe de code intuitive et simple tout en gardant à l'esprit la vitesse, la portabilité et l'intégration avec d'autres programmes, ce qui facilite la prise en main sans sacrifier beaucoup de fonctionnalités et de performances. Voici quelques extraits de code de base décrivant les fonctionnalités fondamentales du langage :
Variables et opérations
local a = 25
local b = 5
local result = a + b print (result) -- Output: 30
Expressions conditionnelles
local temperature = 15
local heatSetting = 0
if temperature < 0 then heatSetting = 3
elseif temperature <= 20 then heatSetting = 2
else heatSetting = 1 end
print (heatSetting) -- Output: 2
Boucles
-- While Loops
local i = 0
while i < 10 do
i = i + 1
end
print (i) -- Output: 10
-- For Loops
local i = 0
-- i = first, last, delta
for i = 0 , 10 , 1 do
print (i) end
print (i) -- Output: 10
les tables
local new_table = {} -- Table value assignment
new_table[ 20 ] = 10
new_table[ "x" ] = "test"
ax = 10
Les fonctions
function add (arg1, arg2)
return arg1 + arg2 end
local added_number = add( 2 , 3 ) print (added_number) -- Output: 5
Notes récapitulatives sur Lua
Lua est typé dynamiquement
La portée est spécifiée comme locale ou globale. Global est la valeur par défaut
Les points-virgules ne sont pas nécessaires, ce qui donne plus de valeur aux espaces blancs
-- indique un commentaire
i = i + 1 utilisé pour l'incrémentation variable
~= utilisé à la place de !=
Les types sont : string, number, boolean, nil, function, userdata, thread et table
Nil est utilisé pour une non-valeur
Au conditionnel : néant et faux sont faux, le reste est véridique.
La seule structure de données de Lua est la table. Les tableaux implémentent des tableaux associatifs. Les tableaux associatifs peuvent être indexés par des nombres et d'autres types comme des chaînes. Ils sont dynamiques et souvent appelés objets.
Pour configurer le développement de dissecteurs avec des scripts Lua dans Wireshark, cliquez sur
Help -> About Wireshark -> Folders
. À partir de là, cliquez sur la référence du dossier Personal Lua Plugins ou Global Lua Plugins. Le chemin doit ressembler à quelque chose comme C:\Program Files\Wireshark\plugins\2.4.2 sous Windows . Pour créer un dissecteur, initialisez un fichier dans ce répertoire comme example.lua
. Le script sera automatiquement appliqué une fois Wireshark rechargé. Vous pouvez recharger Wireshark en redémarrant l'application ou en rechargeant tous les scripts Lua à l'aide de Ctrl+Shift+L . Maintenant que tout est configuré, je vais vous guider à travers un script de dissecteur rudimentaire qui extrait et affiche des informations sur un protocole personnalisé.
-- Create a new protocol for our custom protocol
local custom_protocol = Proto( "CustomProtocol" , "Custom Protocol" ) -- Define the fields of our custom protocol
local field1 = ProtoField.uint8( "custom_protocol.field1" , "Field 1" , base.DEC) local field2 = ProtoField. string ( "custom_protocol.field2" , "Field 2" ) -- Register the fields to the custom protocol
custom_protocol.fields = { field1, field2 } -- Create a function to dissect the packets of our custom protocol
function custom_protocol.dissector (buffer, pinfo, tree)
-- Create a subtree for our custom protocol in the Wireshark GUI
local subtree = tree:add(custom_protocol, buffer(), "Custom Protocol Data" ) -- Extract and display the values of Field 1 and Field 2
local field1_value = buffer( 0 , 1 ):uint() subtree:add(field1, buffer( 0 , 1 )):append_text( " (Value: " .. field1_value .. ")" ) local field2_value = buffer( 1 , 5 ): string () subtree:add(field2, buffer( 1 , 5 )):append_text( " (Value: " .. field2_value .. ")" ) end
-- Register our custom protocol as a dissector in Wireshark
local udp_port = DissectorTable.get( "udp.port" ) udp_port:add( 12345 , custom_protocol)
- le code commence par initialiser un protocole personnalisé à l'aide de l'objet Proto appelé
CustomProtocol
field1
et field2
buffer
, pinfo
, et tree
. buffer inclut le tampon du paquet et l'objet Tvb , pinfo contient les colonnes de la liste des paquets et tree est la racine de l'arbre - À l'intérieur de la fonction dissecteur, nous créons une sous-arborescence dans la section Wireshark Packet Details montrant notre protocole personnalisé sous forme de champ
- Dans la section arborescence, nous affichons les informations sur les paquets pour chacun des champs respectifs dans le protocole personnalisé
- Enfin, nous attribuons un protocole à un port. Dans ce cas, le port utilisé est
12345
pour UDPDans l'ensemble, en utilisant Wireshark en conjonction avec quelques dissecteurs de communication basés sur DJI, nous avons pu révéler des informations sensibles transmises par les drones DJI via leurs protocoles de communication. J'espère que ce processus de recherche approfondi décrit a élucidé quelques techniques d'ingénierie inverse que vous pourriez appliquer au cours de votre processus de cybersécurité pour éventuellement trouver des vulnérabilités dans les systèmes existants. De plus, j'espère que ce rapport a prouvé que même si le piratage de drones peut être un peu fastidieux, ce n'est pas impossible. Il est important de continuer à repousser les limites de ce que l'on sait actuellement sur un système afin de mettre en évidence les failles existantes avant qu'elles ne soient remarquées par de mauvais acteurs. Dans ce cas, nous avons révélé que les protocoles de drones, même pour les grands fabricants de marques de confiance comme DJI, sont toujours vulnérables à l'interception de données et à l'ingénierie inverse. En tenant compte de cela, des mesures constructives peuvent être prises pour atténuer ces vulnérabilités existantes et renforcer la sécurité des canaux de communication des drones.
Également publié ici.