Seguridad

Level_Up!: Una plataforma para aprender a hacer pentesting en Web3 (SmartContracts & BlockChain ) a través de retos hacking

En el equipo de IdeasLocas de la unidad CDO de Telefónica hacemos muchas cosas. Ya sabéis que somos un equipo de pre-innovación que intenta ser lo más ágil posible, probar cosas nuevas, hacer pruebas de concepto rápidas que muestren dónde pueden llegar ciertas tecnologías o ciertas áreas de una rama tecnológica.

Figura 1: Level_Up!: Una plataforma para aprender a hacer pentesting
en Web3 (SmartContracts & BlockChain ) as a través de retos hacking
Imagen Dall-e 2: “drawing of a hacker happy in old computer style”

Llevamos algo más de un año trabajando en el mundo Web3 y poniendo foco en la importancia que tiene la ciberseguridad en este campo. Es más, sabemos que muchas empresas dedicadas al mundo Web3 buscan perfiles de ciberseguridad para mejorar la calidad de sus proyectos y que éstos sean más robustos. Encontrar bugs en SmartContracts, encontrar vulnerabilidades en DApps, auditar el código, incluso auditar el proceso del flujo de creación del entorno Web3 son elementos fundamentales para generar confianza en un proyecto. Conocer más del mundo del tokenomics, entender BitCoin & Blockchain, el mundo de las criptomonedas, es fundamental.


Figura 2: Libro dedicado a “Bitcoin: La tecnología Blockchain y su investigación”
de Yaiza Rubio y Félix Brezo

Este año daré una charla en RootedCON sobre la importancia del aprendizaje con motivación (parece algo obvio, pero puede que no lo sea tanto) y cómo los retos y desafíos fomentan y ayudan a que el alumno disponga de dicha característica. Plataformas de entrenamiento, de retos o desafíos ayudan, y mucho, a generar esa motivación y a poder aplicar un aprendizaje práctico. 

RootedCON & RootedLabs
Hay una frase que me gusta mucho que dice: 
“No vale con ver al profesor hacerlo, tienes que enfrentarte tú y realizarlo, sólo de esa forma interiorizarás el conocimiento práctico”. 
Además, se mostrará una plataforma que hemos realizado para ayudar a los que quieran a introducirse en el mundo de la seguridad en SmartContracts, una plataforma que será de la comunidad.

También, impartiré un RootedLab sobre Pentesting en entornos Web3 (SmartContracts) el día 8 de Marzo en el cual se podrá aprender metodología y conocer las principales vulnerabilidades, técnicas y herramientas para detectar vulnerabilidades en proyectos web. Todo desde un enfoque práctico montaremos un laboratorio e iremos desplegando contratos de pruebas e incluso se retará a los alumnos con los conocimientos que previamente irán conociendo. Tenéis más información en el Dossier del RootedLab. Ya sabéis que es un perfil que empieza a ser buscado.

Level_Up!

Hoy quería hablaros de Level_Up! Este proyecto ha sido muy especial para mí, ya que tuve la suerte de hacerle crecer. Estuve conociendo diferentes plataformas existentes que disponen de retos para aprender de seguridad en Web3 y ver que había un hueco para algo que mezclase el enseñar la interacción con este mundo junto a la seguridad que requieren los proyectos. Por esta razón nace Level_Up! Una plataforma que se liberará en los próximos días y que ayudará a los usuarios que quieran a introducirse en este mundo de la seguridad en SmartContracts y Web3.

Figura 5: Home de Level_Up!

