使用基于浏览器的端口扫描来探测内网情况

Track-SSG   ·   发表于 2018-11-13 10:26:54   ·   漏洞文章



22.png

在这篇博客文章中,我将描述如何使用ja vasc ript创建端口扫描器。如果你只是对这个工具感兴趣,你可以从这个url得到:

http://portswigger-labs.net/portscan

在Chrome浏览器进行端口扫描

过去有一些关于在一个在互联网间进行端口扫描的文章。Jeremiah Grossman在过去曾写过不使用ja vasc ript,而是使用链接元素和定时的端口扫描,Berend Jan Wever(Skyline)也写过一个一个局域网扫描器,该扫描器配合WebRTC和XHR一起,使用定时攻击。因为以上两者都使用定时,因此它们不是100%精确的。我想我已经想出了一种更可靠的技术,但主要是针对Web服务器进行扫描。

当测试Web应用程序时,应用程序会使用浏览器在受限环境中呈现用户提供的内容。我正在寻找提取关于在给定的IP上运行的服务的信息的方法。Chrome是我的目标,因为Web应用程序会使用它。我注意到一些有趣的行为,当Chrome链接到一个拒绝连接的端口,而这个端口没有被主机使用。它将会向用户显示一条消息,这也是有趣的一点,它会将实际的url更改为chrome-error://chromewebdata/。

当使用if rame向服务器上不存在的端口发出请求时,即使端口没有开启监听,也能成功加载事件。如果端口确实有一个服务器正在监听,那么它也能成功加载事件,Chrome浏览器之所以这样做可能是为了防止您知道端口是否打开。我可以用这种反应来达到我的目的,我想出了一个使用if rame加载技术来确定端口是否打开的技术。

对于端口不存在的情况,首先加载一个url并同时捕获on load事件,然后递增一个计数器,接着再次发出相同的请求,但是此次后面跟随一个#,因为原url已被更改为chrome-error://chromewebdata/。然后您会捕获第二个on load事件,因为url已更改。如果是Web服务器正在监听的情况,您将只得到一个on load事件,因为第二个url包含哈希值,并且当哈希值被发送到现有的已加载页面时,浏览器将不会重新加载相同页面。

为了构造一个端口扫描器,我首先创建了一个if rame和锚元素。锚元素将被用来执行单击# URL。然后,我需要将if rame名称和锚定目标分配相同的值,以便对if rame而不是顶部文档进行单击操作:

if rame.name = a.target = 'probe'+Date.now();

然后我需要将if rame和锚href设置为目标值:

if rame.src = url + ":" + pos;
a.href = if rame.src + '#';

if rame需要一个on load函数,并且当遇到一个有效端口时,我需要一个计时器,因为当探测到有效端口时,使得我们只得到一个on load事件,然后我们需要进入下一个测试:

if rame.on load = function(){        
 calls++;        
 if(calls > 1) {
   clearTimeout(timer);
   next();
   return;
 }
 a.click();
};
timer = setTimeout(function(){
   validPorts.push(pos);
   next();
}, 5000);

这就是该技术的主要基础,您可以使用它来扫描任何主机,包括本地IP的Web服务器。

注意:拒绝使用最新版本的Chrome的X-fr ame-Options,因为它会更改url,导致检测错误。

在Firefox浏览器扫描端口

我在Firefox上用了同样的技术,但发现这更容易。Firefox为有效的Web服务器触发加载事件,但不为连接被拒绝触发,因此很容易找到它们,不必自动单击链接。简单地看一下on load事件是否被触发或超时。Firefox还允许您创建大量的if rames而不影响性能。

这次我使用了一个if rames池,而不是Chrome的单一池。Firefox允许很多if rames,所以我使用1000条。

var id = 'if rame'+(pos%1000), 
if rame = document.getElementById(id) ? document.getElementById(id) : document.createElement('if rame'), timer;

然后,我简单地使用on load事件来确定它是否是有效的Web服务器:

if rame.on load = function(){
   validPorts.push(pos);
   clearTimeout(timer);
   next();
};

Firefox版本端口扫描更加快速和强大,因为它允许你扫描甚至无效的响应。这允许您检测其他服务,例如redis服务器。

在Edge浏览器扫描端口

该版本与Chrome版本相反,所以如果存在有效端口,则url将更改为错误页面,从而导致加载事件触发,但如果它是无效端口,则只有哈希值更改,并且不会触发加载事件。

if rame.on load = 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#123';
a.target = if rame.name;
        a.click();
        a = null;
        if(calls === 1) {
          next();
        }
    };

以上所有我都是用可爱的异步ja vasc ript编写的。你可以在这里找到这个工具:portswigger-labs.net/portscan

原文链接:https://portswigger.net/blog/exposing-intranets-with-reliable-browser-ba sed-port-scanning
           


打赏我,让我更有动力~

0 条回复   |  直到 2018-11-13 | 1325 次浏览
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.