[button.gif] Accueil
[button.gif] Quoi de neuf
[button.gif] Logiciels
[button.gif] Liens
[button.gif] À propos
[button.gif] E-mail
[button.gif] Dons
[3x1.gif]

FireHole

Comment contourner la détection du trafic sortant de votre firewall personnel

ou

Fini de plaisanter : un exercice pour rien

Mise à jour 25/3/2002 8:23

Avec l'apparition des firewalls personnels comme ZoneAlarm, Tiny Personal Firewall, Sygate Personal Firewall et bien d'autres, nous avons constaté une déviation du concept typique du firewall bloquant uniquement le trafic entrant du réseau en gardant le contrôle du produit et en bloquant le trafic sortant. C'était une bonne chose parce que l'attention de l'utilisateur était attirée sur l'existence de programmes, potentiellement malveillants ou pouvant violer votre intimité, et tournant sur leurs systèmes en essayant de se relier à Internet pour exécuter toute sorte de forfait.

Au milieu de 2000, Steve Gibson de Gibson Research Corporation a fait, à grand renfort de publicité, une révélation sur la mauvaise qualité de la détection du trafic entrant par la plupart de ces firewalls personnels de nouvelle génération avec son utilitaire de contrôle de concept LeakTest. Puisque ces firewalls s'appuyaient sur les niveaux de confiance des applications fournies par l'utilisateur, il a été montré qu'en remplaçant simplement une application de confiance par une version "troyenne" du même nom, le firewall permettait au trafic de passer depuis le programme avec tous les privilèges de la version réelle. Ceci a été rapidement réparé par les vendeurs de firewalls en exécutant des totaux de contrôle sur les applications éprouvées et en avertissant l'utilisateur lorsqu'une copie du programme différente était détectée. Tout était pour le mieux dans le meilleur des mondes.

Passons maintenant à aujourd'hui ou, plus exactement, passons à bien des mois en arrière, quand il m'est venu à l'esprit qu'il y avait probablement encore beaucoup d'autres façons de contourner les processus de détection du trafic sortant des firewalls personnels. Étant donné la logique de LeakTest par laquelle il simule un programme malveillant qui a, d'une façon ou d'une autre, trouvé son chemin sur votre ordinateur (via un e-mail par exemple), vous n'avez alors quasiment aucune chance d'interdire au code de faire tout ce que l'utilisateur d'ordinateur assis devant la machine peut faire. Si vous pouvez fermer votre firewall par un menu contextuel de la zone de notification, alors un programme le peut aussi. Si vous pouvez terminer un processus en ouvrant le gestionnaire de tâches, alors un programme le peut aussi. Vous n'avez aucune chance. Fini de plaisanter.

J'ai lancé l'idée d'écrire un code pour contourner le contrôle de firewall contrairement à ce que j'avais l'intention de faire puisque, comme déjà mentionné, c'était vraiment une idée futile lorsque vous y avez pensé. Bien sûr, il pouvait être fait de plusieurs façons possibles aussi pourquoi perdre du temps. Mais bien sûr, étant un programmeur, il m'arrive de ne pas pouvoir résister à tester simplement des idées et avec tout le bruit qui est actuellement fait autour des réclamations de nombreuses personnes sur divers firewalls, j'ai décidé d'écrire un outil pour tester les concepts avec l'objectif d'obtenir un connexion sortante de réseau secret qui passerait sans être détecté par le firewall.

Tout d'abord, je me suis rendu compte, en fouillant dans les API de réseau de niveau bas qui puissent contourner des objets, elles ne fonctionneraient probablement pas sur tous les firewalls personnels. Il ne serait pas si facile de s'en sortir. En y réfléchissant un peu plus c'est devenu évident. Quelle est la partie de logiciel relative au réseau qu'ont pratiquement tous les utilisateurs d'Internet sur leur système ? En quelle partie de logiciel ont-ils naturellement confiance pour permettre un libre accès sortant sur un port au moins ? Mais, votre navigateur Internet bien sûr ! ZoneAlarm va même jusqu'à placer une jolie case à cocher sur sa fenêtre d'installation demandant si vous voulez donner à votre navigateur un accès inconditionnel à Internet. Parfait !

J'ai donc choisi le navigateur Internet comme cible. Maintenant, comment mieux orienter son utilisation ? Bien, nous pourrions probablement utiliser un langage de script ou une ActiveX fantaisiste qui se charge chaque fois que vous lancez le navigateur. Mais il devrait y avoir une meilleure solution...

