
Extensión de Burp Suite para decodificar llamadas JSON-RPC de Ethereum e interacciones con contratos inteligentes, con soporte para múltiples cadenas y recuperación automática de ABI.
Web3 Decoder é uma extensão do Burp Suite projetada para analisar operações de blockchain e interações com contratos inteligentes. Ela processa chamadas JSON-RPC para Ethereum e redes compatíveis (incluindo Polygon, Arbitrum, BSC e outras)
A maioria dos block explorers suportados, como etherscan.io, exige uma chave de API para permitir mais de 1 requisição a cada 5 segundos.
Para adicionar suas chaves de API, você tem 2 opções:
A extensão armazena em cache os ABIs baixados dos block explorers como o etherscan
dentro de uma pasta chamada .abi_caches em formato JSON. Você pode simplesmente adicionar um novo arquivo dentro dessa pasta,
com a seguinte convenção de nomenclatura:
{chain_id}_{contract_address.lower()}.abi
Por exemplo:
# Ethereum Mainnet (chain ID 1), contrato 0xfbdca68601f835b27790d98bbb8ec7f05fdeaa9b
1_0xfbdca68601f835b27790d98bbb8ec7f05fdeaa9b.abi
# Polygon (chain id 137), contrato 0x447646e84498552e62ecf097cc305eabfff09308
137_0x447646e84498552e62ecf097cc305eabfff09308.abi
Esta documentação se aplica a Windows e Linux; usuários de macOS podem usar o arquivo DMG.
Verifique se há Git e Python no seu sistema.
Inicie uma sessão de terminal como administrador.
Esta extensão requer bibliotecas python3 como web3.py que, infelizmente, não estão disponíveis para python 2.7 para serem usadas diretamente com Jython 2.7. Como um 'hack', a funcionalidade principal é escrita em uma biblioteca python 3 que é executada pela extensão através de um ambiente virtual python (falando em sujeira...)
Criei binários pré-compilados da biblioteca python3 usada, para Linux, Windows e Mac OSX. A extensão usará esses binários se não for capaz de executar a biblioteca. Para melhor desempenho ou desenvolvimento, você pode criar um virtualenv e instalar da seguinte forma:
cd "web3-decoder"
virtualenv -p python3 venv
source venv/bin/activate
pip install web3 py-evm
A extensão fará chamadas à biblioteca usando o virtualenv criado.
Uma vez que o virtualenv é criado, você pode adicionar a extensão python selecionando o arquivo burp_web3_decoder.py na aba Extender do Burp Suite
eth_calleth_sendRawTransaction (e suas funções internas)eth_calleth_calleth_call quanto em eth_sendRawTransactionTodas as chains suportadas podem ser encontradas no arquivo chains.json. Estas são chains que possuem um block explorer com as mesmas APIs do etherscan. Se você quiser adicionar mais block explorers, adicione-os ao arquivo chains.json, teste e faça um pull request!
Para mais exemplos, incluindo chamadas de proxy e multicall, veja o EXAMPLES.md
eth_call:
Bruto:

Decodificado:

eth_sendRawTransaction (teste Uniswap v2):
{
"method": "eth_sendRawTransaction",
"params": [
"0x02f9015b820539808459682f00850df8475800830493e0947a250d5630b4cf539739df2c5dacb4c659f2488d880de0b6b3a7640000b8e47ff36ab500000000000000000000000000000000000000000000009e0950598867d8000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000002105eaa660ff62b14a5e093fc348e13ab63af2e600000000000000000000000000000000000000000000000000000000623b16570000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006b175474e89094c44da98b954eedeac495271d0fc001a005cfdf9ff11dea2d3e8781cb6ba140ae6e86a0922bfa75938b6f2456f513e24ca057f02b3f7125edb59e22651d503bc296153860e3843f9d495ad21d898c8e20c3"
],
"id": 4700418092893,
"jsonrpc": "2.0"
}
Decodificado:
[
{
"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"
}
}
}
]
Requisição JSON-RPC eth_chainId ao nó em uso para detectar em qual chain estamos trabalhando e, dependendo da chain, seleciona uma API de block explorer, pesquisando no arquivo chains.json.
Como exemplo de uso, para decodificar chamadas de funções, precisamos do ABI (Application Binary Interface) do contrato, que contém todas as funções que podem ser chamadas no contrato e suas entradas e saídas. Por enquanto, funciona com contratos verificados no block explorer, ou adicionando manualmente o ABI. Em versões futuras, exploraremos a possibilidade de gerar automaticamente um ABI pesquisando os seletores de funções em bancos de dados públicos.
O seguinte diagrama de "fluxo" mostra de forma simplificada o processo que a biblioteca eth_decoder segue ao decodificar chamadas JSON-RPC eth_call:
