Resolución del Reto de «Pentesting SmartContracts: From Web 2.0 to Web3» de #NavajaNegra
Figura 2: Libro dedicado a «Bitcoin: La tecnología Blockchain y su investigación» de Yaiza Rubio y Félix Brezo |
Vamos a empezar el resultado: los 3 NFTs fueron “minteados” por lo que los alumnos lo hicieron rápido, quitándonos el miedo de “esto no lo va a querer hacer nadie”. Además, sabemos que más de uno lo intentó y consiguió después de que nuestro SmartContract “mintease” los 3 NFTs, por lo que no tuvieron premio, pero consiguieron más que eso, aprendieron.
Las pruebas del reto
Tenemos 3 contratos, los cuales explicamos a continuación:
- Contrato TokenNN: implementa un token ERC20 y nos servirá para ir dándote un token por cada reto que consigas pasar. Recuerda que había que conseguir 3 tokens para poder optar al NFT.
- Contrato NFT_NN: implementa un token ERC721 y nos sirve para poder “mintear” o acuñar el NFT para los ganadores. Solo se iban a generar 3 NFTs.
- Contrato TallerNN: simula el propio taller en sí, más adelante hablaremos del contrato y sus funciones. El objetivo para el alumno era apuntarse al taller, entender un poco la lógica del contrato (el código fuente lo proporcionábamos) y poder conseguir pasar los diferentes retos que existían dentro del propio contrato.
El contrato TallerNN tiene las siguientes funciones:
El alumno debe “pagar” por apuntarse al taller (de ahí el color rojo en el botón “apuntarse”). Existe un mecanismo de destrucción del contrato (que solo puede ejecutar el propietario, a través del botón “close”). El alumno puede desapuntarse del taller y luego vemos que hay una serie de botones que empiezan por “get_token_*”.
- Get_token_one: Esta es la primera prueba. La más sencilla. Para enseñar a interactuar con un contrato, en el momento que el alumno ejecuta dicha función obtiene su primer token de tipo TokenNN. Así de fácil.
Lógicamente, el propietario del contrato tiene una serie de tokens en su poder que irá repartiendo entre los alumnos que van superando las pruebas.
Durante el taller se habló de diferentes vulnerabilidades, y en un punto concreto sobre el Integer Overflow y cómo afecta a los SmartContracts generados con Solidity. Hasta la versión 0.8 del compilador no se validaban los límites de los enteros y debía ser chequeado por el programador (con el riesgo que esto supone). El contrato se compiló con la versión 0.6.2 según el propio pragma del contrato. Por lo que este reto va de Integer Overflow.
Reto 3 (get_token_three)
El tercer reto está orientado al uso del tx.origin (el cual como medida de autorización es un punto débil en la seguridad). Si miramos el código de get_token_three vemos que en la función debemos pasar un código (0 o 1) para ir por alguna de estas dos ramas. Si se estudia lo que hace cada rama, veremos que ninguna se ejecutará completamente, si la lanzamos directamente desde un usuario. ¿Cómo es esto?
Si introducimos 0 como código pasaremos por 3 requires. El primero verifica que el alumno está apuntado al taller. El segundo verifica que tienes ya los dos tokens (o las dos pruebas primeras hechas) y el tercer require verifica que el msg.sender (el que invoca la función) es igual a la dirección del propio contrato TallerNN. Esto último, invocándolo el usuario nunca va a suceder.
Si introducimos 1 como código pasamos por 3 requires también. Los dos primeros iguales a los anteriores. El tercero comprueba que tx.origin (el origen de la petición) sea igual a la dirección del contrato. De nuevo, si esta función es invocada por el alumno no podrá lograrse nunca.
El NFT
Una vez que se conseguían los 3 tokens (se puede verificar en el contrato con la función “get_tokens”) podemos solicitar el NFT. Primero nos validamos como “winner” para que el contrato nos registre y nos asigne una de las tres posiciones disponibles. En caso afirmativo, podemos llamar a “give_me_NFT” y conseguir nuestro token. A continuación, os dejamos algunos ejemplos de lo que podía conseguirse.
Fue muy interesante ver cómo los asistentes al taller querían participar en el reto. Fuimos buenos y os dimos el código fuente, ya que facilitaba mucho el realizar los diferentes retos (fue en caja blanca).
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
Contactar con Pablo González |
Powered by WPeMatico