You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Taller: Ataques y Contramedidas — Script de Fuerza Bruta Optimizado en Rust
Descripción General
Este repositorio contiene la implementación de un motor de recuperación de contraseñas mediante ataque de fuerza bruta, desarrollado como parte del taller de seguridad criptográfica "Ataques y Contramedidas". El script original en Bash fue analizado línea por línea para identificar sus limitaciones técnicas, y posteriormente se migró a una implementación optimizada en Rust para maximizar el rendimiento del procesador durante el descifrado de hashes DES del estándar Unix crypt(3).
Análisis del Script Original (Bash)
Funcionamiento
El script original emplea bucles anidados para generar combinaciones de caracteres a partir de alfabetos definidos, calculando el hash DES con mkpasswd y comparándolo contra un hash objetivo.
#!/bin/bash
space1="abcdefghijklmnopqrstuvwxyz"
space2="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"# ... más alfabetos ...foriin$space2;doforjin$space2;doforkin$space2;do
variable=$(mkpasswd -m des -S "$2""$i$j$k")if [ "$variable"="$2" ];thenecho"password found: $i$j$k"exitfidonedonedone
Limitaciones Técnicas
Limitación
Descripción
Overhead de Contexto
mkpasswd se invoca como binario externo en cada iteración, generando miles de procesos
Sin Concurrencia
Ejecución estrictamente secuencial y monohilo, desperdiciando núcleos
Rigidez de Profundidad
Bucles anidados manuales impiden adaptación dinámica a diferentes longitudes
Gestión de Memoria
Sin tipado fuerte ni garantías de seguridad de memoria, aumentando latencia
Implementación Optimizada en Rust
Arquitectura
La implementación en Rust utiliza una arquitectura de función de compresión tipo Davies-Meyer dentro de una estructura Merkle-Damgård, siguiendo el algoritmo DES del estándar Unix crypt(3) mediante la librería crypt3_rs.
Fases del flujo operativo:
Transformación de la credencial → Clave de 64 bits mediante secret_to_key (desplazamientos bit a bit para paridad)
25 rondas de cifrado sobre bloque nulo (0u64), integrando un salt de 12 bits en las etapas de sustitución-permutación
Codificación Base64 específica de crypt (./0-9A-Za-z) → Digestos de 13 caracteres (2 de sal + 11 de hash)
Optimizaciones Implementadas
Optimización
Descripción
Criptografía Nativa
Implementación DES mediante crates de bajo nivel compilados a código máquina, eliminando llamadas a procesos externos
Paralelismo Masivo
Uso de Rayon para dividir el espacio de búsqueda en fragmentos y distribuirlos entre todos los hilos lógicos del CPU
Búsqueda en Memoria
Manejo de alfabetos y combinaciones como slices de bytes (&[u8]) para evitar asignaciones en heap
Control de Estado Simple
Bucles (no recursión) para consumo de memoria constante O(1) y facilitar optimizaciones del compilador LLVM
Justificación Arquitectónica: Bucles vs. Recursión
Eficiencia del Stack: Los bucles garantizan consumo de memoria constante O(1), evitando el overhead de llamadas a función en billones de intentos
Optimización del Compilador (LLVM): Los bucles permiten loop unrolling y vectorización automática
Control de Estado: Mantenimiento simple de contadores mutables sin complejidad de punteros entre stack frames
Resultados Experimentales
Tabla de Recuperación de Contraseñas
ID
Alfabeto
Long.
Salt
Contraseña
Tiempo
Intentos
1
Alfabeto 1
3
ok
sol
533.99 ms
9,863
2
Alfabeto 2
3
Aa
TiC
5.27 s
102,099
3
Alfabeto 3
3
k+
?+L
82 s
272,387
4
Alfabeto 4
3
2K
14#
21.27 s
390,190
5
Alfabeto 1
4
ko
alex
1.14 s
21,346
6
Alfabeto 1
5
4a
peace
127.55 s
2,425,111
7
Alfabeto 2
4
UP
UPTC
310.74 s
5,951,900
Complejidad Teórica (Combinaciones)
Alfabeto
Tamaño
Long 2
Long 3
Long 4
Long 5
Long 6
Alfabeto 1
26
676
17,576
456,976
11,881,376
308,915,776
Alfabeto 2
52
2,704
140,608
7,311,616
380,204,032
19,770,609,664
Alfabeto 3
74
5,476
405,224
29,986,576
2,219,006,624
164,206,490,176
Alfabeto 4
84
7,056
592,704
49,787,136
4,182,119,424
351,298,031,616
Eficiencia de Hardware
Alfabeto 1: ~10,600 intentos/segundo
Alfabeto 2: ~10,450 intentos/segundo
Rendimiento constante independientemente de la longitud o el alfabeto
Umbral de Impracticabilidad
Configuración
Longitud
Combinaciones
Tiempo Estimado
Alfabeto 1
7
8,031,810,176
~210 horas (>24h, impracticable)
Alfabeto 2
6
19,770,609,664
~525 horas (>24h, impracticable)
Alfabeto 2
8
~53 billones
~162 años
Vulnerabilidades Criptográficas de DES
Entropía de Clave Reducida: Clave de 64 bits, pero solo 56 efectivos (8 de paridad) — espacio de búsqueda de 2⁵⁶, trivial para hardware moderno
Debilidad del Salt: Sales de solo 12 bits (4,096 variaciones), permitiendo tablas Rainbow
Ausencia de Coste Adaptativo: Sin factor de costo configurable (a diferencia de Argon2 o bcrypt), diseñado para ser rápido en hardware de los 70s
Análisis STRIDE + CVE
Adicionalmente, se realizó un análisis de seguridad sobre la Arquitectura de Gestión FrisGril Order Flow utilizando los modelos STRIDE y CVE:
Amenazas Críticas Identificadas
Amenaza
Riesgo Inicial
Mitigación
Spoofing — OAUTH_CLIENT_SECRET en Git
4.25 (Alto)
Rotar secreto, .gitignore, purgar historial
Information Disclosure — .env en repo
4.25 (Alto)
Rotar secretos, migrar a Vercel Environment Variables
CVE-2025-48757 — RLS insuficiente
3.75 (Alto)
Auditar RLS, reemplazar USING (true) por auth.uid()
CVE Identificados como Aplicables
CVE
Componente
CVSS
Descripción
CVE-2026-44373
Nitro SSR
5.3 (Medio)
Proxy scope bypass via path traversal
CVE-2026-44372
Nitro SSR
5.3 (Medio)
Open redirect via protocol-relative URL
CVE-2025-48757
Lovable + Supabase RLS
9.3 (Crítico)
RLS insuficiente con anon key expuesta
Conclusiones
La migración de Bash a Rust elimina el overhead de fork/exec de mkpasswd, logrando un rendimiento constante de ~10,400 intentos/segundo en CPU.
La longitud del secreto (L) y la extensión del alfabeto (A) son los pilares fundamentales de la robustez criptográfica, con una correlación determinística A^L.
Una contraseña de 8 caracteres bajo Alfabeto 2 requiere ~162 años en CPU, pero el uso de GPU o ASIC podría degradar esto a días.
DES presenta limitaciones estructurales: solo procesa los primeros 8 caracteres de la credencial.
Se recomienda adoptar esquemas modernos como bcrypt o Argon2 con factores de costo configurables.
Referencias
[1] Merkle, R. C. — A certified digital signature (CRYPTO '89)
[2] Damgård, I. B. — A design principle for hash functions (CRYPTO '89)
[3] NIST — Secure Hash Standard (SHS), FIPS PUB 180-4