Una de las mejores maneras de aprender a hackear aplicaciones web es practicar con la tienda Juice Shop, una app web vulnerable, que imita algunas de las vulnerabilidades más habituales que se reflejan en el top 10 OWASP.

Ya vimos en su día cómo instalar OWASP Juice Shop en local mediante Docker, para practicar tranquilamente y sin problemas.

Juice Shop tiene una serie de desafíos con diversas dificultades, que se valoran desde 1 estrella (los más sencillos) hasta 6 estrellas (los más difíciles).

Algunos de esos desafíos también incluyen tutoriales para aprender. Así que aquí vamos a ver cómo resolver esos desafíos de 1 estrella y en siguientes artículos iremos solventando el resto.

Iniciamos Juice Shop, como elegimos la opción de instalar mediante Docker, ejecutamos.

sudo docker run -d -p 3000:3000 bkimminich/juice-shop

Accedemos después a:

http://127.0.0.1:3000

1. Encontrar la página de puntuación «Score Board» en Juice Shop

El primero de los desafíos es encontrar la página de tablero de puntuación, en la que aparecen los desafíos y que va teniendo en cuenta qué desafíos hemos completado y cuáles no.

Esa página está oculta y de momento voy a usar Chrome en lugar de Firefox, porque es lo que tengo ahora mismo disponible en la máquina en la que instalé Juice Shop.

De paso, eso me sirve para practicar fuera de Firefox, por si en alguna situación no podemos acceder a él y solo disponemos del navegador de Google.

Lo más sencillo para resolver este desafío es buscar la dirección oculta en Google, pero imaginemos que no podemos hacerlo.

En ese caso, es hora de revisar posibles enlaces hacia la página «Score Board» que haya en el código de las páginas a las que sí podemos acceder.

El código fuente de la página principal no da pistas si lo analizamos, de modo que nada por ahí.

Así pues, nos vamos a las herramientas de desarrollador de Chrome pulsando Ctrl-Shift-I, o bien accedemos mediante el menú de opciones de Chrome (los tres puntos verticales de la parte superior derecha y, en lo que se despliega, elegimos Más herramientas > Herramientas para desarrolladores).

Allí se nos abren varias opciones y la que queremos es la pestaña «Sources», si pinchamos en ella, vemos los archivos que podemos examinar, porque son los que ha cargado la página y a los que se refiere en su código.

Ahora hay que ir buscando por los archivos, usando la palabra clave «score», que asumimos que debe corresponder a la página que buscamos.

La respuesta está en el archivo javascript principal llamado main-es2018.js.

