POLITICA DE COOKIES

Q2BSTUDIO.COM utiliza cookies técnicas, analíticas, de sesión y de publicidad con la finalidad de prestar un mejor servicio. No obstante, necesitamos su consentimiento explícito para poder utilizarlas. Así mismo puede cambiar la configuración de las cookies u obtener más información aquí .

Reto NFT de Cyfrin: Adivina la pseudoaleatoriedad

Reto NFT de Cyfrin: Adivina la pseudoaleatoriedad

Publicado el 19/08/2025

Presentación Soy kode-n-rolla, investigador de seguridad centrado en Web3 y en vulnerabilidades de contratos inteligentes. En este artículo explico en español y paso a paso cómo resolví el reto Lesson Nine de Cyfrin Updraft, un desafío NFT que exige adivinar un número pseudoaleatorio y llamar a la función solveChallenge para reclamar el NFT.

Resumen del reto El contrato genera un valor con la expresión uint256(keccak256(abi.encodePacked(msg.sender, block.prevrandao, block.timestamp))) % 100000. La meta es reproducir ese cálculo controlando las variables relevantes mediante un fork de la red Sepolia y un contrato atacante que actúe como msg.sender.

Montando el entorno Primero creamos un proyecto Foundry con forge init lesson9 y trabajamos dentro de ese directorio. Foundry facilita crear forks de cadenas públicas, ejecutar pruebas rápidas y manipular la hora del bloque con vm.warp.

Archivo de configuración Creamos un archivo .env con las variables necesarias como SEPOLIA_RPC, TARGET y FORK_BLOCK. Luego cargamos esas variables con source .env para que las pueda leer la prueba de Foundry.

Elegir el bloque Es crítico fijar un bloque porque la semilla pseudoaleatoria depende de block.timestamp y block.prevrandao. Usamos cast block-number y cast block BLOQUE --rpc-url URL para obtener timestamp y mixHash del bloque objetivo. Esos valores serán la base para reproducir la salida del keccak256.

Interfaz del objetivo Añadimos en src ILessonNine.sol la interfaz simplificada con la firma function solveChallenge(uint256 randomGuess, string calldata yourTwitterHandle) external; No necesitamos todo el contrato, solo su firma externa para interactuar.

Recreando el guess fuera de cadena Conocemos timestamp y prevrandao del bloque seleccionado y podemos predecir la dirección del contrato atacante si desplegamos desde una EOA fija. La dirección de un contrato desplegado se deriva del nonce del EOA, así que al fijar el remitente y el orden de las transacciones la dirección es predecible.

Cálculo off chain Codificamos los valores con abi.encodePacked y calculamos keccak256 del paquete que contiene la dirección del contrato atacante, el prevrandao y el timestamp. Convertimos el hash a entero y aplicamos mod 100000 para obtener el número entre 0 y 99999 que el contrato objetivo espera. En el ejemplo práctico el resultado fue 90451.

Construcción del exploit Escribimos un contrato HackLessonNine que almacena la dirección del objetivo y el handle. En la función run reconstruimos el mismo cálculo uint256(keccak256(abi.encodePacked(address(this), block.prevrandao, block.timestamp))) % 100000 y llamamos a target.solveChallenge(guess, handle). Incluimos receive para aceptar ETH y onERC721Received para recibir el NFT si se usa safeTransferFrom.

Prueba en Foundry Implementamos una prueba Forge que crea un fork de Sepolia en el bloque elegido con vm.createFork y vm.selectFork. Usamos vm.warp para fijar el timestamp exacto y vm.deal para financiar la EOA atacante. Con vm.startPrank desplegamos el contrato atacante desde la EOA predicha y llamamos a run. Si todo está replicado correctamente, la NFT se acuña y se transfiere al atacante en el entorno local del fork.

