¿Cómo un programa para descifrar contraseñas ‘prueba’ las contraseñas?

La respuesta a esto depende en gran medida del caso de uso: consideremos un formulario en línea para iniciar sesión en un sitio web como ejemplo.

Cuando vea una forma visual, verá bonitos cuadros en los que puede escribir texto; presiona el botón y envía la combinación de usuario / contraseña ingresada al servidor para su validación.

Lo que sucede detrás de escena es un poco diferente: su navegador muestra un código que originalmente se parece a:

Representa esto como un cuadro para ingresar su nombre de usuario, uno para su contraseña y un botón para enviar. Cuando hace clic en enviar, su navegador envuelve lo que ingresó y lo envía al servidor en un formato como este:

POST /authenticate.php
HTTP / 1.0
Tipo de contenido: application / x-www-form-urlencoded
Longitud del contenido: 64

nombre de usuario = texto + usted + ingresó y contraseña = texto + usted + ingresó + por + contraseña

Sin embargo, su navegador no es nada especial: puede escribir una secuencia de comandos para enviar esa misma solicitud al servidor y luego captar su respuesta; ya sea un “acceso otorgado” o un “acceso denegado”.

Entonces envías uno con:

nombre de usuario = algunos + conocido + nombre de usuario y contraseña = aaaaaaaa

seguido por:

nombre de usuario = algunos + conocido + nombre de usuario y contraseña = aaaaaaab

Y repita hasta que obtenga la respuesta de “acceso otorgado”. Estoy comenzando con 8 caracteres aquí, asumiendo que el sitio web en cuestión impone una longitud mínima de contraseña de 8 caracteres.

Por supuesto, podemos usar 26 letras + 26 letras mayúsculas + 10 números + 28 símbolos, para un total de 90 opciones posibles, para cada uno de los 8 caracteres. Esto significa que, en el peor de los casos, tenemos que probar [matemáticas] 90 ^ 8 [/ matemáticas] o 4304672100000000 combinaciones diferentes. – ¡y eso supone que solo tiene 8 caracteres de longitud! Esto llevaría mucho tiempo (136 mil años si podemos probar 1000 combinaciones por segundo), por lo que es poco probable que alguien pueda descifrar su contraseña con este método.

