Apunto de finalizar el mes de septiembre lanzamos el WriteUp del reto Overworld y publicamos el mes de septiembre, en este caso un reto para entender conceptualmente el funcionamiento de un DEX o un Exchange Descentralizado. Seguimos avanzando en el aprendizaje de la Web3 y de la seguridad que rodea a ésta.
Figura 1: WriteUp del Reto Hacking Web3 Overworld
& Nuevo Reto DEX Knowledge en Level_UP!
Cada vez son más los usuarios que juegan con Level_UP! y que quieren conocer la seguridad sobre este campo. Es más, si estás por Albacete la semana que viene pásate por Navaja Negra para ver el taller sobre Seguridad en Web3 dónde Level_UP! es protagonista, y lo impartiré con nuestro compañero Álvaro Núñez-Romero.
Además, pronto tendremos novedades para que podamos disfrutar de Level_UP! en una testnet y seguir el aprendizaje sin necesidad de desplegarlo en local. Si quieres montar tu CTF sobre Web3, Level_UP! es tu entorno Open Source con el que poder hacerlo. Queremos facilitar el aprendizaje, sin necesidad de desplegarlo en local, por lo que utilizaremos alguna testnet y pronto daremos noticias.
Dicho todo esto, vamos con el artículo de hoy. Vamos a dar solución al Reto Overworld. La dificultad de Overworld es de tipo 3, aunque puede resultar sencillo para muchos players, ya que dependerá cómo todo de la intuición y conocimiento de cada uno. Los puntos en juego son 100.
Reto: Overworld
Leyendo la página del reto podemos entender que el objetivo es conseguir la flag, como siempre, y que para ello debemos trabajar con el concepto de Token. Podremos crear y quemar tokens. El acertijo que hay que resolver es si podemos conseguir llegar a los 255 tokens. Si leemos las funciones faucet y burning encontramos que no podemos o no deberíamos poder llegar a los 255 tokens que son necesarios para conseguir la flag. Vamos a ver cómo podemos jugarlo.
Además, pronto tendremos novedades para que podamos disfrutar de Level_UP! en una testnet y seguir el aprendizaje sin necesidad de desplegarlo en local. Si quieres montar tu CTF sobre Web3, Level_UP! es tu entorno Open Source con el que poder hacerlo. Queremos facilitar el aprendizaje, sin necesidad de desplegarlo en local, por lo que utilizaremos alguna testnet y pronto daremos noticias.
Figura 3: Level_Up! en GitHub
Reto: Overworld
Leyendo la página del reto podemos entender que el objetivo es conseguir la flag, como siempre, y que para ello debemos trabajar con el concepto de Token. Podremos crear y quemar tokens. El acertijo que hay que resolver es si podemos conseguir llegar a los 255 tokens. Si leemos las funciones faucet y burning encontramos que no podemos o no deberíamos poder llegar a los 255 tokens que son necesarios para conseguir la flag. Vamos a ver cómo podemos jugarlo.
Tras desplegar el reto nos fijamos en que la variable balances almacena un mapping entre direcciones y números enteros sin signo de 8 bit. Este detalle es importante. En otras palabras, el contrato almacena la cantidad de tokens que tiene cada usuario, pero no podrá almacenar más de 255, ya que el tipo de dato es un entero sin signo. Al ser un entero sin signo, el rango de valores va de 0 a 255. Para conseguir la flag, el requisito es conseguir tener 255 tokens.
El problema viene cuando vemos que usando la función faucet para mintear tokens y la función burning para quemar tokens pues se controla que no se pueda llegar a 255. Si revisamos bien la función burning comprueba la suma, pero no la resta. Al final, quemar tokens es una resta de enteros, por lo que si se valida la suma no tendrá validez.
¿Qué ocurre si tengo 0 tokens y pido quemar 1? Se produce un Underflow y consigo el valor máximo, es decir, 255. Si intento mintear tokens y llegar a 255 no voy a poder, porque el require de la función faucet no me lo va a permitir. En el caso de burning se comprobaría que 1 + 0 no es 255, pero realizaríamos la operación inversa, quemar tokens y daríamos “la vuelta” al marcador, pero por el límite inferior. Es decir, hacemos un underflow.
¿Esto no lo controla Solidity? La respuesta es sí y no. Hasta la versión 0.8 del compilador no y si nos fijamos la versión de compilación del código es la 0.6.2, por lo que el lenguaje no controla los límites inferiores, ni superiores de las variables de tipo entero. Esto puede ser un gran problema, como se ve en el reto. Debe ser el programador quién lo controle. ¿Cómo avanzamos?
Figura 4: Función getFlah()
El problema viene cuando vemos que usando la función faucet para mintear tokens y la función burning para quemar tokens pues se controla que no se pueda llegar a 255. Si revisamos bien la función burning comprueba la suma, pero no la resta. Al final, quemar tokens es una resta de enteros, por lo que si se valida la suma no tendrá validez.
¿Qué ocurre si tengo 0 tokens y pido quemar 1? Se produce un Underflow y consigo el valor máximo, es decir, 255. Si intento mintear tokens y llegar a 255 no voy a poder, porque el require de la función faucet no me lo va a permitir. En el caso de burning se comprobaría que 1 + 0 no es 255, pero realizaríamos la operación inversa, quemar tokens y daríamos “la vuelta” al marcador, pero por el límite inferior. Es decir, hacemos un underflow.
Figura 5: Función burning()
¿Esto no lo controla Solidity? La respuesta es sí y no. Hasta la versión 0.8 del compilador no y si nos fijamos la versión de compilación del código es la 0.6.2, por lo que el lenguaje no controla los límites inferiores, ni superiores de las variables de tipo entero. Esto puede ser un gran problema, como se ve en el reto. Debe ser el programador quién lo controle. ¿Cómo avanzamos?
La solución más rápida y sencilla sería si tengo 0 tokens en un inicio y lo puedo ver invocando al objeto contract.mytokens() desde la consola de Javascript del navegador y quiero llegar a 255, puedo solicitar quemar una unidad a mis tokens. Debería comprobarse que no tengo tokens y que no puedo quemar, pero la comprobación no se hace correctamente, como se puede ver en el fragmento de código de la Figura 6.
Ahora, si invocamos un contract.burning(1) se restaría una unidad a nuestros 0 tokens provocando el desbordamiento (underflow) y pasaríamos a tener el valor máximo que sería 255. Justo lo que necesitsamos tener para lograr la flag.
Ahora toca validar la flag para conseguir los puntos. Podemos visualizar la flag con contract.getFlag() y, posteriormente, validarlo contra el contrato base con la instrucción base.validateFlag(contract.address, contract.getFlag()).
Nuevo reto: DEX Knowledge
Publicamos el nuevo reto del mes de septiembre en Level_UP! Es el reto número 16 y tiene una dificultad de 3 sobre 5. Habrá 150 puntos en juego y permite conocer el concepto de DEX o Exchange Descentralizado. La idea del reto consiste en que el player pueda conocer los conceptos básicos de un DEX para intercambiar tokens y delegarlos para que un DEX pueda intercambiarme los valores.
No será tan sencillo el reto, por lo que tendremos que estudiar las condiciones que debemos cumplir para conseguir el acceso a la flag y poder superar el reto y sumar los puntos. Os animamos a jugar con DEX Knowledge en Level_UP! que pronto tendréis novedades para jugar en una testnet. Nos vemos en el Taller de Seguridad Web3 de Navaja Negra y seguiremos aprendiendo sobre la seguridad de los SmartContract.
Figura 7: Resultado obtenido 255 tokens tras quemar 1 token con 0 token de saldo
Ahora, si invocamos un contract.burning(1) se restaría una unidad a nuestros 0 tokens provocando el desbordamiento (underflow) y pasaríamos a tener el valor máximo que sería 255. Justo lo que necesitsamos tener para lograr la flag.
Figura 8: Conseguimos la flag y validamos la flag.
Nuevo reto: DEX Knowledge
Publicamos el nuevo reto del mes de septiembre en Level_UP! Es el reto número 16 y tiene una dificultad de 3 sobre 5. Habrá 150 puntos en juego y permite conocer el concepto de DEX o Exchange Descentralizado. La idea del reto consiste en que el player pueda conocer los conceptos básicos de un DEX para intercambiar tokens y delegarlos para que un DEX pueda intercambiarme los valores.
Figura 9: Nuevo reto "DEX Knowledge"
No será tan sencillo el reto, por lo que tendremos que estudiar las condiciones que debemos cumplir para conseguir el acceso a la flag y poder superar el reto y sumar los puntos. Os animamos a jugar con DEX Knowledge en Level_UP! que pronto tendréis novedades para jugar en una testnet. Nos vemos en el Taller de Seguridad Web3 de Navaja Negra y seguiremos aprendiendo sobre la seguridad de los SmartContract.
Figura 10: 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!
Saludos,
Autor: Pablo González Pérez, escritor de los libros "Metasploit para Pentesters", "Hacking con Metasploit: Advanced Pentesting" "Hacking Windows", "Ethical Hacking", "Got Root", “Pentesting con Powershell” y de "Empire: Hacking Avanzado en el Red Team", Microsoft MVP en Seguridad y Security Researcher en el equipo de "Ideas Locas" de la unidad CDCO de Telefónica. Para consultas puedes usar el Buzón Público para contactar con Pablo González
Contactar con Pablo González |
No hay comentarios:
Publicar un comentario