好久没更新博客了,博主最近偷懒了…

最近在 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一生黑啊╮( ̄▽ ̄)╭

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。不知道是个什么情况?

通过WebRTC获得的IP地址
通过WebRTC获得的IP地址

 

既然可以通过这个方法获得内外网 IP,那怎么去防范呢?

目前已知的一个方法是,在防火墙【出站规则】中,添加一条记录,禁止 UDP 的 3478、3479 两个端口的流量流出,可以使对方无法通过这个方法获得外网 IP,然而内网 IP 依旧可以显示…

然并卵( ´_ゝ`)


原创文章,转载请以链接形式注明出处:http://blog.ttionya.com/article-990.html