En la imagen anterior se puede ver el ‘home’ de la plataforma. Se puede ver algo que pone “Base Address” y una tabla con lo que parecen los retos. Actualmente hay 9 retos, pero irán aumentando rápidamente, ya que incluir un nuevo reto siguiendo la estructura de Level_Up! es sencillo. Pero antes de nada, unos apuntes sobre la plataforma y su arquitectura:

  • La plataforma proporciona una DApp, la cual está conectada con la Blockchain (en este caso local, recomendamos montar un Ganache, aunque se podría utilizar otros proveedores, ya que hay un fichero de configuración en el que se configura todo lo necesario para arrancar la plataforma, pero esto lo dejaremos para otro artículo).
  • La DApp conecta con la Blockchain y con un SmartContract denominado “Base“. El SmartContract Base es el encargado de gestionar y almacenar qué usuarios están dados de alta y qué usuarios han desplegado niveles y el estado de dichos niveles. En otras palabras, el contrato base es la base del juego.
  • Cada reto que vemos en la pantalla principal tendrá unos objetivos de aprendizaje. Por ejemplo, el primer reto tiene como objetivo mostrar como interactuar con la plataforma, pero habrá otros retos que trabajarán con vulnerabilidades de lógica en un contrato, con fallos en un delegate_call, un re-entrancy, un Overflow, etcétera.
  • Cuando queremos jugar a un reto debemos desplegar dicho contrato del reto. Este contrato es diferente del contrato Base. Tienen diferentes objetivos, uno nos proporciona un reto en el que deberemos conseguir el flag y el otro nos gestiona las puntuaciones, los jugadores, etcétera, es decir, todo lo referente a la plataforma.
  • Nosotros jugamos con la Blockchain de Ganache conectada.

Resumiendo:

  • Tenemos una Blockchain (se puede configurar, pero nosotros recomendamos montarlo en pruebas y usar Ganache o Hardhat).
  • Tenemos un SmartContract que gestiona jugadores, niveles, puntuaciones y validará las flags que consigamos. Este contrato es Base.
  • -Por cada reto se desplegará uno o varios contratos y se nos pondrán unos objetivos. Siempre deberemos conseguir una flag para poder validarla contra el contrato Base.
  • – Teneos una DApp que nos permite interactuar de forma “amigable” con la plataforma.

Lo primero que debemos hacer cuando ingresamos a la plataforma es darnos de alta como jugador. Recordemos, hay que decirle al contrato Base quiero jugar en este CTF o plataforma de aprendizaje / entrenamiento.

Figura 6: Comienzo del “juego”

Para crear un jugador es sencillo, simplemente pulsaremos sobre el botón “Crear Player” y, posteriormente, aceptar la transacción con nuestro Metamask. Una vez el usuario se ha creado, se habrá añadido al contrato Base, por lo que ya está preparado para poder desplegar retos. El despliegue de los retos se puede solicitar al backend y será éste el que tiene una cuenta (que se configura en el fichero de configuración de la plataforma) y hace el despliegue. Es decir, sería la cuenta del backend quién paga “la fiesta”. 

Figura 7: Transacción con Metamask para empezar el “juego”

Por esta razón, si alguien quiere montar esto en un entorno real, debería tener esto muy en cuenta, ya que cada usuario que despliega un reto no lo paga, realmente lo paga el backend. Esto sería fácil de cambiar para que sea el usuario quién se hace cargo del pago, pero no es el objetivo del proyecto. El objetivo es que equipos o usuarios puedan desplegar en un entorno controlado por ellos y puedan entrenar (y “picarse” debido a que hay un Global Score con las puntuaciones de todos los usuarios que están dados de alta). En la siguiente imagen se puede ver como el usuario se creó y tiene 0 puntos y no tiene ningún contrato desplegado.

Figura 8: Ningún punto y sin SmartContracts desplegados

Cuando queremos desplegar un reto hay que acceder a la página del propio reto. En esta página podemos encontrar una serie de pasos que nos irá guiando y dando, en algunos casos, alguna pista. Por ejemplo, si queremos desplegar el reto ‘Interact’, el cual es un reto a modo de tutorial de ver cómo funciona la plataforma. Al acceder a la página del reto ‘Interact’ vamos a ver información y una serie de pasos y se nos mostrará el contrato como tal o los contratos que contienen el reto. Creemos que esto es importante, ya que para auditar contratos es vital conocer el lenguaje y ser capaces de ver qué lógica tiene el contrato y qué hace.

Figura 9: Interact Challenge

