Seguridad

WriteUp del Reto Hacking Web3 «Blockchain Tour» & Nuevo Reto «Gas Knowledge» en Level_Up!

Como cada mes, hoy traemos un nuevo WriteUp y un nuevo reto para Level_UP! En esta ocasión le toca el turno al reto número 7, identificado en la plataforma como “Blockchain_Tour”. Se trata de un reto con una dificultad de nivel 2 sobre 5 y que nos otorgará una puntuación de 75 puntos si lo logramos superar. ¡Vamos a por ello!

Figura 1: WriteUp del Reto Hacking Web3 «Blockchain Tour»
Nuevo Reto «Gas Knowledge» en Level_UP!

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.


Reto: Blockchain Tour
En primer lugar, se puede apreciar que se trata de un contrato bastante simple. Se definen al comienzo algunas variables en el Storage del contracto, también está el constructor del Smart Contract y una función denominada set_flag(flag).

Figura 3: Smart Contract del reto Blockchain Tour

Si ya has jugado otros niveles de Level_UP! echarás en falta la típica función getFlag() que normalmente, tras realizar diferentes acciones para conseguir ser el owner del contrato, nos termina devolviendo la flag para superar el reto. Sin embargo en esta ocasión no disponemos de dicha función, por lo que tenemos que ver que otras opciones tenemos. Detallando las variables que se almacenan en el Storage tenemos:

  • Una variable privada de tipo string llamada flag.
  • Un variable pública de tipo uint llamada blocknumber.
  • Una variable pública de tipo address llamada owner.

Esta última variable, owner, se fija en el momento del despliegue del contrato, a través del constructor, dándole el valor con la dirección del msg.sender. Además, la plataforma hace también una llamada a la función set_flag() tras desplegar el contrato para definir el valor de la flag dinámica que se genera desde el backend. Por ello, esta función set_flag() tiene un requisito que comprueba que es el propietario del contrato el que puede llamar a esta función.

Además de definir el valor de la flag (que se pasa como parámetro y se guardará en la variable flag del Storage), se define el valor de la variable blocknumber, que tendrá el valor del número de bloque actual. Y aquí es donde debemos fijarnos. Al ser una variable pública podremos acceder a dicho valor.

Figura 4: Acceso a la variable blocknumber desde la consola del navegador

Podemos encontrar el valor en hexadecimal que, si lo pasamos a decimal, obtendremos el valor del bloque donde debemos buscar. En el ejemplo mostrado aparece el valor “0x027e”, que se corresponde con el valor 638. Vamos ahora a revisar que hay en dicho bloque. Para revisar el contenido del bloque podemos hacer uso de la API JSON-RPC que dispone la blockchain, concretamente haciendo una solicitud con método eth_getBlockByNumber:

curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByNumber",
"params":["0x027e", true],"id":1}' 127.0.0.1:7545
Figura 5: Haciendo uso de JSON-RPC API de Ethereum

En este caso, como la blockchain se encuentra en un Ganache GUI en la misma máquina, sería posible revisar directamente la GUI para encontrar el bloque de una manera más sencilla aunque este método sólo es válido si tenemos nosotros el acceso al Ganache GUI.

Figura 6: Visualización del bloque en Ganache GUI

En ambos ejemplo nos encontramos que hay una única transacción: 0xcc3abbedd9f63ef1d09c3f1b7a6b978917bc9970d36316c1476d8b23a9f4cca6. Incluso en la petición con cURL nos da la información directamente del input de la transacción, ya que la petición se hizo para que diera el detalle de cada una de las transacciones que se encuentran en el bloque:

0x42e22ff6000000000000000000000000000000000000000000000000000000000000002
     00000000000000000000000000000000000000000000000000000000000000027323
     23934383936343334313433363136383934303638393337373430313235373131373
     138393300000000000000000000000000000000000000000000000000

Con esta información, en primer lugar, podemos averiguar el selector de la función. Hago uso de nuestra herramienta Open Source CrazyToolBox y compruebo el selector 0x42e22ff6 con la función selector decoder.

Figura 7: Selector decoder con la herramienta CrazyToolBox

Pero lamentablemente el servicio 4byte.directory no tiene información sobre este selector, por lo que procedo a validar que la función set_flag() se corresponde con dicho selector haciendo uso del selector encoder.

Figura 8: Selector encoder con la herramienta CrazyToolBox

Ahora sí, estamos seguros de que en esos datos es donde debemos buscar nuestra flag. Como en la función get_flag() sólo se pasa un parámetro (la flag) vamos a convertir los datos de hexadecimal a texto (ASCII).

Figura 9: Conversor de hexadecimal a ASCII

¡Lo tenemos! Finalmente, nos queda validar nuestra flag (únicamente los números) interactuando con el contrato base y la función validateFlag() para obtener nuestros puntos, tal y como ya se ha realizado con anterioridad en el resto de retos.


Nuevo reto: Gas Knowledge


Este mes publicamos un nuevo reto relacionado con el gas en Ethereum, donde se repasa este concepto y tendrás que acelerar tus transacciones si quieres superar el reto. Se trata del reto número 17, con un nivel de 2 sobre 5 y que nos dará 75 puntos para sumar al resto de retos que ya tenemos validados. Recuerda reclamar tu NFT en la plataforma cada vez que puedas para demostrar tu nivel, ¿llegarás a ser el gran maestro?

Figura 10: Nuevo reto «Gas Knowledge»

Como siempre, esperamos que sigas disfrutando y aprendiendo con la plataforma Level_UP! y nos vemos el próximo mes con un nuevo reto, que pronto tendréis novedades para jugar en una testnet


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
Happy Hacking!

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.