
Exfiltrer subrepticement des données du navigateur via DNS
Browsertunnel est un outil permettant d'exfiltrer des données depuis le navigateur via le protocole DNS. Il y parvient en abusant de dns-prefetch, une fonctionnalité conçue pour réduire la latence perçue des sites web en effectuant des résolutions DNS en arrière-plan pour des domaines spécifiés. Le trafic DNS n'apparaît pas dans les outils de débogage du navigateur, n'est pas bloqué par la Content Security Policy (CSP) d'une page, et est souvent ignoré par les pare-feu ou proxys d'entreprise, ce qui en fait un vecteur idéal pour faire transiter furtivement des données dans des scénarios contraints.
C'est une technique ancienne — le tunneling DNS lui-même remonte aux années 90, et Patrick Vananti a écrit sur l'utilisation de dns-prefetch à cette fin en 2016, mais à ma connaissance, browsertunnel est le premier client/serveur open source prêt pour la production qui en fait la démonstration. Comme dns-prefetch ne renvoie aucune donnée au JavaScript client, la communication via browsertunnel est uniquement unidirectionnelle. De plus, certains navigateurs désactivent dns-prefetch par défaut, et dans ce cas, browsertunnel échoue silencieusement.
Le projet se compose de deux parties :
html/, qui encode et envoie les messages côté client.Browsertunnel peut envoyer des chaînes de caractères arbitraires via DNS en encodant la chaîne dans un sous-domaine, qui est transmis au serveur browsertunnel lorsque le navigateur tente de résoudre récursivement le domaine.
Les messages plus longs qui ne tiennent pas dans un seul domaine (253 octets) sont automatiquement divisés en plusieurs requêtes, qui sont réassemblées et décodées par le serveur.
Commencez par configurer des enregistrements DNS pour déléguer un sous-domaine à votre serveur. Par exemple, si l'IP de votre serveur est 192.0.2.123 et que vous souhaitez tunneliser via le sous-domaine t1.example.com, alors votre configuration DNS ressemblera à ceci :
t1 IN NS t1ns.example.com.
t1ns IN A 192.0.2.123
Sur votre serveur, installez browsertunnel à l'aide de go get. Sinon, compilez browsertunnel sur votre propre machine et copiez le binaire sur votre serveur.
go get github.com/veggiedefender/browsertunnel
Ensuite, exécutez browsertunnel en spécifiant le sous-domaine à tunneliser.
browsertunnel t1.example.com
Pour l'utilisation complète, exécutez browsertunnel -help :
$ browsertunnel -help
Usage of browsertunnel:
-deletionInterval int
seconds in between checks for expired messages (default 5)
-expiration int
seconds an incomplete message is retained before it is deleted (default 60)
-maxMessageSize int
maximum encoded size (in bytes) of a message (default 5000)
-port int
port to run on (default 53)
Pour des descriptions détaillées et la justification de ces paramètres, vous pouvez également consulter la godoc.
Enfin, testez votre tunnel ! Vous pouvez utiliser ma page de démonstration ici ou cloner ce dépôt et charger html/index.html localement. Si tout fonctionne, vous devriez voir les messages s'afficher dans la sortie standard (stdout).
Pour des applications réelles de ce projet, vous voudrez peut-être forker et adapter le code selon vos besoins. Quelques pistes :