sábado, 24 de enero de 2009

Windows 7 Beta y la clave UserAssist

La clave UserAssist del registro de Windows contiene valiosa información que nos ayudará a desvelar gran parte de las acciones realizadas por un usuario en el sistema. Dicha clave es particular para cada cuenta por lo que los datos almacenados serán diferentes en función del usuario que haya iniciado la sesión.

Hasta el momento los datos almacenados se encontraban cifrados, utilizando para ello el método ROT-13. Didier Stevens publicó en su momento una valiosa herramienta la cual nos mostraba el contenido de dicha clave, una vez descifrados los datos, y en un formato amigable para el investigador. Puede consultarse más información sobre el registro en general y la clave UserAssist en particular en mi documento publicado en los foros de Wadalbertia.

Pues bién, tal y como Didier Stevens ha descubierto y publicado, para Windows 7 Beta el algoritmo de cifrado ROT-13 ha sido sustituido por Vigenère, y la clave utilizada para el cifrado, y también descubierta por Didier Stevens, se repite para todas las instalaciones analizadas hasta el momento.

El cifrado Vigenère

Tal y como se menciona en la Wikipedia se trata de un método de cifrado para las letras del alfabeto basado en diferentes variantes del método Caesar.

Ahora voy a explicar el método que debe seguirse para descifrar un valor, conociendo la clave utilizada y utilizando para ello los parámetros manejados por Windows 7. Por lo menos voy a intentarlo ...

Supongamos que tenemos el siguiente texto cifrado:

VATU_MMPRCXKTAE

Bién, el primer paso será identificar la clave a utilizar. Conociendo la secuencia base, BWHQNKTEZYFSLMRGXADUJOPIVC, tenemos que hacer coincidir las longitudes de ambos valores, el del texto cifrado y el de la clave:
VATU_MMPRCXKTAE (Texto cifrado)

BWHQNKTEZYFSLMR (Clave)

Segundo paso: para realizar la trasposición de carácteres necesaria para descifrar el texto tendremos que utilizar la siguiente tabla:
   | A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

---+----------------------------------------------------
A | A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
B | B C D E F G H I J K L M N O P Q R S T U V W X Y Z A
C | C D E F G H I J K L M N O P Q R S T U V W X Y Z A B
D | D E F G H I J K L M N O P Q R S T U V W X Y Z A B C
E | E F G H I J K L M N O P Q R S T U V W X Y Z A B C D
F | F G H I J K L M N O P Q R S T U V W X Y Z A B C D E
G | G H I J K L M N O P Q R S T U V W X Y Z A B C D E F
H | H I J K L M N O P Q R S T U V W X Y Z A B C D E F G
I | I J K L M N O P Q R S T U V W X Y Z A B C D E F G H
J | J K L M N O P Q R S T U V W X Y Z A B C D E F G H I
K | K L M N O P Q R S T U V W X Y Z A B C D E F G H I J
L | L M N O P Q R S T U V W X Y Z A B C D E F G H I J K
M | M N O P Q R S T U V W X Y Z A B C D E F G H I J K L
N | N O P Q R S T U V W X Y Z A B C D E F G H I J K L M
O | O P Q R S T U V W X Y Z A B C D E F G H I J K L M N
P | P Q R S T U V W X Y Z A B C D E F G H I J K L M N O
Q | Q R S T U V W X Y Z A B C D E F G H I J K L M N O P
R | R S T U V W X Y Z A B C D E F G H I J K L M N O P Q
S | S T U V W X Y Z A B C D E F G H I J K L M N O P Q R
T | T U V W X Y Z A B C D E F G H I J K L M N O P Q R S
U | U V W X Y Z A B C D E F G H I J K L M N O P Q R S T
V | V W X Y Z A B C D E F G H I J K L M N O P Q R S T U
W | W X Y Z A B C D E F G H I J K L M N O P Q R S T U V
X | X Y Z A B C D E F G H I J K L M N O P Q R S T U V W
Y | Y Z A B C D E F G H I J K L M N O P Q R S T U V W X
Z | Z A B C D E F G H I J K L M N O P Q R S T U V W X Y

Y ahora para realizar el descifrado seguimos los siguientes pasos: en el eje y buscamos el carácter correspondiente del valor de la clave, y una vez encontrada la fila adecuada buscamos la posición del carácter correspondiente del texto cifrado, el cual nos dará el carácter para el texto descifrado en los valores del eje x.

Para muestra un botón: en el eje y buscamos el carácter 'B', el cual encontramos en la segunda fila. Ahora dentro de la segunda fila buscamos la posición del carácter 'V', el cual se corresponde con la letra 'U' del eje x. Por lo tanto el primer carácter descifrado será 'U'.

Otra característica del método Vigenère es que únicamente sirve para cifrar/descifrar carácteres alfabéticos, por lo que si encontramos algún carácter que no lo sea, lo incluiremos tal cual en el texto cifrado/descifrado resultante. Y la última norma es que únicamente sirve para tratar con carácteres en mayúscula, por lo que para descifrar carácteres en minúscula los convertiremos en primer lugar a sus equivalentes en mayúsculas para luego completar el proceso convirtiéndolos a su formato original.

Y ahora, conociendo las pautas anteriores, el texto cifrado, la clave y el texto descifrado quedarán como sigue:
VATU_MMPRCXKTAE (Texto cifrado)

BWHQNKTEZYFSLMR (Clave)
UEME_CTLSESSION (Texto descifrado)

Supongamos ahora que la longitud del texto cifrado supera la longitud de la clave básica, ¿qué hacemos? Muy sencillo, repetimos el valor de la clave hasta hacerla coincidir con la longitud del texto cifrado. Ejemplo:
Nejhbchjs.Baypfcp.PymwpKzpuay (Texto cifrado)

BWHQNKTEZYFSLMRGXADUJOPIVCBWH (Clave)
Microsoft.Windows.MediaCenter (Texto descifrado)

Herramienta para automatizar el descifrado

Bién, una vez conocida la metodología necesaria para realizar el proceso de descifrado, es obvio que no entraña demasiada dificultad, pero evidentemente su desarrollo no esta exento de provocar errores. Por ello, y por mejorar un poco más mi faceta de programador junior he desarrollado una herramienta para automatizar el proceso, la cual puede encontrarse aquí.

Y esto ha sido todo, en breve más, y mejor, espero.

Código y ejecutable: getuassist.zip

Addendum 29/01/2009:

Después de solicitar ayuda en el foro de programación de wadalbertia el_chaman, basándose en el código de getuassist, desarrolló una interfaz con GTK que puede utilizarse tanto en Windows como en Linux, la cual ha liberado con licencia GPL. Si el programa se cierra después de provocar un error es problema del código base, y no del desarrollo del interfaz.

Addendum 29/01/2009:

Parece que después de tanto lío con el cifrado Vigenère éste solo será utilizado en las versiones Beta, ya que para la release final se volverá al clásico algoritmo ROT-13. Más info, como no, en el blog de Didier Stevens.

Moraleja: al menos algo habremos aprendido ;-)

2 comentarios:

SLaYeR dijo...
Este comentario ha sido eliminado por el autor.
Ariel Liguori dijo...

Asi que Vigenère, jeje. Pues eso hasta con el Cain lo sacas ya que es lo mismo que utiliza la password de los cisco sin tener habilitado el password-encryption service :)

Muy buena data,
Slds.,
AL