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.
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.
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.
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.
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.
Figura 2: Level_Up! en GitHub
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.
Figura 5: Libro dedicado a "Bitcoin: La tecnología Blockchain y su investigación" de Yaiza Rubio y Félix Brezo |
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.
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.
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.
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.
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.
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.
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 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:
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()
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 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
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
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
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