Retour en arrière : Il y a longtemps j'ai écrit un enregistreur de frappe en utilisant la fonction Win32 SetWindowsHookEx . Cette fonction puissante vous permet d'intercepter un grand nombre d'évènements du système d'exploitation comme des messages de fenêtres qui sont envoyés à toutes les fenêtres, tous les mouvements de la souris et le clic sur un bouton, ainsi que toutes les frappes (pour l'enregistreur de frappe). La caractéristique la plus puissante de cette fonction est le fait que si vous placez votre fonction d'interception dans une DLL, celle-ci est alors chargée avec toute application qui se présente et est traitée comme faisant partie du même espace de processus que cette application.

J'ai donc choisi la solution SetWindowsHookEx. Si je créais une DLL qui attende de s'apercevoir qu'elle est utilisée par votre navigateur Internet, j'aurais la certitude qu'en créant un canal de communication de réseau à ce moment là, je serais alors à l'abri de la détection parce qu'elle serait dans l'espace du processus du navigateur et serait donc presque certainement acceptée par le firewall. Je pourrais probablement entrer en communication avec l'extérieur sur le réseau en utilisant un port TCP quelconque, mais il existe certains utilisateurs paranoïaques qui ont paramétré les règles de leur firewall pour n'autoriser le navigateur Internet à dialoguer qu'avec des ports spécifiques. Mais le port TCP 80 est pratiquement garanti.

Le programme que j'ai enfin terminé s'appelle FireHole et occupe 13 Ko (non compressés). Cette taille peut sembler un peu élevée à certains programmeurs (pas nombreux !), mais elle correspond au programme lui-même et à la DLL qu'il utilise comme ressource et que le programme extrait au démarrage. Le programme n'occupe en réalité que 7 Ko et la DLL dont il accouche occupe 5 Ko.

Flash : Bien que mon programme ait été prêt à fonctionner, je n'étais pas pressé de communiquer d'informations à son sujet. J'avais pensé que peut-être la société de sécurité informatique Foundstone pour laquelle je travaille, pourrait désirer en faire quelque chose dans un cadre consultatif, mais j'ai jugé qu'il n'en valait probablement ni le temps ni la peine. Environ une semaine auparavant j'avais mentionné, dans les groupes de discussion GRC, que j'avais créé un programme qui pourrait faire échouer la détection du courrier sortant des firewalls personnels, provoquant ainsi une petite révolution. Mais, une semaine plus tard environ, tandis que j'étais en déplacement pour mon "vrai" travail, je visitais à nouveau les groupes de discussion GRC sur lequels je remarquais une publication véhémente de Bob Sundling portant le titre "ZoneAlarm et LeakTest sont une plaisanterie ! :-(:-(" . Tout à fait par hasard (!), il proclamait la faillite des firewalls personnels en mettant à disposition un outil de démonstration qui utilisait le navigateur Internet du système pour transmettre des informations sans que l'utilisateur le sache. Bien que sa technique ait été étonnamment simple dans son approche et semblable à la mienne quant à l'utilisation du navigateur Internet, la similitude s'arrêtait là. J'estime que ma méthode est beaucoup plus puissante et pourrait être utilisée de beaucoup de façons différentes. Par exemple si la DLL, au lieu d'être détectée, était utilisée par le client d'e-mail du système, elle pourrait probablement sans risque faire sortir l'information sur le port TCP 25 (SMTP) non détecté. On aurait le même résultat avec toute autre application d'utilisation courante à laquelle on peut se fier. De plus, le prgramme n'est pas limité à l'utilsation du protocole HTTP et peut envoyer et recevoir n'importe quel volume de données.


Cliquer ici pour télécharger firehole.exe (13 Ko)


L'utilisation de FireHole est très simple. Lancez le programme. Il apparaît une fenêtre contenant une zone pour entrer l'adresse IP et le port TCP à utiliser. Par défaut, il est configuré pour dialoguer avec keir.net (66.39.30.176) sur le port 80. Vérifiez si que vous êtes connecté à Internet et cliquez sur le bouton Start. Cette action lance le navigateur Internet de votre système. Dès que le navigateur a été lancé, la DLL piège se charge automatiquement dans l'espace d'adresse du navigateur et elle vérifie si le texte de fenêtre est identifié comme étant celui d'un navigateur Internet connu. Si c'est le cas, elle crée une connexion vers keir.net et envoie un petit message en texte contenant le nom de l'utilisateur connecté, le nom de l'ordinateur et un message revendiquant la victoire sur le firewall et l'heure à laquelle le message a été envoyé. Le message doit se présenter à peu près comme suit :

Message from user "rkeir" on computer WIN2K [192.168.1.100] at 11/06/01 19:37:38
***** I have successfully bypassed the personal firewall! *****

Peut-être pensez-vous que ce message contient trop d'informations personnelles et qu'il est trop révèlateur. Eh bien, pensez tout simplement à ce qu'un programme "troyen" utilisant cette technique pourrait envoyer ! Des fichiers, des documents privés, des mots de passe, des numéros de cartes de crédit...

Vous avez mon assurance personnelle que FireHole n'exécute pas d'autres actions que celles décrites dans cet article. Ce n'est PAS un "Cheval de Troie", mais une simulation de ce qu'un programme malicieux pourrait être capable de faire.


Choses à essayer

  • Pour mieux simuler comment un "cheval de Troie" travaille, vous pouvez choisir de cacher la fenêtre du navigateur Internet tant que le programme fonctionne. Faites le en cochant la case à la partie supérieure de la fenêtre. Bien sûr un vrai cheval de Troie n'a même pas cette fenêtre de contrôle visible ; totalement invisible, il agit en arrière-plan, réquisitionnant votre navigateur Internet pour envoyer et recevoir tout ce qu'il choisit, tant que votre firewall personnel dit "Ah, ce n'est que le navigateur Internet. Aucun problème. J'ai confiance en lui" .

  • Peut-être voudriez-vous voir si vous pouvez contourner votre firewall en envoyant le message à une adresse différente sur un port différent. Pour envoyer des données sur un port différent au standard 80, vous devrez avoir donné votre autorisation de navigation Internet de dialoguer sur n'importe quel port. La plupart des personnes n'ont pas suffisamment de savoir-faire pour configurer leur firewall afin de permettre à leur navigateur de communiquer seulement sur certains ports et il y arrivera probablement . Une fois encore, pour réaliser cette opération, vous devrez avoir un autre ordinateur (non spécifiquement certifié par votre firewall) écoutant sur l'adresse IP et le port que vous avez choisis. Une façon simple de le faire consiste à faire fonctioner un auditeur Netcat. Téléchargez Netcat ici puis lancez le ainsi depuis la ligne de commande sur l'ordinateur cible :-

    nc -vLp 6666

    Dans cet exemple nous écoutons sur le port 6666. Quand/si FireHole envoie le message, vous devez le voir apparaître dans la fenêtre DOS du système cible.


Pourquoi peut-il ne pas fonctionner

Ce programme n'est pas parfait. Il a été écrit rapidement juste pour une démonstration, aussi s'il ne réussit pas à se connecter et à envoyer le message, cela peut provenir de plusieurs raisons. Si votre firewall voit la transmission, il est alors évident qu'il n'a pas fonctionné. Peut-être avez-vous configuré votre firewall pour toujours vous prévenir quand votre navigateur Internet démarre, ou peut- être même avez-vous fait en sorte qu'il vous informe chaque fois qu'il provoque une connexion. Si vous le faites, vous faites certainement partie de la minorité et vous êtes extrêmement vigilant et prudent. Si votre firewall ne voit pas la communication mais si le programme affirme ne pas avoir travaillé, peut-être alors n'a-t-il pas reconnu votre navigateur Internet.


Finalementy...

J'insiste sur ce que j'ai dit au tout début de cet article. Cette technique et toutes les techniques similaires reposent sur un programme malicieux arrivant et s'exécutant sur votre système. Si vous pouvez l'arrêter, vous êtes alors sauvé. Si vous ne pouvez pas l'arrêter, alors fini de plaisanter - le programme malicieux contrôle entièrement votre ordinateur. Par conséquent, tenez votre programme antivirus à jour, gardez votre client d'e-mails verrouillé avec des réglages corrects de la zone de sécurité, n'ouvrez jamais les pièces jointes qui peuvent contenir des exécutables et limitez éventuellement les ports sur lesquels peuvent dialoguer votre navigateur Internet et les autres applications d'utilisation courante.


Addendum

Concernant le paragraphe 4 ci-dessus :

"Bien sûr il pourrait être fait de plusieurs façons, aussi pourquoi perdre du temps..."

Depuis que cette page et l'outil de démonstration ont été publiés, plusieurs personnes m'ont demandé ce que je voulais dire par ce commentaire. "Vous voulez dire que c'est le seul moyen de vaincre le firewall ?". La partie "plusieurs voies possibles" peut constituer pour beaucoup d'entre vous des informations dérangeantes, mais pour certaines personnes ce sont des informations anciennnes. Je vous suggère de visiter quelques sites Web de sécurité d'ordinateurs confirmés ou d'imprimer une copie de Hacking Exposed (publicité flagrante pour le livre publié par certains des fondateurs de Foundstone :-) et de le lire d'un bout à l'autre. Portez une attention particulière au chapitre sur les firewalls. Après lecture d'un tel livre, les capacités de blocage du courrier sortant de votre firewall personnel seront probablement le moindre de vos soucis !


Mais patientez, ce n'est pas terminé !...

Pour vous autres techniciens :

  • Essayez de scanner votre firewall en utilisant des ports de source généralement autorisés tels que TCP 20 (données FTP), TCP & UDP port 53 (DNS), UDP 67 & 68 (BootP et DHCP), UDP 69 (TFTP) et UDP 520 (RIP).
  • Essayez d'envoyer des données en utilisant UDP 53 (DNS) ou l'un des ports DHCP mentionnés ci-dessus.
  • Sur Windows 2000 ou XP, essayez d'envoyer des paquets TCP en utilisant des "sockets" bruts.
J'ai testé et confirmé qu'au moins une de ces méthodes complémentaires permettait decontourner à peu près tous les firewalls personnels pour autant qu'il y ait détection de flux sortant. Vous pouvez être consterné et surpris de constater que votre firewall personnel est une véritable "passoire". :-)


FireHole dans la presse

NewsBytes
CNet
Information Security Magazine
PC Flank
The Register


Robin Keir . 9/11/2001 21:03


[ Accueil | Quoi de neuf | Logiciels | Liens | À propos | E-mail | Dons ]

Browser Based Help. Published by chm2web software.