HackMyVM - Adria - Writeup
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
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
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.
En un principio con netexec/crackmapexec
no se detecta nada, pero siempre es bueno probar con herramientas alternativas.
Ahora si vemos recursos disponibles y en DebianShare
tenemos acceso de lectura.
Dentro de este directorio habia un archivo zip, si lo descargamos y lo descomprimimos encontramos esto.
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.
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.
Si recordamos en el escaneo con nmap se detectó un robots.txt.
Bueno si revisamos la ruta de /panel
llegamos al panel de login del CMS.
Ahora si probamos las credenciales encontradas anteriormente estas son del administrador del CMS.
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.
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.
- Primero subimos un archivo con la extensión
.phar
o.pht
el cual contenga un código malicioso que permita ejecutar comandos.
Ahora debemos acceder a la ruta en donde se almacena este archivo, si recordamos en robots.txt habia una ruta
/uploads
.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.
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
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.
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.
1
2
3
4
5
6
7
8
9
10
11
#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
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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/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
Ya con esto tendriamos los privilegios máximos en la máquina víctima y podriamos visualizar la flag en el directorio de root.