Editorial Writeup
Reconocimiento
Realizando un reconocimiento de puertos con nmap
mediante TCP:
nmap -p- --open -vvv -n -sS -Pn --min-rate 5000 10.129.28.76

El resultado obtenido, se evidencian que solo están abiertos los puertos 80 y 22. Debido a este resultado, considero que sería una buena opción también enumerar puertos mediante por el protocolo UDP .
nmap -p- --open -vvv -n -sS -Pn -sU --min-rate 5000 10.129.28.76
El escaneo no arrojó algún indicio de servicio corriendo en el servidor.
Escaneo de vhosts:
gobuster vhost -u http://editorial.htb/ -w /usr/share/SecLists/Discovery/DNS/subdomains-top1million-110000.txt --append-domain -t 20
No se obtuvo información de algún vhosts corriendo en la maquina victima.
Escaneo de directorios:
gobuster dir -u http://editorial.htb -w /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-medium.txt -t 20
El resultado del escaneo muestra los siguientes directorios:

El directorio /upload llama la atención ya que podría ser un vector para encontrar contenido sensible o desencadenar la ejecución de un payload malicioso que carguemos en alguna otra parte de la página. Sin embargo, al revisarlo en el navegador, encontramos que contiene un formulario.

Los formularios son siempre un posible vector de ataque para explotar vulnerabilidades como XSS, SQLi y SSRF. En este caso, descartamos un CSRF ya que no hay un apartado de inicio de sesión que permita inducir acciones no deseadas a un administrador o usuario con privilegios elevados. Sin embargo, al considerar que el formulario permite cargar archivos e ingresar una URL, los principales vectores de ataque serían la carga de contenido malicioso o un SSRF.
Explotación
Analizando las peticiones mediante BurpSuite, intenté cargar un archivo malicioso para obtener una reverse shell sin éxito alguno. Sin embargo, al ingresar información en el campo “Cover URL related to your book or” y cargar una imagen, probamos un SSRF.

Levantamos un servicio HTTP en nuestra máquina atacante para verificar que la petición proviene desde la IP de la máquina víctima y no desde el cliente.

Confirmamos que es vulnerable a un SSRF.
Este es un SSRF blind/Out-of-band, ya que no podemos ver directamente el contenido del localhost en la página. Para enumerar los puertos ocultos o detrás de un firewall, utilizamos ‘ffuf’.
Se modifica la petición reemplazando el valor a fuzzear
con la palabra FUZZ.

Generamos un diccionario con el número total de puertos con el siguiente comando.
seq 1 65535 > ports.txt
ffuf -w /usr/share/SecLists/Discovery/Infrastructure/common-http-ports.txt -request post.req -u http://editorial.htb/upload-cover -fs 61
En la identificación de un puerto abierto, se utiliza la misma metodología que en la explotación de vulnerabilidades como por ejemplo SQLi Blind, donde el primer cambio en el contenido de la cabecera Content-Length en la respuesta puede indicar que en ese número de puerto está corriendo un servicio en el localhost de la máquina víctima.

Al apuntar al puerto 5000 encontramos un archivo JSON con varios endpoints de una API corriendo en el localhost.

Al enumerar el endpoint llamado authors, obtenemos las siguiente credenciales:

Escalada de privilegios
Al iniciar sesión por SSH como dev, realizamos una enumeración básica.
Usuarios con una bash:
cat /etc/passwd | grep "/bash"
root:x:0:0:root:/root:/bin/bash
prod:x:1000:1000:Alirio Acosta:/home/prod:/bin/bash
dev:x:1001:1001::/home/dev:/bin/bash
Archivos con SUID de root
find / -type f -perm -4000 2>/dev/null
/usr/lib/openssh/ssh-keysign
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/libexec/polkit-agent-helper-1
/usr/bin/chsh
/usr/bin/fusermount3
/usr/bin/sudo
/usr/bin/umount
/usr/bin/mount
/usr/bin/newgrp
/usr/bin/gpasswd
/usr/bin/passwd
/usr/bin/chfn
/usr/bin/su
Revisar los grupos a los que pertenece el usuario dev con el comando id
, así como las tareas cron que se estén ejecutando en el sistema mediante el siguiente comando:
cat /etc/crontab
Durante el proceso de enumeración, encontramos un directorio llamado “apps” en el espacio personal del usuario dev, el cual resulta llamativo. Al ingresar y listar su contenido a simple vista parece vacío, pero al ejecutar un ls -a
para mostrar los archivos ocultos observamos que el directorio contiene un fichero .git. Esto abre la posibilidad de ejecutar comandos de Git y revisar el registro de commits del proyecto`

Este fue el commit que automáticamente llamó mi atención, ya que el mensaje descriptivo deja bastante claro que hemos obtenido las credenciales de otro usuario del sistema, el usuario prod.
Al iniciar sesión como el usuario prod y realizar la enumeración básica mencionada anteriormente, ejecutamos el comando (sudo -l) y evidenciamos que podemos ejecutar el siguiente script de Python como root mediante sudo.

Al validar los permisos que tenemos sobre este fichero, encuentro que es posible leer el contenido del script, lo cual resulta útil para identificar qué hace y evaluar qué posible escalada de privilegios podríamos aprovechar.

Al darle un vistazo, encontramos que el script permite clonar un repositorio de Git en el directorio actual de trabajo, pero no realiza ningún tipo de validación del input que ingresemos. Esto sugiere de inmediato una potencial inyección de comandos para elevar privilegios.
La inyección de comandos reside en la siguiente línea, donde se utiliza el protocolo ext:

Este protocolo permite ejecutar comandos arbitrarios en el sistema sin ningún tipo de restricción.
Sí ejecutamos el script pasando como argumento el comando “whoami”, obtenemos el siguiente resultado, lo que evidencia que los comandos se están ejecutando como el usuario root:

Para la escalada de privilegios, opté por cambiar los permisos del fichero /etc/shadow ejecutando el siguiente comando:
chmod o+rw ../../../etc/shadow
Teniendo permisos de escritura en este fichero, podemos sobreescribir la contraseña del usuario root y asignar una nueva. Para generar esta nueva contraseña, usamos el siguiente comando:
openssl passwd -1 "tooradmin123"
Copiamos el hash generado y lo añadimos al fichero /etc/shadow, luego guardamos los cambios.
Después, realizamos login como el usuario root mediante el comando:
su root
