Bienvenidos a un nuevo post en Bytemind. En el post de hoy les vamos a explicar como recuperar la contraseña de un fichero Office que hayamos perdido o no nos acordemos de la misma, para ello utilizaremos varias herramientas, así como un diccionario mediante el cual realizar el ataque para descubrir la misma.
Los archivos de Microsoft Office pueden protegerse con contraseña para evitar manipulaciones no deseadas y garantizar la integridad de nuestros datos, pero documentos protegidos de versiones anteriores son susceptibles de poder extraer sus hashes con un programa simple llamado office2john. Estos hashes extraídos pueden descifrarse de forma sencilla utilizando herramientas muy útiles como son John the Ripper y Hashcat.
Extraer este hash tan sólo lleva unos segundos y nos ayudará a obtener dicha contraseña. Esta herramienta, office2john, está escrita en Python y puede ejecutarse directamente desde la terminal. En cuanto a la compatibilidad con Office, se sabe que funciona en cualquier archivo protegido de Word, Excel, Powerpoint, OneNote, Project, Access y Outlook creado en Office 97, 2000, XP, 2003, 2007, 2010 y 2013, inlcuidas las versiones del mismo para Mac. Sin embargo, es posible que no funcione correctamente en versiones más nuevas del mismo.
Índice
Instalación de Office2John
Para comenzar, necesitaremos descargar la herramienta desde GitHub ya que office2john no está incluido en la versión estándar de John the Ripper (que ya debería estar instalada en su sistema Kali). Esto se puede lograr fácilmente con wget, para ello lo haremos mediante el siguiente comando:
1 |
# wget https://raw.githubusercontent.com/magnumripper/JohnTheRipper/bleeding-jumbo/run/office2john.py |
Extracción del hash con Office2John
Para su ejecución deberemos de realizarlo mediante python, indicando el directorio en el cual se instaló. Para la prueba que vamos a realizar, hemos creado un documento llamado prueba.docx protegido con contraseña con Word 2007 y en el cual la contraseña es “password1234”.
Ahora deberemos de extraer el hash de nuestro fichero Office protegido. Para ello ejecutaremos el siguiente comando y enviaremos la salida del mismo a un fichero llamado hash.txt para su uso posterior:
1 |
# python office2john.py prueba.docx > hash.txt |
Para verificar que se obtuvo el hash correctamente podemos utilizar cat sobre el fichero hash.txt generado como en el siguiente ejemplo:
1 2 |
# cat hash.txt prueba.docx:$office$*2007*20*128*16*a7c7a4eadc2d90fb22c023c6324a6b49*abc5a7 |
Ataque de diccionario sobre el hash obtenido
Como ya se mencionó, vamos a realizar esta prueba mediante el uso de dos herramientas, John the Ripper y Hashcat para descifrar el hash que acabamos de obtener del fichero de Microsoft Office protegido. Ambos métodos funcionan muy bien así que ya depende de las preferencias de cada uno el utilizar una herramienta u otra.
Si no tienes un diccionario creado previamente, es hora de crear uno, ya sea mediante la creación de un fichero con las palabras o posibles coincidencias que creamos que podrían ser o mediante el uso de una herramienta que automatice la creación del mismo como es crunch.
Opción 1 – John the Ripper
En nuestro caso utilizaremos un diccionario creado previamente y que incluye la contraseña que hemos definido previamente. Lanzaremos el siguiente comando para empezar a descifrar el hash obtenido:
1 2 3 4 5 6 7 8 |
# john --wordlist=dictionary.txt hash.txt Using default input encoding: UTF-8 Loaded 1 password hash (Office, 2007/2010/2013 [SHA1 128/128 SSE2 4x / SHA512 128/128 SSE2 2x AES]) Cost 1 (MS Office version) is 2007 for all loaded hashes Cost 2 (iteration count) is 50000 for all loaded hashes Will run 4 OpenMP threads Press 'q' or Ctrl-C to abort, almost any other key for status |
Lanzado el comando anterior, John comenzará a descifrar el hash y, dependiendo de la complefidad de la contraseña y del diccionario, tardará más o menos tiempo hasta encontrar una coincidencia o finalizar el diccionario sin un resultado. Cuando se obtenga la contraseña, se mostrará un mensaje en pantalla con la misma. En nuestro caso, como la contraseña es muy simple, ha tardado tan sólo unos segundos en descifrarla.
1 2 3 4 |
password1234 (prueba.docx) 1g 0:00:00:06 DONE (2020-01-04 11:00) 0.5824g/s 415.8p/s 415.8c/s 415.8C/s prueba..password123456 Use the "--show" option to display all of the cracked passwords reliably Session completed |
Otra opción es utilizar el flag –show para mostrar la misma:
1 2 3 |
# john --show hash.txt prueba.docx:password1234 1 password hash cracked, 0 left |
Y listo, ya disponemos de la contraseña de nuestro documento de Office, vamos a verlo en otro ejemplo mediante la herramienta Hashcat.
Opción 2 – Hashcat
A continuación, y para realizar la prueba con Hashcat, deberemos de realizar un modificación en el fichero hash.txt obtenido. Editaremos el fichero con vi y eliminaremos el principio de la línea del hash, eliminando el nombre del fichero y los dos puntos del mismo, quedando de la siguiente forma:
Antes:
1 2 |
# cat hash.txt prueba.docx:$office$*2007*20*128*16*a7c7a4eadc2d90fb22c023c6324a6b49*abc5a7 |
Y después:
1 2 |
# cat hash.txt $office$*2007*20*128*16*a7c7a4eadc2d90fb22c023c6324a6b49*abc5a7 |
Completado este paso, seguimos. Podemos comentar mostrando la ayuda de Hashcat con el siguiente comando, aunque destinaré una entrada nueva para hablar en profundidad de esta herramienta:
1 |
# hashcat --help |
Desde el resultado anterior, sólo estamos interesados en los modos hash de Office, por lo que utilizaremos la opción -m seguido del identificador correspondiente a la versión de nuestro documento Office.
1 2 3 4 5 6 7 8 9 |
9700 | MS Office <= 2003 $0/$1, MD5 + RC4 | Documents 9710 | MS Office <= 2003 $0/$1, MD5 + RC4, collider #1 | Documents 9720 | MS Office <= 2003 $0/$1, MD5 + RC4, collider #2 | Documents 9800 | MS Office <= 2003 $3/$4, SHA1 + RC4 | Documents 9810 | MS Office <= 2003 $3, SHA1 + RC4, collider #1 | Documents 9820 | MS Office <= 2003 $3, SHA1 + RC4, collider #2 | Documents 9400 | MS Office 2007 | Documents 9500 | MS Office 2010 | Documents 9600 | MS Office 2013 | Documents |
En nuestro caso, al tratarse de 2007 utilizaremos el identificador 9400, por lo tanto el comando quedaría de la siguiente forma:
1 |
# hashcat -a 0 -m 9400 --username -o result.txt hash.txt dictionary.txt |
Las opciones utilizadas serian las siguientes:
- -a -> establece el tipo de ataque como el modo directo predeterminado de 0
- -m -> especifica el modo que queremos utilizar, tal y como acabamos de explicar
- –username -> ignora cualquier nombre de usuario en el archivo de hash
- -o -> especifica el fichero de salida
- hast.txt -> el fichero de hash a descifrar
- dictionary.txt -> el diccionario a utilizar para descifrar el hash
Una vez lanzado el comando, hashcat empezará a trabajar en ello:
1 2 3 4 5 |
hashcat (v5.1.0) starting... * Device #1: Intel(R) Core(TM) i5 CPU M 480 @ 2.67GHz, 934/3736 MB allocatable, 4MCU ... |
Después de un tiempo, mostrará el estado de descifrado y habrá creado el fichero de salida indicado con la contraseña del hash:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Session..........: hashcat Status...........: Cracked Hash.Type........: MS Office 2007 Hash.Target......: $office$*2007*20*128*16*a7c7a4eadc2d90fb22c023c6324...abc5a7 Time.Started.....: Sat Jan 4 11:00:00 2019 (6 secs) Time.Estimated...: Sat Jan 4 11:00:06 2019 (0 secs) Guess.Base.......: File (dictionary.txt) Guess.Queue......: 1/1 (100.00%) Speed.#1.........: 610 H/s (8.51ms) @ Accel:512 Loops:128 Thr:1 Vec:4 Recovered........: 1/1 (100.00%) Digests, 1/1 (100.00%) Salts Progress.........: 1024/5084 (20.28%) Rejected.........: 0/1024 (0.00%) Restore.Point....: 0/5084 (0.00%) Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:49920-50000 Candidates.#1....: prueba -> password123456 Started: Sat Jan 4 10:59:50 2019 Stopped: Sat Jan 4 11:00:06 2019 |
Ahora ejecutaremos un cat sobre el fichero de salida para obtener la contraseña del hash:
1 2 |
# cat result.txt $office$*2007*20*128*16*a7c7a4eadc2d90fb22c023c6324a6b49*abc5a7:password1234 |
Y listo, ya conocemos dos métodos para descifrar contraseñas de un fichero de Microsoft Office.
Como defenderse ante un ataque de diccionario
Como siempre, existen medidas con las que hacerlo y nada es imposible en este mundo. La mejor técnica de defensa en este tipo de ataques es utilizar contraseñas que cumplan con las buenas prácticas, es decir, el uso de letras mayúsculas y minúsculas, números, y símbolos y con una longitud mínima de 16 caracteres, aunque cuanto más larga y complicada más difícil se lo pondríamos al atacante. Otra de las opciones es utilizar frases largas con una alta entropía con la que también hacer mucho más complicado la posibilidad de que pueda descifrarse la misma.
Y esto ha sido todo por hoy, espero les haya sido de ayuda y si tienen cualquier duda o aclaración no duden en exponerla en la sección de comentarios.