WebRTC(网页即时通信,Web Real-Time Communication)是一种开放标准和技术集合,用于在Web浏览器之间实现实时通信和音视频通信而无需添加额外的浏览器拓展。包括 Chrome、Firefox、Opera、Safari 均支持,并且在移动端也有支持。WEBRTC的优势在于它提供直接在Web浏览器中进行实时通信的能力,无需用户安装额外的软件或插件。它为开发者提供了一种简单而强大的方式来构建实时通信应用,同时兼容性较好,并具备较低的延迟和高质量的音视频传输能力。
WebRTC架构
- 紫色部分是WEB应用开发者API层
- • 蓝色实线部分是面向浏览器厂商的API层
- • 蓝色虚线部分是浏览器厂商可以自定义实现
WebRTC通信原理
1、媒体协商
彼此了解对方支持的媒体格式,选择它们之间的交集,有专门的协议SDP,参与视频通讯的双方必须交换SDP信息。
2、网络协商
彼此了解对方的网络情况,找到一条相互通讯的链路。(candidate)
方式:
- 获取外网IP地址映射
- 通过信令服务器交换”网络信息“
理想情况下Peer-A和Peer-B都有私有公网IP,但实际情况下需要进行NAT穿透实现点对点通信。一般实现的过程有STUN和TURN。
NAT穿透参考资料
NAT穿透——STUN、TURN、ICE
STUN:为终端提供一种方式能够获知自己经过NAT映射后的地址,从而替代位于应用层中的私网地址,达到NAT穿透的目的。
WebRTC泄露IP原理
VPN和Proxy区别
Proxy:使用代理服务器,计算机会首先将所有Web流量发送到代理,代理将请求转发到目标网站,下载信息并将其回传给计算机,通过这种方式掩蔽IP地址,代理服务器可使用户避开内容限制和监视。但一旦的互联网在代理服务器上停止工作、您的IP 很可能会暴露。与VPN不同、代理服务器也没有坚如磐石的 DNS 泄漏保护或加密协议。这意味着您的 IP 地址以及您的身份可能会在不合适的时候暴露出来。
VPN:”虚拟专用网络”,为数据创建一个加密隧道,通过隐藏您的 IP 地址来保护您的在线身份,并允许您安全地使用公共 Wi-Fi 热点。VPN在操作系统级别工作,意味着他们会重定向所有流量。还会加密互联网和设备之间的流量,因此,您的互联网服务提供商 (ISP) 无法看到您在线做了什么,只知道您连接了一个 VPN 服务器。VPN 服务器实际上充当了您在 Internet 上的代理。由于统计位置数据来自其他国家/地区的服务器,因此无法确定您的实际位置。此外,大多数 VPN 服务不会存储您的活动日志。另一方面,一些供应商会记录您的行为,但不会将这些信息传递给第三方。这意味着,任何潜在的用户行为记录都会被永久隐藏。
隐藏IP的方式
• 使用VPN
• 使用代理服务器
• 使用Tor浏览器(洋葱路由器):可以加密在线活动并隐藏IP地址,互联网流量会通过一个代理服务器来加密您的传入数据
• 连接到公共WiFi:配合VPN食用更佳
• 要求ISP提供一个新的静态IP地址
• 拔掉调制解调器以更改IP地址:DHCP服务器分配动态IP地址
• 切换到手机的互联网网络:不会让您保持匿名,移动提供商仍然知道您是谁。
WebRTC漏洞原理
• ICE和STUN协议:WebRTC使用ICE和STUN协议来建立对等连接(P2P)和进行NAT穿透(这是它的工作同时也是它的弱点)。ICE协议用于找到通信路径并建立连接,而STUN协议用于获取客户端的网络地址和端口信息。
• 客户端IP泄露:WebRTC在获取网络地址信息时,会返回客户端的本地和公网IP地址,包括用户的真实IP地址。
• IP地址检测:网页或应用程序可以使用JavaScript等客户端脚本来检测用户的IP地址。利用WebRTC的功能,它可以通过访问RTCPeerConnection对象获取用户的本地IP地址,并将其发送到外部服务器。
• 绕过代理和VPN:即使用户使用了代理服务器或VPN来隐藏其真实IP地址,WebRTC仍然可以通过直接访问RTCPeerConnection对象获取用户的真实IP地址。
WebRTC漏洞复现
连接公共WiFi可以看到自己的公网IP是:
curl https://openapi.lddgo.net/base/gtool/api/v1/GetIp
然后通过:https://ip.voidsec.com/ 工具直接luo奔,可以看到webrtc上很明显有我们的公网IP地址:
然后使用我自己的VPN测试(连接的是American的一个代理服务器),再次查询自己的公网IP。
但是此时在voidsec网站上测试后发现我的IP Info是代理服务器的IP地址,在Web RTC上没有显示,说明我的公网IP地址没有被泄露。
经过发现使用谷歌上网助手VIP版(扩展)的时候,却能够通过WebRtc泄露公有IP地址。
打开代理后可以看到有公网IP的地址:
通过归属地查询可以查询到具体的位置。同时IGG谷歌上网助手也存在这个问题。
WebRTC防范原理
禁用webrtc或者禁用javascript或者在VPN端设置更严格的防火墙规则
WebRTC修复原理
测试网站:
https://ip8.com/webrtc-test
https://ip.voidsec.com/
匿名代理追踪真实ip
检查出口源IP:
https://ip4.me/ https://api.ipify.org (只返回源IP)
http://checkip.dyndns.com
https://ipinfo.io/
浏览器
Chrome/Edge/Firefox的”WebRTC Leak Shield”扩展
其他方法:
Chrome/Opera/Edge有个配置项
chrome://flags/#enable-webrtc-hide-local-ips-with-mdns
opera://flags/#enable-webrtc-hide-local-ips-with-mdns
edge://flags/#enable-webrtc-hide-local-ips-with-mdns
匿名化WebRTC公开的本地IP,使用mDNS主机名隐藏本地IP地址。
一般情况下,启用该配置项并不能阻止WebRTC泄露源IP,因为你很可能并未使用mDNS。
mDNS代表多播DNS(Multicast DNS),它是一种网络协议,用于在局域网中实现主机名解析和服务发现。mDNS允许设备在没有中央DNS服务器的情况下进行通信,而是通过在局域网上广播查询和响应来进行通信。
使用mDNS主机名来隐藏本地IP地址的原理是通过将本地IP地址与主机名进行映射,使得对方无法直接获取到真实的IP地址。当使用WebRTC建立点对点连接时,一般情况下,对方可以获取到本地设备的真实IP地址。通过使用mDNS主机名,可以对本地IP进行匿名化处理,使得对方无法直接获知真实的IP地址。
具体实现步骤如下:
- 1. 在本地设备上,通过mDNS协议将主机名和本地IP地址进行绑定。这可以通过使用mDNS实现的软件或库来实现,例如Bonjour(在苹果设备上常见)或Avahi(在Linux设备上常见)。
- 2. 在建立WebRTC连接之前,本地设备通过mDNS广播其主机名和绑定的IP地址。这样其他设备就能够通过mDNS查询获得该主机名。
- 3. 当对方设备想要建立WebRTC连接时,它会通过主机名进行通信,而不是直接使用IP地址。这样,对方设备无法直接获取到本地设备的真实IP地址。
总之,使用mDNS主机名隐藏本地IP地址的原理是将本地IP地址与主机名进行映射,并通过mDNS协议在局域网中进行广播。这样,对方设备只能通过主机名进行通信,无法直接获取到真实的IP地址,从而实现了IP地址的匿名化。
about:config
media.peerconnection.enabled
将缺省的true设为false,会禁用WebRTC。
但是这个方法一般都不太安全。在本机上测试发现就算Disabled以后还是存在webrtc的问题。
然而结果还是会显示公网IP地址,因此最稳妥的方式还是下载Webrtc leak shiled等插件。或者直接关掉Javascript的使用(极力不推荐会严重影响使用)。
VPN
如下是Stagno发现易受IP泄露问题影响的VPN提供商列表(截至到2018.4.24)。
VPN Web RTC Leak – Google Sheets
VPN端修复WebRTC的原理
ExpressVPN采用了一种名为”Network Lock“的功能来防范WebRTC泄露IP地址。”Network Lock”是一个网络审查机制,旨在阻止意外的IP泄露和保护用户的隐私。
其原理如下:
- • 防火墙规则:在用户设备设置强大的防火墙规则,组织了与用户真实IP地址有关的所有未经授权的网络连接。
- • 强制使用VPN:强制所有网络流量通过其VPN服务器路由,而不是直接通过用户的本地网络连接。这意味着即使WebRTC流量意外泄露,它也会被重定向到VPN服务器,隐藏用户的真实IP地址。
- • WebRTC阻塞:在其VPN客户端中禁用WebRTC功能。这样一来,即使WebRTC在用户的浏览器中启用,它也无法与外部服务器进行通信,从而防止IP泄露。
WebRTC泄露IP拓展
通过脚本得到IP地址
仓库地址:
https://github.com/diafygi/webrtc-ips
需要更改STUN服务器,然后在谷歌上打开该脚本文件可以发现已经弹出公有IP地址了,这里可以利用这个方式嵌入到正常的网站中,因为可以在对方不知觉的情况下得到对方的公有IP地址从而方便溯源。
国内免费可用的STUN服务器(端口都是3478):
stun.xten.com
stun.voipbuster.com
stun.sipgate.net
stun.ekiga.net
stun.ideasip.com
stun.schlund.de
stun.voiparound.com
stun.voipbuster.com
stun.voipstunt.com
stun.counterpath.com
stun.1und1.de
stun.gmx.net
stun.callwithus.com
stun.counterpath.net
stun.internetcalls.com
numb.viagenie.ca
//get the IP addresses associated with an account
function getIPs(callback){
var ip_dups = {};
//compatibility for firefox and chrome
var RTCPeerConnection = window.RTCPeerConnection
|| window.mozRTCPeerConnection
|| window.webkitRTCPeerConnection;
var useWebKit = !!window.webkitRTCPeerConnection;
//bypass naive webrtc blocking using an iframe
if(!RTCPeerConnection){
//NOTE: 如果不支持RTCPeerConnection那么需要一个iframe标签获取所需的实现,然后从该iframe中获取RTCPeerConnection对象,所以即使主页面的浏览器不原生支持RTCPeerConnection,仍然可以使用iframe中的浏览器实例来执行必要的操作。
var win = iframe.contentWindow;
RTCPeerConnection = win.RTCPeerConnection
|| win.mozRTCPeerConnection
|| win.webkitRTCPeerConnection;
useWebKit = !!win.webkitRTCPeerConnection;
}
//为数据连接设置了一些最低要求和配置
var mediaConstraints = {
optional: [{RtpDataChannels: true}]
};
var servers = {iceServers: [{urls: "stun:stun.services.mozilla.com"}]};
//construct a new RTCPeerConnection
var pc = new RTCPeerConnection(servers, mediaConstraints);
function handleCandidate(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(candidate)[1];
//去掉重复的IP地址
if(ip_dups[ip_addr] === undefined)
callback(ip_addr);
ip_dups[ip_addr] = true;
}
//处理程序监听候选者事件
pc.onicecandidate = function(ice){
//skip non-candidate events
if(ice.candidate)
handleCandidate(ice.candidate.candidate);
};
//为触发候选者的收集,代码创建了一个数据通道,并使用 pc.createDataChannel 和 pc.createOffer 函数创建了一个 offer SDP(会话描述协议)
pc.createDataChannel("");
//create an offer sdp
pc.createOffer(function(result){
//触发向指定的STUN服务器发送请求
pc.setLocalDescription(result, function(){}, function(){});
}, function(){});
//wait for a while to let everything done
setTimeout(function(){
//read candidate info from local description
var lines = pc.localDescription.sdp.split('\n');
lines.forEach(function(line){
if(line.indexOf('a=candidate:') === 0)
handleCandidate(line);
});
}, 1000);
}
//Test: Print the IP addresses into the console
getIPs(function(ip){console.log(ip);});
WebRTC隐私泄露方面的论文
https://ieeexplore.ieee.org/document/6894480/
https://ieeexplore.ieee.org/document/9297333/https://www.mdpi.com/1999-5903/12/5/92
http://link.springer.com/10.1007/978-3-319-94496-8_5
http://ieeexplore.ieee.org/document/8167801/
https://www.rfc-editor.org/info/rfc8827
http://www.inderscience.com/link.php?id=92138
mDNS学习
mDNS(Multicast Domain Name System)是一种在局域网内进行服务发现和名称解析的协议。它允许局域网内的设备通过多播的方式进行通信,以发现其他设备和提供的服务,并使用易于理解的主机名来标识设备。
mDNS的主要特点和作用包括:
- 1. 服务发现:mDNS允许设备在局域网内广播自己提供的服务,同时也能监听和解析其他设备广播的服务信息。通过这种方式,设备可以自动发现局域网内提供的服务,无需配置服务器或中心化的服务注册。
- 2. 主机名解析:mDNS使用
.local
域名后缀来标识局域网内的设备和服务。当设备广播自己的主机名时,其他设备可以通过主机名加上.local
后缀来解析设备的IP地址,从而实现设备间的直接通信。 - 3. 多播通信:mDNS使用多播(Multicast)技术进行通信,设备可以将消息广播到特定的多播地址,所有监听该地址的设备都能接收到消息。这样,设备可以同时发送和接收mDNS消息,实现服务发现和主机名解析的双向通信。
- 4. 适用于局域网:mDNS是为了在局域网内实现服务发现和主机名解析而设计的。它不需要依赖外部的域名服务器,因此可以在没有互联网连接的情况下正常工作。
mDNS广泛应用于家庭和办公室网络中,用于自动发现局域网内的打印机、网络存储设备、智能家居设备等,并提供方便的方式让用户直接通过易于理解的名称来访问这些设备和服务。
如何在TG群中获取用户真实IP?
https://mp.weixin.qq.com/s/zRe0oxFtteBs93bfrEeesA
这篇文章前半部分在讲上面已经讲到过的WebRTC泄露IP地址的问题,创新点在于在本地存储了生成记录,这样可以记录每一次访问的地址。
mDNS的安全风险
隐私泄露可能会泄露设备的主机名、IP地址和设备类型,主要用于本地网络中的设备发现,但在某些情况下,恶意网站可能会利用WebRTC技术获取这些信息,从而窃取用户的隐私。
利用的是CSRF攻击,利用用户设备信息发起针对内部网络的攻击,从而窃取或篡改网络设备的数据。
提供了两个脚本:
实现mDNS代码——通过webrtc泄露mDNS主机名
使用mDNS获取本地网络文件——通过得到的mDNS主机名进行本地资源test.txt获取,但是需要的是同一个网络且端口开放才行
这里的思路:
通过链接可以得到用户的公网IP地址、私网IP地址以及mDNS主机地址。
通过有一篇论文可以发现可以通过泄露的IP地址进行端口扫描(能够绕过安全工具和防火墙)。
mDNS的本地地址经过尝试可以在局域网内进行互相访问,因此可以利用泄露的主机名进行CSRF攻击(使用mDNS工具:在支持mDNS协议的网络环境中,你可以使用mDNS工具(如Bonjour浏览器或avahi-browse命令行工具)来浏览局域网中的mDNS服务和主机。这些工具可以列出可见的mDNS主机和它们提供的服务。)。
总结
WebRTC通信的原理以及其需要STUN导致的IP泄露的原理。
WebRTC的检测以及修复。
WebRTC的二次利用以及在溯源中的使用。
声明*:实验中出现的任何工具仅是为了验证漏洞,环境在本地搭建。请遵守国家法律,切勿在互联网上进行尝试,否则后果自负。转载请注明原处,侵权必究。
作者:Ph0Jav7
原文:https://mp.weixin.qq.com/s/NESrl5tkESfX9UugmqbWWA
版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。