Nos encontramos a finales de noviembre y, como cada mes, traemos la solución a uno de los retos de Level_UP!, nuestra plataforma de aprendizaje basada en retos de Web3. Hoy le toca el turno al reto “Snippet Delegated”, un reto de dificultad 4 sobre 5 y que sumará 200 puntos a nuestro marcador global. ¡Vamos a por ello!
En esta ocasión partimos de dos contratos diferentes: un primer contrato que tiene una serie de funciones, y un segundo contrato que importa estas funciones para su uso.
Figura 1: WriteUp del Reto Hacking Web3 "Snippet Delegated"
& Nuevo Reto "Send to me" en Level_Up!
En esta ocasión partimos de dos contratos diferentes: un primer contrato que tiene una serie de funciones, y un segundo contrato que importa estas funciones para su uso.
Reto: Snippet Delegated
Tal y como indica el nombre del reto, se va a trabajar con una función llamada “delegatecall” que va a permitir que el contrato del reto pueda ejecutar el código del contrato de funciones con el almacenamiento del contrato del reto, el msg.sender y el msg.value.
Para conseguir el flag de este contrato, si observamos la función getFlag(), nos damos cuenta de que necesitamos ser el owner y, además, hay un valor llamado power que debe ser igual a 9. Debemos encontrar, en primer lugar, como hacernos owner del contrato y, a continuación, como llegar a obtener 9 en el valor de power.
Como se ha comentado con anterioridad, se va a trabajar con la función delegatecall(). Si nos fijamos, el contrato hace uso de está función en la función llamada execution_function().
Se puede revisar el contrato functions y ver que opciones tenemos disponibles. Rápidamente podemos encontrar varias funciones que van a jugar con los valores de power y stamina y recordamos que una condición para obtener el flag es que power tenga el valor de 9.
Además, también encontramos una función llamada setOwner() que establece el propietario del contrato con el valor msg.sender. Con esto confirmamos que debemos interactuar con este contrato para conseguir los requisitos para conseguir la flag.
Comenzamos por llamar a la función setOwner(). Para ello debemos averiguar el selector de la función para pasarlo como el parámetro _data de la función execution_function(), que a su vez se pasará como parámetro de la función delegatecall().
Figura 2: Level_Up! en GitHub
Figura 3: Smart Contract del reto Snippet Delegated
Como se ha comentado con anterioridad, se va a trabajar con la función delegatecall(). Si nos fijamos, el contrato hace uso de está función en la función llamada execution_function().
Figura 4: Función execution_function en el contrato Snippet Delegated
Se puede revisar el contrato functions y ver que opciones tenemos disponibles. Rápidamente podemos encontrar varias funciones que van a jugar con los valores de power y stamina y recordamos que una condición para obtener el flag es que power tenga el valor de 9.
Figura 5: Funciones para interactuar con los valores power y stamina
Además, también encontramos una función llamada setOwner() que establece el propietario del contrato con el valor msg.sender. Con esto confirmamos que debemos interactuar con este contrato para conseguir los requisitos para conseguir la flag.
Comenzamos por llamar a la función setOwner(). Para ello debemos averiguar el selector de la función para pasarlo como el parámetro _data de la función execution_function(), que a su vez se pasará como parámetro de la función delegatecall().
Para ello, hacemos uso de nuestra herramienta Open Source CrazyToolBox. En el apartado “Function selector encode”, indicamos el nombre de la función setOwner() y nos devuelve el selector 0x40caae06. Llamamos a execution_function:
Figura 7: Ejecución de la función getOwner() a través de delegatecall
Tras esto, podemos verificar que hemos conseguido ser el propietario del contrato llamando a contract.owner(). También podemos llamar a la función getFlag() y nos encontramos con que pasamos el primer requisito (ser el owner) pero no el segundo. Todavía nos queda conseguir poder para obtener el valor de la flag.
Figura 8: Valores de power y stamina
Tenemos que llegar al valor 9 en power. La función addPower() nos sumará 5 al valor de poder. Además, contamos con las funciones addStamina() y delStamina(), que sumarán o restarán 1 al valor de stamina. Por último, también tenemos la función addStaminaToPower() que suma el valor de la stamina al valor que tiene poder.
En el caso del ejemplo, stamina ha comenzado en el valor 6. Para llegar al valor 9 en power, una posible opción sería:
Ahora sí, podemos hacer la llamada al contrato para conseguir la flag y pasar a validarla en el contrato base y la función validateFlag() ya conocida de otros retos.
- addPower() -> Power pasa de valer 0 a valer 5
- delStamina() -> Stamina pasa de valer 6 a valer 5
- delStamina() -> Stamina pasa de valer 5 a valer 4
- addStaminaToPower() -> Power pasa de valer 5 a valer 9 (le suma el valor 4 de stamina)
- addPower() -> 0x51f2e64a
- addStamina() -> 0x1659544c
- delStamina() -> 0x9499443a
- addStaminaToPower() -> 0xcf5e9734
Figura 9: ¡Flag conseguida!
Nuevo reto: Send to me
Como cada mes, la publicación de un nuevo WriteUp! viene acompañado de un nuevo reto. En esta ocasión, parece un contrato sencillo a simple vista. Únicamente hay que encontrar la manera de mandar fondos a un contrato que no está preparado para la recepción de fondo. ¿Encontrarás la manera de hacerte con la flag?
Figura 11: Nuevo reto “Send to me"
Como siempre, esperamos que sigas disfrutando y aprendiendo con la plataforma Level_UP! y nos vemos el próximo mes con un nuevo reto, que pronto tendréis novedades para jugar en una testnet.
Figura 12: Libro dedicado a "Bitcoin: La tecnología Blockchain y su investigación" de Yaiza Rubio y Félix Brezo |
Más artículos de Web3, Blockchain & SmartContracts
- Blockchain & SmartContracts: Una serie para aprender
- BlockChain & SmartContrats: Primer SmartContract con Solidity
- Blockchain & SmartContracts: Cómo probar y desplegar un SmartContract en Ethereum
- WWW, Web 1.0, Web 2.0, Web 3.0, Web3 y ¿Web 4.0?
- Metaverso, multiverso y las tierras digitales en que vivimos en forma de avatar
- Los Fan Tokens vs. las Criptomonedas y los NFTs: Level 101
- Tokenomics: Las criptomonedas y las "Proof-of-work": Level 101
- Los NFTs y el registro mundial de los dueños de activos digitales en el Metaverso
- BitCoin: Blockchain y su investigación
- BlockChain & SmartContrats: El Internet descentralizado y el almacenamiento off-chain en IPFS
- Reentrancy Attack: Cómo te roban criptomonedas por un bug en tu SmartContract
- BlockChain & SmartContract: Bugs que pueden dejar tu SmartContrat "fuera de juego"
- Blockchain & SmartContracts: Patrones y buenas prácticas de seguridad
- Blockchain & SmartContracts: Herramientas de Auditoría de Seguridad de SmartContracts
- BlockChain & SmartContracts: Ataque de phishing a tx.origin y robo de criptomonedas
- BlockChain & SmartContracts: Ataques de Ice Phishing
- Blockchain & SmartContracts: Herramientas de análisis dinámico
- ZIION: Una distribución Linux para auditar SmartContracts (& BlockChain)
- Dominios Web3 en Etherenum Name Service y la trazabilizad de las transacciones Blockchain
- BlockChain & SmartContracts: Actualizar SmartContracts como los grandes protocolos
- Jumping level up (from) web2 (to) web3: Vulnerabilities & SCAMs - SmartContracts
- 20 millones (Euros) en Tokens de Optimism perdidos por no saber cómo funcionan los Wallets Multifirma
- BlockChain & SmartContracts: Cómo crear una DApp de la Web3 con Python (y Flask)
- Pentesting SmartContracts: From Web2.0 to Web3
- Tokenomics 101: Una explicación con gráficos
- Read-Only Reentrancy Attack: $220k robados y otros +$100M en riesgo
- Como utilizar ChatGPT para encontrar bugs en SmartContracts
- BlockChain & SmartContracts: Nuevas áreas profesionales relacionadas con la Web3
- Las voces de Satoshi: Un canal para estar al día en Web3, Blockchain, Criptos & IA
- BlockChain & SmartContracts: Nuevas áreas profesionales relacionadas con la Web3
- Bit2Me Academy: Una plataforma online para aprender de Web3, BitCoin, Tokenomics o Ethereum con cursos gratuitos
- Level_Up!: Una plataforma para aprender a hacer pentesting en Web3 (SmartContracts & BlockChain ) a través de retos hacking
- Level_Up!: Web3 Security WarGames para los amantes del Challenge Based Learning
- Level_up!: WriteUp del Reto Questions para comenzar el pentesting en la Web3
- Level_Up! Deny_to_me Challenge activado en la plataforma Level_up! de retos hacking Web3
- Level_Up!: WriteUp del Ownership Challenge para hacer pentesting en Web3
- Nuevo reto Hacking Web3 de Level_UP! -> Forensic Ouch!
- Level_Up!: WriteUp del reto "Safeguarding" para hacer pentesting en Web3
- Reto Web3 en Level_Up! "Replay_me": La importancia de una correcta validación de firmas
- Level_Up! Configuración paso a paso de la plataforma de pentesting en Web3
- Level_Up! Consigue tus NFTs mientras cuando supera retos Web3
- Telefónica validará nodos de la cadena BlockChain de Celo
- Latch Web3: Un pestillo de seguridad para SmartContract
- Level_Up!: El WriteUp del reto "Origin" y un nuevo reto "Guess my number"
- CrazyToolBox: Una herramienta multifunción de utilidades Web3
- Level_Up!: El WriteUp del reto "ReLottery" y un nuevo reto de agosto llamado “Pay Me!”
- WriteUp: Reto Overworld y nuevo reto DEX Knowledge disponible en Level_Up!
- WriteUp del Reto Hacking Web3 Blockchain Tour & Nuevo Reto Gas Knowledge en Level_Up!
- WriteUp del Reto Hacking Web3 "Snippet Delegated" & Nuevo Reto "Send to me" en Level_Up!
Happy Hacking!
Autor: Álvaro Núñez-Romero, investigador en el equipo de Ideas Locas. Autor del libro "Arduino para Hackers (& Makers): PoCs and Hacks Just for Fun" y del VBOOK de "Arduino para Hackers (& Makers): PoCs and Hacks Just for Fun"
No hay comentarios:
Publicar un comentario