Level_Up!: WriteUp del reto «Safeguarding» para hacer pentesting en Web3
- 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
En esta ocasión, al acceder al reto, nos encontramos con 7 pasos y una pista. La pista nos indica que nos fijemos en qué hace keccak256. Además, revisando el código, y como en el contrato del reto de “Ownership”, aparece el modificador onlyOwner que comprueba que el msg.sender sea el propietario (owner) del contrato.
Este modificador aparece en la función getFlag() y en el paso 6 ya se indica que debemos conseguir ser el owner del contrato para obtener la flag, por lo que vamos a desplegar el contrato y a revisar que funciones tenemos disponibles.
Comenzando el reto
Una vez desplegado el reto, revisamos las funciones disponibles con contract.functions:
La función safeguard() es la que más llama la atención, ya que getFlag() se usará para conseguir la flag (ya sabemos que debemos conseguir ser propietarios del contrato para ello) y la función owner() nos va a devolver quien es el propietario del contrato. Revisamos con detenimiento que hace la función safeguard(). Vemos que necesita dos argumentos (2 strings) para su ejecución y que tal y cómo se indicaba en la pista del reto, ¿qué hace que está presente dentro de esta función?
La función keccak256() va a calcular el hash Keccak-256 de la entrada indicada. Puede verse que para llamar la función safeguard() se pasan dos parámetros, _flag y _message. Si probamos a llamar a esta función con un par de valores aleatorios, por ejemplo, “hola” y “mundo” nos devuelve el siguiente error: “Mensaje incorrecto”.
Observamos en el código del SmartContract que este error aparece cuando no se cumple la siguiente condición:
- keccak256(abi.encodePacked(message)) == keccak256(abi.encodePacked(«secret»))
Es decir, que el segundo parámetro que se pasa a la función safeguard() debe ser el string «secret«. Cuando esto se cumpla, se pasará de dicha linea y vemos que se asigna a la variable owner el valor de msg.sender.
Además, la primera vez que se pasa de este require hay otra condición, y es que si el valor de la variable flag del contrato es igual a «firstuse«, que es el valor que tiene el contrato al inicio, se asignarán las variables flag y message del SmartContract. El valor del primer argumento pasado en la función safeguard(), en el caso de la variable flag, y «random» en el caso de message. Un poco más abajo vemos la explicación sobre esto.
Ahora se puede llamar a la función getFlag(), firmar la transacción y validar la flag obtenida a través del contrato base: base.validateFlag(contract.address, «flag_encontrada»)
Superar este reto nos dará 75 puntos que se sumarán a la puntuación global del usuario.
Explicación de la vulnerabilidad
¿Recuerdas que la función safeguard() tenía como primer argumento un string que no se ha llegado a utilizar? Como se indica más arriba, este primer argumento, en el caso de ser «firstuse«, entrará en una condición que asignará las variables flag y message del contrato.
Acabamos de comprobar que completar el reto no es muy complejo, sin embargo, debemos resaltar en que consiste esta vulnerabilidad. Si nos fijamos, la función safeguard() tiene un comentario que indica que dicha función es el constructor. Pero, ¿por qué se está utilizando una función como constructor cuando se podría utilizar la palabra reservada constructor?
Hay que retroceder en el tiempo hasta las versiones inferiores a la versión 0.4.22 de Solidity, ya que antes no era posible utilizar dicha palabra reservada. Esto hacía que se tuviera que crear el constructor mediante una función y, para que únicamente se ejecutase una vez, se tenía que crear una variable que actuase a modo de bandera, es decir, que tiene asignado un valor inicial y, tras realizar una acción, cambia el estado.
En definitiva, para superar este reto hay que fijarse en que para conseguir ser el propietario del contrato se está evaluando la condición de que el hash keccak256 del segundo argumento que se pasa a la función safeguard() debe ser igual a «secret«. Sin embargo, no debemos olvidar que el uso incorrecto de una función como constructor permite que este sea llamado en más de una ocasión, pudiendo provocar fallos como los vistos durante este reto.
Figura 11: Libro dedicado a «Bitcoin: La tecnología Blockchain y su investigación» de Yaiza Rubio y Félix Brezo |
Esperamos que sigas disfrutando de la plataforma Level_UP! y mucho ánimo con el resto de retos. Y recuerda que si quieres aprender de estas tecnologías, tienes Bit2Me Academy, que es una plataforma online para aprender de Web3, BitCoin, Tokenomics o Ethereum con cursos gratuitos además del libro dedicado a «Bitcoin: La tecnología Blockchain y su investigación» de Yaiza Rubio y Félix Brezo que seguro que te ayudan a ponerte las pilas.
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
Powered by WPeMatico