
Estensione Burp Suite per decodificare chiamate JSON-RPC di Ethereum e interazioni con smart contract, con supporto per più chain e recupero automatico degli ABI.
Web3 Decoder è un'estensione per Burp Suite progettata per analizzare operazioni blockchain e interazioni con smart contract. Elabora chiamate JSON-RPC verso Ethereum e reti compatibili (inclusi Polygon, Arbitrum, BSC e altre).
La maggior parte degli esploratori di blocchi supportati, come etherscan.io, richiede una chiave API per consentire più di 1 richiesta ogni 5 secondi.
Per aggiungere le tue chiavi API hai 2 opzioni:
L'estensione memorizza nella cache gli ABI scaricati dagli esploratori di blocchi come etherscan
all'interno di una cartella denominata .abi_caches in formato JSON. Puoi semplicemente aggiungere un nuovo file in quella cartella,
con la seguente convenzione di denominazione:
{chain_id}_{contract_address.lower()}.abi
Ad esempio:
# Ethereum Mainnet (chain ID 1), contratto 0xfbdca68601f835b27790d98bbb8ec7f05fdeaa9b
1_0xfbdca68601f835b27790d98bbb8ec7f05fdeaa9b.abi
# Polygon (chain id 137), contratto 0x447646e84498552e62ecf097cc305eabfff09308
137_0x447646e84498552e62ecf097cc305eabfff09308.abi
Questa documentazione si applica a Windows e Linux; gli utenti macOS possono utilizzare il file DMG.
Verifica la presenza di Git e Python sul tuo sistema.
Avvia una sessione del terminale come amministratore.
Questa estensione richiede librerie python3 come web3.py che purtroppo non sono disponibili per python 2.7 per essere utilizzate direttamente con Jython 2.7. Come 'escamotage', la funzionalità principale è scritta in una libreria python 3 che viene eseguita dall'estensione tramite un ambiente virtuale python (che schifezza...)
Ho creato binari precompilati della libreria python3 utilizzata, per Linux, Windows e Mac OSX. L'estensione utilizzerà questi binari se non riesce a eseguire la libreria. Per prestazioni migliori o per lo sviluppo, puoi creare un virtualenv e installare come segue:
cd "web3-decoder"
virtualenv -p python3 venv
source venv/bin/activate
pip install web3 py-evm
L'estensione effettuerà chiamate alla libreria utilizzando il virtualenv creato.
Una volta creato il virtualenv, puoi aggiungere l'estensione Python selezionando il file burp_web3_decoder.py nella scheda Extender di Burp Suite
eth_calleth_sendRawTransaction (e delle loro funzioni interne)eth_calleth_calleth_call che in eth_sendRawTransactionTutte le reti supportate si trovano nel file chains.json. Queste sono reti che dispongono di un esploratore di blocchi con le stesse API di etherscan. Se vuoi aggiungere altri esploratori di blocchi, aggiungili al file chains.json, testali e fai una pull request!
Per ulteriori esempi, inclusi proxy e chiamate multicall, consulta EXAMPLES.md
eth_call:
Raw:

Decodificato:

eth_sendRawTransaction (test Uniswap v2):
{
"method": "eth_sendRawTransaction",
"params": [
"0x02f9015b820539808459682f00850df8475800830493e0947a250d5630b4cf539739df2c5dacb4c659f2488d880de0b6b3a7640000b8e47ff36ab500000000000000000000000000000000000000000000009e0950598867d8000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000002105eaa660ff62b14a5e093fc348e13ab63af2e600000000000000000000000000000000000000000000000000000000623b16570000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000006b175474e89094c44da98b954eedeac495271d0fc001a005cfdf9ff11dea2d3e8781cb6ba140ae6e86a0922bfa75938b6f2456f513e24ca057f02b3f7125edb59e22651d503bc296153860e3843f9d495ad21d898c8e20c3"
],
"id": 4700418092893,
"jsonrpc": "2.0"
}
Decodificato:
[
{
"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"
}
}
}
]
Richiesta JSON-RPC eth_chainId al nodo in uso per rilevare su quale rete stiamo lavorando e, a seconda della rete, seleziona un'API di esploratore di blocchi cercando nel file chains.json.
Come esempio di utilizzo, per decodificare le chiamate di funzione, abbiamo bisogno dell'ABI (Application Binary Interface) del contratto, che contiene tutte le funzioni che possono essere chiamate nel contratto e i loro input e output. Per ora, funziona con contratti verificati nell'esploratore di blocchi, oppure aggiungendo manualmente l'ABI. Nelle versioni future, esploreremo la possibilità di generare automaticamente un ABI cercando i selettori di funzione in database pubblici.
Il seguente diagramma di "flusso" mostra in modo semplificato il processo che la libreria eth_decoder segue quando decodifica chiamate JSON-RPC eth_call:
