Ce serveur Gitlab sera éteint le 30 juin 2020, pensez à migrer vos projets vers les serveurs gitlab-research.centralesupelec.fr et gitlab-student.centralesupelec.fr !

dns_rebinding.md 4.1 KB
Newer Older
Sami Tabet's avatar
Sami Tabet committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
Du coup dans notre bail de package infecté on pourrait avoir un package JS client malveillant qui quand il est sur un site web monsite.fr:

- du DNS rebinding pour pouvoir scanner des serveurs open en ""local"" de la personne qui va sur monsite.fr
- du DNS rebinding pour pouvoir envoyer les résultat à notre serveur à nous

---

Détail du workflow:

Browser demande `monsite.fr`:
- Envoie une requête DNS à un serveur DNS que nous devons contrôler
- Ce serveur DNS répond avec la bonne IP pour `monsite.fr` mais avec un TTL court
- Le browser envoie sa requête GET pour récupérer la page de `monsite.fr` (avec notre code malicieux à l'intérieur).

Notre script malicieux va ensuite:
- requêter une ressource de `monsite.fr` (page, web, API, whatever)
- cela va re-trigger une resolution DNS grâce au TTL court précédent.
- Notre serveur DNS pourra alors répondre avec une IP qui pointe en fait vers **autre chose**:
- - `127.0.0.1` si nous voulons récupérer des bails en local
- - `malicieux.nous` si nous voulons exfiltrer les données que nous avons collecté


Notes:
- Il faut contrôler un DNS "proche" de la victime (si elle utilise des DNS tels que ceux de google ou cloudflare ça marchera probablement pas), il faut que notre DNS soit le premier à recevoir la requête.
- Si nous voulons faire plusieurs requêtes (une pour collecter des données en local, et une autre pour nous les envoyer, il va falloir répondre avec un deuxième TTL court)
- On peut commencer par juste essayer de nous envoyer (à `malicieux.nous`) les cookies / local storage du browser sans chercher à faire des requêtes en local et itérer à partir de ça.

---

je sais pas trop comment on peut se découper ça / si vous avez le temps de travailler pendant les vacances mais en tâches y'a ça je pense:

- Setup un mini serveur DNS qui répond toujours avec un TTL court (ça devrait suffir pour notre usecase je suppose mais si ça marche pas on peut en créer un nous même en utilisant des libs en python / go, genre: https://github.com/miekg/dns, https://github.com/rthalley/dnspython)
- Réussir à faire des requêtes depuis du JS vers des domaines interdits en utilisant le serveur DNS précédent.
- Faire une mini lib malicieuse à partir du système de requêtes précedents.
- Faire une mini lib JS legit (on peut reprendre le bail d'emojis de julien) et setup un repo public où elle ne contient pas la lib malicieuse + un repo privé avec la lib malicieuse, avec un code minifié de la lib qui contient la lib malicieuse.
- Tester sur un site que l'on contrôle 
Sami Tabet's avatar
Sami Tabet committed
37 38 39 40 41 42

--- 

Problèmes qu'on peut rencontrer:
- Content Security Policy (c'est le cas sur github par exemple)
- Cache DNS du navigateur qu'il faut réussir à flush plus ou moins rapidement (il y a 2 techniques décrites dans [le wiki de rebind.it](https://github.com/nccgroup/singularity))
Sami Tabet's avatar
Sami Tabet committed
43
- HTTPS: si on est sur un site en HTTPs on ne peut query que du HTTPs (sinon on a une mixed content error), il faudrait donc vérifier que le DNS rebinding fonctionne avec du HTTPs
Sami Tabet's avatar
Sami Tabet committed
44 45 46 47 48 49 50 51 52 53 54 55 56

---

Différentes entités:

- La cible dans l'environnement local de la victime (par exemple un ES qui tourne sur la machine de la victime ou sur un autre host local).
- La victime et son browser
- Le site internet contaminé qui contiendra notre librairie minifiée avec le code du DNS rebinding intégré.
- Notre serveur (DNS + Legit API + API malicieuse pour changer la résolution DNS):
- - Notre librairie JS sera en fait un wrapper autour de l'API legit de ce serveur, ce qui permettra d'assurer le fait que les CSP ne soient pas un problème lors du DNS rebinding
- - L'API malicieuse permettra de changer la résolution DNS depuis la victime (par exemple si on veut accéder à 127.0.0.1:8080 en passant par le NDD `api.notresite.fr` on aura juste à faire une requête POST sur /secret-api/dns avec ces paramètres et la prochaine résolution DNS pour `api.notresite.fr` venant de l'IP de la victime ayant fait la précédente requête POST retournera 128.0.0.1)
- - Le serveur DNS sera entièrement contrôlé par l'API malicieuse
- Le responsable du NDD pour notre serveur qui devra redirigé les requêtes DNS vers notre DNS.