Comment j’ai piraté un portefeuille Bitcoin ?

Récit d’un pirate du Bitcoin

Il s’agit d’une ancienne vulnérabilité, mais elle existe toujours. Peu de sociétés/portefeuilles bitcoin réutiliseront les valeurs de nos jours lors de la signature de transactions, mais les personnes qui créent de nouvelles copies d’anciennes pièces et portefeuilles ne connaissent généralement pas cette vulnérabilité. Au cours de mes recherches, j’ai découvert que de nombreux pirates informatiques russes ont codé des robots pour récupérer automatiquement des pièces à partir d’adresses vulnérables de ce type et d’autres, comme mentionné au début de ce didacticiel.

Voici quelques façons dont une adresse ou un portefeuille bitcoin peut être vulnérable.

Une clé privée est créée avec un mot de passe commun tel que « 123456 ». Une simple erreur de copier/coller. Une transaction est créée avec des sorties non standard. Un générateur de nombres aléatoires a été mal utilisé ou a produit la même sortie. La clé privée a été publiée publiquement.

Nous allons parler d’une transaction avec un générateur de nombres aléatoires cassé (chaîne). Ces adresses réutilisent certaines valeurs dans une transaction en raison d’une mauvaise connaissance, d’erreurs de programmation ou d’un générateur de nombres aléatoires défectueux.

Il y a deux entrées et une sortie dans ce script. C’est bien. Les entrées sont des pointeurs vers les sorties des transactions précédentes. Les sorties sont, à la base, un montant et une adresse.

En regardant de plus près les entrées de ces scripts, nous remarquons qu’ils sont similaires.

ScriptSig: PUSHDATA(71[30440220d47ce4c025c35ec440bc81d9983 4a624875161a26bf56ef7fdc0f5d52f843ad1022044e1ff2 dfd8102cf7a47c21d5c9fd5701610d04953c6836596b4fe9dd2f53e3e01] PUSHDATA(65)[04dbd0c61532279cf72981c3584fc32216e0127699 635c2789f549e0730c059b81ae133016a69c21e23 f1859a95f06d52b7bf149a8f2fe4e8535c8a829b449c5ff]

 

ScriptSig: PUSHDATA(71)[30440220d47ce4c025c35ec440bc81d99834a62 4875161a26bf56ef7fdc0f5d52f843ad102209a5f1c7 5e461d7ceb1cf3cab9013eb2dc85b6d0da8c3c6e27e3a5a5b3faa5bab01] PUSHDATA(65)[04dbd0c61532279cf72981c3584fc32216e01276 99635c2789f549e0730c059b81ae133016a69c21e23f1859 a95f06d52b7bf149a8f2fe4e8535c8a829b449c5ff]

Le début des scripts contient les signatures (définies comme ‘r’ et ‘s’). La fin du script est la clé publique hexadécimale.

Nous avons donc:

r1: d47ce4c025c35ec440bc81d99834a624875161a26bf56ef7fdc0f5d52f843ad1
r2: d47ce4c025c35ec440bc81d99834a624875161a26bf56ef7fdc0f5d52f843ad1

s1: 44e1ff2dfd8102cf7a47c21d5c9fd5701610d04953c6836596b4fe9dd2f53e3e
s2: 9a5f1c75e461d7ceb1cf3cab9013eb2dc85b6d0da8c3c6e27e3a5a5b3faa5bab

Il s’avère que les valeurs r dans les scripts sont exactement les mêmes. Cela signifie que nous pouvons dériver la clé privée.

Maintenant l’équation mathématiques :

Bitcoin Private Key = (z1*s2 – z2*s1)/(r*(s1-s2))

Nous avons les valeurs r et s, maintenant nous devons trouver les valeurs z1 et z2.

Entrez l’identifiant de transaction :

9ec4bc49e828d924af1d1029cacf709431abbde46d59554b62bc270e3b29c4b1

Faites défiler vers le bas pour trouver les valeurs z.

Nous trouvons:

z1 = c0e2d0a89a348de88fda08211c70d1d7e52ccef2eb9459911bf977d587784c6e
z2 = 17b0f41c8c337ac1e18c98759e83a8cccbc368dd9d89e5f03cb633c265fd0ddc

Le Bitcoin utilise une courbe elliptique pour générer des clés publiques. L’ordre de la courbe est secp256k1.

p = parameter for the secp256k1 curve. So
p = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141

Nous devrons créer un champ fini pour le calcul.

K = GF(p)

Maintenant que nous avons toutes les informations dont nous avons besoin, nous pouvons effectuer nos calculs.

Nous utiliserons Sagemath : http://www.sagemath.org/

Je vais utiliser la version cloud. Assurez-vous de saisir toutes nos équations :

p = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141
r = 0xd47ce4c025c35ec440bc81d99834a624875161a26bf56ef7fdc0f5d52f843ad1
s1 = 0x44e1ff2dfd8102cf7a47c21d5c9fd5701610d04953c6836596b4fe9dd2f53e3e
s2 = 0x9a5f1c75e461d7ceb1cf3cab9013eb2dc85b6d0da8c3c6e27e3a5a5b3faa5bab
z1 = 0xc0e2d0a89a348de88fda08211c70d1d7e52ccef2eb9459911bf977d587784c6e
z2 = 0x17b0f41c8c337ac1e18c98759e83a8cccbc368dd9d89e5f03cb633c265fd0ddc

K = GF(p)

K((z1*s2 – z2*s1)/(r*(s1-s2)))

Cliquez sur exécuter.

Les sorties de calcul : 88865298299719117682218467295833367085649033095698151055007620974294165995414

Maintenant, nous allons le convertir de décimal en hexadécimal. Vous pouvez le faire ici : https://www.rapidtables.com/convert/number/decimal-to-hex.html

Notre clé privée en hexadécimal est : C477F9F65C22CCE20657FAA5B2D1D8122336F851A508A1ED04E479C34985BF96

De là, nous pouvons le convertir en WIF (format d’importation de portefeuille). Cela représente la clé privée !

A WIF private key is a standard private key, but with a few added extras:

1. Version Byte prefix – Indicates which network the private key is to be used on.
0x80 = Mainnet
0xEF = Testnet
2. Compression Byte suffix (optional) – Indicates if the private key is used to create a compressed public key.
0x01
3. Checksum – Useful for detecting errors/typos when you type out your private key.

Allez ici : https://2coin.org/privateKeyToAddress.html

Entrez dans notre clé privée hexadécimale.

La clé privée dans WIF est : 5KJp7KeffR7HHFWSFYjiCUAntRSTY69LAQEX1AUzaSBHHFdKEpQ

Latest Crypto Fear & Greed Index
Réussir son investissement, c'est avant tout bien s'informer !
Send this to a friend