Si nuestra aplicación web admite la subida de archivos, es importante controlarlos mediante diferentes tipos de filtro. En este caso vamos a ver el "client-side filter" que es un filtro que se coloca en el front-end del usuario y que controla el correcto ingreso de los archivos.
Vamos a ver, tambien, que es muy facil de vulnerar, con los conocimientos adecuados.
Para este ejercicio contamos con una página que nos permite seleccionar un archivo y subirlo. Vamos a intentar encontrar el client-side filter y tratar de pasarlo (es decir, hacer un bypass).
Utilizamos la herramienta gobuster, que nos permite enumerar los directorios pertenecientes a la url en cuestión.
Le agregamos un modificador de tiempo de delay (para no sobrecargar el servidor).
Mientras se realiza el escaneo podemos observar el codigo fuente.
No hace falta tener conocimientos avanzados de HTML, simplemente saber leer e identificar los potenciales scripts que ejecutan el filtro.
En este caso no es dificil, el filtro es un script en java llamado "client-side-filter.js"
Una vez abierto podemos ver su contenido.
De vuelta, no es importante conocer en este caso java, sino simplemente tratar de entender como se aplica el filtro, es decir, que archivos son permitidos.
Por lo pronto podemos ver que los archivos aceptados son aquellos que terminan en PNG.
Gobuster terminó y nos engrega los directorios posibles. Es probable que las imagenes se suban a la carpeta /images.
Es importante identificarla porque desde allí ejecutaremos nuestre shell reversa.
Están allí.
Por lo pronto sabemos que las imagenes se suben a esta carpeta.
Que el filtro se encuentra escrito en java.
Una vez en esta posición tenemos dos caminos para hacer un bypass al client-side filter.
El primero consiste en interceptar la página con Burp Suite, eliminar el filtro del cliente (es decir el script en java que encontramos), subir la shell (con su extensión .php) y ejecutarla.
El segundo camino, que es el que tomaremos aquí, es subir la shell con el formato cambiado para que pase el filtro e interceptar su salida luego.
Veamos como se hace.
Utilizamos una shell, en este caso yo utilicé la php-reverse-shell de Pentest Monkey.
Es importante, al utilizar una shell reversa, colocar la ip de nuestra maquina y el puerto por el que queremos escuchar la conexión.
Seleccionamos la imagen y, antes de subirla, le pedimos a Burp que intercepte la página.
Al final nos vamos a encontrar con esto, podemos ver el "filename" y el "content-type".
El filtro, en este caso, se guia por el final del archivo y no por los magic numbers (eso suele ser utilizado por los servidores).
Renombramos el archivo como php (para poder ser ejecutado) y cambiamos el tipo de contenido a "text/x-php".
Lo enviamos.
Revisamos la carpeta /images y vemos que la Shell ha sido subida.
Ahora debemos ejecutarla y recibir la comunicación.
Abrimos netcat y ponemos a escuchar en el puerto que colocamos en la shell.
Fe de erratas: el comando es nc -lvnp <PUERTO>
Ejecutamos la shell desde esta página.
Netcat recibe la comunicación de la shell y solo nos queda navegar al directorio donde se encuentra la bandera.
Es importante destacar que los client-side filters deben estar acompañados de un server-side filters, es decir, filtros en el servidor mismo para evitar estos bypas.
Esos sistemas son más complicados y, en combinación con estos, otorgan una seguridad alta frente a ataques de estas características.
NOTA: Todas estas pruebas fueron realizado en la página TryHackMe, un sitio que ofrece entornos controlados para practicar pentesting..
Estos procedimientos no deben realizarse a equipos ajenos sin una previa autorización.