lunes, 12 de marzo de 2012

Mimikatz & WCE 1.3beta

Hace algo más de un mes, mi compañero Julio Gómez nos mandaba a unos cuantos una herramienta llamada Mimikatz, publicada en Frances, que decía poder extraer las contraseñas de Windows de la memoria. Tras unas cuantas horas de pruebas, IDA, y ver un poco que hacía, parece que efectivamente la herramienta hacía lo que decía hacer.

Fruto de las pruebas, otro compañero, Ramón Pinuaga, escribía en el blog de S21sec un articulo donde comentaba el descubrimiento de la herramienta, la técnica que empleaba, y algunas de las pruebas que hicimos con ella.

Ahora, algunas semanas después, una actualización de una de mis herramientas favoritas: Windows Credential Editor (WCE) de Hernán Ochoa, de la que ya he hablado en otras ocasiones, incorpora esta técnica y es capaz de obtener las credenciales en texto claro mediante la nueva opción -w:


En estos momentos, la versión 1.3, que es la que soporta esta nueva funcionalidad, se encuentra en estado Beta, y únicamente disponible en su versión de 32 bits, aunque todos esperamos poder verla pronto disponible para 64 bits.

> wce.exe -w


Según he podido leer tanto en el blog del autor de Mimikatz, la información que conozco sobre WCE y un poquito de IDA, la técnica empleada originariamente por Mimikatz sería muy similar (por no decir idéntica) a la empleada tradicionalmente por WCE, salvo que a éste último se le habría añadido la funcionalidad de consultar otros Security Packages además de MSV1_0, concretamente WDigest, de donde se pueden obtener las credenciales en texto claro. La otra posibilidad, que era la de obtener las credenciales a través de Tspkg no ha sido implementada, imagino que porque esta última requiere que el sistema sea un Windows Vista o superior, mientras que en el caso de WDigest la técnica funcionaría con cualquier equipo Windows XP o superior.

No nos olvidemos que para que estas credenciales hayan sido almacenadas en memoria es necesario que el usuario haya hecho login en la máquina físicamente o a través de Terminal Server en algún momento tras el último reinicio de la máquina. Las autenticaciones a través de red almacenarían esta contraseña, ya que esta ni siquiera llegaría a ser transmitida a este equipo.

En el próximo post, algunas "jugadas" que podemos hacer empleando esta técnica.

Actualización: En los comentarios del post podeis ver una explicación muy completa que ha realizado Hernan Ochoa, autor de WCE, sobre el funcionamiento del mismo, con todas las referencias necesarias para comprender el proceso. También nos anuncia que ya ha liberado la versión para 64 bits de la nueva versión de la herramienta.

8 comentarios :

Adrián dijo...

Me sorprendió mucho el post en el blog de S21 cuando lo leí, la verdad. ¿Crees que habrá un parche no muy tarde que solucione esto almacenando únicamente el hash?

Salud

Jose Selvi dijo...

@Adrián: A mi también me sorprendió cuando leí el artículo original del autor y probé la herramienta. De hecho en un primer momento pensé que sería un fake, pero no xD

Por lo que leí que comentaba el autor, no creo que salga parche, porque no es un bug, es una feature :P

Parece ser que Microsoft era consciente de que esto se hacía, pero lo considera necesario para algunos aspectos de su SSO. Eso al menos me parece recordar que leí en el blog del autor de Mimikatz.

Gentil Kiwi dijo...

@Jose Selvi , correct :) a real feature of Microsoft ;)
Announced about one year ago...
(ps: mimikatz x64 is about one year old ;))

Jose Selvi dijo...

@Gentil Kiwi: Hi! I mean that WCE1.3 x64 is not available yet. Of course I know that your tool works perfectly in x64 :)

Some workmates talked about mimikatz a couple of months ago in our corporate blog:

http://blog.s21sec.com/2012/02/se-acabo-el-pass-hash.html

Nota: @Gentil Kiwi, como podréis ver en los enlaces que pongo en el post, es el autor de Mimikatz :)

Anónimo dijo...

Para esto sí que escribe en inglés ;)

hernan dijo...

Hola Jose!, soy Hernan, el autor de WCE! como estas!? :)

Lo que vos mencionas en cuanto al funcionamiento de esta tecnica es correcto!.

y agrego:

Todos los authentication packages usan las mismas estructuras de datos (o 99.9% similares) para guardar las logon sessions y credenciales asociadas (NTLM hashes y passwords cleartext) y utilizan las mismas funciones para encriptar datos.

Estas funciones y estructuras siguen siendo las mismas que encontre haciendo ingenieria reversa y describi ya en mi paper original del a#o 2000 (Modifying Windows NT Logon Credentials), luego en la presentacion sobre Pass-the-Hash toolkit en el 2007, y tambien actualize en la ultima presentacion que tuve la suerte de dar en la RootedCon 2001 llamada "WCE Internals".

Esta opcion fue agregada a WCE recientemente porque recibi algunos emails pidiendola hace unos dias atras.

La tecnica para obtenerla es la misma que publique ya para obtener los hashes NTLM como vos bien mencionas. Es siempre el mismo procedimiento.

La opcion de hacer lo mismo con el tspkg no la agregue porque es hasta casi redundante, pero la tecnica es exactamente igual, de nuevo.

Porque es practicamente redundante? Porque cuando un usuario se loguea interactivamente a Windows (poniendo la clave o usando cualquiera de los metodos que menciono en mis presentaciones), Windows "llama" a TODOS los authentication packages instalados (msv1_0,wdigest,tspkg, etc) y les dice "aqui tienen la clave en cleartext, el usuario, el dominio y otros datos, hagan lo que uds. quieran con ella".

Entonces, msv1_0 guarda esos datos pero antes convierte la clave ingresada a los hashes LM y NT, wdigest directamente guarda la clave en plaintext, y tspkg hace lo mismo. Todos usan la misma funcion para encriptar estos datos.

Entonces, como Windows llama a todos los authentication packages cuando recibe una clave, es altamente probable, que si wdigest tiene una clave en plaintext, las claves que tenga tspkg sean exactamente las mismas (en un escenario 'normal' es 100% asi diria, hagan la prueba).

Igualmente, la funcionalidad de hacer lo mismo para tspkg la voy agregar en la proxima version por completitud, es sencillo hacerlo, pero por lo que digo mas arriba no me parece urgente.

Para mas informacion sobre el funcionamiento interno de Windows y los authentication packages, todo este funcionamiento y estructuras lo explico en las publicaciones que detalle mas arriba.

Gracias!

Jose Selvi dijo...

@hernan: como siempre encantado de tenerte por aquí :)

Gracias por aportar los enlaces a toda esa información. Algunos tuvimos la suerte de verte presentar en la RootedCON, pero para los que no, al menos podrán consultar la info.

Te escribo esta semana y charlamos!

hernan dijo...

Gracias Jose! un gusto hablar con vos de nuevo!

Veo que tambien les interesa la version 64bit de WCE asi que recien la hice, la pueden bajar del siguiente link:

http://www.ampliasecurity.com/research/wce_v1_3beta_x64.tgz

Cualquier inconveniente me avisan!

Gracias!.