Skip to content

Attaque brute force : construire un dictionnaire efficace

Dans cet article, nous allons parler de la génération de wordlist (ou dictionnaire) à l’aide de certains outils spécialisés dans le cadre des attaques par brute force.

Il m’est souvent arrivé, dans les CTF ou VM vulnérables auxquelles je m’attaque, de passer du temps à attendre la fin d’une attaque par brute-force alors que, dans la plupart des CTF/VM, les mots de passe auraient pu être trouvés plus intelligemment. J’ai donc été amené à trouver des solutions afin d’être plus efficace, je les partage aujourd’hui avec vous :).

Un petit mot sur les attaques par brute-force

Les attaques par brute-force sont en général efficaces que si elles sont exécutées intelligemment et que plusieurs facteurs sont réunis. A ce titre, deux types d’attaques par brute force existent :

  • L’attaque par dictionnaire : Elle consiste à tester un ensemble (quasi) fini de possibilité. Celles-ci se trouvent généralement dans un fichier nommé « dictionnaire » ou « wordlist« . Un dictionnaire est donc une grande liste de mot de passe probables pour un compte donné. Les dictionnaires sont généralement construit à partir de mots de passe leakés (fuite de donnée), des mots de passe les plus utilisés, des mots de passes probables pour une organisation donnée, etc.
  • L’attaque… sans dictionnaire : Une attaque par brute force sans dictionnaire est plus simple à expliquer, mais généralement beaucoup moins efficace (nous verrons ensuite pourquoi). Celle-ci consiste à tester l’ensemble des combinaisons possibles pour un nombre de caractère libre ou défini. Si l’on sait que le mot de passe de notre cible fait trois caractères de long, nous allons commencer par tenter « aaa », puis « aab », puis plus tard « ab1 » pour finir à quelque chose comme « zzz », « 999 » ou « z!9 ». Bref, on tente toutes les possibilités alphanumériques + caractères spéciaux et ceci pour un nombre inconnu de caractère (la plupart du temps, entre 4 et 15).

Si l’on devait discuter de l’efficacité des deux méthodes, on commencera par dire que l’attaque sans dictionnaire à une chance de réussite de 100%. En effet, si on laisse l’attaque se dérouler sur une durée infinie, on finira forcément par trouver la combinaison (puisqu’elle sont, au final, toutes testées). Le problème est que celle-ci est considérée comme peu efficace car un attaquant ne dispose pas d’un temps illimité.

L’attaque par dictionnaire repose sur des critères plus cohérents comme la liste des mots de passe les plus utilisés en 2016 ou le contexte du compte que l’on attaque (avec les mots « facebook », « fb », « fbook » si l’on attaque un compte facebook ou « gmail », « mail », « m@il », « google », si l’on attaque un compte Gmail par exemple). Pour la liste des mots de passe courants (et par conséquent, faibles), on peut en trouve sur le net. Ces listes sont généralement construite à partir des leaks de données majeurs comme ceux d’Adobe : Top 100 Adobe Passwords with Count

La cohérence des critères choisis et la considération du facteur temps amènent généralement à définir l’attaque par dictionnaire comme plus efficace. Pour s’en protéger en tant qu’utilisateur, il « suffit » de suivre les considérations habituelles de construction d’un mot de passe fort et notamment :

  • Construire un mot de passe qui n’est pas en lien avec un critère personnel (date, nom, prénom, ville, pays)
  • Construire un mot de passe qui n’est pas intelligible (nom du site, mot d’une langue quelconque, année)

Pour se protéger des attaque par brute force sans dictionnaire, il faut :

  • Avoir un mot de passe (très) long
  • Avoir un mot de passe qui mélange les caractères alphanumérique, majuscules/minuscules et caractères spéciaux

Et oui, une attaque par brute force trouvera toujours plus facilement « aaa » que « z^a@!9Z$ ». On peut le comprendre par une simple logique lorsque l’on connait le fonctionnement d’une attaque par brute force.

Côté serveur, la méthode la plus efficace de protection reste l’implémentation d’un quota de tentative d’authentification par login/ IP. (Éviter de porter votre quota sur les cookies, ça se supprime facilement).

Le sujet ici est donc, pour un attaque de type brute-force avec dictionnaire, comment en construire un efficace ?

Construire une wordlist cohérente

