lunes, 15 de octubre de 2012

Luchando contra Mimikatz/WCE

Sin duda, uno de los descubrimientos de más trascendencia de este año fue la publicación primero por parte de PentestMonkey y posteriormente por PaulDotCom de la existencia de una herramienta llamada Mimikatz mediante la cual era posible obtener las contraseñas en texto claro de los usuarios de Windows directamente desde la memoria, y de la que ya hablé en este mismo blog AQUÍ.

Desde que apareció esta nueva técnica, tanto yo como cualquier Pentester, la hemos usado ampliamente durante nuestras auditorías, ya que conocer la contraseña en texto claro nos da la oportunidad de usarla en sistemas o aplicaciones no-Microsoft, algo que con otras técnica como el Pass-the-Hash o el Pass-the-Token no sucede. Esto ha llevado a dos cosas, la primera es una gran sorpresa por parte de los clientes cuando ven en el informe de auditoría que se pueden recuperar las contraseñas en texto claro, con una conversación que suele ser algo así:

Pentester: ... Y entonces volcamos esta contraseña en texto claro y la utilizamos para entrar en la aplicación XXX y...
Cliente: Espera, espera, espera ¿Windows se guarda mi contraseña en texto plano en la memoria?
Pentester: Sí, exactamente.
Cliente: Uffff.... ¡Menuda cagada!

 Pues sí, menuda cagada... pero a continuación viene la pregunta obligada:

Cliente: Y qué hacemos?

Esta es una pregunta que me han hecho en numerosas ocasiones ya, tanto clientes como amigos del mundo de la seguridad, ya que esto, como ocurre con el Pass-the-Hash, se considera una feature y no un bug, así que en principio Microsoft no va a sacar ningún tipo de parche de seguridad que lo corrija.

Ya que parece que vamos a tener que vivir con ello mucho tiempo, vamos a ver algunas aproximaciones que nos pueden ayudar a luchar contra esta técnica:

Deshabilitar los Security Packages

Sabemos que la causa de que Windows se guarda nuestras credenciales en texto plano (en realidad, con un cifrado reversible, pero a efectos prácticos da igual) es que la emplea para algunos servicios de SSO a través de los llamados Security Packages:

Imagen "prestada" del artículo que escribió mi compañero Ramón Pinuaga en el blog de S21sec

Estos Security Packages pueden ser desactivados editando el registro HKLM\SYSTEM\CurrentControlSet\Control\Lsa\Security Packages, por lo que la mejor opción para protegernos de esta técnica sería deshabilitarlos todos. No obstante, yo no soy sysadmin ni security admin y no tengo acceso a una red REAL en la que probar si esta solución puede ocasionar problemas de funcionamiento, por lo que recomiendo aplicarlo con cautela y con las pruebas previas adecuadas.

Como esto no va a ser siempre posible, y además no tenemos la certeza de que solo almacenen las contraseñas estos módulos, vamos a ver algunas otras mitigaciones.

Borrarlo de la Memoria

Una opción "para valientes" es, igual que estas herramientas se van a la memoria y recuperan la información, modificar el código fuente para que la sobreescriban. En el caso de WCE tendríamos que hacer Ingeniería Inversa de la herramienta, pero en el caso de Mimikatz, su código fuente está disponible AQUÍ, así que podemos cogerlo e intentar hacer nuestra propia versión que lo que haga sea sobreescribir las credenciales encontradas. Os adelanto que el código de donde se obtiene la información está en el directorio "sekurlsa/Security Packages":


Los offsets de donde está la información están referenciados dentro de la función "searchWDigestEntryList", según he podido ver. Esta es una solución que no me he metido a fondo a probar, ya que me parece aún más arriesgada que la primera, por aquello de sobreescribir repetidamente la memoria de un sistema en producción, además de que solo nos protege de que se obtengan las credenciales de aquellos lugares en los que se conoce que están, pero no tenemos la certeza de que existan en más sitios. En cualquier caso, es una alternativa que se podría estudiar más en profundidad si fuera necesario, a ver si tiene repercusiones de estabilidad en las máquinas o no, y si tiene ventajas con respecto a la primera.

 Reiniciar los Equipos de Usuario

