Aujourd’hui j’ai reçu ma facture mensuelle de mon fournisseur internet et quelque chose m’a semblé bizarre.
La facture, contenue dans le mail, était dans un fichier ZIP avec un mot de passe.
Sans parler de l’étrangeté de recevoir une pièce jointe sous forme de fichier ZIP de nos jours (spam, malware, phishing, etc.), le mot de passe qu’ils avaient choisi m’a paru très faible.
C’est la date de naissance du titulaire du compte au format YYMMDD.
J’ai fait un calcul très grossier dans ma tête pendant que j’étais à la salle de sport et le résultat était un nombre très réduit de combinaisons possibles. Après avoir utilisé un outil en ligne pour calculer le nombre de jours écoulés (puisque toutes les combinaisons ne donneraient pas une date valide) depuis le 1900-01-01, il s’avère que les combinaisons sont seulement 44 075 (jusqu’au 2020-09-14).
Sachant que des outils optimisés utilisant la puissance du GPU pour craquer des hashs peuvent faire des millions de tentatives par seconde, je voulais voir à quelle vitesse le mot de passe pouvait être deviné sans les utiliser, en me servant uniquement de la ligne de commande Linux/macOS (n’ayant accès qu’à un VPS depuis la salle de sport).
J’ai concocté le code suivant qui fonctionne sur macOS :
echo {1..44000} | xargs -P 16 -n 1 -I{} date -v "-{}d" +"%y%m%d" | xargs -P 16 -I{} sh -c 'unzip -qqoP "{}" 0417160508.zip && echo "{}" && exit 255'
La commande est assez simple dans son fonctionnement, même si elle paraît compliquée.
echo {1..44000} génère les nombres de 1 à 44 000 et les transmet à l’étape suivante.
xargs -P 16 -n 1 -I{} date -v "-{}d" +"%y%m%d" – prend l’entrée de la première étape et génère des dates au format YYMMDD en exploitant la fonctionnalité de date permettant « d’augmenter » une date d’une quantité spécifique. Dans ce cas, cela va soustraire X jours à la date actuelle. Où X est le nombre généré à la première étape. Ainsi, on peut générer des dates depuis aujourd’hui jusque dans les années 1900.
La troisième étape est la plus intéressante, donc je vais la diviser en deux parties :
xargs -P 16 -I{} sh -c '...'
Cela prend les dates générées à l’étape 2 et exécute une commande sur chacune de ces dates. -P 16 signifie ici que cela va s’exécuter sur 16 processus parallèles, pour accélérer le traitement des données. La même astuce est appliquée à l’étape 2 pour accélérer la génération des dates.
La deuxième partie est l’endroit où les tentatives ont lieu :
unzip -qqoP "{}" 0417160508.zip && echo "{}" && exit 255
Ce que cela fait, c’est d’abord essayer de décompresser le fichier zip en utilisant le mot de passe généré à l’étape 2. Si c’est réussi, cela affiche (echo) le mot de passe deviné puis exit 255 force xargs à arrêter l’exécution. On ne veut pas continuer à deviner si le mot de passe a été trouvé.
En somme, c’était une assez mauvaise décision de choisir cela comme mot de passe pour le fichier, car exécuter la commande ci-dessus prend seulement environ 10 secondes pour deviner le bon mot de passe de ma facture. Pas beaucoup plus pour n’importe qui d’autre.