为什么我的内部 IP 地址(私有)从 Internet 可见?

信息安全 ip
2021-08-22 00:53:44

在访问http://www.monip.orghttp://ip-api.com等网站时,我得到以下结果:

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

我了解我可以看到我的公共 IP 地址 (197.158.xx)。我想不通的是,我的内部 IP 地址是如何通过 Internet 可见的

这些网站似乎没有使用Flash插件、Java 小程序或其他脚本。我的 ISP 正在对我的内部 IP 地址执行 NAT 以访问 Internet:

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

那么网站怎么可能看到我的内部 IP 地址呢?

4个回答

此信息最可能的来源是您的浏览器的WebRTC实现。

您可以在ip-api.com的源代码中看到这一点。

来自https://github.com/diafygi/webrtc-ips,它还提供了该技术的演示:

Firefox 和 Chrome 已经实现了 WebRTC,允许向 STUN 服务器发出请求,这些请求将为用户返回本地和公共 IP 地址这些请求结果可用于 javascript,因此您现在可以在 javascript 中获取用户的本地和公共 IP 地址。

最近有人注意到,纽约时报正在使用这种技术来帮助区分真实的访问者和机器人(即,如果 WebRTC API 可用并返回有效信息,那么它很可能是真正的浏览器)。

有几个Chrome 扩展程序声称阻止此 API,但目前它们似乎并不有效。这可能是因为浏览器中还没有钩子,正如 GitHub README 所暗示的那样:

此外,这些 STUN 请求是在正常的 XMLHttpRequest 过程之外发出的,因此它们在开发人员控制台中不可见,也不会被 AdBlockPlus 或 Ghostery 等插件阻止。

获取内部 IP 地址的常用方法是在 JavaScript 中使用 RTCPeerConnection。

例如, http: //ip-api.com/正在调用一个名为“gi”的 javascript 函数,其中包含以下代码:

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

从技术上讲,这是通过使用“onicecandidate”在 RTC 连接(对象 o)上设置回调并从事件中获取属性 Candidate.candidate 来完成的。这将列出网络接口的所有本地 IP 地址。

查看模块:获取内部 IP WebRTC

JavaScript 脚本可以将此信息发送回 Internet 服务器,但例如http://ip-api.com/只是将其显示给客户端。

WebRTC只是可以发现 LAN IP 地址的几种方法之一。

在 Black Hat 2012 上有一个关于这个主题的精彩演讲,名为Blended Threats and JavaScript: A Plan For Permanent Network Compromise,其中Phil PurvianceJosh Brashars提出了一种通过单击网站。

混合威胁和 JavaScript

这早于 WebRTC,因此他们必须以另一种方式发现您的路由器的 IP 地址。这可以使用jslanscannerJSScanJS-Recon等 JavaScript 扫描器来完成,但是是一个简单(但很大)的嵌入式对象集合,这些对象仅猜测路由器的地址(例如,通过嵌入预期的路由器图像并注意它何时成功加载)。获得地址后,您可以使用 RouterPasswords.com 猜测密码(从预期的默认值开始)甚至可以通过Routerpwn.com绕过身份验证。

作为概念验证,他们的演示发现了路由器 IP、查找其默认密码、登录并自动安装替换固件 (DD-WRT)。真正的攻击可能对新固件具有任意数量的恶意功能,并且很容易使其看起来像是未经修改的原始路由器系统。

(不可否认,这可以识别您的家庭 wifi 路由器的 LAN IP 地址,而不是您的本地 LAN IP 地址,但它非常接近并且可以说更令人担忧。)

最有可能的是,您的浏览器(或您的 ISP)正在发送一个X-Forwarded-For 标头,该标头会显示您的内部 IP 地址。检查类似这样的网站以查看您发送的标头。