Notre contribution à la communauté de la sécurité de l'information et des systèmes d'information

Proxyshark, développé par CONIX, est un outil capable d’intercepter, d’afficher et de modifier/injecter à la volée n’importe quel champ, de n’importe quel protocole basé sur IP. Il peut être vu comme une sorte d’analyseur réseau type Wireshark avec des capacités d’édition des paquets IP à la volée, un peu à la manière de Burp Suite.

Le besoin d’un tel outil est apparu au cours de tests d’intrusion impliquant des protocoles ou des contextes un peu particuliers (VoIP, protocoles propriétaires, objets connectés, …). Il devenait indispensable de pouvoir modifier des flux en temps réel quel que soit le protocole de transport sur IP (niveau 4 et au-delà du modèle OSI) en question. L’objectif était donc de disposer d’un outil proposant à la fois des fonctionnalités de Wireshark, notamment la dissection de paquets, et de Burp Suite, en termes de possibilités de rejeu, de modification/injection de paquets forgés (fuzzing), et ce, éventuellement au travers d’une interface graphique efficace.

L’outil est développé en Python et basé sur les briques logicielles suivantes :

  • NFQueue, pour la capture de paquets
  • TShark, pour leur dissection (reconnaissance des protocoles)
  • Burp Suite, pour l’interface graphique

La partie basée sur NFQueue et TShark constitue le moteur de Proxyshark. Il est pilotable en ligne de commande de façon autonome. L’interface graphique reste optionnelle et se présente sous la forme d’une extension du progiciel Burp Suite.

Présentation du moteur

Interception et dissection

Pour l’interception, le moteur utilise une file NFQueue et des règles Netfilter qui sont générées automatiquement à partir d’un filtre Berkeley Packet Filter (BPF) défini par l’utilisateur (option « – c »). Ces éléments permettent de capturer les paquets souhaités et de faire en sorte qu’ils deviennent manipulables à partir de l’espace utilisateur.

Le moteur va ensuite devoir gérer 2 instances de TShark qui permettront d’obtenir, pour chaque paquet capturé, le résultat de sa dissection :

  • sous la forme d’une description textuelle synthétique (option « -T text » de TShark)
  • sous la forme de données PDML (option « -T pdml » de TShark)

Les 2 instances fonctionnent en parallèle et de façon permanente pour des raisons de performance.

A ce stade, l’utilisateur peut modifier les paquets interceptés comme il l’entend :

  • soit manuellement, champ par champ ou en manipulant les données brutes
  • soit en utilisant des règles automatiques créées à l’avance (cf. breakpoints et actions)

Enfin, un verdict est posé sur chaque paquet capturé :

  • soit le paquet est rejeté, et donc supprimé
  • soit il est accepté, et la version éventuellement modifiée par l’utilisateur est réinjectée

Proxyshark CONIX

Filtrage

L’utilisateur peut spécifier de manière assez fine quels sont les paquets qui l’intéressent. Pour cela, plusieurs niveaux de filtres interviennent dans la durée de vie d’un paquet au sein de Proxyshark :

  • les capture filters (option « -c ») : ils interviennent au niveau de la capture des paquets par Netfilter. Leur rôle est de générer un jeu de règles qui déterminera quels sont les paquets qui transiteront par NFQueue. Leur syntaxe est basée sur les Berkeley Packet Filters (BPF) utilisés dans Tcpdump ou Wireshark.
  • les packet filters (option « -p ») : ils interviennent après la dissection d’un paquet et déterminent s’il peut continuer son chemin ou s’il doit être proposé à la modification dans Proxyshark. Leur syntaxe est inspirée des Wireshark display filters. Ces filtres permettent d’aller beaucoup plus loin que les capture filters en posant des conditions basées sur les protocoles et les champs issus de la dissection du paquet.
  • les field filters (option « -f ») : ils permettent de ne garder qu’un sous-ensemble des protocoles et des champs d’un paquet afin d’économiser des ressources et de visualiser plus facilement les paquets interceptés. Il s’agit en réalité de simples expressions rationnelles correspondant aux noms des protocoles et des champs à garder.

2016_08_Proxyshark-2

Modes d’utilisation

Proxyshark peut être utilisé selon 3 modes différents :

  • mode vue (option « -r ») : c’est un mode passif qui permet d’observer les paquets capturés et disséqués en temps réel dans la console au fur et à mesure de leur capture, un peu à la manière de Wireshark.
  • mode interactif : il se présente sous la forme d’une interface en ligne de commande classique, à ouvrir dans un terminal, et qui donne accès à un jeu de commandes propres à Proxyshark. Il permet également l’exécution de n’importe quelle expression Python.
  • mode pilotage web (option « -w ») : il permet l’interfaçage de l’outil avec un proxy web (et donc, notamment, avec l’extension Burp Suite de Proxyshark). Dans ce mode, Proxyshark génère, pour chaque paquet capturé, une requête HTTP contenant le résultat de sa dissection. Il envoie ensuite cette requête au travers du proxy web qui a été configuré dans l’outil (option « -w »). De cette façon, l’utilisateur est en mesure de faire transiter le trafic capturé au travers d’un proxy web comme Burp Suite, et de profiter de ses outils intégrés et de son interface graphique.

Aperçu des commandes

Le mode interactif propose un ensemble de commandes permettant de :

  • contrôler l’état de la capture (commandes run, pause, continue, stop)
  • gérer la file de réception des paquets (commandes queue, packet, remove, accept, drop)
  • définition de points d’arrêts et d’actions (commandes breakpoint, action)

Manipulation des paquets

La liste des différents protocoles et champs qui composent un paquet est récupérée au format PDML à partir de TShark. Ces données (protocoles, champs, attributs) sont accessibles directement depuis la ligne de commande de Proxyshark sous la forme d’un dictionnaire Python (variables « queue » et « packet »).

Un système de rejeu de paquets a également été implémenté. Il permet de rejouer un paquet à partir d’un niveau donné du modèle OSI et prend par exemple lui-même en charge l’établissement d’un handshake TCP lorsque c’est nécessaire (rejeu de niveau 4).

2016_08_Proxyshark-3

Breakpoints et actions

Proxyshark permet de définir des points d’arrêt, ou breakpoints, dont les conditions de déclenchement sont caractérisées par des packet filters (option « -b »). Ce sont eux qui fournissent à l’application ses fonctionnalités d’édition automatique à la volée. Lorsqu’un point d’arrêt est déclenché, la capture est mise en pause, le paquet est mis en attente (état pending) et l’utilisateur est invité à inspecter / modifier le paquet manuellement.

Il est également possible d’y greffer des actions (un ensemble d’expressions Python) afin de d’automatiser le traitement des paquets capturés. Dans ce cas, les actions associées à un point d’arrêt seront exécutées une à une lors de son déclenchement (option « -a »).

Extension Burp Suite

Nous verrons dans un prochain article comment Proxyshark peut s’interfacer avec Burp Suite grâce à une extension développée spécialement à cet effet.

Lien de téléchargement : https://github.com/conix-security/proxyshark

Save

By | 2017-01-31T17:42:03+00:00 29/08/2016|Technique|