
Extension Burp Suite pour décoder les appels Ethereum JSON-RPC et les interactions avec les contrats intelligents, prenant en charge plusieurs chaînes et la récupération automatique des ABI.
Web3 Decoder est une extension Burp Suite conçue pour analyser les opérations blockchain et les interactions avec les contrats intelligents. Elle traite les appels JSON-RPC vers Ethereum et les réseaux compatibles (notamment Polygon, Arbitrum, BSC, et autres)
La plupart des explorateurs de blocs pris en charge, comme etherscan.io, exigent une clé API pour autoriser plus d'une requête toutes les 5 secondes.
Pour ajouter vos clés API, vous avez 2 options :
L'extension met en cache les ABI téléchargées depuis les explorateurs de blocs comme etherscan
dans un dossier nommé .abi_caches au format JSON. Vous pouvez simplement ajouter un nouveau fichier dans ce dossier,
en respectant la convention de nommage suivante :
{chain_id}_{contract_address.lower()}.abi
Par exemple :
# Ethereum Mainnet (ID de chaîne 1), contrat 0xfbdca68601f835b27790d98bbb8ec7f05fdeaa9b
1_0xfbdca68601f835b27790d98bbb8ec7f05fdeaa9b.abi
# Polygon (ID de chaîne 137), contrat 0x447646e84498552e62ecf097cc305eabfff09308
137_0x447646e84498552e62ecf097cc305eabfff09308.abi
Cette documentation s'applique à Windows et Linux ; les utilisateurs macOS peuvent utiliser le fichier DMG.
Vérifiez la présence de Git et Python sur votre système.
Démarrez une session de terminal en tant qu'administrateur.
Cette extension nécessite des bibliothèques python3 comme web3.py qui, malheureusement, ne sont pas disponibles pour python 2.7 pour être utilisées directement avec Jython 2.7. En guise de « hack », la fonctionnalité principale est écrite dans une bibliothèque python 3 qui est exécutée par l'extension via un environnement virtuel python (pour parler de bricolage...)
J'ai créé des binaires précompilés de la bibliothèque python3 utilisée, pour Linux, Windows et Mac OSX. L'extension utilisera ces binaires si elle n'est pas en mesure d'exécuter la bibliothèque. Pour de meilleures performances ou pour le développement, vous pouvez créer un virtualenv et installer comme suit :
cd "web3-decoder"
virtualenv -p python3 venv
source venv/bin/activate
pip install web3 py-evm
L'extension effectuera des appels à la bibliothèque en utilisant le virtualenv créé.
Une fois le virtualenv créé, vous pouvez ajouter l'extension Python en sélectionnant le fichier burp_web3_decoder.py dans l'onglet Extender de Burp Suite
eth_calleth_sendRawTransaction (et de leurs fonctions internes)eth_calleth_calleth_call et eth_sendRawTransactionToutes les chaînes prises en charge se trouvent dans le fichier chains.json. Ce sont des chaînes qui disposent d'un explorateur de blocs avec les mêmes API qu'etherscan. Si vous souhaitez ajouter d'autres explorateurs de blocs, ajoutez-les au fichier chains.json, testez-les, et faites une pull request !
Pour plus d'exemples, y compris les appels proxy et multicall, consultez le fichier EXAMPLES.md
eth_call :
Brut :

Décodé :

eth_sendRawTransaction (test Uniswap v2) :
{
"method": "eth_sendRawTransaction",
"params": [
"0x02f9015b820539808459682f00850df8475800830493e0947a250d5630b4cf539739df2c5dacb4c659f2488d880de0b6b3a7640000b8e47ff36ab500000000000000000000000000000000000000000000009e0950598867d8000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000002105eaa660ff62b14a5e093fc348e13ab63af2e600000000000000000000000000000000000000000000000000000000623b16570000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006b175474e89094c44da98b954eedeac495271d0fc001a005cfdf9ff11dea2d3e8781cb6ba140ae6e86a0922bfa75938b6f2456f513e24ca057f02b3f7125edb59e22651d503bc296153860e3843f9d495ad21d898c8e20c3"
],
"id": 4700418092893,
"jsonrpc": "2.0"
}
Décodé :
[
{
"chain_id": 1337,
"access_list": [],
"nonce": 0,
"r": 2628844986784880378434698689940765181553490914879903463877191830852582236748,
"s": 39775559607776431912363889945449043629789293388076288013264795388376358199491,
"max_priority_fee_per_gas": 1500000000,
"gas": 300000,
"max_fee_per_gas": 60000000000,
"from": "0x2105Eaa660ff62b14a5e093fc348e13ab63AF2E6",
"y_parity": 1,
"to": "0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D",
"value": 1000000000000000000,
"data": "0x7ff36ab500000000000000000000000000000000000000000000009e0950598867d8000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000002105eaa660ff62b14a5e093fc348e13ab63af2e600000000000000000000000000000000000000000000000000000000623b16570000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006b175474e89094c44da98b954eedeac495271d0f",
"decoded_function": {
"args": {
"amountOutMin": 2915256698432979992576,
"path": [
"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
"0x6B175474E89094C44Da98b954EedeAC495271d0F"
],
"to": "0x2105Eaa660ff62b14a5e093fc348e13ab63AF2E6",
"deadline": 1648039511
},
"function": "swapExactETHForTokens(uint256,address[],address,uint256)",
"to": "0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D",
"abi": {
"outputs": [
{
"internalType": "uint256[]",
"type": "uint256[]",
"name": "amounts"
}
],
"inputs": [
{
"internalType": "uint256",
"type": "uint256",
"name": "amountOutMin"
},
{
"internalType": "address[]",
"type": "address[]",
"name": "path"
},
{
"internalType": "address",
"type": "address",
"name": "to"
},
{
"internalType": "uint256",
"type": "uint256",
"name": "deadline"
}
],
"stateMutability": "payable",
"type": "function",
"name": "swapExactETHForTokens"
}
}
}
]
Requête JSON-RPC eth_chainId vers le nœud utilisé pour détecter sur quelle chaîne nous travaillons, et selon la chaîne, sélectionne une API d'explorateur de blocs, en recherchant dans le fichier chains.json.
À titre d'exemple d'utilisation, pour décoder les appels de fonction, nous avons besoin de l'ABI (Application Binary Interface) du contrat, qui contient toutes les fonctions pouvant être appelées dans le contrat ainsi que leurs entrées et sorties. Pour l'instant, cela fonctionne avec les contrats vérifiés dans l'explorateur de blocs, ou en ajoutant manuellement l'ABI. Dans les versions futures, nous explorerons la possibilité de générer automatiquement une ABI en recherchant les sélecteurs de fonction dans des bases de données publiques.
Le diagramme « flux » suivant montre de manière simplifiée le processus que la bibliothèque eth_decoder suit lors du décodage des appels JSON-RPC eth_call :
