flagCrack the Power PicoCTF (Intermediate)

Contexto de la maquina

Trayectoria Crack the Power

Descripción

Crack the Power es un reto de criptografía enfocado en la explotación de una implementación insegura del algoritmo RSA. El desafío consiste en analizar un mensaje cifrado proporcionado junto con sus parámetros criptográficos y aplicar técnicas matemáticas para recuperar el mensaje original.

Objetivo del reto

Descifrar un mensaje cifrado mediante RSA y obtener la flag final sin factorizar el módulo, aprovechando debilidades en la elección de los parámetros criptográficos.

Tipo de reto

  • Criptografía

  • RSA

  • Ataques matemáticos

Habilidades y técnicas evaluadas

  • Comprensión del funcionamiento de RSA

  • Identificación de configuraciones criptográficas inseguras

  • Aplicación de ataques de exponente público pequeño

  • Uso de herramientas matemáticas en Python

  • Conversión de enteros a datos ASCII

Análisis de vulnerabilidades

Despliegue del CTF

Dentro de la propia página del reto, localizaremos el CTF. Al acceder a él, encontraremos un enlace que nos permitirá descargar un archivo que contiene un mensaje cifrado. Además, se nos proporciona una breve descripción con información relevante sobre el reto.

El objetivo principal de este tipo de CTFs es analizar la información proporcionada hasta conseguir obtener la flag final.

Decode message.txt

Nos proporcionan la siguiente descripción:

La descripción indica que se ha interceptado un mensaje cifrado y que el módulo RSA está construido con números primos suficientemente grandes como para que la factorización no sea viable. Esto sugiere que tendremos que buscar una alternativa criptográfica para recuperar el mensaje.

Procedemos a descargar el archivo:

Una vez descargado, al inspeccionar el contenido observamos lo siguiente:

Podemos observar que nos proporcionan los parámetros típicos de un sistema criptográfico RSA.

RSA

Se nos han proporcionado los siguientes valores:

  • n → Módulo RSA (producto de dos números primos grandes).

  • e = 20 → Exponente público.

  • c → Ciphertext (mensaje cifrado).

El funcionamiento clásico de RSA se define mediante:

Para descifrar el mensaje normalmente necesitaríamos la clave privada d, la cual satisface:

donde:

siendo p y q los factores primos de n.

Observación crítica: exponente público pequeño

En este caso, el valor de e = 20 es relativamente pequeño para un sistema RSA. Aunque valores pequeños pueden usarse, también pueden introducir vulnerabilidades si el mensaje original m es suficientemente pequeño en comparación con n.

Si se cumple la condición:

entonces el módulo deja de tener efecto y se cumple directamente:

Esto implica que el cifrado puede romperse sin necesidad de factorizar n. Bastaría con calcular la raíz e-ésima entera del ciphertext para recuperar el mensaje original.

Obtención del mensaje mediante raíz entera

Para calcular dicha raíz, podemos crear un pequeño script en Python utilizando la librería gmpy2, que permite trabajar con números enteros de gran tamaño de forma eficiente.

decodeRootMessage.py

Ejecución:

Respuesta:

Este valor representa el mensaje original en formato numérico.

Conversión del mensaje numérico a texto legible

En este tipo de retos, es habitual que el mensaje original esté codificado como un entero que representa una secuencia de bytes ASCII. Para convertirlo a texto plano, utilizaremos el siguiente script:

decodeMessagePlainText.py

Ejecución

Respuesta:

Con esto comprobamos que el ataque ha sido exitoso, logrando recuperar el mensaje original sin necesidad de factorizar el módulo RSA.

flag.txt

Last updated