Ataques de fuerza bruta
Última actualización
¿Te fue útil?
Última actualización
¿Te fue útil?
Nota: Este tipo de técnicas son muy invasivas, ya que vamos a conseguir contraseñas de un usuario y acceder a sistemas, por lo que no podemos utilizar estas técnicas sin un consentimiento o aprobación por parte del objetivo o en un entorno controlado.
Para comprender realmente el desafío de la fuerza bruta, es fundamental comprender las matemáticas subyacentes. La siguiente fórmula determina el número total de combinaciones posibles para una contraseña:
Por ejemplo, una contraseña de 6 caracteres que usa solo minúsculas (juego de 26 caracteres) tiene 26^6 (aproximadamente 300 millones) combinaciones posibles. En cambio, una contraseña de 8 caracteres con el mismo juego de caracteres tiene 26^8 (aproximadamente 200 mil millones) combinaciones. Añadir mayúsculas, números y símbolos al juego de caracteres amplía exponencialmente el espacio de búsqueda.
Este crecimiento exponencial del número de combinaciones resalta la importancia de la longitud y la complejidad de las contraseñas. Incluso un pequeño aumento en la longitud o la inclusión de tipos de caracteres adicionales puede incrementar drásticamente el tiempo y los recursos necesarios para un ataque de fuerza bruta exitoso.
Consideremos algunos escenarios para ilustrar el impacto de la longitud de la contraseña y el conjunto de caracteres en el espacio de búsqueda:
Longitud de la contraseña
Conjunto de caracteres
Posibles combinaciones
Corto y simple
6
Letras minúsculas (az)
26^6 = 308.915.776
Largo pero simple
8
Letras minúsculas (az)
26^8 = 208.827.064.576
Añadir complejidad
8
Letras minúsculas y mayúsculas (az, AZ)
52^8 = 53.459.728.531.456
Máxima complejidad
12
Letras minúsculas y mayúsculas, números y símbolos
94^12 = 475.920.493.781.698.549.504
Como puede ver, incluso un ligero aumento en la longitud de la contraseña o la inclusión de tipos de caracteres adicionales amplía drásticamente el espacio de búsqueda. Esto aumenta significativamente el número de combinaciones posibles que un atacante debe probar, lo que hace que la fuerza bruta sea cada vez más difícil y lenta. Sin embargo, el tiempo que se tarda en descifrar una contraseña no solo depende del tamaño del espacio de búsqueda, sino también de la capacidad computacional disponible del atacante.
Cuanto más potente sea el hardware del atacante (p. ej., la cantidad de GPU, CPU o recursos informáticos en la nube que pueda utilizar), más intentos de contraseña podrá realizar por segundo. Si bien una contraseña compleja puede tardar años en descifrarse por fuerza bruta con una sola máquina, un atacante sofisticado que utilice una red distribuida de recursos informáticos de alto rendimiento podría reducir drásticamente ese tiempo.
El gráfico anterior ilustra una relación exponencial entre la complejidad de la contraseña y el tiempo de descifrado. A medida que aumenta la longitud de la contraseña y el conjunto de caracteres, el número total de combinaciones posibles crece exponencialmente. Esto incrementa significativamente el tiempo necesario para descifrar la contraseña, incluso con recursos informáticos potentes.
Comparando la computadora básica y la supercomputadora:
Computadora básica (1 millón de contraseñas por segundo): Adecuado para descifrar contraseñas simples rápidamente, pero resulta extremadamente lento para contraseñas complejas. Por ejemplo, descifrar una contraseña de 8 caracteres usando letras y dígitos tardaría aproximadamente 6,92 años.
Supercomputadora (1 billón de contraseñas por segundo): Reduce drásticamente el tiempo de descifrado de contraseñas más simples. Sin embargo, incluso con esta inmensa potencia, descifrar contraseñas muy complejas puede llevar un tiempo impráctico. Por ejemplo, una contraseña de 12 caracteres con todos los caracteres ASCII tardaría unos 15 000 años en descifrarse.
Para seguir, veremos el caso práctico en la parte inferior de la página.
La aplicación de instancia genera un PIN aleatorio de 4 dígitos y expone un endpoint (/pin
) que acepta un PIN como parámetro de consulta. Si el PIN proporcionado coincide con el generado, la aplicación responde con un mensaje de éxito y una bandera. De lo contrario, devuelve un mensaje de error.
Usaremos este sencillo script de demostración de Python para forzar el endpoint /pin
en la API. Copia y pega este script de Python pin-solver.py
en tu equipo. Solo necesitas modificar las variables de IP y puerto para que coincidan con la información de tu sistema de destino.
El script de Python itera sistemáticamente todos los PIN de 4 dígitos posibles (0000 a 9999) y envía solicitudes GET al endpoint de Flask con cada PIN. Comprueba el código de estado y el contenido de la respuesta para identificar el PIN correcto y capturar la bandera asociada.
La salida del script mostrará la progresión del ataque de fuerza bruta, mostrando cada intento de PIN y su resultado. El resultado final mostrará el PIN correcto y la bandera capturada, lo que demuestra la finalización exitosa del ataque de fuerza bruta.