linuxBackToTheFuture

Enumeration

Vamos a empezar con un escaneo nmap:

┌──(pylon㉿kali)-[~/…/pylon/THL/BackToTheFuture/nmap]
└─$ nmap -p- --open -sS -n -Pn --min-rate=5000 -vvv 192.168.44.133
Starting Nmap 7.95 ( https://nmap.org ) at 2025-07-20 13:16 CEST
Initiating ARP Ping Scan at 13:16
Scanning 192.168.44.133 [1 port]
Completed ARP Ping Scan at 13:16, 0.04s elapsed (1 total hosts)
Initiating SYN Stealth Scan at 13:16
Scanning 192.168.44.133 [65535 ports]
Discovered open port 22/tcp on 192.168.44.133
Discovered open port 3306/tcp on 192.168.44.133
Discovered open port 80/tcp on 192.168.44.133
Discovered open port 21/tcp on 192.168.44.133
Completed SYN Stealth Scan at 13:16, 0.70s elapsed (65535 total ports)
Nmap scan report for 192.168.44.133
Host is up, received arp-response (0.00067s latency).
Scanned at 2025-07-20 13:16:17 CEST for 1s
Not shown: 65531 closed tcp ports (reset)
PORT     STATE SERVICE REASON
21/tcp   open  ftp     syn-ack ttl 64
22/tcp   open  ssh     syn-ack ttl 64
80/tcp   open  http    syn-ack ttl 64
3306/tcp open  mysql   syn-ack ttl 64
MAC Address: 00:0C:29:79:B9:22 (VMware)

Read data files from: /usr/share/nmap
Nmap done: 1 IP address (1 host up) scanned in 0.87 seconds
           Raw packets sent: 65536 (2.884MB) | Rcvd: 65536 (2.621MB)

Vemos que tiene varios puertos abiertos, vamos a realizar un segundo escaneo para determinar el servicio y versión que corre en el puerto:

Vemos que tiene un dominio configurado hillvalley.thl, vamos a añadirlo en nuestro /etc/hosts:

Vamos a ver la aplicación web:

Vemos que hay un login, antes de probar cualquier cosa vamos a realizar un fuzzing para ver si hay más cosas en la aplicación:

Vemos que hay varios archivos, vamos a ir viéndolos:

Vemos que no hay gran cosa, nos habla con que fin fue creada esta aplicación web.

Shell as www-data

Vamos a ver si el login es vulnerable a un SQLi para ello lo detectaremos de la siguiente manera:

  1. Interceptaremos la consulta con BurpSuite y la enviaremos al Repeater:

  1. Vamos a probar en el campo username a añadir una comilla simple, si esto está mal sanitizado por detrás lo que ocurrirá es un fallo en la consulta devolviendo un error o un código de estádo 500 (Internal Server Error):

Esto nos da una buena señal, ya que estamos ocasionando un error en la consulta. Ahora vamos a emplear sqlmap para ver ante que posible tipo de SQLi nos podriamos estar enfrentando:

Vemos que estamos ante un Blind SQLi Time Based. Vamos a enumerar las bases de datos con sqlmap:

circle-exclamation

Vemos la base de datos hillvalley, ahora con el parametro -D indicaremos esa base de datos y enumeraremos las tablas:

Ya tenemos la tabla!! Ahora vamos a enumerar las columnas. Indicaremos la tabla encontrada con -T:

circle-exclamation

Ya tenemos las columnas, vamos a dumpearnos los datos:

Tenemos su hash, vamos a emplear john:

Bien!! Ya tenemos la contraseña del usuario marty. Vamos a probarlas en el login:

Moviéndome por la aplicación web me percato de lo siguiente:

Esto huele a un posible LFIarrow-up-right vamos a probar poniendo simplemente /etc/passwd:

Vamos a ver si podemos usar PHP Wrappers:

Vemos que pudimos emplearlo, vamos a descodificar la cadena base64:

Bien sabiendo que podemos usar PHP Wrappers, para lograr un RCE vamos a usar el siguiente repositorio:

Vamos a usar el php_filter_chain_generator.py, para ello vamos a seguir la siguiente sintaxis compartida en el repositorio como ejemplo:

Vamos a emplearlo:

Con <?php system($_GET[0]);?> estamos estableciendo una web shell básica donde por el parámetro 0 recoge nuestro input y con la función system() la ejecuta a nivel de sistema. Vamos a poner esta cadena en en el parámetro page y al final añadiremos el parámetro que está en “escucha”:

circle-info

En este caso lo realicé en BurpSuite ya que me parece más cómodo que hacerlo por la URL

Vemos que funcionó! Vamos a darnos una reverse shell, en este caso cree un archivo en mi máquina llamado shell.sh donde contiene la reverse shell y nos abriremos un servidor en python3:

Vale ahora en el servidor apuntaremos a nuestro servidor de python3 con curl:

Bien!! Si ponemos whoami veremos que somos el usuario www-data.

Shell as marty

Vamos a leer el /etc/passwd:

Vemos que existen los siguientes usuarios:

  • marty

  • docbrown

Tambien vemos lp que forma parte del servicio de CUPSarrow-up-right. Si recordamos hay una base de datos, tanto expuesta a nivel de red y vulnerable ante la aplicación web, vamos a hacer un ls:

Vemos el archivo config.php vamos a ver su contenido:

Obtuvimos las posibles credenciales del usuario marty que sería t1m3travel, vamos a probarlas por SSH:

Vemos que necesitamos si o si un id_rsa, así que vamos a intentar iniciar sesión en la propia reverse shell:

Vemos que las credenciales son validas!! Si hacemos un ls -la en el directorio suyo home nos encontraremos lo siguiente:

Vamos a intentar leer el id_rsa de marty:

Tenemos el id_rsa, vamos a copiarlo en nuestra máquina y darle el permiso 600:

Al intentar emplear el id_rsa para iniciar como marty por el SSH, vemos que nos pide unas credenciales:

Probando las encontradas anteriormente no funcionan, vamos a usar ssh2john para sacar el hash:

Ahora con john vamos a intentar crackearlo:

Bien!! Ahora vamos a inciar como marty:

Shell as docbrown

Bien!! Si volvemos a hacer un ls -la en el directorio de marty veremos otra cosa rara:

Vemos el fichero .flux_notes, vamos a leerlo:

runner?.. No entiendo lo que queire decir, seguramente sea una pista. Vamos a intentar ver el home del usuario docbrown:

Vemos el fichero .flux_hint, vamos a leerlo:

Vemos que comenta un supuesto script que se ejecuta cada minuto, vamos a usar pspyarrow-up-right:

Vemos un script llamado flux_admin.sh, vamos a hacer un ls -l para ver que permisos tiene:

Vemos varios scripts… ejecutandolos no consigo gran cosa. Vamos a usar linPEASarrow-up-right:

Vemos que el binario backup_runner tiene cap_setuid=ep, vamos a intentar a busar de el. Vamos a ejecutarlo a ver que ocurre:

Vemos que solicita que añadamos otro campo, en este caso un archivo. Y si intento ejecutar un comando ahí?

Vamos a probarlo:

Vemos que ahí se ejecutó el whoami dando como resultado docbrownp, vamos a darnos una bash:

Shell as root

Vamos a ver si el usuario docbrown tiene algún permiso SUDOERS:

Vamos a ejecutarlo a ver que ocurre:

Vemos que intenta apuntar a un archivo llamado sync en el directorio /tmp/ lo vamos a crear y dentro intentaremos dar permisos suid a /bin/bash:

Ahora vamos a ejecutar time_daemon:

Ahora esperaremos un rato ya que hay una tarea cron configurada que ejecuta el script indicado como root. Después de esperar un rato si hacemos un ls -la a /bin/bash veremos lo siguiente:

Ahora solo iniciaremos una bash como privilegiado (-p):

root! ;)