20 de marzo de 2012

Cisco7 ¿encryption?

De rato en rato, trato de sacar tiempo para ir desarrollando la versión 2.0 de findmyhash. Una de las muchas mejoras que tendrá la próxima versión es no consultar ningún servicio online para los algoritmos reversibles que soporta.

El algoritmo del que os voy a hablar hoy es uno de los que Cisco utiliza para cifrar las contraseñas que almacena en la configuración de sus dispositivos y que se suele conocer como Cisco 7 porque al consultar la configuración del dispositivo se muestra algo como:

username admin password 7 080d4d7604181714130e00083f2c253a

Donde el '7' indica el tipo de algoritmo utilizado.

Cisco 7 está basado en el cifrado de Vigenère, utilizando como clave la cadena:

d s f d ; k f o A , . i y e w r k l d J K D H S U B s g v c a 6 9 8 3 4 n c x

A primera vista podemos decir que es bastante robusta, por lo que alguno podría pensar que lo que se cifre con esta clave debería estar seguro. Pero recordemos que tan sólo estará seguro si no conociéramos la clave con la que se está cifrando y en este caso se utiliza la cadena anterior en TODOS los dispositivos Cisco... por lo que ahora veremos que no sirve de mucho.

Para descifrar la contraseña, vamos a trabajar siempre en hexadecimal, por lo utilizaremos tan sólo la versión codificada de la clave:


dsfd;kfoA,
647366643b6b666f412c
.iyewrkldJ
2e69796577726b6c644a
KDHSUBsgvc
4b444853554273677663
a69834ncx
6136393833346e6378


La contraseña cifrada que aparecía en el ejemplo con el que empezaba el post ya está en formato hexadecimal, así que la utilizaremos tal cual:

080d4d7604181714130e00083f2c253a

Esta contraseña se divide en dos partes, el primer byte (08) es un desplazamiento en la clave de cifrado. Es decir, en este caso vamos a obviar los 8 primeros caracteres de la clave, por lo que comenzaríamos en 412c2e69... y utilizaremos tantos caracteres como tiene la contraseña cifrada. Es decir, lo que en la tabla anterior he marcado en azul.

La segunda parte (el resto: 0d4d7604181714130e00083f2c253a) es la contraseña cifrada. Esta parte fue calculada con un XOR entre la contraseña original y la clave de cifrado, que en nuestro caso recordamos que empieza con un desplazamiento de 8 caracteres. Es decir:


Clave de cifrado:412c2e69796577726b6c644a4b4448
Contraseña original:   ??????????????????????????????
------------------------------
Contraseña cifrada:0d4d7604181714130e00083f2c253a


Como la operación XOR es reversible, nos basta con calcular el XOR entre la misma clave que se utilizó y la contraseña cifrada para obtener la contraseña en texto claro:


Clave de cifrado:412c2e69796577726b6c644a4b4448
Contraseña cifrada:0d4d7604181714130e00083f2c253a
------------------------------
Contraseña original:  4C61586D61726361656C6C75676172


Que se corresponde con la cadena:

LaXmarcaellugar

Como veis, aunque la contraseña se almacena cifrada, no sirve de mucho si el algoritmo que se utiliza es reversible y la clave de cifrado conocida.

Ésta es la principal razón por la cual nunca se debe almacenar una contraseña cifrada (y mucho menos en texto claro...). En su lugar se debe almacenar el hash de la contraseña, utilizando alguna función como SHA-1 y tratando de evitar el uso del MD5, que se considera débil desde hace muchos años.