SubVersion

Máquina SubVersion de DockerLabs

Autor: Lenam

Dificultad: Dificil

SubVersion

Reconocimiento

Comenzamos con un escaneo de nmap:

tenemos 3 puertos abiertos: •Puerto 80: Nginx 1.18.0

Puerto 1789: Desconocido

Puerto 3690: svnserver

Puerto 80

Si vamos a la web, no veremos nada interesante, pero podemos intentar hacer fuzzing web:

tenemos un archivo "upload", el cual si descargamos dice lo siguiente:

como vemos en el mensaje, nos dice que tendremos que fijarnos en el svnserver usando el usuario "svnuser" y en el repositorio "subversion".

Puerto 3590

Si intentamos listar el repositorio nos pedirá una contraseña:

por lo que tendremos que crear un script el cual nos permita hacer fuerza bruta para poder obtener la contraseña.

SVN Brute Force

Continuaremos creando un script en bash con el siguiente contenido:

y lo ejecutamos:

perfecto, ya tenemos la contraseña: "iloveyou!"

Cuando el script termine, nos dejará el repositorio en el mismo directorio.

Dentro del repositorio, podremos ver dos archivos:

Intrusión

Buffer Overflow

Si vemos el codigo en C, podremos ver el siguiente flujo:

ademas, podremos notar que tenemos todas las respuestas de las preguntas y que hay una función la cual nunca es llamada.

Al ejecutar el binario, veremos que es imposible adivinar el nímero normalmente ya que el programa genera el número de manera aleatoria usando el tiempo actual mezclado con 69 como semilla, y luego lo limita a un rango de 0 a 9999999:

sabiendo esto empezaremos a crear nuestro exploit que responda a todas las preguntas:

Con este exploit podremos responder las preguntas de manera automática, pero ahora debemos lograr generar el numero aleatorio exacto:

Este exploit logra generar el numero aleatorio.

Ahora vamos a intentar llamar la función shell del binario, ya que si recordamos nunca es llamada y la máquina tiene este binario funcionando por el puerto 1789, por lo que podríamos obtener una shell por ese lado. Para hacerlo primero necesitamos saber cual es la dirección de la función, y para esto usaremos gdb:

en este caso usaremos la dirección "0x00000000004017b4", ya que es donde se prepara y pasa el argumento necesario al registro rdi antes de llamar a system(), lo que permite ejecutar /bin/bash.

Ahora continuaremos buscando cual es el offset, para esto utilizaremos ghidra:

Offset

como vemos el offset es de 64, pero nosotros pondremos 72 porque hay un desplazamiento de 8 bytes debido a que el binario es de 64 bits.

Finalmente, el exploit quedaría asi:

Lo probamos y quedamos con una shell:

Exploit

ahora simplemente nos quedaría reemplazar una parte del exploit para que en vez de procesar el binario que se encuentra en el directorio se conecte a la máquina donde también se encuentra el mismo:

Lo ejecutamos y recibimos una shell como luigi:

Shell

Escalada De Privilegios

Luigi

Para tener una shell cómoda, nos pondremos a la escucha con netcat en el puerto 443:

y ejecutaremos lo siguiente en la máquina:

luego de recibir la shell realizamos un tratamiento de la tty.

Luego de revisar un rato, encuentro una tarea cron que ejecuta un script que crea un backup de la home de luigi:

viendo el script, busco como escalar y veo que puedo escalar con un "Wildcards with tar".

Para esto, primero debemos buscar como escalar con tar:

de este comando solo nos interesa lo siguiente:

luego crearemos tres archivos en la home de luigi, uno llamado "--checkpoint=1", otro llamado "--checkpoint-action=exec=sh script.sh" y finalmente uno llamado script.sh que ejecute algo que nos permita escalar a root.

En mi caso, este es el oneliner que creé el cual hace todo esto:

Root

Root

Gracias por leer ;)

Última actualización