Clef publique (Web3) - 404CTF 2022

Clef publique (Web3) - 404CTF 2022

Fichiers du challenge Principe:
Trouver la clef publique d'une adresse de la blockchain

Le challenge

Le challenge nous demande de trouver la clef publique d'un contrat (fichiers de résolution dispos ici)

Le zip ci-dessus ne contient que les fichiers spécifiques au challenge. Les fichiers additionnels (geth, node modules) sont disponibles là

Vous avez déjà du voir que je n'aime pas le web3 (d'autant plus quand un challenge se base sur le fait qu'il soit difficile de trouver la clef publique d'un compte!) donc, ne vous étonnez pas du nom de mes fichiers ou de mes variables!

Le challenge a été redéployé pendant le CTF, il se peut donc que les screens de ce writeup présentent des adresses variables

Etherscan

Encore une fois, on va démarrer dans etherscan
Dans le code de création du contrat, on trouve une "adresse secrète"
On peut facilement savoir qu'elle fait partie du CTF au vu d'une de ses transactions

Mais ceci n'est pas le flag du challent! Ce n'est pas une clef publique

On regarde alors avec combien d'adresses le vieux contrat a interagit: on en trouve 3
On cherche qui a créé le nouveau contrat et on trouve une adresse
On remonte jusqu'à l'adresse secrète, dont on trouve une transaction

NodeJS

On va alors passer par NodeJS pour récupérer les informations de cette transaction, signée, et la clef publique associée
On configure infura comme notre "provider" pour accéder à la blockchain depuis NodeJS

Alors, il faudra m'expliquer comment le web3 peut être "décentralisé" s'il faut un provider pour accéder à la blockchain. En fait, non, m'expliquez pas: je m'en fous :D

On récupère cette clef
Et, nope, fail! ce n'est pas la public key

A la mano

Je pars donc sur une construction de la clef à la main, et je récupère la transaction en RAW
A partir de cette RAW transaction, le site ABDKToolkit me donne le détail, avec la public key (compressée ou non) et l'adresse (celle "secrète")

Ignorer un byte

Si on ignore le 1er byte de la clef publique décompressée (0x04) alors la fin de son Keccak-256 correspond à l'adresse secrète

En fait, la clef publique commence pas 0x03 si elle est au format compressé, et par 0x04 si elle est décompressée. Or, c'est la clef publique décompressée elle-même dont on a besoin, d'où le fait d'ignorer ce premier caractère.

On essaie et… ca passe!
Flag: 404CTF{0xb227feb5ecb369faf668f711f2331d163244fddb5e297be94fe30046b261732fda92d1afe5578f1d88c29ae439a7220ecc984701411742b5fec2b1639433100d}

Oui, j'avais franchement été saoulé par ce challenge et la complexité bordelique pour une information aussi simple qu'une clef publique (la "documentation" totalement inconsistante et basée sur les bruits de couloirs du net et la spéculation des gens sur StackOverflow n'a pas aidé)

Fichiers du challenge

↩ Retour à la liste des challenges

⇇ Retour à l'accueil