L’efficacité d’une wordlist va donc porter sur sa cohérence, c’est à dire la probabilité que l’un des mots de passe qu’elle contient soit effectivement utilisé. Il faut ici partir du principe que :

  • Vous connaissez au moins un login valable, on peut ici utiliser des techniques d’user-énumeration au préalable (article à venir)
  • Ce compte utilise une mot de passe que l’on peut considérer comme faible (car pouvant être trouvé dans une wordlist 🙂 )

Ici, savoir à qui l’on s’attaque peut être une information intéressante. Un particulier sur son compte facebook mettra plus fréquemment un mot de passe faible alors que l’administrateur système d’une grande entreprise mettra un mot de passe fort (généralement…). Également, il arrive souvent en entreprise ou sur certains sites web que les mots de passe soient cadrés par une politique de mot de passe. On peut trouver ces informations en jouant avec le formulaire de création d’un compte par exemple, on y trouvera des messages comme :

  • « Mot de passe trop faible ! Veuillez saisir un mot de passe d’au moins 5 caractères » : il est alors inutile de tester les mots de votre wordlist avec moins de 5 caractères
  • « Erreur. Votre mot de passe ne doit contenir que des caractères alphanumérique » : il est alors inutile de tester les mots de votre wordlist avec des caractères spéciaux
  • « Mot de passe trop long, votre mot de passe doit faire entre 5 et 15 caractères« 
  • « Votre mot de passe doit contenir au moins un caractères spécial et une majuscules« 
  • etc.

Une fois que ces critères sont connus, il nous faut les bonnes ressources et les bons outils. l’objectif principal de cet article est de vous présenter quelques outils qui vous permettront de créer, ajuster et peaufiner vos dictionnaires. Ceci principalement afin de réduire le temps d’exécution d’une attaque par brute force sans jouer sur son efficacité.

Il existe donc, comme je le dit depuis le début de l’article, des wordlists téléchargeables tirées de différents leak, voici une page qui en référence quelques-unes : https://wiki.skullsecurity.org/Passwords

On peut y trouver les wordlists tirées des leaks, mais également des wordlists propres à des langues particulières (anglais, français, espagnols..). Cela permet de construire une wordlist qui va être adaptée au contexte d’attaque.
Passons maintenant à la revu de quelques outils.

CEWL – Custom Word List Generator

CeWL, pour « Custom Word List Generator« , est un outil qui permet de créer/générer un dictionnaire en se basant sur le site web de notre cible. Il est particulièrement utile lors des CTF/VM car les mots de passes utilisés sont souvent contextuels. Il va plus précisément parser un site web donné afin d’y extraire un ensemble de mots qui, selon vos critères, seront intégrés dans une wordlist. Voici une première utilisation :

cewl -d 2 -m 5 http:///monsite.loc

ici, « -d 2 » indique a CeWL qu’il doit parser (parcourir) le site web cible en descendant jusqu’à deux répertoires (« depth » en anglais, pour profondeur).
CeWL permet également de récupérer les adresses mail présentes sur un site web. Ce qui peut être pratique dans le cadre de la construction d’un dictionnaire :

cewl --email -d 2 http:///monsite.loc

Comme la plupart des outils de ce genre, on peut bien sur spécifier des options annexes comme l’utilisation d’un proxy (« –proxy_host » et « –proxy_port« ), l’écriture de la sortie dans un fichier (« -w« ), etc.

PassGen – PassGenerator

PassGen est un outil Python que j’ai trouvé récemment sur GitHub, il permet de donner des dérivées à partir d’un mot de passe.

J’utilise PassGen essentiellement pour la conversion en Leet Speak, qui est une technique souvent recommandée pour construire des mots de passe fort. Le Leet Speak consiste essentiellement à « transcrire » certaines lettres par d’autres, par des signes ou des chiffres. Par exemple, « Facebook » deviendra « f4c3b00k » ou « Fac3|3o0|<« . On a alors en principe un mot de passe non intelligible (qui n’existe pas dans le dictionnaire français), mais qui peut tout de même être retrouvé si on utilise PassGen et sa conversion en Leet Speak.

PassGen se compose de plusieurs scripts et options, je ne les présente pas tous ici.
Pour télécharger PassGen,  il faut se rendre sur l’espace Github de « Broham » : https://github.com/Broham/PassGen

cd /opt/
git clone https://github.com/Broham/PassGen

On peut ensuite utilise PassGen, il suffit de lui passer un mot de passe en entré, il générera ensuite à partir de ce mot de passe des dérivées possibles :

root@kali [/opt/PassGen] # python passgen.py facebook
facebook1
facebook2
facebook3
[..]
Facebook$
Facebook%
Facebook^
Facebook&
Facebook*

