> For the complete documentation index, see [llms.txt](https://4lec4st.gitbook.io/4lec4st/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://4lec4st.gitbook.io/4lec4st/writes-ups/the-hacker-labs/profesional/mentallity.md).

# Mentallity

## Información de la máquina

<figure><img src="/files/zJqou83XM7c9o4VYYM8G" alt=""><figcaption></figcaption></figure>

**Mentality** es una máquina Windows de nivel avanzado en la plataforma *The Hacker Labs* que simula un entorno empresarial con Active Directory y múltiples vectores de ataque encadenados, desde el acceso inicial hasta la toma total de control del controlador de dominio. La fase inicial se basa en técnicas clásicas de enumeración web, identificación de recursos filtrados (como archivos JavaScript expuestos y credenciales codificadas), y el uso de servicios como FTP para obtener acceso inicial. Una vez dentro, el entorno revela información sensible adicional que permite el acceso a cuentas internas del dominio. La parte más interesante de la máquina radica en la explotación de una configuración vulnerable de Active Directory Certificate Services (AD CS), mediante la técnica **ESC7**, que permite obtener un certificado válido para el usuario **Administrator**, comprometiendo así por completo el entorno.

***

## Reconocimiento

Empezaremos haciendo un primer reconocimiento para ver los puertos abiertos en el sistema.

<figure><img src="/files/p44SSUnIvkNoaxEFi2Nx" alt=""><figcaption></figcaption></figure>

**1. `-p-` → Escaneo de todos los puertos (1-65535)**

Por defecto, `nmap` solo escanea los **1000 puertos más comunes**.\
Con `-p-`, forzamos a que escanee **los 65,535 puertos** de la máquina objetivo, lo que puede ser útil para encontrar servicios que corren en puertos poco convencionales.

**2. `--open` → Filtrar solo los puertos abiertos**

Cuando escaneamos un sistema, muchos puertos pueden estar cerrados o filtrados por un firewall.\
Este parámetro hace que `nmap` **solo muestre los puertos abiertos**, reduciendo el ruido y facilitando el análisis.

**3. `-sS` → Stealth Scan (Escaneo Sigiloso con SYN)**

Es conocido como **"TCP SYN Scan"**, y funciona de la siguiente manera:

* `nmap` envía un paquete **SYN** (solicitud de conexión).
* &#x20;Si el puerto está abierto, el servidor responde con **SYN-ACK**.
* En lugar de completar la conexión con un **ACK**, `nmap` responde con un **RST (Reset)**, interrumpiendo la comunicación.

**4. `--min-rate 5000` → Velocidad mínima de paquetes (5000 por segundo)**

Por defecto, `nmap` ajusta dinámicamente la velocidad de los paquetes según la respuesta de la red.\
Con `--min-rate 5000`, obligamos a `nmap` a **no enviar menos de 5000 paquetes por segundo**, acelerando el escaneo.

**5. `-n` → Deshabilitar resolución DNS**

Normalmente, `nmap` intenta resolver el nombre de dominio de las IPs escaneadas (DNS lookup).\
Con `-n`, evitamos esta resolución de nombres, lo que **acelera el escaneo** y evita que los servidores DNS registren nuestra actividad.

**6. `-Pn` → Omitir detección de host (Host Discovery Off)**

Por defecto, `nmap` envía paquetes ICMP (ping) para ver si un host está activo antes de escanearlo.\
Si un firewall bloquea los pings, `nmap` puede marcarlo como "host down" y no escanearlo.

**7. `-oG`** **→ Exportar el contenido en formato grepeable**

Todo el resultado del escaneo lo exportaremos en un archivo llamado **`allPorts` .**

El escaneo revela muchos puertos abiertos. Ahora haremos un escaneo más detallado.

<figure><img src="/files/5IR4QeS76lhQYCrRDaUy" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/p7PK8E2haQGBy9E6tKcz" alt=""><figcaption></figcaption></figure>

**1. `-p<puertos>` → Escaneo de puertos específicos**

Con `-p<puertos>`, le indicamos que **solo** escanee los puertos que queremos

**2. `-sCV` → Escaneo de versiones y scripts básicos**

Este parámetro en realidad es **dos combinaciones en una**:

* **`-sC`** → Activa los **NSE scripts por defecto** en `nmap` (similar a usar `--script=default`).\
  Ejecuta scripts básicos para enumerar información del servicio detectado, como banners, versiones, etc.
* **`-sV`** → Realiza **fingerprinting de versiones**, intentando identificar la versión exacta del software en cada puerto abierto.

**3. `-oN` → Guardar el resultado en formato Normal**

Por defecto, `nmap` muestra los resultados en pantalla, pero con **`-oN targeted`**, guardamos el resultado en un archivo en **formato legible para humanos**.

Accedemos al sitio web en los puertos **80** y **8080**. Mientras que la página en el puerto **80** muestra contenido por defecto o no relevante, la del puerto **8080** presenta información o funcionalidades adicionales que pueden resultar de interés para la enumeración y explotación.

<figure><img src="/files/ZSeFnuN9vpwNs2RqMdTS" alt=""><figcaption></figcaption></figure>

## Gobuster directory admin

Realizamos una búsqueda de directorios ocultos con **Gobuster** y encontramos el directorio **/admin** expuesto en el servidor.

<figure><img src="/files/iJwKEM9kTDNLdl8pGB4n" alt=""><figcaption></figcaption></figure>

Al acceder a **/admin**, se carga un formulario de inicio de sesión bastante simple.

<figure><img src="/files/NT8cAVJdosshLdNexpor" alt=""><figcaption></figcaption></figure>

## script.js leaked password

Analizando los recursos cargados por la página del login, descubrimos un archivo **script.js**. Este archivo contiene en texto plano las **credenciales** necesarias para acceder a **dashboard.html**.

<figure><img src="/files/vApiRZkPWBHOSHEICqQy" alt=""><figcaption></figcaption></figure>

Una vez dentro de **dashboard.html**, al hacer clic en **Run Diagnostics**, se genera una cadena codificada, aparentemente en **Base64**.

<figure><img src="/files/QnRmb8sqVsVaiscAsnvp" alt=""><figcaption></figcaption></figure>

## ftp credentials and flag user

Al decodificar la cadena Base64 obtenemos unas **credenciales**, correspondientes al usuario **ftpuser**, aparentemente destinadas al servicio **FTP**.

<figure><img src="/files/i5ymii75M4NSw7VBSZh5" alt=""><figcaption></figcaption></figure>

Nos conectamos exitosamente al servidor **FTP** utilizando las credenciales de **ftpuser** y descargamos la **primera flag** del sistema.

<figure><img src="/files/2xU9zhRKorKZs1rB2WsE" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/4YAqxJTAkMtB55vOsisZ" alt=""><figcaption></figcaption></figure>

En el mismo directorio del FTP encontramos un archivo **HTML**, que también descargamos para analizarlo.

<figure><img src="/files/9EnK5fP0qR5z3zvw0P0z" alt=""><figcaption></figcaption></figure>

## Leaked credentials ad\_hc\_mentality\_htl.html

Para visualizar correctamente el archivo **ad\_hc\_mentality\_htl.html**, montamos un servidor web local con **Python**, lo cual permite interpretarlo como una página en lugar de leer su código fuente directamente

<figure><img src="/files/En4tJ3226TkvQrJRjldc" alt=""><figcaption></figcaption></figure>

Dentro de la plantilla HTML, encontramos **nuevas credenciales filtradas**.

<figure><img src="/files/LKF4VyzB25hHXndyUsAj" alt=""><figcaption></figcaption></figure>

Al probar estas credenciales en otros servicios disponibles, confirmamos que son **válidas**. Sin embargo, tras ejecutar distintos vectores de ataque, **ninguno resulta efectivo** por el momento. Incluso utilizando **BloodHound** para analizar posibles relaciones en Active Directory, no se detecta información útil de inmediato.

<figure><img src="/files/YpiR9aNrntuOMM2Rvhd5" alt=""><figcaption></figcaption></figure>

## Privilege escalation -> ESC7

**ESC7** es una técnica de abuso en entornos con Active Directory Certificate Services (AD CS). Ocurre cuando un usuario tiene privilegios excesivos sobre una *plantilla de certificado*, en este caso `SubCA`.\
Al tener permisos como **Certificate Manager**, el usuario puede:

1. **Solicitar un certificado con UPN de otro usuario (como Administrator)**
2. **Aprobar su propia solicitud de certificado**
3. **Usar ese certificado para autenticarse (PKINIT)**

<figure><img src="/files/3hoA6j5rBHengL59bd0J" alt=""><figcaption></figcaption></figure>

### Paso 1: Solicitar certificado con plantilla SubCA

<figure><img src="/files/EIxNV2Ww2XHdseZj1qUw" alt=""><figcaption></figcaption></figure>

`certipy-ad ca -enable-template SubCA` intenta *activar* el uso de la plantilla `SubCA` desde el punto de vista del usuario `svcapp1`.

En algunas configuraciones, **las plantillas requieren aprobación manual** antes de emitir certificados, lo cual detiene temporalmente el proceso. Por eso este paso *"falla"* en el sentido de que la solicitud **queda pendiente**.

### Paso 2: Solicitar un certificado con el UPN del usuario Administrator

<figure><img src="/files/assXrYzBxFKbo2NopDN3" alt=""><figcaption></figcaption></figure>

Se solicita un **certificado nuevo** usando la plantilla `SubCA`, pero **en nombre del UPN `Administrator@mentality.thl`**.

El UPN (User Principal Name) identifica al usuario objetivo en el dominio. El certificado se generará como si fuera para ese usuario.

**La solicitud queda pendiente** porque aún no se ha aprobado (recordemos que requiere revisión manual o intervención del Certificate Manager).

### Paso 3: Añadir a `svcapp1` como Certificate Manager

<figure><img src="/files/L1x8tpLN9jRXwtf6Ayq9" alt=""><figcaption></figcaption></figure>

Se añade a `svcapp1` como **oficial de certificación** (Certificate Manager) en la CA (`-add-officer`).

Esto le da permiso para **ver y aprobar solicitudes de certificado pendientes**.

En un entorno vulnerable, si el usuario puede autoañadirse como manager, ya está comprometido.

{% hint style="danger" %}
*Este paso representa el núcleo de la vulnerabilidad ESC7: el abuso de permisos de gestión sobre la CA.*
{% endhint %}

### Paso 4: Aprobar la solicitud pendiente

<figure><img src="/files/oCnUSJEncBcHxIYFf9pd" alt=""><figcaption></figcaption></figure>

`-issue-request 7` aprueba la solicitud de certificado número 7, que corresponde a la que creamos en el **Paso 2**.

Ahora se genera un certificado **válido** para el UPN `Administrator@mentality.thl`.

### Paso 5: Descargar el certificado aprobado

<figure><img src="/files/wwCSljfTvRLkABpKsd6x" alt=""><figcaption></figcaption></figure>

Descarga el certificado **ya aprobado** con ID 7.

Se guarda localmente como archivo `.pfx` (ej: `administrator.pfx`) que contiene el certificado y clave privada del usuario `Administrator`.

### Paso final: Autenticación como Administrator vía certificado (PKINIT)

<figure><img src="/files/VONlkkJj5dmSSwkZ9qqX" alt=""><figcaption></figcaption></figure>

Realiza autenticación **Kerberos** usando el certificado con `PKINIT` (Public Key Cryptography for Initial Authentication).

**No se requiere contraseña ni hash** del administrador: el certificado lo valida como si fuera el propio usuario.

Certipy obtiene el **hash NTLM del usuario Administrator**, que puedes usar con `secretsdump`, `pass-the-hash`, `psexec`, etc.

Con evil-winrm, hacemos pass-the-hash y obtenemos una shell como administrator. Tenemos privilegios máximos en el DC y obtenemos la flag final.

<figure><img src="/files/IgZdBZmlAIQdD9Cc3Yap" alt=""><figcaption></figcaption></figure>

***

## Conclusión

La máquina **Mentality** demuestra cómo una serie de errores aparentemente menores —como la exposición de archivos JavaScript sensibles, configuraciones débiles en el servicio FTP o filtraciones de credenciales en archivos HTML— pueden ser la puerta de entrada a compromisos mayores. La explotación culmina en una escalada de privilegios mediante la técnica **ESC7**, aprovechando un abuso de plantillas de certificados en AD CS, lo que nos permite autenticar como el propio **Administrator** sin necesidad de su contraseña.
