🟠DC-9
Write-up de la máquina DC-9 de Proving Grounds #writeup #walkthrough
Last updated
Write-up de la máquina DC-9 de Proving Grounds #writeup #walkthrough
Last updated
Comenzamos enumerando que servicios tiene abiertos la máquina DC-9.
Un único puerto abierto, el 80. Vamos a ver que se está ejecutando en este servicio.
Servicios abiertos:
Puerto 80 -> HTTP -> Apache httpd 2.4.38
Se está ejecutando un servidor Web en la máquina objetivo. Vamos al navegador para ver el contenido del sitio Web.
En "Display All Records" podemos ver todos los registros de información sobre usuarios potenciales.
También parece que podemos buscar usuarios por su nombre.
Otra cosa que vamos a hacer es enumerar los directorios y archivos interesantes.
Si llevamos a cabo una inyección SQL típica, nos proporcionará todos los datos correspondientes a la opción "Visualizar todos los registros". Esta es la inyección SQL que empleé:
Esta inyección nos devuelve la informaciónd de la lista de usuarios sin devolver ningún error. Podemos entender que esta entrada de datos es vulnerable a SQLi. Comenzaremos por listar el número de columnas con las que es posible trabajar. Para listar las columnas, emplearé la consulta "ORDER BY", iniciando con el número 1 e incrementándolo hasta que produzca un error o no proporcione información alguna. Pondremos a prueba esto utilizando el nombre conocido "mary", y la estructura de la consulta se presentará de la siguiente forma:
Incrementando el número en uno, observamos que al ejecutar "ORDER BY 7", deja de mostrarse información, lo que indica que el total de columnas es 6. Nuestro próximo objetivo es determinar en qué parte se muestra la información de cada columna. Por lo tanto, introduciremos algunos números para reconocer cada columna, y esto se puede llevar a cabo a través de la siguiente consulta:
mary' union all select 1,2,3,4,5,6 -- -
Observamos la posición de cada columna, identificada por un número. Una vez que conocemos dónde se puede visualizar la información, debemos determinar la versión de la base de datos (asumiendo que sea MySQL) y esto se puede lograr mediante la siguiente consulta:
La información que conseguimos al identificar la versión nos facilita entender de qué manera efectuaremos las consultas. El próximo paso es listar las bases de datos usando el esquema de información, esta es la pregunta que empleamos para mostrar las bases de datos:
Basándonos en la información proporcionada, la base de datos de "usuarios" nos parece la más intrigante. Por el momento, vamos a listar las tablas para determinar cuál es interesante, y para ello, hemos empleado la consulta siguiente:
Ahora vamos a listar los nombres de los campos presentes en la tabla con el fin de identificar cuáles de ellos podrían contener información relevante. Para lograr esto, emplearemos la consulta que se muestra a continuación:
Existen seis campos en total, pero los que realmente nos importan son los denominados "nombre de usuario" y "contraseña". Para visualizar únicamente estos datos de "UserDetails", situaremos el nombre de usuario en la cuarta columna y las contraseñas en la quinta. La consulta que empleamos es la siguiente:
Si observamos juntos la tabla de Usuarios, conseguiremos un nombre de usuario correspondiente al administrador y una contraseña cifrada. La consulta para alcanzar este objetivo se muestra de la siguiente manera:
Para conseguir la clave a partir del hash, empleamos CrackStation en vez de utilizar herramientas en el equipo, logrando así adquirir la contraseña de forma veloz.
Obtenemos las credenciales del usuario admin: admin:transorbital1
Accedemos a la zona de administración con estas credenciales y vemos lo siguiente.
Una vez que hemos iniciado sesión, observamos en la parte de abajo un mensaje que indica "El archivo no existe", dando la impresión de que busca un archivo. Esto nos lleva a creer que la página está intentando obtener un archivo y mostrarlo. A través de prueba y error, podemos descubrir una vulnerabilidad LFI al incluir un parámetro de archivo. Simplemente incluimos ?file= en la barra de URL.
Básicamente, todos los usuarios que vimos anteriormente tienen acceso a la máquina y las contraseñas que obtuvimos podrían permitirnos ingresar a la máquina, pero del informe nmap sabemos que el puerto SSH está siendo filtrado, esto podría significar que está restringido por IP tal vez o estamos lidiando con un "port knocking". Aprovechando el LFI, intentamos leer un archivo knockd.conf si estaba disponible y pudimos obtener información de dicho archivo.
Estupendo, ahora todo lo que tenemos que hacer es eliminar la secuencia de puertos que se muestran desde el archivo utilizando nmap. La llamada de puerto con nmap usando esos números de puerto se puede lograr con el siguiente comando:
Volvemos a escanear los servicios de esta máquina.
Ya está abierto el puerto 22 en la máquina DC-9.
Ahora el siguiente paso podría realizar un ataque de fuerza bruta sobre el puerto 22 (SSH) para determinar que usuario está en el sistema y su contraseña. ¿Como extraemos estos nombres de usuario? Recordamos que durante la explotación de la base de datos, utilizamos consultas de MySQL para ir extrayendo información. Pues ahora igual, debemos construir una consulta que nos devuelva únicamente nombres de usuario y contraseña de forma concatenada.
Copiamos esta línea en un documento de texto, y extraemos de ella una lista de nombre de usuarios y otra de contraseñas.
Ahora que tenemos las dos listas, con hydra vamos a realizar el ataque de fuerza bruta de la siguiente manera:
Había tres credenciales válidas que funcionaban con SSH, así que simplemente usamos SSH como usuario de chandlerb.
En el directorio del usuario "chandler", no encontramos información interesante así que pivotamos a otros usuarios. Para ello, volvemos a utilizar las credenciales encontradas durante la fuerza bruta.
Enumeramos dentro del directorio de este usuario.
Encontramos nuevas contraseñas. Vamos a añadirlas al archivo de passwords que generamos anteriormente y volvemos a ejecutar hydra.
Obtenemos unas credenciales nuevas para el usuario "fredf". Vamos a iniciar sesión con estas credenciales.
Enumerando en el directorio del usuario "fredf" encontramos la flag local.txt.
Una vez que hayamos iniciado sesión como fredf, podemos verificar si tiene algún permiso de sudo usando el comando sudo -l
.
Nos dirigimos juntos a la ubicación donde observamos que se encuentra almacenada el archivo test.py. Al examinarlo con más atención, nos damos cuenta de que se trata de un programa sencillo para añadir datos. Aceptará dos archivos como parámetros y luego agregará el contenido del primer archivo dentro del segundo archivo.
¿Cómo podemos utilizar este archivo?
Crearemos un nuevo usuario con acceso de root y añadiremos la entrada del usuario en el archivo /etc/passwd utilizando el script test.py. Crearemos un usuario y su hash de contraseña. Llevaremos a cabo esta tarea usando openssl. Aquí, crearemos un usuario llamado securiters con la contraseña securiters. Una vez obtenido nuestro hash, pasaremos a la máquina objetivo.
Añadimos el nombre de usuario, seguido de dos puntos (:) y ":0:0::" para crear una entrada que podría funcionar como usuario "root". Luego, empleamos el comando echo para generar un archivo llamado "securiters" en el directorio /tmp. Posteriormente, utilizamos el script test.py que descubrimos antes con el archivo "securiters" e incluimos el hash del usuario que acabamos de crear dentro del archivo /etc/passwd. Después de eso, iniciamos sesión como el usuario securiters que hemos creado. Ingresamos la contraseña y obtenemos acceso de root en la máquina.
Ya tenemos privilegios máximos dentro de la máquina objetivo. Ahora a por la flag proof.txt para finalizar la resolución.