Si lo examinamos y buscamos «score» en el código (pulsando Ctrl-f y poniendo la palabra que queremos), vamos por las distintas ocurrencias de score hasta que vemos una interesante que pone:

 }, {
     path: "score-board",
     component: Jn
}, {

Observemos la imagen de abajo para hacernos una composición de lugar:

Encontrando la página score board de Juice Shop

Ahí vemos una ruta score-board y, teniendo en cuenta cómo construye las páginas esta aplicación web, la solución sería:

http://localhost/#/score-board

Este archivo javascript nos va a servir para buscar más cosas en desafíos futuros.

En la página score-board aparecen los distintos desafíos, podemos filtrar por dificultad, por tipo de vulnerabilidad, etc.

Hay 12 desafíos de 1 estrella, ya hemos resuelto el primero y nos avisa de ello, sigamos con los más fáciles.

Bully Chatbot - Intimidar al chatbot

Este desafío nos pide conseguir un cupón del chatbot de soporte y no hay que hacer nada especial para cumplirlo.

Lo primero es registrar un usuario en la tienda con los datos que sean e identificarnos con él.

Así, nos aparecen más opciones en el menú de la izquierda, una de ellas es «Support chat».

Opciones de Juice Shop

Pidiendo un cupón por favor con «give me a coupon, please» me lo da sin problemas y aparece como desafío resuelto. Una vez obtenido uno parece que ya no da más.

Leer la política de privacidad

Este es otro de los desafíos más sencillos que no requiere técnicas o herramientas especiales.

Si activamos de nuevo el menú de opciones vemos un encabezado llamado «Privacy & Security». Si lo desplegamos haciendo clic ahí, la primera opción que aparece es «Privacy Policy», accedemos a ella y conseguido.

Leer la política de privacidad

Poner una calificación de 0 estrellas en el feedback de la tienda

Aquí ya requerimos herramientas especiales. La más común y recomendada es Burp, con la que podremos interceptar las peticiones al servidor y sus respuestas, manipulando al vuelo dichas peticiones, medrando con los datos que mandamos y saltando posibles restricciones.

Eso es lo que tenemos que hacer en este caso.

Para ello, como ahora mismo no tengo instalado Burp, voy a usar una herramienta con muchas menos opciones, pero que me saca del apuro y me sirve para solventar este desafío y algún otro.

Se trata de la extensión para Chrome Tamper Dev. La instalo desde la tienda Chrome pinchando en el enlace anterior y ya puedo usarla.

Lo primero es ir a la sección de Feedback de la tienda Juice Shop eligiendo en el menú la opción: «Customer Feedback».

Ahí vemos un formulario y el apartado «Rating» es el que tenemos que enviar con un valor de cero, pero la aplicación solo permite un mínimo de 1 estrella.

Formulario de Feedback

Eso significa que:

  • Debo rellenar lo que sea en los apartados que me pide y dar un rating con el número que me dé la gana, pero aún no enviamos nada.
  • Activar Burp, o en este caso Tamper Dev, para que intercepte la petición al servidor.
  • Le doy a «Submit» en la página de «Feedback» para enviar esa petición, pero quedará interceptada por Burp o Tamper, mostrando los datos que envía y dando la posibilidad de cambiarlos antes de dar paso a la petición hasta el servidor.

En el caso de Tamper Dev, pulso en la extensión y la activo pulsando en «Intercept Requests».

Activando Tamper Dev

Con la intercepción activada, pulso el botón Submit en el formulario de Feedback. La página de la tienda parece no hacer nada ni dar respuesta, porque la petición está atrapada en Tamper Dev (o Burp) esperando a darle el visto bueno, examinar los datos o cambiarlos.

Petición interceptada

Si pulso en esa intercepción, puedo ver los datos de la petición.

En el apartado «Request Body» aparece lo que quiero.

Si me fijo, el dato final que envía es “rating”:1 que corresponde al número de estrellas que pongo.

Si hago clic ahí, puedo borrar ese 1 y cambiarlo por un 0.

Petición sin modificar

Hago eso y pulso en el botón amarillo con la flecha negra para que envíe mi petición modificada al servidor.

Me da las gracias por el feedback y me avisa de que he cumplido el desafío de cero estrellas.

Registro Repetitivo (Repetitive Registration) en Juice Shop

Otro desafío sencillo, ya que estamos con Tamper Dev, es el que nos pide seguir el principio DRY a la hora de registrar un usuario nuevo.

DRY son las siglas de Don’t Repeat Yourself. Cuando registramos un usuario en la tienda, nos pide una contraseña y, a continuación, nos pide repetirla para asegurarnos de que la hemos puesto bien.

Para superar esto, debemos enviar datos de registro de un nuevo usuario con una contraseña y en el campo de repetirla, poner otra distinta.

Sin embargo, la aplicación, obviamente, no nos deja hacer eso a las bravas, comprueba que ambas sean idénticas antes de enviar todo y, si no es así, nos pide corregir el error y no manda la petición.

De nuevo, la técnica es similar al desafío anterior. Ponemos lo que la aplicación nos deja (en este caso, dos contraseñas iguales), interceptamos la petición y cambiamos al vuelo el parámetro de contraseña repetida para que sea diferente.

Así pues:

  • Hacemos logout si es que estamos identificados como usuario.
  • Nos vamos a registrar un usuario nuevo en el apartado de «login», donde pone «Not yet a customer?».
  • Rellenamos los datos y ponemos dos contraseñas iguales para que nos permita enviar la petición pero, antes de hacer eso, volvemos a conectar Burp o Tamper para medrar con los datos que enviamos.
  • Ahora sí, le damos al botón «Register».
  • Nos vamos a Tamper (o Burp) para ver la petición que ha interceptado.
  • En el apartado de «Request body» vemos el parámetro «passwordRepeat» que tiene el mismo valor que el que hay antes de él y que se llama «password».
  • Cambiamos lo que hay entre comillas tras «passwordRepeat» y ponemos otra cosa.
  • Le damos al botón de enviar la petición y ya tenemos otro desafío resuelto.

Alterando la contraseña