|
|
|
联系客服020-83701501

如何构造基于浏览器的端口扫描器

联系在线客服,可以获得免费在线咨询服务。 QQ咨询 我要预约
若何结构基于浏览器的端口扫描器 0x00 概述

在本文中我将介绍若何使用JavaScript结构端口扫描器,如果自己感趣味,或是间接然后处下载这款东西。

0x01 基于Chrome浏览器的实现

关于从Internet(互联网)区域到Intranet(内部网)区域停止端口扫描方面的形式,网上已经有一些研讨文章。Jeremiah Grossman在畴前介绍过若何在不寄托JavaScript的前提下,使用link元素和时序动作停止端口扫描,而Berend Jan Wever(Skylined)写了一个lan扫描器,也使用了时序进犯(timing attacks)以及WebRTC和XHR道理。 这两种技艺都用到了时序进犯,因此不是100%可靠。 这里我已经提出了一种越发可靠的技艺,但主要面向的是网络服务器扫描场景。

在测试在受限环境中使用浏览器来出现用户提供的形式的Web垄断顺序时,我不停在计议或是提取特定IP上运行的服务静态的动作。之所以选择Chrome,是由于这个Web垄断顺序使用的正是这个浏览器。当某个端口没有被用户主机占用时,Chrome会拒绝毗邻,此时我留神到了一些幽默的行为。 Chrome会向用户显露一条消息,但这正是最为幽默的一点,Chrome会将实际的URL变换为chrome-error://chromewebdata/

当我们使用iframe向服务器上不存在的某个端口发送乞求时,即便该端口没有监听任何形式,我们也会得到腐败的onload事变。如果的确有服务器在该端口监听,浏览器也会有一个腐败的onload事变,Chrome或是或许的确会这样做,以警醒用户探测哪些端口处于打开状态。 我们或是哄骗这种行为,我想出了一种动作,或是使用iframe?onload事变来必定端口可否打开。

如果我们初次加载url,捕获到onload事变,而后增长计数器值,再次收回相似的乞求,但此次乞求源中加了#(由于网址已变换为chrome-error:,而不是原始url),此时我们将失掉第2次onload事变,由于网址已变换。 如果某个Web服务器正在目标地点上监听,我们只会得到一个onload事变,这是由于第2个url中包孕一个哈希值,而当一个哈希发送到已加载的某个页面时,浏览器不会从新加载页面。

为了结构端口扫描顺序,我起首建设了一个iframe元素和anchor元素。anchor元素用来执行对#url的点击行为。而后,我们必要将iframe的称谓及anchor目标设置为相似的值,以便在点击哄骗会在iframe上而非顶层文档上执行:

Default
1 iframe.name = a.target = 'probe'+Date.now();

而后我们必要设置iframe的url值以及anchorhref属性值设置为同一个目标:

Default
12 iframe.src = url + ":" + pos;a.href = iframe.src + '#';

iframe必要关联onload事变,有效端口只会触发一次onload事变,因此我们必要使用计时器,碰着有效端口时继续下次测试:

Default
12三4567八91011121三 iframe.onload = function(){         calls++;         if(calls > 1) {   clearTimeout(timer);   next();   return; } a.click();};timer = setTimeout(function(){   validPorts.push(pos);   next();}, 5000);

以上即是主要思路,我们或是使用这种动作来扫描随便主机(搜罗本地IP)上的Web服务器。

请留神 :在最新版的Chrome上使用X-Frame-Options: DENY选项时会修改url,所以该东西会将这种环境果断为端口关闭。

0x02 基于Firefox浏览器的实现

我研讨了若何在Firefox上使用这种技艺,事实下场证实此时这种技艺哄骗起来更加简单。如果是有效的Web服务器,那么Firefox会触发onload事变,并且不会由于拒绝毗邻而触发该事变,因此我们无需自动点击链接便或是紧急找到目标。我们只需搜查onload事变可否被触发,或是或许检测可否超时便可(此时没有触发该事变)。Firefox还或是让我们建设大量iframe,并且不会构成效用上的散失。

此次我并没有使用单个iframe(如Chrome浏览器的垄断场景),而是使用了iframe池。Firefox承诺我们使用大量的iframe,这里我选择的数量为1000。

Default
12 var id = 'iframe'+(pos%1000), iframe = document.getElementById(id) ? document.getElementById(id) : document.createElement('iframe'), timer;

而后只必要使用onload事变便或是容易果断目标可否为有效的Web服务器:

Default
12三45 iframe.onload = function(){   validPorts.push(pos);   clearTimeout(timer);   next();};

Firefox场景比其他场景要更放慢速,也越发弱小,由于此时我们乃至或是扫描有效的响应场景。这样我们就可以检测其他服务,比如Redis服务器等。

0x0三 基于Edge浏览器的实现

Edge浏览器版的扫描器与Chrome版底细反,如果目标端口有效,那么url就会跳转到舛讹页面,触发onload事变;但如果目标端口有效,那么只需哈希值会发作篡改,不会触发onload事变。

Default
12三4567八91011121三1415 iframe.onload = function(){  calls++;  if(calls > 1) {     validPorts.push(currentPos);     return;  }  var a = document.createElement('a');  a.href = 'ms-appx-web://microsoft.microsoftedge/assets/errorpages/dnserror.html#12三';a.target = iframe.name;        a.click();        a = null;        if(calls === 1) {          next();        }    };

我已经将以上技艺整合到一个东西中,这款东西使用我最恋情的异步JavaScript说话停止斥地,自己或是会面此处下载该东西。

文章翻译转自:https://xz.aliyun.com/t/三241

原文:https://portswigger.net/blog/exposing-intranets-with-reliable-browser-based-port-scanning

数安新闻+更多

证书相关+更多