Por qué funciona Controlando el bloque forkeado y la EOA origen eliminamos la aleatoriedad real: block.timestamp y block.prevrandao son conocidos y address(this) es predecible, por lo que el keccak256 deja de ser una fuente segura de aleatoriedad. El test en Foundry demuestra que pseudoaleatoriedad basada en variables de bloque es insegura para componentes críticos.

Buenas prácticas y alternativas seguras Para generar aleatoriedad segura on chain se recomienda usar oráculos verificados como Chainlink VRF que aportan randomness verificable y resistente a manipulación. No se debe confiar en block.timestamp, block.prevrandao ni en combinaciones con msg.sender para decisiones críticas de seguridad.

Recursos Repositorio con código de ejemplo y pruebas: https://github.com/Kode-n-Rolla/web3/tree/main/own_kodes/nft_challange Foundry docs y Chainlink VRF docs son lecturas recomendadas para comprender alternativas seguras de randomness.

Sobre Q2BSTUDIO Q2BSTUDIO es una empresa de desarrollo de software y aplicaciones a medida especializada en soluciones integrales para empresas. Ofrecemos software a medida, aplicaciones a medida, servicios de inteligencia artificial e ia para empresas, agentes IA personalizados, y consultoría en ciberseguridad. Además proporcionamos servicios cloud aws y azure, servicios inteligencia de negocio y soluciones de visualización con power bi. Nuestro equipo combina experiencia en desarrollo backend y frontend, machine learning, seguridad y despliegue en la nube para entregar proyectos robustos, escalables y alineados con objetivos de negocio.

Por qué elegirnos Al elegir Q2BSTUDIO obtienes un partner capaz de diseñar software a medida que integra agentes IA y capacidades de inteligencia artificial para automatizar procesos, mejorar la toma de decisiones con servicios inteligencia de negocio y proteger activos digitales mediante prácticas avanzadas de ciberseguridad. Ofrecemos despliegue y gestión en servicios cloud aws y azure, desarrollo de pipelines de datos y cuadros de mando en power bi para convertir datos en valor accionable.

Servicios destacados Desarrollo de aplicaciones a medida, integración de soluciones de inteligencia artificial y aprendizaje automático, implementación de agentes IA conversacionales y autónomos, auditorías y hardening en ciberseguridad, migraciones y arquitecturas cloud en aws y azure, y creación de dashboards con power bi para reporting y análisis estratégico.

Conclusión El reto de Cyfrin Updraft Lesson Nine es un excelente ejercicio para entender por qué la pseudoaleatoriedad basada en variables de bloque es peligrosa. Replicar el cálculo fuera de cadena y ejecutar el exploit en un fork demuestra la importancia de diseñar bien la generación de números aleatorios en contratos inteligentes. Si buscas soporte para proyectos que integren seguridad, inteligencia artificial, servicios cloud o desarrollo de software a medida, Q2BSTUDIO puede ayudarte a diseñar e implementar la solución adecuada.

Contacto y enlaces Visita nuestro sitio web corporativo o contacta con Q2BSTUDIO para consultas sobre desarrollo de software a medida, aplicaciones a medida, inteligencia artificial, ciberseguridad, servicios cloud aws y azure, servicios inteligencia de negocio, agentes IA y power bi. Para ver el código del reto y más ejemplos revisa el repositorio https://github.com/Kode-n-Rolla/web3/tree/main/own_kodes/nft_challange Muchas gracias por leer y feliz hacking responsable.

Fin del artículo, inicio de la diversión
Construyendo software juntos

Dando vida a tus ideas desde 2008

Diseñamos aplicaciones móviles y de escritorio innovadoras que cumplen con tus requisitos específicos y mejoran la eficiencia operativa.
Más info
Cuéntanos tu visión
Sea cual sea el alcance, podemos convertir tu idea en realidad. Envíanosla y charlemos sobre tu proyecto o una colaboración futura.
Contáctanos
artículos destacados
Live Chat
Enviado correctamente.

Gracias por confiar en Q2BStudio