HackTheBox - Authority - Writeup
Reconocimiento
Escaneo de puertos
Para iniciar la resolución de esta máquina hacemos un escaneo de puertos para detectar cuales están abiertos.
En un principio detectamos muchos puertos abiertos y además estos parecen corresponder a puertos típicos de servicios como smb, ldap, winrm, kerberos, etc. Por lo que podríamos decir que nos enfrentamos a un entorno de Directorio Activo o en su defecto a un IIS de Windows.
nmap -p- -sS --min-rate 5000 -Pn -n -oG allPorts 10.10.11.222
Escaneo de servicios
Para esta fase lanzo un conjunto de script básicos de reconocimiento con nmap.
1
nmap -p53,80,88,135,139,389,445,464,593,636,3268,3269,5985,8443,9389,47001,49664,49665,49666,49667,49679,49688,49689,49691,49692,49700,49708,49712,49731 -sCV -oN targeted 10.10.11.222
Con este escaneo confirmamos que nos enfrenteamos a un entorno de directorio activo, por lo que ahora añadiré los dominios encontrados al /etc/hosts
.
Ahora con los dominios podemos examinar cada servicio más detenidamente.
Enumeración
Web
Del escaneo de servicios me fijo en un que parece corresponde una pagina web por HTTPS
, por lo que le echo un vistazo
Interesante, ya que podemos ver un panel de login y al acceder los paneles de editor podemos observar inicios de sesión anterior los cuales corresponder al usuario svc_pwm
y al dominio htb.corp
. Después de investigar un poco llego al siguiente repositorio de github.
Parece ser que este servicio funciona junto con el servicio de LDAP y es un servicio el cual permite cambiar la contraseña del usuario en un directorio de LDAP.
En cuanto al usuario usuario encontrado compruebo si este es un usuario válido en el sistema.
Dado que si lo es, pruebo bruteforcear, enumerar, conseguir un TGT con un ASREPRoast, etc. No logro encontrar nada, por ende paso ver si puedo obtener más información en otro servicio.
Smb
Enumero smb para obtener información del sistema al que me enferento y para ver los recursos compartidos a nivel de red.
Al parecer no puedo listar recursos a nivel de red con crackmapexec, por lo que como es habitual en estos casos siempre es recomendable probar con herramientas alternativas.
como podemos observar con smbclient
si se listan los recursos a nivel de red, a pesar del error que nos muestra, de estos recursos me llaman la atención 2 de ellos Department Shares
y Development
.
En el recurso de Department Shares
no tenemos permisos, pero en el de Development
si, entonces me traere este recuros a mi equipo jugando con monturas del tipo cifs
.
Ansible Playbook
Al revisar el contenido del recuros me encuentro con que se está utilizando un Ansible Playbook
, el cual sirve para organizar procesos de TI.
Luego reviso los archivos .yml
, para ahorrar tiempo utilizo una busqueda recursiva con grep para ver si hay archivos que contengan la palabra pass.
grep -ri 'pass' | awk '{print $1}' FS=':' | sort -u
Ahora revisando estos archivo encuentro lo siguiente en Automation/Ansible/PWM/defaults/main.yml
Hay vaults con contenido encriptado en este archivo, por lo que con ansible2john
puedo extraer un hash para luego intentar crackear.
Primero separo los conenidos de cada vault.
Luego extraigo lo hashes de estos vault y los guardo en un archivos
hashes
.Ahora intento crackear estos hashes con
john
.Por último visualizamos su contenido con
ansible-vault
.
de acá obtenemos 1 usuario y la contraseña de svc_pwm al parecer y svc_ldap.
Explotación
Responder
Ahora si recordamos el servicio del puerto 8443 teniamos un intento de login con el usuario svc_pwm.
Pero si probamos con la opción de Configuration Editor
accedemos al siguiente panel, notar que la web se intenta conectar utilizando el usuario svc_ldap
y nosotros teniamos una contraseña en ldap_admin_password
pero esta no es válida.
Investigando y fijandonos en el error que nos daba cuando nos intentamos loguear este servicio se intenta conectar a otro servicio LDAP remoto, luego si nos fijamos en panel de settings → default → connections.
Podemos modificar al punto en donde se está conectando, por lo que podriamos intentar capturar las credenciales que utiliza este para intentar conectarse, esto lo podriamos hacer con netcat, wireshark, responder, etc. En este caso lo haré con responder ya que es más cómodo y reporta de una forma más clara las credenciales obtenidas.
Lanzar responder.
Modificar la configuración con nuestra ip y puerto de ldap, y recordar guardar los cambios.
Ahora nos intentamos loguear para que se intente conectar a nuestro equipo.
Y listo capturamos la credencial del usuario svc_ldap
, esta correponde a svc_ldap:lDaP_1n_th3_cle4r!
Ahora con estas credenciales probamos en que servicio son válidas y obtenemos esto.
Son válidas para el servicio de winrm
por lo que con evil-winrm
me conecto a la máquina victima para obtener una powershell como este usuario.
Escalada
Para esta parte contemplo 3 formas de elevar privilegios, esto con el fin de practicar.
ADCS
Para esta parte como el usuario svc_ldap examino los permisos del usuario, archivos, grupos, etc. Encuentro lo siguiente.
Al parecer por el grupo en está este usuario puede que exista un ADCS (Active Directory Certificate Services), dado esto intento enumerar este servicio utilizando certipy.
Ahora reviso lo que logró recolectar de los templates existentes en el sistema.
Encontró un template con la vulnerabilidad ESC1
, lo que quiere decir que podremos explotarla probablemente, esto lo haré siguiente los pasos del mismo repositorio de certipy.
Pero existe un problema, solamente los usuarios pertenecientes a Domain Computers
pueden hacer enroll de este template, por ende debemos obtener un usuario perteneciente a este grupo. Ahora bien si recordamos nosotros teniamos el privilegio de SeMachineAccountPrivilege
el cual nos permite añadir workstations al dominio.
Esto quiere decir que puede abusar de este privilegio para añadir un nuevo computador al dominio, lo cual se puede hacer utilizando impacket-addcomputer
.
Ahora podemos solicitar el certificado con el UPN (User Principal Name) de administrator.
Una vez obtenido el certificado del administrador podemos obtener el hash NTLM del usuario administrator, pero ocurre lo siguiente.
Obtenemos un error Kerberos SessionError: KDC_ERR_PADATA_TYPE_NOSUPP(KDC has no support for padata type)
este error quiere decir que el PKINIT (el mecanismo de pre autenticación de kerberos) no está correctamente configurado por lo tanto la autenticación falla.
Por lo tanto para resolver este problema se puede hacer de las siguientes formas.
Escalada con ldap shell con certipy
Para esta escalada simplemente utilizamos la herrramienta certipy la cual nos permite directamente spawnear una ldap shell como administrator utilizando el certificado obtenido.
Ya dentro de esta consola podemos ejecutar los siguientes comandos para añadir al usuario svc_ldap
al grupo de Domain Admin
.
1
2
3
4
# el nombre del usuario lo elegimos nosotros
add_user svc_admin
change_password svc_admin 'svc_admin@svc_admin123!$'
add_user_to_group svc_admin 'Domain Admin'
Con esto ya creariamos el usuarioc svc_admin luego nos podriamos conectar al equipo y ejecutar comandos como administrador.
Escalada con ldap shell de forma manual
Para esta forma manual necesitamos generar la llave y el certificado en archivos por separados, lo cual podemos hacer con certipy.
Ahora con la herramienta PassTheCert podemos spawnear una ldap shell como administrator.
Ya en este punto hacemos los mismo pasos para crear el usuario y añadirlo al grupo Domain Admin
.
Escalada con PassTheCert a través de un TGT
Para esta ultima forma de escalar privilegios debemos delegar los permisos del DC sobre el computador fake que creamos, en este caso llamado $TEST
.
Luego debemos sincronizar nuestro reloj (recomendable siempre que se trabaja con directorio activo).
timedatectl set-ntp 0
→ Ejecutar esto antes en caso de estar en kali linux.
Ahora debemos obtener un Service Ticket.
Con este Service Ticket podemos dumpear las credenciales del dominio con secretsdump
Por último podemos hacer PassTheHash como administrator.