[TUTO] Comment Michel Sassano a ouvert le wallet flouté du reportage de France 2 (1/2)
France 2 a diffusé un documentaire sur Bitcoin. On y retrouvait Roger Ver, le libertarien pro-Bitcoin Cash. Il montrait publiquement la clé privée d’un wallet Bitcoin Cash qui contenait 1 000 $ en BCH. Pour des raisons légales, France 2 a flouté l’image. Cela n’a pas empêché Michel Sassano d’ouvrir ce wallet, en se basant sur les quelques éléments qu’il a pu récupérer de la vidéo. Cet article est une traduction de la première partie de l’article où il détail comment il est parvenu à son but.
L’article de Michel Sassano : On zoom ! Comment on a trouvé les 1000$ du portemonnaie lié à la clé privée de @rogervker !
Commençons par une précision : nous ne connaissons pas les journalistes qui ont enregistré l’interview et nous ne connaissons pas Roger Ver. N’importe qui ayant eu accès à ce reportage aurait pu récupérer la clé privée.
Nous aurions pu simplement nommer ce post « Comment les QR codes sont géniaux et comment on a récupéré un wallet à partir de rien », mais c’est beaucoup plus intéressant quand le QR code est la clé privée d’un wallet Bitcoin Cash de 1000$.
Bitcoin, Ethereum, Litecoin, Dash, Neo… Les cryptomonnaies sont partout et évoluent rapidement. Je suis Bitcoin depuis 2013 (ce qui ne veut pas dire que j’en ai acheté), j’ai dû lire Mastering Bitcoin 3 fois pour comprendre comment chaque partie fonctionne réellement et pouvoir l’expliquer à quelqu’un d’autre. Pourtant, je ne peux pas suivre tout ce qui se passe sur le marché, de nouvelles cryptomonnaies, de nouveaux hard fork, de nouvelles ICO paraissent tous les jours.
Commencer à utiliser les cryptomonnaies est plutôt facile en suivant un tutoriel en ligne. Téléchargez au pif une application de portefeuille, générez une paire de clés au hasard et achetez des cryptomonnaies sur un exchange. Par contre, la courbe d’apprentissage des cryptomonnaies est difficile.
Si vous ne comprenez pas bien toutes les parties de ce travail, vous devriez éviter les cryptomonnaies. Sinon, vous risquez de perdre votre argent en tombant dans l’un des nombreux pièges. L’un d’entre eux, la conservation de votre clé privée en toute sécurité, fait l’objet de cet article.
« La première règle du Crypto Club est : Vous ne partagez pas votre clé privée. »
La chose la plus précieuse que vous avez quand vous possédez des cryptomonnaies est votre clé privée. Si vous perdez votre clé privée, vous perdez votre argent. Si quelqu’un a accès à votre clé privée, vous perdez votre argent. Ce n’est pas compliqué.
Cet article vous montrera pas à pas comment nous avons récupéré la clé privée du portemonnaie Bitcoin cash de 1000$ créé par @rogerkver pour l’émission « Complément d’enquête » alors qu’il était flouté à l’écran.
Introduction
La semaine dernière, France 2 a diffusé un documentaire sur Bitcoin. Ils ont interviewé @rogerkver qui a décidé d’offrir 1000$ en Bitcoin au spectateur le plus rapide. Malheureusement, le QR code et la clé privée ont été floutés par France 2.
J’ai vu plusieurs personnes se plaindre sur Twitter. Certains tweetaient que France 2 avait décidé de garder les bitcoins pour eux. C’est faux, France 2 a dû flouter la clé, non pas parce qu’ils voulaient garder les bitcoins, mais parce qu’ils y étaient légalement obligés.
Vous pouvez essayer de scanner le QR Code avec autant d’applications différentes que vous le pouvez, vous ne pourrez pas le décoder car il y a trop de flou.
L’histoire aurait pu se terminer ici, les 1000 $ perdus à jamais, car je ne pense pas que Roger Ver ait gardé une copie de la clé privée. Seuls les journalistes qui ont enregistré l’interview auraient pu récupérer les bitcoins.
Mais vers la fin de l’entrevue, ils ont montré une petite partie en claire du QR code. Est-ce qu’ils l’ont fait exprès, sachant que les 1 000 $ seraient perdus si personne n’arrivait à trouver la clé privée ? Ou était-ce juste une des erreurs que l’on peut faire lorsque l’on débute dans le monde des cryptomonnaies ?
J’allais envoyer un mail à mon ami @clementstorck quand j’ai reçu de sa part une capture d’écran du QR code. Nous avons décidé de travailler ensemble pour voir si nous pouvions trouver la clé privée à partir d’une si petite quantité d’information.
Soyons clairs, les chances de trouver la clé privée étaient proches de zéro. Nous connaissions les propriétés des QR codes et leur résilience à ce type d’attaque. Notre but était de recueillir le plus d’informations possible pour réduire au minimum les paramètres inconnus. Nous savions qu’à terme, il faudrait le bruteforcer. Après toutes les étapes ci-dessous, nous n’avons eu qu’à tenter par bruteforce 2 097 152 combinaisons.
Alors, on commence par où ? Ci-dessous, toutes les étapes que nous avons suivi pour récupérer la clé privée :
- La collecte d’informations
- Améliorons! Analyse d’images
- QR code standard partie 1
- Reconstitution du QR code
- QR code standard partie 2
- Décodage du QR code
- Code de correction d’erreur
- Python et bruteforce
1 – La collecte d’informations
La première étape consistait à recueillir le plus d’information possible en se basant sur le reportage. Nous avons regardé image par image et nous avons pris plusieurs captures d’écran :
- La clé publique nous mène à un portefeuille BTC (presque) vide. Roger Ver a-t-il menti ? Beaucoup de gens sur Twitter l’ont dit. Il n’a pas menti, il a tweeté à propos de l’échange ici. On a dû chercher un portefeuille de BCH.
- La partie floue des clés privées. Nous allons l’exploiter pour obtenir les 6 premières lettres. L’étape « correction d’erreurs » nous donnera les 7 lettres suivantes.
- La dernière lettre de la clé privée (un V) sera également très utile pour déverrouiller les 8 dernières lettres de la clé privée.
- Captures d’écran de mauvaise qualité de la partie supérieure et gauche du QR code. Elles seront également utiles pour obtenir un peu plus de données et compléter le QR code pendant la phase de reconstruction.
- L’outil qu’il a utilisé pour créer la clé publique et la clé privée est l’outil « Single Wallet » sur Bitcoin.com. Ceci nous a donné des informations sur les données contenues dans le QR code : une clé privée « Wallet Import Format Bitcoin » de 52 caractères similaire à celle-ci:
KwjiU4CVAmdyxyDbvkbx2XbSoU1nxZgyXz7usqAemvsd4RdGHoPF
L’étape suivante consiste à reconstruire le QR Code.
2 – Améliorons ! Analyse des images
Ok, nous avons moins d’1/3 du QR code, nous sommes encore loin de la clé privée. Que pouvons-nous apprendre des captures d’écran que nous avons faite ?
Nous avons décidé de nous concentrer sur 2 captures d’écran.
- La première est le QR code flou de la clé privée, nous voulions savoir si les applications de QR code étaient capables de le lire après traitement.
- La deuxième capture d’écran sur laquelle nous voulions travailler était celle avec la clé privée. Nous savions que nous devions avoir au moins une petite quantité de données si nous voulions que l’étape ECC (Error Correction Code) fonctionne.
Nous avons décidé d’envoyer les captures d’écran à nos experts. Et nous avons eu des résultats.
Voici ce que l’on a obtenu.
- Une version non brouillée du QR code, qu’aucune des applications n’a pu décoder. Nous voulions essayer parce que ce type a fait des crash-tests sur des QR codes et d’après les commentaires, tous restaient scannables.
- Deux versions de la chaîne de clés non brouillées. La première nous donne les quatre premières lettres (on ne voit pas clairement le « K ») et la seconde les six premières (nous ne voyons pas clairement le « z »).
Gardons ces informations pour plus tard. Elles nous aideront à reconstruire le puzzle.
3 – QR code standard partie 1
Il était important de comprendre le fonctionnement des QR codes et les limites de leurs capacités ECC pour restaurer un QR code endommagé.
Wikipédia est un bon début, mais tout ce dont nous avions besoin était dans la norme ISO/IEC 18004 (il y a une version gratuite de la première édition sur Swisseduc). Nous avons aussi trouvé ce bijou en ligne.
Avant de commencer à reconstruire le QR code, voyons ce que nous pouvons apprendre de cette image en utilisant la norme ISO et la structure d’un QR code.
La partie intéressante pour nous était la colonne bleue (x: 8, y: 22-28).
Ceci fait partie du format de la chaîne d’information (séquence de 15 bits : 5 bits de données et 10 bits de correction d’erreur). Les bits situés à (x: 8, y: 22-28) sont les bits 8 à 14 de la chaîne. Nous n’avions que 7 bits sur 15, mais cela suffisait pour trouver l’information dont nous avions besoin.
Le format de cette chaîne d’information encode le niveau de correction d’erreur (EC) et le masque appliqué au QR code. Il y a 4 niveaux EC possibles (L, M, Q, Q, H) et 8 masques possibles => 32 chaînes d’information possibles.
Vous trouverez des détails sur la façon de créer la chaîne d’information à la page 76 de la norme (Annexe C – Informations sur le format). La liste des 32 possibilités est disponible ici.
Utilisons à nouveau le standard pour trouver quel bit est lequel.
De haut en bas, nous avons le bit 8 à 14 de la chaîne d’information. Le bit 14 est le plus significatif. A partir de la capture d’écran n°11, nous avons pris nous pouvons alors lire.
0011001XXXXXXXXXXXXXX
La seule combinaison qui correspond est celle du niveau ECC: H et du pattern: 3
Nous devions également trouver le format d’encodage du QR code. Il existe cinq formats d’encodage (chacun d’eux utilise une méthode différente pour convertir le texte en bits):
- Numérique (0-9)
- Alphanumérique (0-9 ; A-Z ; neuf autres caractères : espace $ % * +-. /:)
- Octet 8 bits (JIS 8 bits Jeu de caractères. JIS X 0201 version japonaise ISO 646)
- Kanji (Caractères Shift JIS, peut encoder chaque caractère Kanji sur 2 octets)
- ECI (Extended Channel Interpretation, lorsque vous avez besoin d’un encodage spécial/personnalisé)
Le format d’encodage pour le QR code est Octet 8-bit. Le Numérique et Alphanumérique ne prennent pas en charge l’alphabet de la clé privée (pas de lettres minuscules), Kanji est encodé sur 2 octets (nous avons besoin d’un seul) et ECI est overkill.
Nous étions presque prêts à commencer la reconstruction du QR code, la dernière chose dont nous avions besoin était de connaître la taille du QR code.
Il existe 40 tailles de QR code (appelées versions). Ils peuvent aller de 21×21 pixels (version 1) à 177×177 pixels (version 40). Ils grandissent de 4×4 pixels chaque fois qu’ils augmentent leur numéro de version. Chaque version a une capacité maximale, basée sur le format d’encodage et le niveau de correction des erreurs.
La capacité de chaque QR code dépend de sa version et de son niveau de correction d’erreur. Pour plus de détails, voir page 28 de la norme ISO.
Nous savions que le QR code devait stocker 52 caractères (416 bits) avec un niveau de correction d’erreur H.
La taille d’un QR code version 6 est de 41×41 pixels.
Nous avions maintenant toute l’information nécessaire pour lancer la reconstruction du QR code.
4 – Reconstruction du QR code
Nous devons reconstruire un QR code de 41×41 pixels. Nous avons décidé de travailler sur un tableur Google (facile à dessiner, à colorier et d’y appliquer des fonctions telles que le masquage sur QR code).
Nous avons suivi les étapes suivantes :
- Dessinez tous les motifs qui font partie de la norme (le motif de positionnement, le motif d’alignement (un seul dans un QR code version 6), le motif de chronométrage et les séparateurs comme on le voit sur l’image n°12)
- Ajoutez les bits de la chaîne d’information de format que nous avons trouvé à l’étape précédente.
- Remplissez le reste du QR code en fonction de la capture d’écran (n°11) que nous avons prise.
Mettons aussi à profit les captures d’écran latérales de la partie supérieure et gauche du QR code. Cela ne semble pas beaucoup, mais à ce stade, chaque bit compte.
Ci-dessous, le QR code que nous avons pu reconstruire.
L’étape suivante consiste à définir la séquence de bits pour extraire les donnés des mots codés et les mots codés de correction d’erreurs.
Partie 2 à suivre…
Source : Medium