Tras desplegar el primer reto y tal como nos cuentan en la descripción del reto, debemos abrir la consola del navegador (las ‘Dev Tools’). Si ejecutamos el comando ‘help’ podremos ver una ayuda con los comandos / objetos disponibles para este reto. Algunas cosas a tener en cuenta:

  • Siempre aparecerá el objeto ‘Base’: Este objeto nos permite interactuar con el SmartContract Base. Esto lo usaremos cuando queramos validar una flag o hacer uso de alguna función del SmartContract. Principalmente, solo lo necesitaremos para cuando consigamos resolver el reto y necesitemos validar la flag y obtener los puntos del reto.
  • El comando ‘player’ me devuelve la dirección pública de mi cuenta: Simplemente por tenerlo a mano, aunque esté en Metamask. Esta dirección es con la cuenta que estoy conectado a la plataforma, es decir, con el jugador que estoy jugando.
  • El ‘contract’ nos permite interactuar con el contrato que tiene la flag y que me marcará el reto: Puede haber más objetos de otros contratos si se necesitasen para cumplir el reto.

A través de los objetos de los contratos podemos ver fácilmente las funciones, como se puede ver en la imagen. En la mayoría de los retos existirá la función getFlag(), la cual proporcionará el flag cuando se supere el reto.

Figura 10: Help con player, contract y base

En este primer reto de tutorial es muy simple, ya que solamente tendremos que pedirle al contrato que nos de la flag. En otros escenarios, habrá que conseguir realizar otras acciones, explotar vulnerabilidades, explotar la lógica de la aplicación u otras acciones para conseguir la flag.

Figura 11: SmartContract del tutorial

A continuación, se puede ver cómo podemos desde la consola interactuar con el contrato. Si el contrato tiene una función Owner() y getFlag() se puede consultar a través de la siguiente sintaxis. En este primer reto (modo tutorial) al pedir la flag, nos la dan directamente (en los siguientes retos, ya no será así de sencillo).

Figura 12: Pidiendo la flag al SmartContract

Una vez que tenemos la flag hay que dársela al contrato base para validar el resultado y obtener los puntos asociados al reto. La sintaxis de la validación de la flag siempre es igual:

  • Base.validateFlag(<dirección contrato reto>, <valor flag>)

Hay que indicar que cada usuario que despliega un reto tiene una flag diferente. Es decir, si el usuario 1 despliega el reto 1, el backend genera una flag (la cual se informará al contrato base que es el que gestiona) para dicho reto. Si el usuario 2 despliega el reto 2, la flag será diferente a la del contrato del reto 1 que desplegó el usuario 1. De esta forma, los ‘players’ no podrán pasarse las flags.

Figura 13: Validando la flag

Una vez que se valida una flag en un reto, el usuario puede ir a sus stats y ver el estado de cada reto. Aquí se puede ver como el usuario ha desplegado un reto y lo ha superado. Se le proporciona una cantidad de puntos y puede ir desplegando otros retos. El usuario puede desplegar los retos en el orden que quiera y puede desplegar varios sin tenerlos resueltos.

Figura 14: Player Stats

Por último, la plataforma muestra un ‘Global ScoreBoard’. De este modo, todos los usuarios que participan en la plataforma pueden ver cuántos puntos tienen otros usuarios y competir entre ellos. Esto es un hecho importante, ya que la competitividad también motiva a mejorar el aprendizaje.

Figura 15: Global Scoreboard

Por supuesto, para resolver los retos se podría utilizar GhatGPT para que te ayude a encontrar y a explortar cada una de las vulnerabilidaes de los SmartContracts, pero lo suyo es que aprendas a hacerlo tú y luego uses IA para asistirte en la toma de decisiones o ahorrarte tiempo, no para hacer tu trabajo.


Iremos publicando más información sobre Level_Up! Y pronto estará disponible para que la comunidad pueda utilizarla y jugar con ella. Además, iremos publicando Writeups sobre la resolución de los retos y seguiremos compartiendo conocimiento en seguridad en el mundo Web3.

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

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.