L’option « -n » permet d’ajouter des chiffres au mot de passe, ce qui permet de retrouver des mots de passe de type « MaSociete@2016 » ou « 2016_masociete » (ce qui est commun):

root@kali [/opt/PassGen] # python passgen.py -n facebook
facebook1
facebook2
facebook3
[..]
facebook100
facebook211

Pour la transcription Leet speak, j’utilise l’option « -f » :

root@kali [/opt/PassGen] # python passgen.py -f facebook
facebook
facebooK
[..]
facebOOK
facebO0k
facebO0K
[..]
faceb0QK
facebQok
[..]FA{EBOQk
[..]
F4<36oOk
F4<36oOK
F4<36o0k

Pour l’option « -f« , plus le mot de passe saisi en paramètre est long, plus il y aura de dérivées et le nombre peut être très important (18432 pour « facebook » par exemple).
Pour utiliser PassGen.py sur une wordlist déjà existante, un petit script bash en one-liner :

for i in $(cat wordlist.txt); do python passgen.py -f $i >> wordlist.2.txt; done

On se retrouve alors, pour chaque mot de passe de wordlist.txt, avec l’ensemble des dérivés dans wordlist.2.txt

Crunch

Crunch est un outil dont l’utilisation peut être assez poussée, il s’agit de l’outil principale qui est ressorti d’après mes recherches mais son utilisation est quelque peu complexe et je ne l’utilise que rarement. Je le présente tout de même car il est très flexible, ce qui est donc très intéressant. Voici quelques exemples d’utilisation :

crunch 4 8

Crunch va ici générer un ensemble de mot de passe entre 4 et 8 caractères, en se basant sur les lettres de l’alphabet, donc de « aaaa » à « zzzzzzzz ». On peut ensuite utiliser des caractères bien précis. Par exemple si l’on sait que les caractères spéciaux et les chiffres « 4 », « 5 », « 6 » sont interdits :

crunch 4 8 abcdefghijklmnopqrstuvwxyz123789 -o /root/wordlist.lst

Ici, seuls les caractères spécifiés seront utilisés. On peut également aller assez loin dans l’utilisation de crunch et spécifier des charsets. Par exemple :

-t @,%^
   Specifies a pattern, eg: @@god@@@@ where the only the @'s, ,'s, %'s, and ^'s will change.
   @ will insert lower case characters
   , will insert upper case characters
   % will insert numbers
   ^ will insert symbols

Crunch permet de générer des mots de passe en masse, notamment à l’aide des charsets. Un outil à connaitre 🙂

altDNS – alternative DNS

altDNS est un outil que j’utilise à la base pour trouver des noms de domaine dérivés à partir d’un ensemble de nom de domaine (alternative DNS). Le but est ici, si je demande l’analyse d’une domaine www.monsite.loc, qu’altDNS génère puis test l’existence des noms de domaines dérivés comme www.dev.monsite.loc, www.test.monsite.loc, prod.www.monsite.loc, etc. Il s’agit d’un outil plutôt efficace et par chance, il peut être utilisé pour autre chose que le DNS, dont la génération de liste de mot de passe, notamment pour construire des dérivés de mots de passe qui m’aident généralement à générer des mots de passe contextualisés.

root@kali 10:05 [/opt/altdns] # python altdns.py -i pass.txt -w pass.txt -o pass.output.txt
root@kali 10:05 [/opt/altdns] # cat pass.output.txt | sed 's/\.//g' > final_wordlist.txt

Avec AltDNS, j’ai pour habitude de supprimer les « . » que l’outil ajoute (et oui, il traite des noms de domaine habituellement 🙂 ), j’utilise pour cela la commande « sed ». Voici un extrait du résultat de sortie :

password2012
cisco
rootadmin
:cisco
NomSocieteNomSociete
20142014
root+
2012$
2014cisco
!+
cisco$
20152015
password2014
admin$
$NomSociete
20122015
2015cisco
2012root
password+
password2016
@2012
+!
passwordNomSociete
2014password
+root

Pour avoir cela, mon fichier « pass.txt » contient ces différents éléments :

root@kali 10:08 [/opt/altdns] # cat pass.txt
admin
password
cisco
root
NomSociete
2016
2015
2014
2012
@
!
:
+
$

CUPP- Common User Passwords Profiler

Il s’agit d’un outil que j’ai découvert récemment par l’intermédiaire de ce blog.  CUPP va permettre de générer un liste de mot de passe en rapport avec les caractéristiques d’une personne (entourage, date de naissance, enfant, employeur, etc.) A l’exécution, l’outil demande le maximum d’information à propos du compte visé, puis génère une liste de mot de passe à partir de ces informations :

root@kali 11:42 [/opt/cupp] # python cupp.py -i
[+] Insert the informations about the victim to make a dictionary
[+] If you don't know all the info, just hit enter when asked! ;)
> First Name: John
> Surname: Dupont
> Nickname: Joe
> Birthdate (DDMMYYYY): 03051990
> Partners) name: Alice
> Partners) nickname: Al
> Partners) birthdate (DDMMYYYY): 06051992
> Child's name: Patrick
> Child's nickname: Norbert
> Child's birthdate (DDMMYYYY): 04062001
> Pet's name: Max
> Company name: CyberCop
> Do you want to add some key words about the victim? Y/[N]: N
> Do you want to add special chars at the end of words? Y/[N]: N
> Do you want to add some random numbers at the end of words? Y/[N]:N
> Leet mode? (i.e. leet = 1337) Y/[N]: N

