Skip to content

elcokiin/bruteforce

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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 ...

for i in $space2; do
  for j in $space2; do
    for k in $space2; do
      variable=$(mkpasswd -m des -S "$2" "$i$j$k")
      if [ "$variable" = "$2" ]; then
        echo "password found: $i$j$k"
        exit
      fi
    done
  done
done

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:

  1. Transformación de la credencial → Clave de 64 bits mediante secret_to_key (desplazamientos bit a bit para paridad)
  2. 25 rondas de cifrado sobre bloque nulo (0u64), integrando un salt de 12 bits en las etapas de sustitución-permutación
  3. 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

  1. 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
  2. Debilidad del Salt: Sales de solo 12 bits (4,096 variaciones), permitiendo tablas Rainbow
  3. 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

  1. 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.
  2. 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.
  3. 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.
  4. DES presenta limitaciones estructurales: solo procesa los primeros 8 caracteres de la credencial.
  5. 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
  • [4] Schneier, B. — Applied Cryptography, 2a ed.
  • [5] Nejgebauer — crypt3_rs, Rust crate (crates.io/crates/crypt3_rs)

Anexos

About

Taller sec2 electiva1 script en rust para fuerza bruta de hash DES

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages