Post

Dreaming

Vamos con otra máquina de try hack me, esta vez la Dreaming. Después de verificar que todo esté andando bien porque luego tengo problemitas técnicos con la vpn y las ips, empezamos lanzando nuestro primer reconocimiento con nmap. Por lo que puedo ver será web hacking ya que solo tenemos los puertos 22 y 80 abiertos, así que primero habrá que vulnerar la página web… esperando que haya una.

Y nos recibe una página de default de apache, al menos ya sabemos uno de los servicios que corren por ahí. Así que toca hacer enumeración por fuerza bruta, a su vez de paso mandaré un whatweb para ver si puedo conseguir algo más de información. Además, en el nmpa nos mostró que se estaba ejecutando en una máquina Linux.

Feroxbuster carreando como siempre. Nos muestra varios resultados entre ellos dos que me llaman la atención, el más obvio es el /app/ que es dónde seguro está la página y el otro el /app/pluck que no tengo idea de que sea, pero enseguida lo vamos a averiguar. Así que ahora de regreso al navegador para explorar la página y ver que podemos hacer en ella.

Si bien no parece mucha cosa, realmente lo es porque ahora tenemos un nombre de usuario (admin) y un servicio que es el pluck que es un servicio que ya he visto antes y sé más o menos como usarlo cuando traté de resolver GreenHouse en hack the box, pero que por cuestiones de conectividad (después de determinado tiempo la máquina se me desconecta y/o la resetean) no la pude terminar.

Decidí darle click al admin que estaba en el pie de página y nos mandó a un loging de usuario, mi primer instinto fue intentar usar inyecciones para pasar el logging, pero recordé que en una máquina anterior perdí mucho tiempo tratando de hacer eso cuando la contraseña era simplemente “password”, así que solo por los loles decidí usarla, ¡y para mi sorpresa funcionó! Sinceramente me reí cuando vi que me había loggeado sin problemas.

Ya con acceso a la página, solo nos queda mandarnos una rever shell y para eso tengo el plan de cargar un archivo php que nos permita hacer eso. Así que primero hay que encontrar una forma de subir dicho archivo, pues al momento de subir cualquier cosa, éste se vuelve automáticamente en formato txt, haciendo que no podamos ejecutarlo correctamente. Para mi suerte, la versión de pluck que estaba corriendo era la pluck 4.7.13, así que con una búsqueda rápida encontré un exploit que podía colar el archivo que necesitaba. SIN EMBARGO, no tuve idea de como hacerlo funcionar, así que seguí investigando y me topé con una vulnerabilidad de esta versión en específica y decidí ponerla en marcha.

Mientras indagaba por los directorios en dónde tenía permitido estar, traté de buscar cualquier cosa relacionada con settings o config, con la práctica he aprendido que usualmente ahí hay cosas interesantes y no me equivocaba, en uno de los files di con un hash en SHA152 (que tuve que ver cual era porque aún no puedo identificar bien algunas cosas). Así que ya con esta información, simplemente puedo usar John para desencriptarlo (o eso espero). Al final era la contraseña que ya sabíamos para www-data. Así que toca seguir buscando.

Después de un buen rato explorando toda la máquina, al entrar a opt me topé con dos scripts en python que si bien no podía ejecutar, si podía leer, ¡ya hí estaba la mugre contraseña que había estado buscando por casi una hora! Ya con esto, podemos ingresar mediante ssh para que el manejo de la consola sea más amigable y sobre todo empezar a escalar en privilegios hasta llegar a root.

Después de explorar por otro buen rato, logré encontrar las credenciales de lucien en su .bash_history (realmente dudaba que pudiese sacar algo de aquí, ya que usualmente está borrado o al menos restringido). Así que con estos, ya podemos ingresar a la database. Ahora, después de que me perdí y me volví a encontrar, al parecer el punto de poder ingresar aquí es aprender dos cosas:

1) Podemos usar un sudo -u death para ejecutar comandos como death especificando las rutas y las acciones que queremos ejecutar. 2) El script de death, que podemos ejecutar como él, interactúa con la database de library.

Con esos dos puntos claros, podemos aplicar una inyección de comandos mediante sql con el siguiente código:

1
INSERT INTO dreams (dreamer, dream) VALUES ('areia','$(cp /bin/bash /tmp/bash; chmod +xs /tmp/bash)');

Y como sé que no se quedarán con la duda de porqué eso en específico, aquí una breve explicación:

