lunes, abril 24, 2023

Level_up!: WriteUp del Reto Questions para comenzar el pentesting en la Web3

Ya hemos hablado de Level_up! en este blog y de lo que ofrece esta plataforma OpenSource que hemos liberado desde IdeasLocas. La presentamos en RootedCON 2023 y hemos recibido un buen feedback, aunque como todo tenemos mucho que mejorar. Levantar un CTF a través de retos de ciberseguridad en Web3 es y ha sido un reto más que interesante, por lo que no dudes en probar la plataforma y aprender sobre ciberseguridad en este mundo de la Web3.

Figura 1: Level_up!: WriteUp del Reto Questions
para comenzar el pentesting en la Web3

En el artículo de hoy y dentro de nuestra política de liberar un nuevo reto mensual y de resolver un reto mensual a través de un WriteUp, vamos a hablar del Level 1 de la plataforma. Este reto denominado Questions tiene una dificultad de 1, por lo que se puede considerar de nivel básico y de toma de contacto con el mundo Web3. Fue uno de los primeros retos que se diseñaron y que propone al usuario una interacción con el contrato del reto para ir resolviendo diferentes dudas. Después, puedes pasarte a hacer  el reto Deny_to_me que tiene un poco más de dificultad.


Sin más, vamos a ir explicando detalles del reto que pueden proporcionar la resolución de éste. Hay que recordar que en todos los retos, el objetivo es el de obtener una flag que cuando la validemos contra el contrato base nos permitirá obtener diferentes puntos. Al final Level_up! es una plataforma de CTFs con un fuerte componente de ‘gamificación’, ya que puedes competir contra el resto de usuarios que están dentro de esta plataforma a través del panel del ScoreBoard.

Solución reto Questions

En primer lugar, vamos a desplegar el reto Questions. Para ello, se puede hacer desde el panel central de la plataforma dónde se encuentran todos los retos. Es importante leer la descripción y el paso a paso que nos desvelan antes de desplegar el reto. En esta descripción podemos encontrar información interesante y alguna pista para facilitar la solución y obtención del reto.

Figura 3: Reto Questions, nivel 1.

En la siguiente imagen, se puede ver los diferentes pasos, que en esta ocasión son pocos, y un par de pistas por si el jugador se queda ‘atascado’. Nos indican que la función ‘entrypoint’ del contrato del reto (hay que recordar que el contrato del reto es el objeto ‘contract’) es la que marca el comienzo de la interacción.

Figura 4: Instrucciones del reto

No nos dicen mucha más información debido a que es un reto de dificultad sencilla (1 sobre 5), por lo que nos debería valer con haber hecho el reto ‘Interact’ (el cual es el reto tutorial de la plataforma) y poco más. 
Una vez desplegamos el contrato, desde la consola de desarrollo podemos interactuar con la ayuda a través del comando ‘help’. Lo que nos interesa ahora mismo es validar el objeto ‘contract’ accesible desde la consola de desarrollo.

Figura 6: Funciones del SmartContract

Podemos ver las diferentes funciones de las que cuenta el contrato de ‘Questions’. Hay que indicar que hay más funciones de las que aparecen en la captura. Otra opción es leer el código fuente del contrato del reto que aparece en la descripción de la página. Entender el código ayudará y mucho en algunos retos más complejos.

Ahora, vamos a ver qué devuelve la función entrypoint() del objeto ‘contract’. Como se puede ver en la imagen nos devuelve “misterio()”, lo que parece una función. Si revisamos las funciones disponibles en el contrato del reto (imagen anterior) podemos ver que existe dicha función.

Figura 7: Función misterio()


Después, invocamos la función misterio() y nos sale un mensaje. Parece que la función misterio4() existe y si comprobamos con ‘contract.functions’ verificamos que sí. Vamos utilizando las diferentes respuestas que nos van dando para llegar a la primera parte del misterio. Aparece el número 32. Tomaremos nota de ello.

Si verificamos las funciones que existen en el contrato del reto, vemos que hay una denominada ‘entrypoint2()’. Habrá que probar a ver qué nos dice el contrato.

Figura 8: Pregunta.

Nos piden verificar cual es el hash del string ‘hola’ en MD5. Esto es algo sencillo de resolver, podemos usar cualquier servicio online para obtener esa respuesta o el comando md5sum en un terminal de GNU/Linux. Si volvemos a echar un ojo a las funciones disponibles en el contrato del reto encontramos una que se llama ‘checkHash’. Si revisamos el código fuente, podemos ver que dicha función recibe un parámetro que es un string.

Figura 9: función checkHash()

En el código fuente se ve que hay una devolución de un número que es 659, ¿Qué será? Vamos a verlo desde la consola de desarrollo.

Figura 10: Respuesta a la llamada

La respuesta es un hexadecimal: 0x293. Si pasamos a decimal encontramos que es el número 659. Solo nos queda una función por probar… la función ‘finalChoice’ la cual, viendo el código fuente, recibe dos parámetros. Podemos probar con 32 y 659.

Figura 11: Función finalChoice()

Obtenemos la flag. Hay que recordar que las flags se crean de forma dinámica, es decir, si otro usuario despliega el reto, la flag tendrá un valor diferente. Ahora, solo queda validar la flag en el contrato base para que los puntos sean añadidos al usuario. La operación es sencilla: 

Figura 12: Validamos la flag con ‘base.validateFlag(contract.addess,’flag’).

Una forma rápida de solucionar el reto…

Hemos dejado para el final una forma muy rápida de superar el reto, aunque recomendamos hacer los pasos anteriores si estás comenzando con los SmartContracts. Teniendo acceso al código fuente, uno puede ver la función ‘finalChoice’. 

Figura 13: Valores hardcodeados de la solución en la función finalChoice()

En esta función se está haciendo una validación directa y ‘hardcodeada’ de los valores 32 y 659. De esta forma si hubiéramos leído todo el contrato de primeras, podríamos habernos percatado de esto. 

Y aún hay más...

Hasta aquí el WriteUp de Questions. El próximo mes escribiremos otro writeup para ayudaros a ir resolviendo los retos e ir aprendiendo sobre esta plataforma y sobre la ciberseguridad en el mundo Web3Y 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érez (@pablogonzalezpe), 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

Figura 14: Contactar con Pablo González

No hay comentarios:

Publicar un comentario