# Lab 4: Browser security Introducción ------------ Este laboratorio te presentará ataques basados en el navegador, así como la manera de prevenirlos. El laboratorio tiene varias partes: * Parte 1: ataque de cross-site scripting * Parte 2: ataque de canal lateral y phishing * Parte 3: un gusano de perfil Cada parte incluye varios ejercicios que te ayudan a construir un ataque. Todos los ataques implicarán explotar debilidades en el sitio de zoobar, pero son representativos de las debilidades que se encuentran en sitios web reales. Configuración de la red ------------- Para este laboratorio, elaborarás ataques en tu navegador web que explotan vulnerabilidades en la aplicación web de zoobar. Para asegurarnos de que tus exploits funcionen en nuestras máquinas cuando califiquemos tu laboratorio, debemos acordar la URL que hace referencia al sitio web de zoobar. Para los fines de este laboratorio, tu sitio web de zoobar debe estar ejecutándose en http://localhost:8080/. Si has estado usando la dirección IP de tu VM, como http://192.168.177.128:8080/, no funcionará en este laboratorio. Si estás usando KVM o VirtualBox, las instrucciones que proporcionamos en el laboratorio 1 ya garantizan que el puerto 8080 en localhost se reenvíe al puerto 8080 en la máquina virtual. Si estás usando VMware, utilizaremos la función de reenvío de puertos de ssh para exponer el puerto 8080 de tu VM como http://localhost:8080/. Primero encuentra la dirección IP de tu VM. Para hacerlo, inicia sesión como root en la consola, ejecuta `ip addr show dev eth0`, y anota la dirección IP que aparece junto a inet. (Esta es la misma dirección IP que has estado usando en los laboratorios anteriores). Luego configura el reenvío de puertos SSH de la siguiente manera (lo cual depende de tu cliente SSH): Para usuarios de Mac y Linux: abre una terminal *en tu máquina* (no en tu VM) y ejecuta ``` $ ssh -L localhost:8080:localhost:8080 student@VM-IP-ADDRESS student@VM-IP-ADDRESS's password: 6858 ``` Para usuarios de Windows, esta debería ser una opción en tu cliente SSH. En [PuTTY](https://www.chiark.greenend.org.uk/~sgtatham/putty/download.html), sigue estas [instrucciones](https://web.archive.org/web/20140811071925/http://www.cs.uu.nl/technical/services/ssh/putty/puttyfw.html). Usa 8080 como puerto de origen y localhost:8080 como puerto remoto. El reenvío permanecerá activo mientras la conexión SSH esté abierta. Navegador web ----------- En este laboratorio, te recomendamos usar la versión actual del navegador [Mozilla Firefox](https://www.mozilla.com/firefox/) para desarrollar tus ataques. Existen diferencias sutiles (y no tan sutiles) en la forma en que distintos navegadores manejan HTML, JavaScript y cookies, y algunos ataques que funcionan en Internet Explorer o Chrome (por ejemplo) pueden no funcionar en Firefox, y viceversa. Sugerimos Firefox porque está ampliamente disponible y puede ejecutarse en una variedad de sistemas operativos. Si tienes una extensión de bloqueo de anuncios en tu navegador web, como uBlock, puede que quieras desactivarla para evitar que interfiera con los ataques que desarrollarás en este laboratorio. Configuración del servidor web ------------------------- Antes de comenzar a trabajar en estos ejercicios, por favor usa Git para hacer commit de tus soluciones del Laboratorio 3, obtén la versión más reciente del repositorio del curso y luego crea una rama local llamada lab4 basada en nuestra rama lab4, `origin/lab4`. No fusionar tus soluciones de los laboratorios 2 y 3 en el laboratorio 4. Estos son los comandos de shell: ``` student@vm-6858:~$ cd lab student@vm-6858:~/lab$ git commit -am 'my solution to lab3' [lab3 c54dd4d] my solution to lab3 1 files changed, 1 insertions(+), 0 deletions(-) student@vm-6858:~/lab$ git pull Already up-to-date. student@vm-6858:~/lab$ git checkout -b lab4 origin/lab4 Branch lab4 set up to track remote branch lab4 from origin. Switched to a new branch 'lab4' student@vm-6858:~/lab$ make ... ``` Ten en cuenta que el código fuente del laboratorio 4 se basa en el servidor web inicial del laboratorio 1. No incluye separación de privilegios ni perfiles de Python. Ahora puedes iniciar el servidor web `zookws` de la siguiente manera. ``` student@vm-6858:~/lab$ ./zookd 8080 ``` Abre tu navegador y ve a la URL `http://localhost:8080/`. Deberías ver la aplicación web de zoobar. Si no la ves, regresa y verifica nuevamente tus pasos. Si no logras que el servidor web funcione, ponte en contacto con el personal del curso antes de continuar. Elaboración de ataques ---------------- Crearás una serie de ataques contra el sitio web `zoobar` con el que has trabajado en laboratorios anteriores. Estos ataques explotan vulnerabilidades en el diseño y la implementación de la aplicación web. Cada ataque presenta un escenario distinto con objetivos y restricciones únicos, aunque en algunos casos podrías reutilizar partes de tu código. Ejecutaremos tus ataques después de limpiar la base de datos de usuarios registrados (excepto el usuario llamado "attacker"), así que no asumas la presencia de otros usuarios en tus ataques enviados. Puedes ejecutar nuestras pruebas con `make check`; esto ejecutará tus ataques contra el servidor y te dirá si tus exploits están funcionando correctamente. Como en laboratorios anteriores, ten en cuenta que las verificaciones realizadas por `make check` no son exhaustivas, especialmente respecto a condiciones de carrera. Podrías querer ejecutar las pruebas varias veces para convencerte de que tus exploits son robustos. Los ejercicios 5, 13 y 14 requieren que el sitio mostrado se vea de cierta manera. El script `make check` no es lo suficientemente inteligente como para comparar cómo se ve el sitio con y sin tu ataque, así que tendrás que hacer esa comparación tú mismo (y nosotros también, durante la calificación). Cuando `make check` se ejecuta, genera imágenes de referencia de cómo *se supone* que debe verse la página del ataque (`answer-XX.ref.png`) y de lo que tu página de ataque realmente muestra (`answer-XX.png`), y las coloca en el directorio `lab4-tests/`. Asegúrate de que tus capturas de pantalla `answer-XX.png` se parezcan a las imágenes de referencia en `answer-XX.ref.png`. Para ver estas imágenes desde `lab4-tests/`, cópialas a tu máquina local o ejecuta `python3 -m http.server 8080` y visualiza las imágenes visitando http://localhost:8080/lab4-tests/. *Ten en cuenta que http.server de Python cachea las respuestas*, así que deberías detenerlo y reiniciarlo después de ejecutar make check. Parte 1: un ataque de cross-site scripting (XSS) ------------------------------------------- La página de usuarios de zoobar tiene una falla que permite el robo de la cookie de un usuario autenticado desde su navegador, si un atacante logra engañar al usuario para que haga clic en una URL especialmente construida por el atacante. Tu trabajo es construir dicha URL. Un atacante podría enviar la URL por correo electrónico a la víctima, esperando que la víctima haga clic en ella. Un atacante real podría usar una cookie robada para hacerse pasar por la víctima. Desarrollarás el ataque en varios pasos. Para aprender la infraestructura necesaria para construir los ataques, primero realiza algunos ejercicios que te familiaricen con JavaScript, el DOM, etc. >Ejercicio 1: Imprimir la cookie. > >Las cookies son el mecanismo principal de HTTP para rastrear usuarios a través de las solicitudes. Si un >atacante logra obtener la cookie de otro usuario, puede >hacerse pasar completamente por ese otro usuario. Para este ejercicio, tu objetivo es simplemente imprimir >la cookie del usuario que ha iniciado sesión cuando accede a la página "Users". > > 1. Lee acerca de cómo se > [accede a las cookies desde JavaScript](https://developer.mozilla.org/en-US/docs/Web/API/document.cookie). > 2. Guarda una copia de `zoobar/templates/users.html` (necesitarás > restaurar esta versión original más adelante). Agrega una etiqueta `