HackMyVM - Adria - Writeup

Publicado el 2024/03/17HackMyVM
SubrionCMSUpload BypassScriptingSMB
HackMyVM - Adria - Writeup
Autor: Lukas PintoTiempo de lectura: 3 min

Reconocimiento

Escaneo de puertos

Para inciar hacemos un reconocimeinto de todo el rango de puertos de la máquina víctima.

nmap -p- -sS --min-rate 5000 -Pn -n 192.168.1.13 -oG allPorts

Untitled
Untitled

Escaneo de servicios

Ahora una vez obtenidos los puertos que están abiertos, hacemos un escaneo con nmap para reconocer el servicio y versión de estos.

nmap -p22,80,139,445 -sCV 192.168.1.13 -oN targeted

Untitled
Untitled

En base a esto podemos ver que nos encontramos ante una máquina Linux Debian probablemente, además que tiene un servicio http y un smb expuesto, por último en cuanto al ssh este es una versión más o menos reciente, asi que el vector de ataque irá por otro lado.


Ganando acceso

SMB

Primero antes de acceder a la web examino el servicio de samba para ver si existe algún recurso compartido a nivel de red disponible.

Untitled
Untitled

En un principio con netexec/crackmapexec no se detecta nada, pero siempre es bueno probar con herramientas alternativas.

Untitled
Untitled
Untitled
Untitled

Ahora si vemos recursos disponibles y en DebianShare tenemos acceso de lectura.

Untitled
Untitled

Dentro de este directorio habia un archivo zip, si lo descargamos y lo descomprimimos encontramos esto.

Untitled
Untitled

Dado que cada una de las carpetas contiene muchos tipos de archivos distintos, prefiero utilizar grep -riR 'pass|password|username|user' para ver si existe alguna credencial o algo relacionado a esto.

Untitled
Untitled

En la primera coincidencia encontramos las crendenciales admin:jojo1989, ya les adelanto que no es de SSH ni de SMB.

SubrionCMS

Ahora si revisamos la web encontramos que se trata de un blog que se administra con un CMS llamado Subrion.

Untitled
Untitled

Si recordamos en el escaneo con nmap se detectó un robots.txt.

Untitled
Untitled

Bueno si revisamos la ruta de /panel llegamos al panel de login del CMS.

Untitled
Untitled

Ahora si probamos las credenciales encontradas anteriormente estas son del administrador del CMS.

Untitled
Untitled

Ahora que estamos como admin, se me ocurre buscar alguna vuln relacionada a la versión de este CMS para ver si puedo ganar acceso al sistema.

Untitled
Untitled
Untitled
Untitled

Encontramos un CVE el cual permite subir un archivo .phar o .pht a través del apartado de subida de archivo del CMS. Si probamos este script no funcionará, asi que haré el procedimiento manual.

  1. Primero subimos un archivo con la extensión .phar o .pht el cual contenga un código malicioso que permita ejecutar comandos.
Untitled
Untitled
Untitled
Untitled
  1. Ahora debemos acceder a la ruta en donde se almacena este archivo, si recordamos en robots.txt habia una ruta /uploads.

    Untitled
    Untitled
    Untitled
    Untitled

    Ya con esto podemos montarnos una reverse shell.


Escalada de privilegios

Adriana

Ahora estando como el usuario www-data busco permisos, archivos, capabilites, etc. Me percato que si listamos los permisos con sudo podemos ejecutar un programa como adriana.

Untitled
Untitled
Untitled
Untitled

Si probramos un poco las opciones del comando, me fijo que al momento de utilizar el help se abre una vista paginada como cuando se utiliza el comando less. Por lo que con esto podemos spawnear una shell como el usuario adriana desde de este contexto.

Estando dentro de la vista páginada podemos hacer esto !/bin/bash

Untitled
Untitled
Untitled
Untitled
Untitled
Untitled

Y ya estamos como adriana, con esto tendriamos la primera flag.

Root

Luego para la escalada a root hacemos el reconocimiento inicial de siempre y al igual que en el caso del usuario www-data, con adriana tambien podemos ejecutar un script como cualquier usuario, en nuestro caso el usuario root.

Untitled
Untitled

Al parece se intenta usar rutas absolutas pero nada de eso sirve, ya que para comparar la contraseña se utilizan los corchetes dobles [[]] y estos contemplan las expresiones regulares.

bash

#este caso es verdadero
if [[ "ho*" == "hola" ]];then
 echo "algo"
fi

# en cambio en el siguiente caso es un string literal y por lo tanto
# es falso
if [ "ho*" == "hola" ];then
 echo "algo"
fi
Untitled
Untitled

Entonces una vez sabiendo esto podemos bypasear la comparacion, pero el zip se sigue encriptando con la contraseña del usuario root, por lo que se me ocurre bruteforcear con un script letra por letra para ir descubriendo la contraseña.

bash

#!/bin/bash
chars=( 'A' 'B' 'C' 'D' 'E' 'F' 'G' 'H' 'I' 'J' 'K' 'L' 'M' 'N' 'O' 'P' 'Q' 'R' 'S' 'T' 'U' 'V' 'W' 'X' 'Y' 'Z' 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 'u' 'v' 'w' 'x' 'y' 'z' '0' '1' '2' '3' '4' '5' '6' '7' '8' '9' )

pass=''

while true;do

 for i in "${!chars[@]}"
 do
  auth=$(echo "$pass${chars[$i]}*" | sudo /opt/backup 2>/dev/null| grep 'Authorized' && echo $pass)
  if [ $? == 0 ];then
   pass="$pass${chars[$i]}"
   echo $pass
   break
  fi
 done
done
Untitled
Untitled

Ya con esto tendriamos los privilegios máximos en la máquina víctima y podriamos visualizar la flag en el directorio de root.