RSA Cracker
TAG -> Artículos
La Importancia de Crear Claves Públicas Robusta en el Mundo de la Ciberseguridad
En el mundo del hacking ofensivo y la ciberseguridad, las llaves públicas juegan un papel crucial en la protección de la información y la verificación de la autenticidad de los mensajes. Ya sea que estés realizando un análisis forense o una prueba de penetración, entender cómo generar, usar y proteger adecuadamente estas llaves es esencial para un trabajo exitoso.
A lo largo de este artículo, exploraremos la importancia de generar llaves públicas robustas, cómo puedes cifrar archivos de manera segura usando OpenSSL y qué sucede cuando intentas decifrar la información cifrada.
🔐 1. ¿Qué es una clave pública?
Una clave pública es un componente esencial en los algoritmos de cifrado como RSA. Se utiliza para cifrar datos que solo podrán ser descifrados con la clave privada correspondiente. Aunque la clave pública es accesible para todos, su fortaleza depende de la robustez de su longitud y de los factores matemáticos que la componen.
¿Por qué es importante crear una clave pública robusta?
La seguridad de la clave pública depende directamente de la complejidad y tamaño de su módulo
n
(producto de dos números primos grandes).Una clave débil (es decir, con un módulo pequeño o con factores conocidos) puede ser fácilmente comprometida, lo que facilita el acceso a la información cifrada y permite ataques de tipo factorización.
🛠️ 2. ¿Cómo se crean claves RSA con ssh-keygen
? ¿Y por qué son tan seguras?
ssh-keygen
? ¿Y por qué son tan seguras?Una de las formas más comunes y prácticas de generar claves RSA en sistemas UNIX/Linux es con el comando ssh-keygen
. Este comando se usa ampliamente tanto para autenticación SSH como para otras tareas criptográficas.
🧬 ¿Qué pasa "detrás de cámaras"?
Cuando ejecutamos ssh-keygen
, se genera:
Dos números primos grandes
p
yq
.Se calcula su producto
n = p * q
, que se convierte en el módulo RSA.Se escoge un exponente público
e
, generalmente65537
.Luego se calcula el exponente privado
d
, que es la clave privada, usando la inversa modular.
🔐 Generar una clave RSA con ssh-keygen
Resultado
📌 Esto creará:
rsa_key
→ clave privadarsa_key.pub
→ clave pública
La opción -b 4096
genera una clave de 4096 bits, lo que significa que el valor n
tiene 4096 bits (¡más de 1200 dígitos decimales!).
🔍 ¿Por qué es segura una clave RSA?
👉 Porque factorizar n
es muy difícil:
n
se forma multiplicando dos primos enormes.Si alguien quiere obtener la clave privada, tendría que factorizar
n
(es decir, hallarp
yq
), lo cual es computacionalmente inviable sin
es lo suficientemente grande.
⏱️ Incluso con supercomputadoras modernas, factorizar un número de 2048 o 4096 bits llevaría siglos usando fuerza bruta.
🧪 Script: Visualizando los valores de una clave RSA
Aquí te dejo un script en Python que usa pycryptodome
para leer una clave pública y mostrar:
El módulo
n
(base de seguridad RSA)El exponente público
e
El número de bits de
n
visualizar_clave_rsa.py
Resultado
📌 ¿Qué debes notar?
🔍 El módulo n
se ve así (extracto real de una clave de 4096 bits):
¡Un solo número! Pero tan grande que si lo intentaras factorizar con fuerza bruta, necesitarías más años de los que tiene el universo conocido. 🤯
✅ Usar ssh-keygen
con al menos 2048 o 4096 bits es una de las formas más sencillas y confiables de generar claves RSA seguras.
⚔️ En pruebas de hacking ofensivo, si encuentras una clave débil con menos de 2048 bits, podrías extraer la clave privada y comprometer el sistema.
Ejemplo
🔨 3. Usando OpenSSL para Cifrar y Descifrar Archivos 🖥️
En el siguiente ejemplo, utilizamos OpenSSL para generar una clave pública robusta, cifrar un archivo y luego descifrarlo usando la clave privada. A continuación, verás cómo puedes realizar estos procesos y cómo entender cada paso.
🔑 Generando las Claves con OpenSSL
Para empezar, necesitamos generar un par de claves públicas y privadas con OpenSSL:
Resultado
Aquí generamos una clave privada (private.key
) usando el algoritmo RSA y luego extraemos la clave pública (public.key
) de esa clave privada.
Paso 1: Crea un archivo de texto
Imagina que tienes un archivo de texto llamado archivo.txt
que quieres cifrar. Este archivo podría contener cualquier información, como:
Crear
Paso 2: Cifrado con la llave pública
Para cifrar el archivo usando una clave pública, primero necesitas tener la clave pública en un archivo. Suponiendo que ya tienes la clave pública (por ejemplo, public.key
), puedes usar el siguiente comando en OpenSSL para cifrar el archivo:
Explicación:
pkeyutl
: Es el comando de OpenSSL para operaciones de RSA (cifrado/descifrado).-encrypt
: Indica que la operación es un cifrado.-inkey public.key
: Especifica el archivo que contiene la clave pública.-pubin
: Le indica a OpenSSL que la clave es una clave pública.-in archivo.txt
: Especifica el archivo de entrada que contiene el mensaje.-out archivo_cifrado.bin
: Especifica el archivo de salida que contendrá el texto cifrado.
Resultado
Como podemos ver, el contenido cifrado es imposible de entender al menos que se usa la clave privada para descifrarlo, borremos el archivo original y sigamos:
Paso 3: Descifrar el archivo con la llave privada
Para descifrar el archivo que cifraste previamente (archivo_cifrado.bin
), puedes usar el siguiente comando en OpenSSL:
Explicación:
pkeyutl
: Es el comando de OpenSSL para operaciones de RSA (cifrado/descifrado).-decrypt
: Indica que la operación es un descifrado.-inkey private.key
: Especifica el archivo que contiene la clave privada.-in archivo_cifrado.bin
: Especifica el archivo de entrada que contiene el texto cifrado.-out archivo_descifrado.txt
: Especifica el archivo de salida que contendrá el mensaje descifrado.
Paso 4: Ver el archivo descifrado
Después de ejecutar el comando anterior, tendrás el archivo archivo_descifrado.txt
con el contenido original, por ejemplo:
Resultado
Resumen de los comandos
Cifrado (usando la clave pública):
Descifrado (usando la clave privada):
Consideraciones
RSA en OpenSSL es adecuado para cifrar pequeños bloques de datos, ya que el tamaño máximo de datos que puedes cifrar depende del tamaño de la clave. Si los datos a cifrar son demasiado grandes, normalmente se utiliza un enfoque híbrido (combinando RSA con AES para cifrar grandes cantidades de datos).
Si el archivo es grande, es recomendable cifrar solo una clave simétrica (como AES) con RSA, y luego usar esa clave para cifrar el archivo completo con AES. Sin embargo, para archivos pequeños o sencillos, RSA es suficiente.
🔓 Qué pasa si usas una clave débil? ⚠️
Si alguna de las claves que generas es débil (por ejemplo, si eliges números primos pequeños), el proceso de cifrado y descifrado puede ser fácilmente vulnerado por un atacante. Un atacante podría factorizar el módulo n
para obtener los valores p
y q
, lo que le permitiría calcular la clave privada d
y descifrar el contenido cifrado.
🛠️ 4. Crypto Challenge - HackTheBox - Brevi Moduli
Código del challenge server.py
:
La debilidad clave es:
El tamaño de los primos (
getPrime(110)
):Primos de 110 bits → módulo RSA
n
de ~220 bits.Este tamaño es ridículamente pequeño para los estándares modernos (se recomienda mínimo 2048 bits para seguridad).
Esto hace que
n = p * q
pueda factorizarse fácilmente con Sage o incluso consympy.factorint()
en segundos.
Llave pública completa se revela:
Se muestra en cada ronda:
n
ye
.Si puedes factorizar
n
, puedes calcularφ(n) = (p-1)(q-1)
y la clave privada.
Validación directa del reto:
El servidor te pide que envíes
p
yq
directamente.Solo necesitas factorizar
n
para superarlo.
🧠 ¿Qué necesitas hacer?
Extraer
n
del contenido de la llave pública.Factorizar
n
usando Sage.Enviar
p
yq
de vuelta al servidor.
Crear una llave privada en base a una llave pública insegura.
Vamos a tomar este challenge para repasar lo aprendido, primero veamos que pasa si ejecutamos el script server.py
:
Resultado
Inspeccionando el código y ya viendo el resultado de ejecutar el archivo server.py
, podemos notar que el script nos da una llave pública y luego nos pide los valores de p
y q
, entonces en este primer paso, vamos a copiar esa llave publica insegura y guardarla en public.key
, para trabajar sobre esa llave, luego usando openssl
cifraremos el contenido de archivo.txt
con esa llave insegura y veremos como construir paso a paso una llave privada en base a una llave publica insegura:
El siguiente paso es cifrar el archivo con openssl
y borrar el original:
Ahora, ¿Cómo logramos descifrar ese archivo_cifrado.bin
si solo tenemos la llave publica?, pues primero veamos un poco de teoría sobre el significado y el papel de cada uno de los valores que usaremos para construir la llave privada.
Significado y el papel de cada uno de los valores que usaremos y cómo se obtienen
Estos valores están relacionados con el funcionamiento del sistema de cifrado RSA.
1. Valor de n
:
n
:Significado:
n
es el módulo de la clave RSA. Es el producto de dos números primos grandes,p
yq
.Obtención: El valor de
n
se obtiene directamente de la clave pública. Es parte de la información que viene incluida en la clave pública y se utiliza tanto para cifrar como para verificar la autenticidad de un mensaje.Uso:
n
es usado en las operaciones matemáticas RSA (cifrado, descifrado, firma, verificación) y es la base del sistema de seguridad de RSA. Es un número muy grande, que asegura que el sistema sea seguro, ya que factorizarlo para encontrarp
yq
es computacionalmente difícil.
2. Valor de e
:
e
:Significado:
e
es el exponente público. Es un número utilizado en el proceso de cifrado. A menudo, se elige un valor pequeño y bien conocido parae
, típicamente 65537.Obtención: El valor de
e
se obtiene directamente de la clave pública.Uso:
e
se utiliza en el proceso de cifrado RSA. Para cifrar un mensaje, se eleva el mensaje a la potenciae
y luego se toma el residuo cuando se divide entren
. Es un número público y no se debe mantener en secreto.
3. Valor de p
:
p
:Significado:
p
es uno de los dos números primos utilizados en la generación de la clave RSA. Junto conq
, se utiliza para calcularn
yphi(n)
.Obtención:
p
es obtenido al factorizar el valor den
. Dado quen
es el producto dep
yq
, al factorizarn
, se pueden obtener ambos valores.Uso:
p
es privado y se mantiene en secreto. Junto conq
, se utiliza para calcularphi(n)
y la clave privada.
4. Valor de q
:
q
:Significado:
q
es el otro número primo utilizado en la generación de la clave RSA. Junto conp
, es utilizado para calcularn
yphi(n)
.Obtención:
q
también se obtiene al factorizar el valor den
. Después de factorizarn
, se obtienep
yq
.Uso: Al igual que
p
,q
es privado y se utiliza para calcularphi(n)
y la clave privada.
5. Valor de phi(n)
o φ(n)
:
phi(n)
o φ(n)
:Significado:
phi(n)
es la función totiente de Euler den
. Representa la cantidad de enteros positivos menores quen
que son coprimos conn
. Se calcula como:
Obtención: Se obtiene al calcular el producto de
(p - 1)
y(q - 1)
, dondep
yq
son los factores primos den
.Uso:
phi(n)
es utilizado para calcular la clave privadad
. Este valor es fundamental para el algoritmo RSA, ya que la clave privadad
se calcula usandophi(n)
.
6. Valor de d
:
d
:Significado:
d
es el exponente privado de la clave RSA. Es el valor que se utiliza en el proceso de descifrado, y su cálculo es un paso esencial en la generación de la clave privada.Obtención:
d
se obtiene como el inverso multiplicativo dee
módulophi(n)
. Es decir,d
es el valor tal que:
Esto se puede calcular utilizando el algoritmo de Euclides extendido (lo que se logra con la función inverse_mod
).
Uso:
d
se utiliza en el proceso de descifrado. Cuando se recibe un mensaje cifrado, se descifra usando la clave privadad
junto conn
(el módulo).
7. Llave privada completa:
Significado: La clave privada es el conjunto de valores que incluye
n
,e
, yd
(junto conp
yq
si es necesario para la optimización). La clave privada se utiliza para descifrar los mensajes que fueron cifrados con la clave pública.Obtención: La clave privada se construye a partir de los valores
n
,e
,d
,p
, yq
, usando la funciónRSA_Crypto.construct
.Uso: La clave privada es necesaria para descifrar mensajes y firmar datos. Es crucial que esta clave se mantenga en secreto para garantizar la seguridad del sistema RSA.
📜 Script para factorizar una llave pública (archivo .key
) con Sage y mostrar sus valores.
.key
) con Sage y mostrar sus valores.Ahora que ya hemos visto toda la teoría e creado el siguiente código en este caso llamado solver_1.py
el cual puede extraer los valores necesarios de una llave publica para crear su llave privada, siempre y cuando la llave publica sea vulnerable, el contenido del código seria el siguiente:
Cabe resaltar que usaremos SageMath (o simplemente Sage) que es un sistema de matemáticas computacionales de código abierto que combina herramientas como Python, álgebra, teoría de números, criptografía, cálculo simbólico y más. Es muy usado en matemáticas puras, criptografía y álgebra computacional.
🔧 Instalación rápida:
✅ En Debian/Ubuntu/Parrot:
✅ En Arch/Manjaro:
Ahora si veamos como nuestro código resuelve este primer reto por decirlo así:
Resultado
Perfecto, nuestro código pudo construir la llave privada correspondiente a la llave publica que nos genero el script server.py
, ahora veamos si podemos descifrar el archivo que tenemos:
Y efectivamente hemos logrado descifrar el mensaje que previamente habíamos cifrado con una clave publica insegura, logrando así crear su correspondiente llave privada con nuestro script usando SageMath.
✅ Versión de solver_2.py
que ejecuta y resuelve server.py
automáticamente:
solver_2.py
que ejecuta y resuelve server.py
automáticamente:Este script:
Ejecuta
server.py
como un subproceso.Detecta el bloque con la clave pública.
Extrae
n
, lo factoriza con Sage.Envia los primos
p
yq
como respuestas.
🔧 Requisitos
Asegúrate de tener instalado pexpect
:
Y que el script server.py
esté en el mismo directorio y sea ejecutable por python3
.
🧪 ¿Cómo ejecutarlo?
El script automáticamente:
Lanza
server.py
Detecta cada ronda
Extrae
n
Factoriza
Envía
p
yq
Al final, imprime la flag.
Resultado
Challenge resuelto.
🧩 5. La Importancia de Usar Claves Fuertes en el Hacking Ofensivo 💡
Cuando realizas pruebas de penetración o ataques de hacking ético, una de tus primeras metas es garantizar que los sistemas que estás probando utilizan claves públicas lo suficientemente robustas para proteger la información sensible.
Consejos para fortalecer tus claves públicas:
Tamaño de la clave: Asegúrate de que la clave RSA tenga al menos 2048 bits. No uses claves de 1024 bits, ya que son vulnerables a ataques de factorizar el módulo
n
en un tiempo razonable.Utiliza generadores de números primos seguros: Elige generadores de números primos robustos y verifica que no existan vulnerabilidades en el algoritmo que utilices para generarlos.
Cambiar regularmente las claves: Asegúrate de cambiar las claves periódicamente y revocar aquellas que ya no sean necesarias o que puedan haber sido comprometidas.
Last updated