Writeup - Editorial
Plataforma: HTB
Dificultad: Facil
Fecha de resolución: 07/07/2025
Descripción
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
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
Tecnologias
Revisando tecnologías, se logra detectar que tenemos un redirect a editorial.htb, agregamos el nombre de dominio al archivo /etc/hosts.
Enumeración de sitio web.
Realizando reconocimiento sobre la pagina, se identifica una sección donde se pueden subir archivos y apuntar a una url(Book Information)
Veremos como se comporta la aplicación utilizando burpsuite al subir un archivo o ingresar una url.
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.
Cuando mandamos la request a mi servidor de atacante, en respuesta tenemos una imagen que no revela nada.
Si apuntamos a mi servidor quitando el archivo de ejemplo.pdf, ahora me devuelve una cadena aleatoria
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.
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”
Tenemos como resultado el Puerto 5000
Los resultados revelan una API activa que nos comparte diferentes endpoint sobre la misma ruta
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).
Intrusion Via SSH
Utilizando las credenciales obtenidas, ingresamos directamente por 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.
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 show b73481bb823d2dfb49c44f4c1e6a7e11912ed8ae
Obtenemos las credenciales del usuario “prod”
Utilizo las credenciales encontradas para ingresar al sistema mediante SSH y se tiene éxito.
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 *
cat clone_prod_change.py
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:
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'
Pwn3d!