Uno de los sitios donde no merece mucho la pena centrar esfuerzos en mitigar estas técnicas es en los equipos de usuario ¿por qué? Porque generalmente en los equipos de usuario... suele haber usuarios, y los usuarios tienen la fea costumbre de teclear sus contraseñas, con lo que al final vamos a poder obtener su contraseña en texto claro de todos modos. La única diferencia va a ser que con Mimikatz/WCE las obtendremos directamente, y si no podemos usar esta técnica tendremos que "motivar" al usuario a que la vuelva a teclear, cerrándole la sesión o poniéndole delante una ventana que parezca un bloqueo de sesión para que introduzca su contraseña, pero al final la contraseña se obtendrá.

El único peligro extra con los equipos de usuario es que obtengamos más credenciales además de la del usuario que lo está utilizando, por ejemplo un administrador que conectó para tareas de mantenimiento. Por esto es recomendable que el administrador, después de realizar sus tareas de mantenimiento, no cierre sesión y deje que el usuario continue trabajando, sino que realice un reinicio del equipo. No estaría de más tampoco que los equipos de usuario tuvieran programado un reinicio periódico nocturno, que por otra parte es necesario para que se apliquen los parches de seguridad, así que es una medida muy recomendable.

Reiniciar los Servidores

Como comentábamos, uno de los mayores peligros de esta técnica es que las credenciales permanecen en la memoria todo el tiempo que el sistema esté sin reiniciarse. Esto puede provocar que encontremos en ella credenciales de usuarios que accedieron al sistema meses antes de producirse la intrusión:


Evidentemente, un sistema servidor no es lo mismo que un equipo de usuario, y no podemos reiniciarlo cada vez que realizamos una tarea de administración, ya que ofrece servicios al resto de la empresa que en la mayoría de los casos no se pueden detener. Aún así, planificar reinicios periódicos (manuales o automáticos) minimizaría la cantidad de información que se puede obtener con estas técnicas. Si reiniciamos cada semana, pues solo se podrán obtener las credenciales de los usuarios que accedieron esa semana. No es una corrección definitiva pero es una manera de mitigar los efectos del uso de estas técnicas.

Usar Autenticación por Red

En entornos Microsoft, se diferencian básicamente tres clases de autenticación. La primera de ellas es el login en el terminal físico, la segunda de ellas es el login por escritorio remoto/terminal server, y la tercera es el acceso por red. Mucha gente con la que he hablado pensaba que con Mimikatz/WCE era posible obtener las credenciales de cualquier tipo de autenticación, es decir, que si comprometes un servidor de ficheros automáticamente obtienes las credenciales de todos los usuarios que tienen montadas carpetas de red. Esto no es así en absoluto.

Si pensamos de una manera más abstracta... para que estas herramientas puedan extraer mi contraseña en claro, tiene que haber estado en algún momento en la memoria del sistema ¿cierto? ¿Y en cuales de estos mecanismos lo hacemos? En el caso del acceso físico está claro que sí, y en el caso del acceso por escritorio remoto también, porque lo que se nos muestra es una ventana de login que es ofrecida por el sistema al que conectamos, así que pasará lo mismo.

En el caso de la autenticación a través de red, esto es radicalmente distinto. Microsoft utiliza los protocolos NTLM o Kerberos, que están basados en mecanismos de reto-respuesta. Veamos un ejemplo de como sería empleando NTLM:

http://www.defenceindepth.net/

Todos los mecanismos de reto-respuesta consisten, de forma básica, en que el servidor al que quieres generar te envía un número grande y aleatorio (el resto) que tu debes cifrar con algún tipo de clave precompartida. Este resultado del cifrado (la respuesta) se enviará al servidor para que este compruebe, realizando el mismo proceso, si la respuesta que a él le sale coincide con la tuya. Si es así, es porque ambos conocéis la misma clave, y por tanto te autentica. En los sistemas Microsoft, esta clave con la que realiza el cifrado no es la clave en si, sino el Hash de ella, que es lo que se almacena en los sistemas. Entonces... ¿cómo se va a poder obtener en este caso la contraseña en claro? Sencillo, NO se puede, porque esta contraseña en claro NUNCA ha sido tecleada en el servidor, por lo que "solo" podrá obtenerse el hash.


Debido a esto, todas las herramientas de administración que funcionen a través de la red no van a dejar ningún rasto en el sistema, por lo que deberemos usarlas siempre que sea posible para evitar dejar las contraseñas de administración en claro en el servidor. Esta puede ser una de las mejoras soluciones (aparte de deshabilitar los security packages), ya que podemos realizar la gran mayoría de gestiones de administración (usuarios, servicios, disco, ficheros, etc) sin necesidad de hacer login en el equipo:

El Administrator está porque es con el que hice el login físico para hacer el volcado, pero el resto no aparecen