Tiene como objetivo crear una copia del binario de Bash en /tmp/bash y darle permisos especiales, pero si no se ejecuta correctamente o no se crea el archivo en /tmp, aquí pueden estar ocurriendo algunas cosas:

  1. Ejecuta una shell con privilegios elevados:

    • Una vez que se crea y modifica /tmp/bash con el bit setuid, cualquier usuario que ejecute /tmp/bash tendrá una shell con permisos de root, incluso si originalmente no tenía dichos privilegios.

    • Permisos: Si el atacante ejecuta el comando, pero no se crea el archivo /tmp/bash, esto podría deberse a que el directorio /tmp tiene permisos restrictivos que impiden la creación del archivo, o que hay un mecanismo en el sistema que detecta y bloquea este tipo de comportamiento.

Con esto hecho, ahora nos vamos a tmp, ahí corremos el script en python como death, para eso hay que implementar el siguiente comando: sudo -u death /usr/bin/python3 /home/death/getDreams.py y de nuevo una pequeña explicación. El comando indica que como death queremos ejecutar el binario de phyton3 (por eso toda la ruta) para correr el scritp de getDreams.py (que de nuevo, hay que especificar la ruta que es la de home de Death, porque hay uno en opt, pero ese no sirve para más allá de darnos una pista).

Una vez ejecutado ese comando, ahora invocamos la bash que es una copia de la de deaht con el siguiente comando: /tmp/bash -p y con eso ya tenemos los privilegios de death que involucran el uso de python a nivel de sudo y con eso podemos hacernos de una shell root si mal lo recuerdo.

Ahora toca sacar el root para poder entrar a la última fase. Ya siendo death, podemos recoger su flag y de paso meternos a ver su script de python en dónde por fin podemos ver sus credenciales para la base de datos. Así que con esto, ahora entramos a la base de nuevo para ver si podemos encontrar algo nuevo que nos permita subir de privilegios. Después de buscar por ahí no encontré nada nuevo, así que tocó de nuevo irnos al inicio. Así que entremos con nuestra sección de…

Aprendiendo cosas nuevas con Areia.

Hoy aprenderemos a usar pspy, un binario que nos permite ver tareas realizadas en la máquina que estamos vulnerando. Al inicio puede ser muy abrumador por la cantidad de información que te da, pero si sabes que buscar entonces es de ayuda. Por ejemplo, en este caso (y con ayuda de Claude.ai) había un script llamado restore.py que se ejecuta con cierta regularidad.

Para este punto saben que mi fuerte es bash y no tanto python, así que primeramente fui a buscar el script para ver que era y por suerte lo pude leer, así que se lo pasé a Claude para que me explicara qué hace. Este script realiza una copia de seguridad de un archivo llamado “kingdom” desde el directorio de Morpheus a un directorio de respaldo, y luego imprime un mensaje de confirmación que es The kingdom backup has been done!

Al ver que el script era .py y que death tiene privilegios para ejecutar python3 como sudo, pensé que quizá podría hacer algo relacionado con eso. Así que después de averiguar un poco y enumerar las cosas que puede hacer death usando el comando find / -type f -group death -ls (que básicamente está pidiendo buscar en la raíz cualquier tipo de file que esté bajo el nombre de death) me di cuenta que death tenía bajo su dominio cierta librería de python que también usa el script de morpheus.

Y como ya dije, yo de python sé tanto como de física nuclear, no, espera, sí sé de eso… Como decía, de python sé tanto como sé sobre como funciona un reactor- no, eso igual lo sé… … Como decía, no tengo ni puñetera idea de python (cosa que debo cambiar, prometo estudiar pyhton), así que me tocó pedir ayuda a Claude de nuevo para que me hiciera una pequeña acción para colar al script.

1
os.system('chmod 777 /home/morpheus/morpheus_flag.txt')

Pequeña nota y a parte, después de intentar esto y un sin fin de cosas más, no lograba darme los permisos necesarios para poder capturar la bandera de Morpheus. Al final me percaté que a pesar de que el script corría (el de Morpheus), simplemente no llamaba a la función o algo pasaba por ahí internamente que hacía que la función copy2 no funcionara correctamente. Así que hice lo que cualquier IT haría, dejarlo para el día siguiente, igual y cuando la máquina se reseteara podría hacerlo y en efecto, al día siguiente conseguí que todo saliera como quería ¡consiguiendo al fin la bandera de Morpheus!

This post is licensed under CC BY 4.0 by the author.