
Laboratorio educativo basado en Docker que demuestra el error Heartbleed (CVE-2014-0160) con contenedores de hacker, víctima y servidor para explotación práctica y extracción de cookies de sesión.
El fallo Heartbleed es un ejemplo de un ataque de ciberseguridad que explota una vulnerabilidad en la biblioteca OpenSSL. Brevemente, un paso de validación faltante en la biblioteca OpenSSL podría permitir a un hacker acceder a información sensible en un servidor que esté utilizando la biblioteca vulnerable. Como parte del protocolo de handshake para establecer una conexión SSL entre un cliente y un servidor, se envía un mensaje heartbeat desde el cliente, que luego es retransmitido desde el servidor. El cliente también es responsable de enviar la longitud de su mensaje heartbeat, que el servidor utiliza para determinar la cantidad de bytes de memoria que deben devolverse. Un valor de longitud espurio, que no es validado por el servidor, puede hacer que este devuelva bytes adyacentes a la ubicación de memoria donde se almacena el mensaje heartbeat del cliente.
Este repositorio contiene una demostración de cómo se puede explotar el fallo Heartbleed para extraer cookies de sesión de un servidor web; permitiendo a un hacker acceder a la parte segura y controlada por acceso de un sitio web.
Si es instructor y enseña conceptos de ciberseguridad y codificación segura, puede usar este ejemplo para proporcionar experiencia práctica con el fallo Heartbleed y demostrar la facilidad con la que se puede recuperar información privilegiada.
Si es estudiante en una clase de ciberseguridad, o un programador en ciernes, es instructivo comprender cómo pequeños errores en el código pueden dar lugar a grandes vulnerabilidades de seguridad. Si actualmente está aprendiendo sobre el ataque Heartbleed en su clase, puede obtener más experiencia práctica sobre cómo operan estos ataques y qué se puede hacer para prevenirlos.
Esta demostración está diseñada utilizando tres contenedores Docker, uno para el servidor, el hacker y la víctima. En el contenedor del servidor se aloja un sitio web simple basado en Python Flask que devuelve un mensaje de bienvenida al iniciar sesión correctamente. El contenedor del servidor ejecuta una versión sin parches de la biblioteca OpenSSL que tiene la vulnerabilidad Heartbleed. Tanto el contenedor del hacker como el de la víctima proporcionan una interfaz VNC a una máquina Ubuntu. El contenedor del hacker también contiene un script en Python que explota el fallo Heartbleed para enviar una longitud de mensaje incorrecta para un mensaje heartbeat, y analiza los datos devueltos por el servidor en busca de cookies de sesión. Las instrucciones se proporcionan en un documento HTML en el escritorio del contenedor del hacker.
El enfoque recomendado para ejecutar este conjunto de contenedores es en CHEESEHub, una plataforma web para demostraciones de ciberseguridad. CHEESEHub proporciona los recursos necesarios para orquestar y ejecutar contenedores bajo demanda. Para configurar esta aplicación para que se ejecute en CHEESEHub, se debe crear una especificación de aplicación que configure la imagen Docker a utilizar, los requisitos de memoria y CPU, y los puertos a exponer para cada uno de los tres contenedores. La especificación JSON para esta demostración de Heartbleed se puede encontrar aquí.
CHEESEHub utiliza Kubernetes para orquestar sus contenedores de aplicación. También puede ejecutar esta aplicación en su propia instalación de Kubernetes. Para obtener instrucciones sobre cómo configurar un clúster mínimo de Kubernetes en su máquina local, consulte Minikube.
Antes de poder ejecutarse en CHEESEHub o Kubernetes, se deben construir las imágenes Docker para los tres contenedores de la aplicación. Las definiciones de los contenedores para el hacker, la víctima y el servidor se encuentran en los directorios heartbleed-hacker, heartbleed-victim y heartbleed-server respectivamente. Para construir estos contenedores, ejecute:
cd heartbleed-hacker
docker build -t <etiqueta de imagen del hacker de su elección> .
cd heartbleed-victim
docker build -t <etiqueta de imagen de la víctima de su elección> .
cd heartbleed-server
docker build -t <etiqueta de imagen del servidor de su elección> .
Una vez que se hayan construido las imágenes Docker, puede ejecutar los contenedores usando solo el motor Docker.
docker run -d -p 80 <etiqueta de imagen del hacker de arriba>
docker run -d -p 80 <etiqueta de imagen de la víctima de arriba>
docker run -d <etiqueta de imagen del servidor de arriba>
Dado que la interfaz orientada al usuario de los contenedores del hacker y la víctima es la interfaz VNC, exponemos el puerto 80 para que sea accesible desde la máquina host. Como solo accederemos al sitio web del servidor desde dentro de los contenedores del hacker y la víctima, no nos molestamos en mapear ninguno de los puertos expuestos del contenedor del servidor.
Al navegar a la URL del contenedor del hacker en su navegador, se le presentará una interfaz de escritorio Linux. Haga doble clic en el archivo Instructions.html en el escritorio para revisar las instrucciones paso a paso para seguir esta demostración. Se puede iniciar una nueva ventana del navegador o terminal en los contenedores del hacker y la víctima seleccionando el menú de programas en la esquina inferior izquierda. La dirección IP del servidor que el hacker y la víctima usarán para acceder al sitio web alojado en el servidor se puede obtener iniciando una consola en el contenedor del servidor desde la página de listado de contenedores de CHEESEHub.
Para informar problemas o contribuir con mejoras a esta aplicación, abra un issue en GitHub.