Cambiar las Contraseñas

Hemos estado hablando todo el rato de la aproximación de "que no me puedan capturar las contraseñas en texto claro", pero en realidad existe otra aproximación igual de buena: "que no les sirvan para nada las contraseñas que me capturen". La aproximación más "artesanal" de esta idea es cambiar la contraseña de Administrador con frecuencia, de tal forma que si dejé rastro en un sistema de la contraseña del mes pasado, este mes ya no les sirva esa contraseña. OJO, no vale el famoso truco de usar la misma palabra e ir cambiando el número final, porque es algo que sin duda va a probar un atacante. Tiene que ser una contraseña completamente diferente.

En algunos clientes a los que he tenido la oportunidad de visitar he visto sistemas que cumplen perfectamente esta función. Estos sistemas tienen control sobre una serie de usuarios que se pueden emplear para administrar los sistemas, los cuales se mantienen deshabilitados. En el momento que un administrador, a través del interface web, solicita el acceso al sistema para administrarlo, el sistema le asigna una contraseña aleatoria y se la proporciona al administrador, y habilita el usuario. Pasado el tiempo que éste ha solicitado, el usuario se deshabilita de nuevo automáticamente.

Este tipo de sistemas, aunque fueron diseñados como medio de control sobre los usuarios administradores en entornos donde existe mucho proveedor externo, proporciona una protección muy buena ante el tipo de ataques que comentamos, ya que las contraseñas robadas no van a tener ninguna utilidad.

Estas son todas las contramedidas que se me han ocurrido a mi y que he recomendado cuando me han preguntado sobre el tema, pero si tienes tu propia solución... es el momento de que dejes un comentario :)

7 comentarios :

Anónimo dijo...

Muchas gracias, muy buen artículo.
Como nota adicional, el deshabilitar por ejemplo el paquete WidGest puede ocasionar problemas para ciertas aplicaciones web que usen dicha autenticación, accesos WebDav, etc.; el tspkg deshabilita por ejemplo poder funcionar con entornos de Remote Desktop Services/Terminal Services-Citrix, por l oque por desgracia no siempre será factible en según qué casos.
Lo peor de todo es saber que no habrá solución por parte de MS para algo que debería considerarse un fallo garrafal (unido por ejemplo al de las sticky keys, creo que este va a ser ya un mítico...)

Salu2!

Jose Selvi dijo...

@Anónimo: Muchas gracias por tu aportación!

Como comentaba en el post, yo no dispongo de una red funcional con la que probar que pasaría en un entorno real si desactiváramos los Security Packages, por eso comentaba que con mucha precaución y muchas pruebas previas.

Anónimo dijo...

Gracias a tí, siempre es de agradecer que se comparta este tipo de conocimiento; sólo exponía eso como nota adicional, ni por asomo como otra interpretación, quede claro ;-), precisamente gracias a cosas como esta es por la que uno se entera de ello y puede indagar o probar, si no, ni eso.
Lo único que siempre me sorprende de estos fallos, es el tema de que la empresa responsable (en este caso MS, y conste que soy "fanMS" porque es lo que mejor conozco, no por otra cosa)no pueda hacer algo al respecto (y recalco lo mismo que las dichosas "stiky kis" :-), que se puede apañar con un cambio de registro, pero es eso, un apaño, no una solución.
Salu2!

Jose Selvi dijo...

@Anónimo: Yo siempre he defendido que, técnicamente, se puede hacer TODO, pero lo cierto es que, nos guste o no, el dinero es el que lo que manda. Si una empresa hace un coste/beneficio y ve que arreglar un fallo cuesta mucho... pues ahí se quedará hasta el siguiente producto al menos (Windows 9?).

Esto, no es un tema de Microsoft, es un tema de cualquier empresa. Todas funcionan así.

Anónimo dijo...

Totalmente de acuerdo, pero esto, en mi humilde opinión, no es cuestión de si una empresa invierte más o menos según pueda o considere, si no que es un fallo del sistema que no se corrige; que para evitarlo ya se busquen otras alternativas, perfecto, pero que MS debiera corregirlo debería ser una máxima, igual que lo hace con otra serie de cosas tan bien, no entiendo por qué en estos casos lo deja pasar cuano es algo inherente al propio sistema
Salu2!

Anónimo dijo...

Muchas gracias por publicar como solucionar el tema... Has perdido un pentester...

Gentil Kiwi dijo...

By the way, you can't disable Kerberos ;)