如何构造基于浏览器的端口扫描器
字数 1234 2025-08-27 12:33:43

基于浏览器的端口扫描器构造技术详解

0x00 概述

本文详细讲解如何利用现代浏览器特性构造可靠的端口扫描器,这种技术可用于从互联网区域探测内网服务。相比传统的时序攻击方法,本文介绍的技术更为可靠,且适用于Chrome、Firefox和Edge等主流浏览器。

0x01 技术背景

传统浏览器端口扫描技术主要依赖两种方法:

  1. Jeremiah Grossman提出的使用<link>元素和时序分析
  2. Berend Jan Wever(Skylined)开发的lan扫描器,结合WebRTC和XHR技术

这些方法都基于时序攻击(timing attacks),存在可靠性不足的问题。本文介绍的技术则通过分析浏览器对不同端口响应行为的差异,实现了更可靠的端口探测。

0x02 Chrome浏览器实现原理

核心发现

当Chrome浏览器访问未监听的端口时:

  1. 浏览器会拒绝连接
  2. 实际URL会被更改为chrome-error://chromewebdata/
  3. 无论目标端口是否有服务监听,iframeonload事件都会被触发

关键技术点

  1. 双重请求机制

    • 首次加载URL,捕获onload事件并增加计数器
    • 第二次请求相同的URL但添加#片段标识符
    • 有效端口只会触发一次onload事件,无效端口会触发两次
  2. 实现细节

    iframe.name = a.target = 'probe' + Date.now();
    iframe.src = url + ":" + pos;
    a.href = iframe.src + '#';
    
    iframe.onload = function(){
        calls++;
        if(calls > 1) {
            clearTimeout(timer);
            next();
            return;
        }
        a.click();
    };
    
    timer = setTimeout(function(){
        validPorts.push(pos);
        next();
    }, 5000);
    
  3. 注意事项

    • 最新版Chrome使用X-Frame-Options: DENY时会修改URL,会被误判为端口关闭
    • 该方法主要适用于Web服务器扫描

0x03 Firefox浏览器实现原理

核心优势

Firefox的实现更为简单高效:

  1. 只有有效的Web服务器才会触发onload事件
  2. 无需处理连接拒绝的情况
  3. 可以创建大量iframe而不会造成性能问题

关键技术点

  1. iframe池技术

    var id = 'iframe' + (pos % 1000),
        iframe = document.getElementById(id) ? 
                 document.getElementById(id) : 
                 document.createElement('iframe'),
        timer;
    
  2. 简化的事件处理

    iframe.onload = function(){
        validPorts.push(pos);
        clearTimeout(timer);
        next();
    };
    
  3. 额外优势

    • 可以扫描无效响应场景,检测非Web服务(如Redis服务器)
    • 扫描速度更快,可靠性更高

0x04 Edge浏览器实现原理

行为特点

Edge浏览器的行为与Chrome相反:

  1. 目标端口有效时:URL跳转到错误页面,触发onload事件
  2. 目标端口无效时:只有哈希值改变,不触发onload事件

实现代码

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

0x05 工具实现要点

  1. 异步JavaScript开发:提高扫描效率
  2. 多浏览器适配:根据浏览器类型自动选择最佳探测策略
  3. 错误处理:妥善处理各种边界情况和异常

0x06 防御措施

网站管理员可采取以下措施防范此类扫描:

  1. 对所有服务设置适当的X-Frame-Options
  2. 配置防火墙规则限制来自浏览器的异常请求
  3. 对内部服务实施严格的访问控制

0x07 总结

本文介绍的浏览器端口扫描技术相比传统时序攻击方法更为可靠,且能适应不同浏览器的特性差异。通过精心设计的请求机制和事件处理逻辑,实现了对内网服务的有效探测。理解这些技术原理不仅有助于安全测试,也能帮助管理员更好地防御此类探测行为。

基于浏览器的端口扫描器构造技术详解 0x00 概述 本文详细讲解如何利用现代浏览器特性构造可靠的端口扫描器,这种技术可用于从互联网区域探测内网服务。相比传统的时序攻击方法,本文介绍的技术更为可靠,且适用于Chrome、Firefox和Edge等主流浏览器。 0x01 技术背景 传统浏览器端口扫描技术主要依赖两种方法: Jeremiah Grossman提出的使用 <link> 元素和时序分析 Berend Jan Wever(Skylined)开发的lan扫描器,结合WebRTC和XHR技术 这些方法都基于时序攻击(timing attacks),存在可靠性不足的问题。本文介绍的技术则通过分析浏览器对不同端口响应行为的差异,实现了更可靠的端口探测。 0x02 Chrome浏览器实现原理 核心发现 当Chrome浏览器访问未监听的端口时: 浏览器会拒绝连接 实际URL会被更改为 chrome-error://chromewebdata/ 无论目标端口是否有服务监听, iframe 的 onload 事件都会被触发 关键技术点 双重请求机制 : 首次加载URL,捕获 onload 事件并增加计数器 第二次请求相同的URL但添加 # 片段标识符 有效端口只会触发一次 onload 事件,无效端口会触发两次 实现细节 : 注意事项 : 最新版Chrome使用 X-Frame-Options: DENY 时会修改URL,会被误判为端口关闭 该方法主要适用于Web服务器扫描 0x03 Firefox浏览器实现原理 核心优势 Firefox的实现更为简单高效: 只有有效的Web服务器才会触发 onload 事件 无需处理连接拒绝的情况 可以创建大量 iframe 而不会造成性能问题 关键技术点 iframe池技术 : 简化的事件处理 : 额外优势 : 可以扫描无效响应场景,检测非Web服务(如Redis服务器) 扫描速度更快,可靠性更高 0x04 Edge浏览器实现原理 行为特点 Edge浏览器的行为与Chrome相反: 目标端口有效时:URL跳转到错误页面,触发 onload 事件 目标端口无效时:只有哈希值改变,不触发 onload 事件 实现代码 0x05 工具实现要点 异步JavaScript开发 :提高扫描效率 多浏览器适配 :根据浏览器类型自动选择最佳探测策略 错误处理 :妥善处理各种边界情况和异常 0x06 防御措施 网站管理员可采取以下措施防范此类扫描: 对所有服务设置适当的 X-Frame-Options 头 配置防火墙规则限制来自浏览器的异常请求 对内部服务实施严格的访问控制 0x07 总结 本文介绍的浏览器端口扫描技术相比传统时序攻击方法更为可靠,且能适应不同浏览器的特性差异。通过精心设计的请求机制和事件处理逻辑,实现了对内网服务的有效探测。理解这些技术原理不仅有助于安全测试,也能帮助管理员更好地防御此类探测行为。