web-dev-qa-db-fra.com

Pourquoi mon adresse IP interne (privée) est-elle visible depuis Internet?

Lorsque je visite certains sites Web comme http://www.monip.org ou http://ip-api.com , j'obtiens le résultat suivant:

Your current IP Address
 - IP:    197.158.x.x
 - Internal IP:    192.168.x.x

Je comprends que je peux voir mon adresse IP publique (197.158.x.x). Ce que je ne peux pas comprendre, c'est que comment se fait-il que mon adresse IP interne soit visible sur Internet ?

Ces sites Web ne semblent pas utiliser un plugin Flash , Java ou autres scripts. Mon FAI exécute un NAT de mon adresse IP interne pour accéder à Internet:

3G Wireless Modem [192.168.x.x] -------- ISP [NAT to 197.158.x.x] ------- Internet

Alors, comment est-il possible pour un site Web de voir mon adresse IP interne?

128

La source la plus probable de ces informations est l'implémentation WebRTC de votre navigateur.

Vous pouvez le voir dans le code source de ip-api.com.

De https://github.com/diafygi/webrtc-ips , qui fournit également une démonstration de cette technique:

Firefox et Chrome ont implémenté WebRTC qui permet de faire des requêtes aux serveurs STUN qui renverront les adresses IP locales et publiques Ces résultats de demande sont disponibles en javascript, vous pouvez donc obtenir les adresses IP locales et publiques d'un utilisateur en javascript.

Il a récemment été noté que le New York Times utilisait cette technique pour aider à distinguer les vrais visiteurs des robots (c'est-à-dire que si l'API WebRTC est disponible et renvoie des informations valides, il s'agit probablement d'un vrai navigateur).

Il existe quelques Chromeextensions qui prétendent bloquer cette API, mais ils ne semblent pas être efficaces pour le moment. C'est peut-être parce qu'il n'y a pas encore de hooks dans le navigateur, car GitHub README fait allusion à:

En outre, ces demandes STUN sont effectuées en dehors de la procédure XMLHttpRequest normale, de sorte qu'elles ne sont pas visibles dans la console du développeur ou ne peuvent pas être bloquées par des plugins tels que AdBlockPlus ou Ghostery.

112
Christopher

Une méthode courante pour obtenir l'adresse IP interne consiste à utiliser RTCPeerConnection en JavaScript.

http://ip-api.com/ par exemple, appelle une fonction javascript nommée "gi" qui contient le code suivant:

...
 o = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection,
...

Techniquement, cela se fait en définissant un rappel sur la connexion RTC (objet o) avec "onicecandidate" et en obtenant l'attribut candidate.candidate de l'événement. Cela répertoriera toutes les adresses IP locales de vos interfaces réseau.

Jetez un œil à Module: Get Internal IP WebRTC.

Le script JavaScript peut renvoyer ces informations à un serveur Internet, mais http://ip-api.com/ , par exemple, les affiche simplement au client.

47
r00t

WebRTC n'est qu'une des nombreuses façons dont les adresses IP LAN peuvent être découvertes.

Il y a eu une conférence Nice Black Hat 2012 sur ce sujet, intitulée Blended Threats and JavaScript: A Plan For Permanent Network Compromise , dans laquelle Phil Purviance and Josh Brashars a présenté une méthode automatisée pour trouver et effacer votre routeur wifi domestique en un seul clic sur un site Web.

Blended Threats and JavaScript

Ce WebRTC était antérieur, ils ont donc dû découvrir l'adresse IP de votre routeur d'une autre manière. Cela peut être fait avec des scanners JavaScript comme jslanscanner , JSScan , JS-Recon , mais une simple (mais grande) collection d'objets intégrés qui se contente de devinez l'adresse du routeur (par exemple en incorporant une image de routeur attendue et en notant quand elle se charge avec succès). Une fois que vous avez l'adresse, vous pouvez deviner le mot de passe (en commençant par la valeur par défaut attendue) en utilisant RouterPasswords.com ou même en contournant l'authentification via Routerpwn.com .

À titre de preuve de concept, leur démonstration a découvert l'IP du routeur, a recherché son mot de passe par défaut, s'est connectée et a installé automatiquement le firmware de remplacement (DD-WRT). Une véritable attaque pourrait avoir un certain nombre de capacités malveillantes sur le nouveau micrologiciel et pourrait facilement le faire apparaître comme le système de routeur d'origine non modifié.

(Certes, cela identifie l'adresse IP LAN de votre routeur wifi domestique plutôt que votre adresse IP LAN locale, mais c'est assez proche et sans doute plus alarmant.)

23
Adam Katz

Très probablement, votre navigateur (ou votre FAI) envoie un en-tête X-Forwarded-For qui révèle votre adresse IP interne. Vérifiez un site comme celui-ci pour voir quels en-têtes vous envoyez.

6
Mark

Le premier de vos deux liens n'a pas fonctionné pour moi mais le second a fonctionné. En consultant le code JavaScript du deuxième lien, j'ai constaté qu'il utilise window.RTCPeerConnection.

Tous les navigateurs ne prennent pas en charge RTCPeerConnection, mais dans ceux qui le font, ils peuvent être utilisés pour identifier les adresses IP locales du navigateur. Cette réponse sur Stack Overflow donne un exemple de la façon dont l'API asynchrone de RTCPeerConnection peut être utilisée pour trouver une adresse IP locale.

3
kasperd

Il est probable que le site héberge du JavaScript qui s'exécute sur votre machine et détermine votre adresse interne et l'affiche à l'écran.

Le serveur distant ne verra pas votre adresse interne et il est peu probable qu'il soit transféré dans un en-tête HTTP.

1
kevino_17

Le protocole TCP/IP sous-jacent ne divulguera pas votre adresse interne - il n'est pas utilisé pour le routage sur Internet public et n'est pas capturé/stocké dans les paquets de protocole eux-mêmes à la couche 3 car les paquets sont créés par votre routeur de périmètre . N'importe quel nombre de services ou de clients que vous exécutez peut le divulguer dans la couche 7 dans les en-têtes, les bannières de service, etc.

La manière définitive de découvrir ce qui fuit ces informations consiste à utiliser un programme de vidage du trafic réseau sur votre réseau interne (comme wirehark ou tcpdump) et de vérifier le contenu des paquets à la couche 7, c'est-à-dire la charge utile des données, et si l'adresse interne n'est pas étant enregistré quelque part dans la charge utile des données par votre client, il proviendra probablement de votre routeur de périmètre (bien que cela soit peu probable) et vous devrez capturer le trafic réseau du côté Internet du routeur quelque part pour voir comment cela se produit.

1
David Scholefield