On peut utiliser également un mode « Leet » qui, comme d’autres outils cités précédemment, va utiliser le Leet Speak pour compléter la wordlist générée.
Voici le Github du projet : https://github.com/Mebus/cupp

La liste des mots de passe peut ici être plus complexe. Ne pas oublier également les mots de passe standard comme « password », « admin », qui peuvent servir de mot de passe par défaut sur des équipements réseaux ou des objets connectés ;). Voici un site intéressant à ce sujet : http://defaultpasswords.in/

Il peut ici être intéressant de chainer altDNS et PassGen (et mettre d’autres outils).

Protection contre les brute force

J’ai déjà donné quelques astuces qui permettent aux utilisateurs de construire des mots de passe résistants aux brute force plus haut, mais des pratiques de sécurité peuvent aussi être mises en place par les administrateurs et les équipes de sécurité au sein d’un réseau/d’une infra :

  • HoneyWord : Les HoneyWords sont un principe qui consiste à mettre en place un piège pour les pirates.  Dés qu’un certain mot de passe est saisi pour une authentification, on peut déduire qu’il s’agit d’une tentative de piratage (brute force) et donc déclencher des mesures de protection. Voici un article plus détaillé à ce sujet : Les mots de passe HoneyWords, c’est quoi ?
  • IDS/IPS : Les Intrusion Detection/Prevention Systems permettent généralement d’analyser en temps réel les flux réseaux et les logs et ainsi détecter des attaques par brute force. L’important ici est d’être en mesure de détecter un grand nombre de tentative de connexion, les brute force manquent par définition de discrétion. Souvent, de simples mécanismes de détection permettent de lever des alertes lors d’une attaque.
  • Quota : La mise en place de quotas, directement au niveau de l’application web, est généralement une bonne mesure à mettre en place. Un quota va être une limite de tentative d’authentification dans le temps. Par exemple : au bout de 5 tentatives d’authentification infructueuses en moins de 10 minutes, le compte est bloqué, ou l’IP est bannie. L’outil Fail2ban est ici une option intéressante (HTTP, SSH , FTP). Voici un article sur sa configuration : Premiers pas avec Fail2ban
  • Politique de mot de passe : Au niveau des systèmes d’information d’entreprise, il est crucial de mettre en place une politique de mot de passe centralisée et stricte. Le but est ici d’interdire aux utilisateurs de paramétrer des mots de passe faibles pour leur compte. On peut par exemple exiger que le mot de passe saisi contienne 10 caractères minimum avec une majuscule, une minuscule, un chiffre et un caractère spécial minimum. Le système PAM.d sous Linux permet par exemple par défaut de détecter si le mot de passe saisi contient un mot intelligible (en anglais). Ce qui peut être une base intéressante pour construire une politique de mot de passe.

La construction d’une wordlist cohérente permet généralement d’exécuter une attaque par brute-force qui va porter ses fruits quand les différentes bonnes pratiques et mesures de protection ne sont pas mises en place.
N’hésitez pas à partager votre avis et vos astuces dans les commentaire

Partager :
Published inAttaques

3 Comments

  1. Mourad

    vos articles sont vraiment super , bravo , et merci beaucoup pour tout ce que vous faites 🙂

  2. Axel

    Un super blog ! Félicitation. Bien rédigé, de belles images bref au top. Merci

  3. Mahoni

    Une autre solution peut être, le 2FA

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *