Entramos en el mes de junio y, en esta ocasión, nos toca dar solución al reto de hacking Web3 llamado “Safeguarding”, que es el número 3 de nuestra plataforma Level_UP! , con una dificultad de 2 sobre 5 puntos, para que todos los que queráis aprender pentestesting Web3 y hacking en Blockchain, SmartContracts y Tokenomics os podáis poner las pilas.
En otras ocasiones ya se han publicados otros writeups de los primeros niveles de la plataforma Level_UP!, y todos los podéis encontrar en:
- 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
- Reto Hacking Web3 de Level_UP! -> Forensic Ouch!
Figura 2: Modifier onlyOwner
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:
Figura 3: Funciones del reto SafeGuarding
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?
Figura 4: Función safeguard()
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”.
Figura 5: Mensaje incorrecto al llamar a safeguard ("HOLA", "MUNDO")
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"))
Figura 6: Conseguimos ser el propietario del contrato
Figura 7: Condicional a la bandera en su primer uso
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")
Figura 8: Obtención de la flag
Superar este reto nos dará 75 puntos que se sumarán a la puntuación global del usuario.
Figura 9: Puntos conseguidos con este reto
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.
Esto es lo que ocurre con la variable flag. El servidor a la hora de desplegar el contrato llama a la función safeguard() y, tras comprobar que la variable flag tiene el valor inicial establecido "firstuse", entrará en la condición y asignará el nuevo valor de flag, que posteriormente podrá recuperarse al llamar a la función getFlag(). Esta debilidad está catalogada como la 118 del registro SWC (Smart Contract Weakness Classification).
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.
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 |
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
No hay comentarios:
Publicar un comentario