Writeup - Editorial

Plataforma: HTB

Dificultad: Facil

Fecha de resolución: 07/07/2025

Linux Git Flask Python SSRF

Descripción

Imagen de la máquina

Editorial es una máquina Linux de dificultad facil que presenta una aplicación web vulnerable a Server-Side Request Forgery(SSRF). Esta vulnerabilidad se aprovecha para obtener acceso a una API interna en ejecución, que luego se aprovecha para obtener credenciales que conducen al acceso SSH a la máquina. La enumeración del sistema revela además un repositorio Git que se aprovecha para revelar credenciales de un nuevo usuario. El abuso de privilegios SUDOERS permite la escalada de privilegios.

Temas

• Netword and PortScanning

• ??????

• ??????

Reconocimiento

Inciamos comprobando si se tiene conectividad con la maquina

ping -c 1 10.10.11.20
ping

Enumeración

Enumeración de puertos

nmap -p- --open -sS --min-rate 5000 -Pn -v -n 10.10.11.20 -oN Sports
nmap -p22,80 -sCV 10.10.11.20 -oN Ports
nmap

Tecnologias

Revisando tecnologías, se logra detectar que tenemos un redirect a editorial.htb, agregamos el nombre de dominio al archivo /etc/hosts.

whatweb netexec

Enumeración de sitio web.

sitio web

Realizando reconocimiento sobre la pagina, se identifica una sección donde se pueden subir archivos y apuntar a una url(Book Information)

sitio web

Veremos como se comporta la aplicación utilizando burpsuite al subir un archivo o ingresar una url.

burpsuite

Dando en preview, interceptamos la petición y nos damos cuenta de que efectivamente la aplicación esta realizando un GET a nuestro servidor montado, está intentando buscar nuestro archivo ejemplo.pdf. Lo interesante seria ver si podemos apuntar a puertos internos.

Veamos como esta solicitando el recurso desde el servidor con burpsuite.

burpsuite

Cuando mandamos la request a mi servidor de atacante, en respuesta tenemos una imagen que no revela nada.

burpsuite burpsuite

Si apuntamos a mi servidor quitando el archivo de ejemplo.pdf, ahora me devuelve una cadena aleatoria

burpsuite

Después de realizar enumeración me doy cuenta que puedo apuntar a puertos internos filtrando por la respuesta del servidor (SSRF), posiblemente obtenga algo diferente que no sea una imagen vacía. Usare la herramienta FFUF utilizando como base la request obtenida con burpsuite.

burpsuite

Como filtro utilizare el nombre de la imagen unsplash_photo_1630734277837_ebe62757b6e0.jpeg, copiamos la request y la guardamos en un archivo request.req o damos click derecho en la request y seleccionan copy to file.

Voy a realizar Fuzzing utilizando un diccionario de números del 1 al 65535 que es la cantidad de puertos exitentes

ffuf -request request.req -request-proto http -w num.txt -fs 61-fr “unsplash_photo_1630734277837_ebe62757b6e0.jpeg”
burpsuite

Tenemos como resultado el Puerto 5000

burpsuite

Los resultados revelan una API activa que nos comparte diferentes endpoint sobre la misma ruta

burpsuite

Nota. Al revisar la salida apuntando al puerto 5000, se tiene que revisar el contenido rápidamente ya que el ID cambia constantemente.

Después de realizar pruebas sobre los distintos endpoints del api, obtenemos respuesta del endpoint /api/latest/metadata/messages/authors, donde nos revelan las credenciales del usuario dev (Divulgación de Información).

api

Intrusion Via SSH

Utilizando las credenciales obtenidas, ingresamos directamente por SSH

ssh

Revisando el directorio HOME del usuario dev, encontramos una carpeta con un directorio llamado apps/.git, esto es interesante ya que podemos revisar los cambios y actualizaciones del proyecto.

git

Para poder ver el contenido, exporto la carpeta .git utilizando scp de la siguiente manera.

scp -r dev@10.10.11.20:/home/dev/apps/.git /home/r4ptor/Documents/htb_2025/Editorial/content/
git
git show b73481bb823d2dfb49c44f4c1e6a7e11912ed8ae

Obtenemos las credenciales del usuario “prod”

git

Utilizo las credenciales encontradas para ingresar al sistema mediante SSH y se tiene éxito.

ssh

Escalada de Privilegios

El usuario tiene privilegios a nivel de SUDOERS. El usuario prod puede ejecutar como usuario root /usr/bin/python3 /opt/internal_apps/clone_changes/clone_prod_change.py *

escalada
cat clone_prod_change.py
escalada

El script recibe como argumento una URL (url_to_clone = sys.argv[1]), que luego se usa directamente en r.clone_from(). Se habilita la opción protocol.ext.allow=always, lo cual permite que Git interprete url_to_clone con el protocolo ext::, habilitando la ejecución arbitraria de comandos del sistema operativo. Esto representa una vulnerabilidad crítica si no se valida estrictamente el input.

Si buscamos por internet sobre protocol.ext.allow=always entontramos lo siguiente:

escalada escalada

Para abusar del protocolo ext:: tenemos que poner el comando seguido de la banderilla -c “ext::sh -c comando%” esto permitirá el ejecución de comandos arbitraria

Podemos intentar diversos comando pero el mas accesible y corto podría ser que se le demos permisos SUID a la bash

sudo -u root /usr/bin/python3 /opt/internal_apps/clone_changes/clone_prod_change.py 'ext::sh -c chmod% u+s% /bin/bash'
escalda

Pwn3d!

Relaciones con otras máquinas

Recursos

Referencias