Sécurité : Brute Force
L'attaque par force brute est une attaque qui consiste à deviner un mot de passe en essayant un maximum de combinaisons successives.
L’attaque par force brute est l’une des techniques les plus primitives, et pourtant, elle s’avère aujourd’hui encore efficace pour compromettre la sécurité des systèmes. Comprendre comment elle fonctionne et comment s’en protéger est crucial dans le maintien de la sécurité des données en ligne.
Comprendre l’attaque par force brute
Définition
L’attaque par force brute est une technique d’attaque informatique où l’attaquant tente de deviner un mot de passe ou une clé de chiffrement en essayant de multiples combinaisons de manière répétée, jusqu’à ce qu’il trouve la bonne.
Une technique de bourrin… qui porte bien son nom !
Fonctionnement
Le fonctionnement de l’attaque par force brute est assez simple : l’attaquant exécute un programme informatique ou un script pour générer des combinaisons de caractères et les teste une à une jusqu’à ce que le mot de passe correct soit trouvé.
Pour optimiser son efficacité, une attaque par force brute respecte une méthodologie bien précise décomposée en 2 étapes : la collecte d’informations sur la cible puis le test de combinaisons de caractères.
1. Collecte d’informations
Avant de commencer l’attaque, l’attaquant analyse sa cible pour obtenir des informations utiles.
Cette phase permet d’adapter l’algorithme de force brute à l’environnement sur lequel il doit s’exécuter.
- S’agit-il de décrypter une clé de chiffrement ou de hachage ?
- S’agit-il de deviner un mot de passe ?
- Etc.
La plupart du temps, les attaques par force brute sont utilisées pour craquer des mots de passe et ainsi accéder à des comptes utilisateurs sur des plateformes web.
Dans ce cas précis, cette phase d’analyse se concentre sur la construction de la requête HTTP à envoyer et la structure de la réponse HTTP retournée.
Analyse de la requête HTTP
- Méthode de requête : La méthode HTTP utilisée (
GET
,POST
, etc.) peut révéler des informations sur la manière dont les données sont envoyées au serveur et comment le système de gestion des identifiants pourrait être configuré. - Paramètres de requête : Quels paramètres de requête sont envoyés au serveur (
username
,email
,password
…), et comment sont-ils envoyés ? (dans le corps de la requête ?). - En-têtes HTTP : Les en-têtes HTTP peuvent contenir des informations supplémentaires qui pourraient être utiles pour cibler l’attaque (comme des cookies nécessaires par exemple).
Analyse de la réponse HTTP
- Code de statut : Le code de statut de la réponse HTTP peut indiquer si la tentative de connexion a réussi (code
200
) ou échoué (codes400
,401
…), ce qui peut aider l’attaquant à ajuster sa stratégie d’attaque en fonction des réponses reçues. - Corps de la réponse : Le corps de la réponse HTTP peut contenir des informations supplémentaires sur le résultat de la tentative de connexion, telles que des messages d’erreur spécifiques ou des indications sur les politiques de sécurité en place.
- En-têtes de réponse : Les en-têtes de réponse peuvent également fournir des informations supplémentaires sur le serveur, telles que le type de serveur utilisé, qui peuvent être utiles pour comprendre la configuration du système cible.
2. Test de combinaisons
Pour tester des combinaisons de caractères, on distingue 2 grandes approches : l’usage d’un dictionnaire de données et la génération incrémentale.
Les attaques par force brute exploitent généralement conjointement ces 2 approches.
Dictionnaire de données
Un dictionnaire de données est une liste des mots de passe les plus couramment utilisés. Cette liste est alimentée par des fuites de données suites à des attaques ou sont le fruit d’analyses de tendance par des chercheurs en cybersécurité.
On y retrouve par exemple les mots de passes suivants : password
, 123456
, qwerty
, 12345678
, abc123
, password123
, iloveyou
, letmein
, admin
, welcome
…
La force brute par dictionnaire de données est rapide et efficace puisqu’elle consiste à exécuter un script testant l’ensemble des mots contenus dans ce dictionnaire.
Voici le fonctionnement global des algorithmes de brute force par dictionnaire de données en pseudo-code :
Fonction forceBrute(dictionnaire) :
Pour chaque mot dans le dictionnaire :
Si le mot est la solution recherchée :
Afficher le mot
Afficher "Mot de passe non trouvé"
// Utilisation de l'algorithme
dictionnaire = ['mot1', 'mot2', 'mot3', ...] // Liste de mots possibles
forceBrute(dictionnaire)
Le mot de passe testé est bien entendu haché par un algorithme et est ensuite comparé au hash enregistré en base de données. Aucun mot de passe ne doit être stocké en clair dans une base de données.
Si cette méthode s’avère efficace pour hacker des comptes peu sécurisés, elle ne marche heureusement pas à tous les coups !
Génération incrémentale
Lorsque le mot de passe de la cible n’est pas défini dans un dictionnaire de données, il ne reste plus qu’une chose à faire : tester toutes les combinaisons de caractères possibles.
Pour cela, l’attaquant va exécuter un script qui génère systématiquement toutes les combinaisons possibles de caractères (lettres, chiffres, caractères spéciaux) jusqu’à ce que le mot de passe correct soit trouvé.
Concrètement, l’algorithme défini un jeu de caractères à exploiter :
abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789
!@#$%^&*()-_=+[]{}|;:'",.<>?/
Nous avons ici 91
caractères :
26
lettres minuscules26
lettres majuscules10
chiffres29
caractères spéciaux
Puis, teste tous les mots de passe sur un caractère, puis deux, puis trois…
# Combinaisons sur 1 caractère
a b c ... z
A B C ... Z
0 1 2 ... 9
! @ # ... /
# Combinaisons sur 2 caractères
aa ab ac ... zz
AA AB AC ... ZZ
01 02 ... 99
!! !@ !# ... //
Cette méthode est exhaustive et garantit de trouver le mot de passe, mais peut être très longue pour des mots de passe longs et complexes.
- Pour trouver toutes les combinaisons d’un jeu de 91 caractères différents :
- De longueur
1
, cela demande91^1 = 91
tentatives - De longueur
2
, cela demande91^2 = 8 281
tentatives - De longueur
3
, cela demande91^3 = 753 571
tentatives - …
- De longueur
12
, cela demande91^12 = 322 475 487 413 604 782 665 681
tentatives
Vous aurez compris l’intérêt d’avoir un mot de passe sécurisé… 🫣
Voici le fonctionnement global des algorithmes de brute force par génération incrémentale en pseudo-code :
Fonction forceBrute(caracteres, longueurMax) :
Pour chaque longueur de mot de passe de 1 à longueurMax :
Pour chaque combinaison possible de caractères dans cette longueur : // nombre de combinaisons = caractères^longueur
Si la combinaison est la solution recherchée :
Afficher la combinaison
Afficher "Mot de passe non trouvé"
// Utilisation de l'algorithme
caracteres = ['a', 'b', 'c'...]
longueurMax = 8
forceBrute(caracteres, longueurMax)
Voici un tableau résumant à titre indicatif la temps qu’il faut à un algorithme de force brute à hacker un mot de passe, en fonction de sa complexité (longueur + jeu de caractères utilisé).
Longueur | Chiffres (0-9 ) | Lettres min (a-z ) | Lettres min et maj (a-z , A-Z ) | Lettres et chiffres | Lettres, chiffres et caractères spéciaux |
---|---|---|---|---|---|
4 | Critique | Critique | Critique | Critique | Critique |
5 | Critique | Critique | Critique | Critique | Critique |
6 | Critique | Critique | Critique | Faible | Faible |
7 | Critique | Critique | Faible | Faible | Faible |
8 | Critique | Faible | Faible | Faible | Faible |
9 | Critique | Faible | Faible | Moyenne | Moyenne |
10 | Critique | Faible | Moyenne | Moyenne | Bonne |
11 | Faible | Moyenne | Moyenne | Bonne | Bonne |
12 | Faible | Moyenne | Bonne | Bonne | Bonne |
13 | Faible | Moyenne | Bonne | Bonne | Excellente |
14 | Critique | Bonne | Bonne | Excellente | Excellente |
15 | Critique | Bonne | Excellente | Excellente | Excellente |
16 | Moyenne | Bonne | Excellente | Excellente | Excellente |
17 | Moyenne | Bonne | Excellente | Excellente | Excellente |
18 | Moyenne | Excellente | Excellente | Excellente | Excellente |
Ce tableau vous permet de visualiser pourquoi la recommandation officielle pour un mot de passe sécurisé est d’au moins 12 caractères avec chiffres, lettres min et maj et des caractères spéciaux.
Si le mot de passe est haché avec une fonction de hachage moderne comme bcrypt
ou argon2
, alors les attaques par force brute serons entravées par le work factor.
(BONUS) Social Enginering
Bien moins utilisée en raison de sa complexité et de son caractère monocible, le « Social Enginering » peut être couplé au brute force de manière à adapter un dictionnaire de données à sa cible. Le Social Enginering consiste à deviner les mots de passe en exploitant des informations personnelles collectées sur la victime, bien souvent sur les réseaux sociaux. Il peut par exemple s’agir de :
- Nom de famille
- Prénom
- Surnom
- Date de naissance
- Nom d’un animal de compagnie
- Film préféré
- Etc.
Sur cette base, un algorithme peut se charger de tester un à un ces éléments de manière brute à la manière d’un dictionnaire ou en les mixant à des caractères générés de manière incrémentielle pour optimiser les chances de trouver le mot de passe (exemple : toto-64
, toto-65
…).
Comprendre par l’exemple
Imaginons qu’un utilisateur nommé Thomas Dupont possède un compte sur une plateforme communautaire de devs. Il peut y publier des articles, sous le pseudo toto
, servant aussi d’identifiant pour se connecter à la plateforme.
username=toto
Un utilisateur malveillant sachant cela, n’aura aucun mal à trouver le username de sa cible. Il lui reste à trouver son mot de passe.
Pour cela :
- Il analyse comment le formulaire de login traite l’identifiant et le mot de passe en analysant les requêtes et réponses HTTP dans l’outil de développement de son navigateur. Il constate qu’en cas de mauvais mot de passe, le serveur retourne un code d’erreur
401
et en cas de succès un code200
(il constate cela en se connectant avec succès à son propre compte). - Il adapte son script JS de brute force pour envoyer des requêtes HTTP répetées au serveur via la fonction
fetch()
, en transmettant dans le corps de la requête les paramètresusername
etpassword
. - Il exécute son script en le collant dans la console JS du navigateur. La boucle de brute force est alors lancée…
POST https://example.com/login.php // 🔒 401
{
"username": "toto",
"password": "aaaaaaaa"
}
POST https://example.com/login.php // 🔒 401
{
"username": "toto",
"password": "aaaaaaab"
}
⌛ Un billion + de générations plus tard...
POST https://example.com/login.php // ✅ 200
{
"username": "toto",
"password": "yD-4hX2P"
}
Risques de l’attaque par force brute
Les risques associés à l’attaque par force brute varient en fonction du système ciblé. Hacker votre compte sur un forum d’élevage canin n’aura évidemment pas les mêmes conséquences que hacker votre espace bancaire en ligne…
Parmi ces risques, on pourrait notamment citer :
- 💳 Vol d’identité : Utilisation de vos informations personnelles pour des activités frauduleuses.
- 📧 Compromission d’e-mails : Accès à vos e-mails privés, pouvant entraîner la divulgation d’informations sensibles.
- 💻 Perte de données : Suppression ou modification de vos données personnelles ou professionnelles.
- 💰 Fraude financière : Accès à vos comptes bancaires ou de paiement en ligne, entraînant des pertes financières.
- 🔗 Propagation d’attaques : Utilisation de votre compte compromis pour envoyer des spams ou lancer des attaques contre vos contacts.
- 📲 Perte de contrôle des réseaux sociaux : Publication de contenus inappropriés ou compromettants en votre nom.
- 🌐 Atteinte à la réputation : Les actions malveillantes menées sous votre identité peuvent nuire à votre réputation personnelle ou professionnelle.
- 💸 Demande de rançon : Les hackers peuvent exiger une rançon s’ils trouvent des données personnelles compromettantes.
Se protéger contre l’attaque par force brute
Pour se protéger contre l’attaque par force brute, voici quelques bonnes pratiques à suivre :
1. Utiliser des mots de passe forts
- ⚠️ Un mot de passe trop court / utilisant un jeu de caractères trop faible prendrait trop peu de temps à un algorithme de brute force pour être testé.
- ⚠️ Un mot de passe utilisant des combinaisons logiques/classiques pourrait figurer dans un dictionnaire de donnes de brute force.
- ⚠️ Un mot de passe faisant référence à des données personnelles pourrait être devinable par Social Enginering.
- ⚠️ Un mot de passe réutilisé pourrait compromettre plusieurs comptes s’il était compromis lors d’une fuite de données.
Un mot de passe sécurisé, c’est un mot de passe unique, long d’au moins 12 caractères (lettres min et maj, chiffres et caractères spéciaux) combinés aléatoirement.
2. Limiter les tentatives de connexion
Mettez en place des mécanismes de blocage des tentatives de connexion après un certain nombre d’échecs.
Cela peut inclure :
- Le verrouillage temporaire du compte
- L’exigence d’une vérification supplémentaire
- L’augmentation progressive du délai entre les tentatives
Ces mesures limitent l’efficacité des attaques par force brute en rendant plus difficile et plus long pour les attaquants de deviner un mot de passe correct, car chaque échec entraîne une pénalité.
3. Utiliser des CAPTCHA
Les CAPTCHA (Completely Automated Public Turing test to tell Computers and Humans Apart) sont des tests conçus pour différencier les humains des robots.
Voici quelques exemples de CAPTCHA que vous avez forcément croisé :
- CAPTCHA de texte déformé : Les utilisateurs doivent saisir les caractères d’un texte déformé affiché dans une image.
- CAPTCHA d’images : Les utilisateurs doivent sélectionner les images qui contiennent des objets spécifiques, comme des voitures ou des feux de circulation.
- CAPTCHA de calcul : Les utilisateurs doivent résoudre une simple opération mathématique, comme
3 + 4
. - CAPTCHA de sélection d’objet : Les utilisateurs doivent cliquer sur des objets spécifiques dans une image complexe.
- CAPTCHA de glisser-déposer : Les utilisateurs doivent faire glisser un objet dans une zone spécifique de l’écran.
- ReCAPTCHA de Google : Les utilisateurs doivent cliquer sur une case à cocher « Je ne suis pas un robot » ou identifier des images correspondant à une description donnée.
Les CAPTCHA complexifient les tentatives de connexion par force brute en ajoutant une étape de vérification que les scripts automatisés ne peuvent pas facilement contourner. Cela oblige les attaquants à résoudre manuellement chaque CAPTCHA, ce qui ralentit considérablement leurs efforts et les dissuade souvent de continuer.
4. Utiliser la double authentification
De plus en plus de plateformes encouragent la mise en place de la double authentification (2FA
), un système très efficace pour éviter l’usurpation d’identité.
La double authentification ajoute une couche supplémentaire de sécurité en demandant non seulement votre mot de passe, mais aussi un second facteur de vérification. Ce second facteur peut être :
- Code par SMS : Après avoir saisi votre mot de passe, vous recevez un code unique par SMS que vous devez entrer pour accéder à votre compte.
- Application d’authentification : Des applications comme Google Authenticator ou Authy génèrent des codes temporaires qui changent toutes les 30 secondes.
- Clés de sécurité : Des dispositifs physiques comme les clés YubiKey doivent être connectés à votre appareil pour valider votre identité.
Cette méthode complique grandement la tâche des hackers, car même s’ils obtiennent votre mot de passe, ils auront besoin de ce second facteur pour accéder à votre compte.
5. Surveiller les activités suspectes
Mettez en place des systèmes de surveillance pour détecter les activités suspectes, telles que des tentatives répétées de connexion avec des mots de passe incorrects.
Pour éviter aux développeurs de coder ces mécaniques « from scratch », il existe de nombreux outils de monitoring tels que Splunk ou Wordfence (dans l’écosystème Wordfence) pour analyser les journaux de connexion et identifier des comportements anormaux, comme un grand nombre de tentatives échouées en peu de temps ou des connexions provenant de lieux géographiques inhabituels.
Ces outils permettent, entres autres, la configuration d’alertes automatiques pour informer les administrateurs lorsqu’une activité suspecte est détectée, afin qu’ils puissent prendre des mesures immédiates pour protéger les comptes. Cette surveillance proactive permet de réagir rapidement aux tentatives d’intrusion et de renforcer la sécurité globale du système.
L’attaque par force brute reste une menace élémentaire mais sérieuse pour la sécurité des systèmes et des données en ligne. En comprenant son fonctionnement et en mettant en œuvre des mesures de sécurité appropriées, il est possible de réduire considérablement les risques associés à cette forme d’attaque.