好久没更新博客了,博主最近偷懒了…
最近在 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>
本站测试地址:https://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