
Démonstration du bogue Heartbleed CVE-2014-0160
Le bug Heartbleed est un exemple d'attaque cybernétique qui exploite une vulnérabilité dans la bibliothèque OpenSSL. En résumé, une étape de validation manquante dans la bibliothèque OpenSSL pourrait permettre à un pirate d'accéder à des informations sensibles sur un serveur qui utilise la bibliothèque vulnérable. Dans le cadre du protocole de prise de contact pour établir une connexion SSL entre un client et un serveur, un message heartbeat est envoyé par le client, qui est ensuite renvoyé par le serveur. Le client est également responsable de l'envoi de la longueur de son message heartbeat, que le serveur utilise pour déterminer le nombre d'octets de la mémoire qui doivent être renvoyés. Une valeur de longueur erronée, qui n'est pas validée par le serveur, peut l'amener à renvoyer des octets adjacents à l'emplacement mémoire où est stocké le message heartbeat du client.
Ce dépôt contient une démonstration de la façon dont le bug Heartbleed peut être exploité pour extraire des cookies de session d'un serveur web, permettant à un pirate d'accéder à la partie sécurisée et contrôlée par accès d'un site web.
Si vous êtes un instructeur enseignant des concepts de cybersécurité et de codage sécurisé, vous pouvez utiliser cet exemple pour offrir une expérience pratique avec le bug Heartbleed et démontrer la facilité avec laquelle des informations privilégiées peuvent être récupérées.
Si vous êtes un étudiant dans un cours de cybersécurité, ou un programmeur en herbe, il est instructif de comprendre comment des erreurs mineures dans le code peuvent conduire à de graves vulnérabilités de sécurité. Si vous étudiez actuellement l'attaque Heartbleed dans votre cours, vous pouvez acquérir une expérience pratique supplémentaire sur le fonctionnement de ces attaques et sur ce qui peut être fait pour les prévenir.
Cette démonstration est conçue à l'aide de trois conteneurs Docker, un pour le serveur, un pour le pirate et un pour la victime. Un simple site web basé sur Python Flask est hébergé sur le conteneur serveur et renvoie un message de bienvenue lors d'une connexion réussie. Le conteneur serveur exécute une version non patchée de la bibliothèque OpenSSL qui présente la vulnérabilité Heartbleed. Les conteneurs du pirate et de la victime fournissent une interface VNC vers une machine Ubuntu. Le conteneur du pirate contient également un script Python qui exploite le bug Heartbleed pour envoyer une longueur de message incorrecte pour un message heartbeat, et analyse les données renvoyées par le serveur pour rechercher des cookies de session. Des instructions sont fournies dans un document HTML sur le bureau du conteneur du pirate.
L'approche recommandée pour exécuter cet ensemble de conteneurs est via CHEESEHub, une plateforme web pour les démonstrations de cybersécurité. CHEESEHub fournit les ressources nécessaires pour orchestrer et exécuter des conteneurs à la demande. Pour configurer cette application afin de l'exécuter sur CHEESEHub, une spécification d'application doit être créée pour configurer l'image Docker à utiliser, les besoins en mémoire et CPU, ainsi que les ports à exposer pour chacun des trois conteneurs. La spécification JSON pour cette démonstration Heartbleed se trouve ici.
CHEESEHub utilise Kubernetes pour orchestrer ses conteneurs d'application. Vous pouvez également exécuter cette application sur votre propre installation Kubernetes. Pour des instructions sur la configuration d'un cluster Kubernetes minimal sur votre machine locale, reportez-vous à Minikube.
Avant de pouvoir exécuter l'application sur CHEESEHub ou Kubernetes, des images Docker doivent être construites pour les trois conteneurs d'application. Les définitions de conteneurs pour le pirate, la victime et le serveur se trouvent respectivement dans les répertoires heartbleed-hacker, heartbleed-victim et heartbleed-server. Pour construire ces conteneurs, exécutez :
cd heartbleed-hacker
docker build -t <tag d'image pirate de votre choix> .
cd heartbleed-victim
docker build -t <tag d'image victime de votre choix> .
cd heartbleed-server
docker build -t <tag d'image serveur de votre choix> .
Une fois les images Docker construites, vous pouvez exécuter les conteneurs en utilisant uniquement le moteur Docker.
docker run -d -p 80 <tag d'image pirate ci-dessus>
docker run -d -p 80 <tag d'image victime ci-dessus>
docker run -d <tag d'image serveur ci-dessus>
Étant donné que l'interface utilisateur des conteneurs du pirate et de la victime est l'interface VNC, nous exposons le port 80 pour qu'il soit accessible depuis la machine hôte. Comme nous n'accéderons au site web du serveur qu'à partir des conteneurs du pirate et de la victime, nous ne nous soucions pas de mapper les ports exposés du conteneur serveur.
En naviguant vers l'URL du conteneur du pirate dans votre navigateur, vous verrez une interface de bureau Linux. Double-cliquez sur le fichier Instructions.html sur le bureau pour consulter les instructions étape par étape pour suivre cette démonstration. Une nouvelle fenêtre de navigateur ou de terminal peut être lancée sur les conteneurs du pirate et de la victime en sélectionnant le menu des programmes en bas à gauche. L'adresse IP du serveur que le pirate et la victime utiliseront pour accéder au site web hébergé par le serveur peut être obtenue en démarrant une console sur le conteneur serveur à partir de la page de liste des conteneurs CHEESEHub.
Pour signaler des problèmes ou contribuer à des améliorations de cette application, ouvrez un problème GitHub.