Seguridad

WriteUp del Reto Hacking Web3 Overworld & Nuevo Reto DEX Knowledge en Level_Up!

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á nuestro compañero Álvaro Núñez-Romero.

impartido por Á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 Web3Level_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. 

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.

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? 


Figura 6: Función burn()
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.

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.

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.

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.


Seguiremos resolviendo retos y creando nuevos retos para el aprendizaje en seguridad en Web3 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
Saludos,

Autor: Pablo González Pérezescritor 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

Powered by WPeMatico

Gustavo Genez

Informático de corazón y apasionado por la tecnología. La misión de este blog es llegar a los usuarios y profesionales con información y trucos acerca de la Seguridad Informática.