SubVersion
Máquina SubVersion de DockerLabs
Autor: Lenam
Dificultad: Dificil

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:

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:

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:

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

Gracias por leer ;)
Última actualización