google-chrome - 使用 WebSockets 进行端口扫描

标签 google-chrome websocket

最近a post Hacker News 报道了网站滥用 WebSockets 在客户端机器上查找开放端口。

帖子没有涉及任何细节,所以我决定试一试。

我在端口 8080 上打开了一个网络服务器,并尝试在 Chrome 的控制台中运行这个脚本:

function test(port) {
  try {
    var start = performance.now();
    var socket = new WebSocket('ws://localhost:' + port);

    socket.onerror = function (event) {
      console.log('error', performance.now() - start, event);
    }

    socket.addEventListener('close', function(event) {
      console.log('close', performance.now() - start, event);
    })

    socket.addEventListener('open', function (event) {
      console.log('open', performance.now() - start, event);
      socket.send('Hello Server!');
    });

    socket.addEventListener('message', function (event) {
        console.log('message ', performance.now() - start, event);
    });
  } catch(ex) {
      console.log(ex) 
  }
}

事实上,当我尝试连接到未打开的端口时,Chrome 会记录不同的错误消息 (ERR_CONNECTION_REFUSED):

test(8081)
VM1886:3 WebSocket connection to 'ws://127.0.0.1:8081/' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED

当我尝试连接到一个打开但未监听 WebSocket 的端口时(意外响应代码:200):

test(8080)
WebSocket connection to 'ws://127.0.0.1:8080/' failed: Error during WebSocket handshake: Unexpected response code: 200

但我找不到任何方法来访问和读取 JavaScript 中的这些错误。

控制流没有到达 catch 子句 catch(ex) { console.log(ex) } 并且 Chrome 传递给 socket.onerror 的事件对象没有端口是否打开似乎有什么不同。

至少在 Chrome 中,计时攻击似乎也无济于事。 onerrornew Socket() 创建之间的增量时间似乎在调用 test(...) 几次后增加。

那么网页是否真的有一种方法可以确定我的计算机上的端口是否打开?

最佳答案

下面链接的演示幻灯片显示它在 2016 年广为人知,并且您的测试中没有时间差异表明缓解措施可能已在上游应用。

https://datatracker.ietf.org/meeting/96/materials/slides-96-saag-1/

关于google-chrome - 使用 WebSockets 进行端口扫描,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61930898/

相关文章:

jquery - Chrome 奇怪的 (scaleY) 过渡行为

javascript - Chrome 重新排序对象键(如果是数字)是正常/预期的吗

Adobe Air StageWebView 中的 Android 远程 Chrome 调试

html - 可以从 webkitStorageInfo.queryUsageAndQuota() 获取详细信息

javascript - 在服务器上是否有将 WebSocket 请求转换为 HTTP 请求的标准?

javascript - 在 'document_start' 处运行的内容脚本会阻止网页上的 JS 脚本?

javascript - 等待 socket.on ('answerToRequest' ) 可以使用 Socket.io 吗?

javascript - Websockets 传输完成

ios - WS Websocket 是否能够在 Swift 中发送或接收 json 对象?

python - 如何从 WebSocket 处理程序获取 Tornado 请求的客户端 IP?