Reto Web3 en Level_Up! "Replay_me": La importancia de una correcta validación de firmas
Hoy traemos un nuevo reto de la plataforma de aprendizaje de Level_UP! el reto que traemos hoy es el de "Replay_Me", el cual se basa y trabaja la importancia que tiene la validación de firmas y no permitir la posibilidad de reutilizarlas. Si observamos algunas vulnerabilidades en proyectos desplegados en la web3 podemos encontrar este tipo de situaciones. El pedirle a un usuario que firme un mensaje es algo muy normal y que ocurre con frecuencia, ya que es la forma que tenemos de verificar que la persona que está al otro lado es el propietario de dicha clave.
Por esta razón, conocer bien el concepto de verificación de firmas y anulación de éstas es importante cuando uno desarrolla un proyecto Web3. El nuevo reto es el número 13 (level = 12) y tiene una dificultad de 5 sobre 5. ¿Es tan complejo? La verdad es que el concepto en sí es complejo y requiere de una base previa que se puede ir tomando cuando uno se va adentrando en este mundo.
En la siguiente imagen se puede visualizar los diferentes retos de los que consta en Junio de 2023 la plataforma Level_UP!, ya disponible, por supuesto, en su Github. Además, estamos trabajando y evaluando alguna sorpresa a corto plazo que enriquecerá la gamificación de la plataforma. No desvelaremos nada, pero seguro que gusta y mucho.
Además, recientemente, se ha realizado un pequeño CTF en Escuela 42 dónde la gente se ha divertido mucho con la plataforma, así nos lo han hecho saber y estamos muy contentos con la experiencia, pero esto lo dejamos para contar otro día.
Conociendo el reto: replay_me
Ahora, vamos a detallar un poco el reto en sí. Cuando accedemos a la página de despliegue del reto en la plataforma, podemos encontrar diferentes pasos (como siempre). El primer ‘snippet’ de código que encontramos es el de una función ‘deposit’ que hace “algo” y envía un hash de un mensaje y tres elementos (no desvelo más). Con estos 4 parámetros se puede verificar el mensaje y la firma de quién invoca esta función (al menos quién invoca la función tiene esos parámetros).
En el paso 4 nos hablan de reutilizar una firma y nos preguntan que dónde se encuentra. Sabemos que todo estará en la Blockchain de una forma u otra. Si hay un cambio y se realiza una transacción, en la Blockchain debe estar. Hay una función en el código completo del contrato, el cual se puede ver, que habla de una función ‘_verifyMessage’. El usuario podrá utilizar para validar “cosas”.
El reto no es sencillo, pero en el paso a paso y en las pistas se da bastante información. El premio son muchos puntos… 250 puntos que sumar a tu cuenta en Level_UP!
Bug solventado
Hace unos días, nos dimos cuenta de un pequeño gran bug en la plataforma, precisamente en el contrato base. Recordemos que este contrato es el que gestiona las flag de cada contrato y de si éstos están resueltos o no. Dicho de otra forma, un bug en este contrato es la muerte del juego. Hemos parcheado el código y solucionado el problema, pero queríamos hablar de varias cosas para que todos podamos aprender. Aquí se puede ver el último commit en el repositorio de Level_UP! solventando el bug de la visibilidad de playerStatus.
Si observamos el código del contrato base.sol tenemos un atributo cuya visibilidad era pública. Ese atributo era playerStatus, el cual almacena un mapping a una estructura level_status. La estructura level_status almacena la dirección de un contrato nivel X desplegado, el valor de su flag (recordad que son dinámicas) y si el contrato estaba resuelto o no.
La visibilidad pública de dicho atributo permitía que un usuario pudiera hacer trampas y solicitar que pasa su dirección de usuario y una dirección de contrato que haya desplegado le mostrase el ‘status’. En ese ‘status’ hay tres campos: nivel del contrato, flag y si el reto se había pasado. Como podemos entender, se podía tener acceso a la flag sin necesidad de pasar el reto. Tras la actualización, el bug queda resuelto, aunque seguiremos haciendo pruebas para encontrar fallos.
Figura 1: Reto Web3 en Level_Up! "Replay_me".
La importancia de una correcta validación de firmas
Por esta razón, conocer bien el concepto de verificación de firmas y anulación de éstas es importante cuando uno desarrolla un proyecto Web3. El nuevo reto es el número 13 (level = 12) y tiene una dificultad de 5 sobre 5. ¿Es tan complejo? La verdad es que el concepto en sí es complejo y requiere de una base previa que se puede ir tomando cuando uno se va adentrando en este mundo.
Figura 2: Level_Up! en GitHub
Figura 3: Retos en Level_Up! Junio de 2023
Además, recientemente, se ha realizado un pequeño CTF en Escuela 42 dónde la gente se ha divertido mucho con la plataforma, así nos lo han hecho saber y estamos muy contentos con la experiencia, pero esto lo dejamos para contar otro día.
Conociendo el reto: replay_me
Ahora, vamos a detallar un poco el reto en sí. Cuando accedemos a la página de despliegue del reto en la plataforma, podemos encontrar diferentes pasos (como siempre). El primer ‘snippet’ de código que encontramos es el de una función ‘deposit’ que hace “algo” y envía un hash de un mensaje y tres elementos (no desvelo más). Con estos 4 parámetros se puede verificar el mensaje y la firma de quién invoca esta función (al menos quién invoca la función tiene esos parámetros).
Figura 4: Reto "replay_me"
En el paso 4 nos hablan de reutilizar una firma y nos preguntan que dónde se encuentra. Sabemos que todo estará en la Blockchain de una forma u otra. Si hay un cambio y se realiza una transacción, en la Blockchain debe estar. Hay una función en el código completo del contrato, el cual se puede ver, que habla de una función ‘_verifyMessage’. El usuario podrá utilizar para validar “cosas”.
Figura 5: Pistas y pasos del Reto "replay_me"
El reto no es sencillo, pero en el paso a paso y en las pistas se da bastante información. El premio son muchos puntos… 250 puntos que sumar a tu cuenta en Level_UP!
Bug solventado
Hace unos días, nos dimos cuenta de un pequeño gran bug en la plataforma, precisamente en el contrato base. Recordemos que este contrato es el que gestiona las flag de cada contrato y de si éstos están resueltos o no. Dicho de otra forma, un bug en este contrato es la muerte del juego. Hemos parcheado el código y solucionado el problema, pero queríamos hablar de varias cosas para que todos podamos aprender. Aquí se puede ver el último commit en el repositorio de Level_UP! solventando el bug de la visibilidad de playerStatus.
Si observamos el código del contrato base.sol tenemos un atributo cuya visibilidad era pública. Ese atributo era playerStatus, el cual almacena un mapping a una estructura level_status. La estructura level_status almacena la dirección de un contrato nivel X desplegado, el valor de su flag (recordad que son dinámicas) y si el contrato estaba resuelto o no.
Figura 6: Visibilidad de playerStatus
La visibilidad pública de dicho atributo permitía que un usuario pudiera hacer trampas y solicitar que pasa su dirección de usuario y una dirección de contrato que haya desplegado le mostrase el ‘status’. En ese ‘status’ hay tres campos: nivel del contrato, flag y si el reto se había pasado. Como podemos entender, se podía tener acceso a la flag sin necesidad de pasar el reto. Tras la actualización, el bug queda resuelto, aunque seguiremos haciendo pruebas para encontrar fallos.
Os animamos a que si probáis la nueva versión y encontráis algún fallo nos lo hagáis saber vía nuestro buzón público en https://MyPublicInbox.com/IdeasLocas. Esperamos que disfrutéis del nuevo reto y que sigáis sumando puntos de conocimiento en Web3 y la seguridad de ésta.
Figura 11: Libro dedicado a "Bitcoin: La tecnología Blockchain y su investigación" de Yaiza Rubio y Félix Brezo |
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
- Level_Up!: WriteUp del Ownership Challenge para hacer pentesting en Web3
- Nuevo reto Hacking Web3 de Level_UP! -> Forensic Ouch!
- Level_Up!: WriteUp del reto "Safeguarding" para hacer pentesting en Web3
- Reto Web3 en Level_Up! "Replay_me": La importancia de una correcta validación de firmas
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 15: Contactar con Pablo González |
No hay comentarios:
Publicar un comentario