Sin embargo, es mucho más probable que alguien use una palabra común como “poundcake” o “fútbol” como contraseña, que “R5 * [correo electrónico protegido] (;” o alguna otra cadena aleatoria de caracteres. Ingrese un diccionario ataque : intente un montón de contraseñas basadas en palabras comunes, o incluso mejor, contraseñas de uso común.

Las 10 contraseñas más comunes son:

contraseña
123456
12345678
1234
QWERTY
12345
continuar
coño
béisbol
fútbol

(fuente: danielmiessler / SecLists)

No son muy creativos, ¿verdad? Si prueba solo estos 10, tiene entre un 1% y un 5% de posibilidades de ingresar a cualquier cuenta, dependiendo del sitio. Si prueba los 10,000 en esa lista, tiene aproximadamente un 30% de posibilidades. Usando la misma métrica que la anterior, si podemos probar 1000 por segundo, esto nos llevará – ¡10 segundos!

Esto debería ilustrarle la importancia de usar buenas contraseñas. Largo, poco común, y arrojando algunos símbolos o mayúsculas allí.

Por supuesto, los sitios web se están volviendo más inteligentes; bloquearán una dirección IP si lanza demasiados intentos de inicio de sesión fallidos. Los piratas informáticos contrarrestan esto mediante el uso de botnets con miles de IP, enmascarando sus identidades con ataques reflexivos, etc. Es un juego de grandes felinos y ratones, pero lo anterior es lo esencial.

El funcionamiento de un programa de craqueo como John the Ripper es el siguiente: obtienes una contraseña y un archivo sombra de un cuadro de Unix, de alguna manera (tal vez lo has pirateado y “has rooteado”, tal vez compraste la computadora en eBay y los discos tenían no ha sido borrado). Las contraseñas están en hash y saladas y es imposible “ir hacia atrás” para recuperar el texto sin formato del hash, como puede hacer con un César Cipher. Así que “avanzas”: tomas una gran lista de palabras y las hash a su vez con el mismo algoritmo, y ves si los hash resultantes coinciden con alguno en tu lista de contraseñas. No solo prueba inglés y francés y klingon, agrega permutaciones como leetspeek (e -> 3, a -> @), suma números al final, etc. Todo eso se puede hacer muy rápidamente (miles de intentos por segundo , limitado solo por cuántos núcleos puede poner en línea). El programa produce una lista de contraseñas descifradas y los nombres de usuario correspondientes. Lo cual, dado que ya tiene root en la máquina local, no es tan útil, pero podría funcionar en otro lugar.

Supongo que un ataque de contraseña SSH en línea solo intenta iniciar sesión en una máquina con un determinado nombre de usuario y contraseña (por ejemplo, root y 12345, root y t00r, admin y admin). Si tiene éxito, obtendrá un estado de éxito, si no, un rechazo. Cada máquina objetivo acelerará los intentos de inicio de sesión para que solo se puedan probar cada pocos segundos, pero un escáner puede probar cientos de objetivos en paralelo. El escáner generará nuevamente una lista de máquinas, nombres de usuario y contraseñas.

Supongamos que utilizó algún tipo de recorrido de directorio, exploración forzada o ataque de inyección SQL para leer la base de datos de usuario de un servidor. Si el servidor no se configuró bien, esa base de datos incluirá las contraseñas de los usuarios y podrá iniciar sesión como cualquier usuario.

Por esta razón, los sistemas operativos y servicios modernos bien diseñados no almacenan las contraseñas reales. En cambio, almacenan hashes de las contraseñas. Una función hash está diseñada para ser unidireccional: puede derivar el hash del texto original, pero no el texto original del hash. Las funciones hash de ejemplo son MD5 o SHA1; ambos han sido utilizados para contraseñas en el pasado. En la mayoría de los casos, puede determinar qué función hash se está utilizando.

Ingrese el cracker de contraseñas. Los crackers de contraseñas comienzan con la contraseña hash, las palabras hash de un diccionario utilizando la función hash (conocida) e intentan hacer coincidir una palabra del diccionario con la contraseña hash. La mayoría de los crackers de contraseñas probarán pequeñas variaciones de las palabras en su diccionario también. La mayoría de los usuarios eligen contraseñas cortas que pueden recordar y escribir fácilmente. Peor aún, muchos, si no la mayoría de los usuarios, usan la misma contraseña para varias cuentas. Eso significa que es probable que su contraseña esté en un diccionario probado por un descifrador de contraseñas, y una vez que el hacker conoce la contraseña de un usuario, puede probarla también en otros sitios.

Pero espera, se pone mejor … Las funciones hash son algo puramente matemático. No tiene que volver a calcular los hashes para cada contraseña que desee descifrar. Solo necesita almacenar una tabla, llamada tabla arcoiris , de posibles contraseñas y sus hashes. Entonces es solo cuestión de buscar la contraseña cifrada que desea descifrar en su tabla de arcoiris. Hay tablas de arcoíris con millones de hashes precalculados que se pueden buscar en menos de un segundo.

Pero espere, hay más … las GPU son particularmente buenas en operaciones como determinar hashes de contraseñas. Eso significa que las personas pueden construir máquinas que son realmente buenas para crear tablas de arcoíris.

Es por eso que debe usar una contraseña larga que no sea una palabra en lenguaje simple (inglés o de otro tipo), y por qué nunca debe usar una contraseña en varios lugares. Esta es también la razón por la que debe considerar seriamente la autenticación de dos factores para cualquier cuenta que le interese.

El descifrador de contraseñas puede tomar un diccionario o palabras y cifrarlo con el método de cifrado de contraseña conocido. Si el resultado del cifrado es el mismo que un valor que está disponible en un archivo de contraseña, puede suponer que se utilizó la misma entrada en ambos casos.

De esta manera sabes la contraseña que alguien usó.

Por eso se le dice que no use palabras de un diccionario como contraseña: hay relativamente pocas opciones disponibles y una máquina puede verificarlas muy rápidamente.

Si usa contraseñas complicadas con números o caracteres de puntuación, el pirata informático debe verificar millones de veces más combinaciones antes de tener la posibilidad de adivinar su contraseña. En muchos casos no vale la pena, tienen suficientes éxitos con una simple verificación de diccionario.

A principios de la década de 1990, un amigo mío y yo intentamos comprobar la fuerza bruta de todas las combinaciones de contraseña de 8 letras, desde aaaaaaaa hasta zzzzzzzz, para adivinar nuestras contraseñas en nuestra propia mini computadora PDP-11. Esto no fue muy eficiente, ya que generamos una gran cantidad de combinaciones de letras estúpidas, y nuestro pequeño disco duro de PC de 40 MB se llenó rápidamente con posibles opciones, incluso antes de haber hecho aaaaa a zzzzz, así que nos dimos por vencidos antes de siquiera generar el diccionario a usar!

Aún así, terminó como consultor de seguridad de red, ¡así que fue el comienzo de una curva de aprendizaje decente!