好久没更新博客了,博主最近偷懒了…
最近在 wooyun 和 github 上看到一个通过 WebRTC 获得内外网 IP 的项目。于是稍微看了看,大概可以通过它做到很多事,不过博主才疏学浅,不会…
什么是WebRTC?
WebRTC,是网页实时通信(Web Real-Time Communication)的缩写,是一个支持网页浏览器进行实时语音对话或视频对话的技术。
WebRTC 实现了基于网页的视频会议,标准是 WHATWG 协议,目的是通过浏览器提供简单的 Javascript 就可以做到实时通讯。WebRTC 项目的最终目的主要是让 Web 开发者能够基于浏览器轻易快捷地开发出丰富的实时多媒体应用,而无需下载安装任何插件,Web 开发者也无需关注多媒体的数字信号处理过程,只需编写简单的 Javascript 程序即可实现。
这里有一个使用 WebRTC 技术制作的在线视频应用,地址:https://apprtc.appspot.com/ (自备梯子)
WebRTC的浏览器支持情况
桌面上从 Chrome 23 、 Firefox 22 、 Opera 18 开始支持 WebRTC, Internet Explorer 和 Safari 尚未支持 WebRTC。
IE一生黑啊╮( ̄▽ ̄)╭
言归正传,WebRTC 要使得浏览器间进行通信需要获得用户的授权,但是以下的方法不需要获得用户授权就可以获取内外网 IP,可以算是一个漏洞吧。
PS:IE 真安全,通过不支持完美地避开了这个泄露 IP 的方式,可喜可贺,可喜可贺
最先披露该问题的是 ipcalf ,Github地址:https://github.com/natevw/ipcalf,该项目是 2 年前的了,可见 2 年了 Google 都没有修复这个问题。
之后 diafygi 对该项目进行了重写,Github地址:https://github.com/diafygi/webrtc-ips
源代码:
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>通过WebRTC获得内外网IP</title> </head> <body> <h4>本测试方法由 <a href="https://github.com/diafygi/webrtc-ips" target="_blank">https://github.com/diafygi/webrtc-ips</a> 提供</h4> <h4>内网IP:</h4> <ul></ul> <h4>公网IP:</h4> <ul></ul> <h4>公网IPv6:</h4> <ul></ul> <script> //得到账户关联的IP地址 function getIPs(callback) { var ip_dups = {}; //对Firefox和Chrome兼容 var RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; //绕过对RTC的阻止 if (!RTCPeerConnection) { var iframe = document.createElement('iframe'); iframe.style.display = 'none'; document.body.appendChild(iframe); var win = iframe.contentWindow; window.RTCPeerConnection = win.RTCPeerConnection; window.mozRTCPeerConnection = win.mozRTCPeerConnection; window.webkitRTCPeerConnection = win.webkitRTCPeerConnection; RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; } //要求最小的数据连接 var mediaConstraints = { optional: [{ RtpDataChannels: true }] }; //Firefox在about:config中设置了默认stun服务器,但在Firefox41中不再默认指定stun地址 // media.peerconnection.default_iceservers = // [{"url": "stun:stun.services.mozilla.com"}] var servers = { iceServers: [{ urls: "stun:stun.services.mozilla.com" }] }; //new一个RTCPeerConnection var pc = new RTCPeerConnection(servers, mediaConstraints); //监听candidate事件 pc.onicecandidate = function (ice) { //跳过非candidate事件 if (ice.candidate) { //匹配IP地址 var ip_regex = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/; var ip_addr = ip_regex.exec(ice.candidate.candidate)[1]; //去重 if (ip_dups[ip_addr] === undefined) callback(ip_addr); ip_dups[ip_addr] = true; } }; //虚构一个数据通道 pc.createDataChannel(""); //create an offer sdp pc.createOffer(function (result) { //触发stun服务器的请求 pc.setLocalDescription(result, function () { }, function () { }); }, function () { }); } getIPs(function (ip) { var li = document.createElement("li"); li.textContent = ip; //本地IP if (ip.match(/^(192\.168\.|169\.254\.|10\.|172\.(1[6-9]|2\d|3[01]))/)) document.getElementsByTagName("ul")[0].appendChild(li); //IPv6 else if (ip.match(/^[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7}$/)) document.getElementsByTagName("ul")[2].appendChild(li); //公网IP else document.getElementsByTagName("ul")[1].appendChild(li); }); </script> </body> </html>
本站测试地址:http://api.ttionya.com/WebRTC/ (WebRTC区分大小写)
(´・_・`)被你发现了呢。最近实在没啥写的,就拿这个来充个数
有人说,在挂上 VPN 后不仅可以获得 VPN 的内外网 IP,还能获得本机的内外网 IP,但是博主测试的结果是:可以获得 VPN 的内外网 IP,也能获得本机的内网 IP,但是无法获得本机的公网 IP。不知道是个什么情况?
既然可以通过这个方法获得内外网 IP,那怎么去防范呢?
目前已知的一个方法是,在防火墙【出站规则】中,添加一条记录,禁止 UDP 的 3478、3479 两个端口的流量流出,可以使对方无法通过这个方法获得外网 IP,然而内网 IP 依旧可以显示…
然并卵( ´_ゝ`)
原创文章,转载请以链接形式注明出处:https://blog.ttionya.com/article-990.html