netmap.js:基于浏览器的网络发现工具

netmap.js是一款基于浏览器,用于提供主机发现和端口扫描功能的网络发现工具。

netmap.js的执行速度也非常的快,由于其使用了es6-promise-pool,因此它可以有效地运行浏览器允许的最大并发连接数。

动机

由于我正需要一个基于浏览器的端口扫描程序来处理我的工作,但我认为直接从BeEF等其他项目导入现有模块或复制粘贴它们太过简单。事实也证明,当前并没有一个像样的即用型npm模块,BeEF中的port_scanner模块(在撰写本文时)不准确,速度慢,且不适用于Chromium。

而netmap.js则是一个优化的“ping”sweeper和TCP扫描器,并且适用于所有现代的浏览器。

快速开始
安装

需要安装包找我

查找实时主机

让我们从家庭环境中找出网站访问者网关的IP地址:

 
  1. import NetMap from 'netmap.js'
  2. const netmap = new NetMap()
  3. const hosts = ['192.168.0.1', '192.168.0.254', '192.168.1.1', '192.168.1.254']
  4. netmap.pingSweep(hosts).then(results => {
  5. console.log(results)
  6. })
 
  1. {
  2. "hosts": [
  3. { "host": "192.168.0.1", "delta": 1003, "live": false },
  4. { "host": "192.168.0.254", "delta": 1001, "live": false },
  5. { "host": "192.168.1.1", "delta": 18, "live": true },
  6. { "host": "192.168.1.254", "delta": 1002, "live": false }
  7. ],
  8. "meta": {}
  9. }

主机192.168.1.1似乎当前正处于活动状态。

扫描TCP端口

让我们尝试扫描主机上开放的TCP端口:

 
  1. import NetMap from 'netmap.js'
  2. const netmap = new NetMap()
  3. const hosts = ['192.168.1.1', '192.168.99.100', 'google.co.uk']
  4. const ports = [80, 443, 8000, 8080, 27017]
  5. netmap.tcpScan(hosts, ports).then(results => {
  6. console.log(results)
  7. })
 
  1. {
  2. "hosts": [
  3. {
  4. "host": "192.168.1.1",
  5. "control": "22",
  6. "ports": [
  7. { "port": 443, "delta": 15, "open": false },
  8. { "port": 8000, "delta": 19, "open": false },
  9. { "port": 8080, "delta": 21, "open": false },
  10. { "port": 27017, "delta": 26, "open": false },
  11. { "port": 80, "delta": 95, "open": true }
  12. ]
  13. },
  14. {
  15. "host": "192.168.99.100",
  16. "control": "1001",
  17. "ports": [
  18. { "port": 8080, "delta": 40, "open": true },
  19. { "port": 80, "delta": 1001, "open": false },
  20. { "port": 443, "delta": 1000, "open": false },
  21. { "port": 8000, "delta": 1004, "open": false },
  22. { "port": 27017, "delta": 1000, "open": false }
  23. ]
  24. },
  25. {
  26. "host": "google.co.uk",
  27. "control": "1001",
  28. "ports": [
  29. { "port": 443, "delta": 67, "open": true },
  30. { "port": 80, "delta": 159, "open": true },
  31. { "port": 8000, "delta": 1001, "open": false },
  32. { "port": 8080, "delta": 1002, "open": false },
  33. { "port": 27017, "delta": 1000, "open": false }
  34. ]
  35. }
  36. ],
  37. "meta": {}
  38. }

起初,结果看起来似乎有点矛盾。

192.168.1.1是本地网段上的嵌入式Linux机器(路由器),唯一打开的端口是80。我们可以看到与其他关闭的端口相比,浏览器在80上的错误时间大约延长了5倍。

192.168.99.100是一个host-only VM,开放了8080端口,google.co.uk是外部主机,443和80都为开放状态。在这种情况下,浏览器在开放端口上相对快速地抛出一个错误,而关闭的端口只是超时。

为了确定端口应该标记为打开还是关闭,netmap.js将扫描一个假定为关闭的“control”端口(默认为45000)。然后,使用控制时间确定其他端口的状态。如果比率delta/control大于设定值(默认值为0.8),则假定端口关闭(tl;dr: 与控制时间相差20%以上则表示端口已打开)。

限制
端口黑名单列表

浏览器维护者一个拒绝连接的端口黑名单列表(如ftp、ssh或smtp)。如果使用默认协议(HTTP)尝试使用netmap.js扫描这些端口,将会返回一个非常短暂的超时。这通常是端口关闭的标志,但对于黑名单端口,这并不意味着什么。

你可以从以下链接查看黑名单列表:

Chromium source

Mozilla docs

Edge/IE(如果你找到了请将地址发送给我,非常感谢!)

在Firefox 61(或其他一些浏览器)之前,可以通过使用ftp协议而不是http来建立连接从而绕过这个限制。在实例化NetMap时,可以在options对象中指定协议。当使用ftp时,你应该期望打开的端口超时,关闭的端口相对较快地出错。FTP扫描还受到本文中讨论的TCP RST数据包的限制。

“传统”协议(如ftp)的子资源请求已在Chromium中被阻塞了一段时间。

"Ping" Sweep

netmap.js提供的“ping”扫描功能在快速查找本地网段(其他计算机,电话,路由器,打印机等)上基于 *nix的实时主机方面表现相当不错。

但由于实现的原因,当不返回TCP RST数据包时这将不起作用。典型:

Windows机器

一些外部主机

某些网络设置,例如桥接/host-only VMs

其原因在以下理论部分进行了解释。

此限制不会影响TCP扫描功能,并且仍然可以通过尝试查找其开放端口来确定上述主机是否处于活动状态。

使用
NetMap构造函数

NetMap构造函数采用一个允许你配置的options对象:

用于扫描的协议(默认为http,请参阅端口黑名单,了解为什么要将其设置为ftp)

端口连接超时(默认为1000毫秒)

 
  1. import NetMap from 'netmap.js'
  2. const netmap = new NetMap({
  3. protocol: 'http',
  4. timeout: 3000
  5. })

pingSweep()

pingSweep()方法用于确定给定的主机阵列是否有效,其主要是通过检查与端口的连接是否超时来实现的。在这种情况下,主机被认为是离线状态(参见"Ping" Sweep了解限制和理论的标准情况)。

该方法采用以下参数:

hosts数组要扫描的主机阵列(IP地址或主机名);

options对象: 

maxConnections - 最大并发连接数(默认情况下Chrome上为10个,其他浏览器为17个 - 浏览器支持的最大并发连接数)

要扫描的端口(默认为45000)

它返回一个promise对象。

 
  1. netmap.pingSweep(['192.168.1.1'], {
  2. maxConnections: 5,
  3. port: 80
  4. }).then(results => {
  5. console.log(results)
  6. })

tcpScan()

tcpScan()方法将针对一系列目标执行端口扫描。请阅读标准案例以了解它是如何做到这一点的。

该方法采用以下参数:

hosts数组要扫描的主机阵列(IP地址或主机名);

要扫描的端口列表(1-65535之间的整数,避免以上黑名单中的端口);

options对象: 

maxConnections - 最大并发连接数(默认为6 - 每个域浏览器允许的最大连接数)

portCallback - 当完成host:port组合的扫描时要执行的回调

controlPort - 要扫描的端口,以确定基线关闭端口增量(默认为45000)

controlRatio - 要被视为已关闭端口的控制增量的相似性(百分比)(默认值为0.8,请参见以上示例部分)

它返回一个promise对象。

 
  1. netmap.tcpScan(['192.168.1.1'], [80, 27017], {
  2. maxConnections: 5,
  3. portCallback: result => {
  4. console.log(result)
  5. },
  6. controlPort: 45000,
  7. controlRatio: 0.8
  8. }).then(results => {
  9. console.log(results)
  10. })
理论

以下部分将为大家简要介绍模块发现技术背后的理论知识。

总体思路

此模块使用Image对象尝试请求跨源资源(测试中的一系列http://{host}:{port} URLs)。浏览器引发错误(delta增量)或在某个超时值后缺少错误所需时间,提供了对正在审查的主机和端口状态的深入了解。

标准情况

当尝试连接到封闭端口时,活动主机通常会使用TCP RST数据包进行相对快速的响应。

如果端口是打开的,即使它没有运行HTTP服务器,由于建立了完整TCP连接的开销,以及随后意识到无法从提供的URL中获取图像中获取Image,浏览器将需要花费更长的时间来引发错误。

而离线主机则不会响应RST,也不允许建立完整的TCP连接。在超时(~90秒)之前,浏览器仍会尝试建立连接。netmap.js默认等待1000毫秒后会超时。

综上所述:

实时主机上的关闭端口将有一个非常短的delta增量

实时主机上的开放端口将具有稍长的delta增量

离线主机或未使用的IP地址将会超时

没有TCP RST的情况

一些主机(如google.co.uk或Windows主机)和一些网络设置(如VirtualBox host-only网络)在命中关闭端口时,并不会返回TCP RST数据包。

在这种情况下,关闭端口通常会超时,而开放端口则会快速引发错误。

因此,当不返回RST数据包时,pingSweep()方法的实现是不可靠的。

总之,当出于任何原因未返回TCP RST数据包时:

实时主机上的关闭端口将超时

实时主机上的开放端口将有一个短的delta增量

pingSweep()将无法区分关闭端口超时和“dead”主机超时

WebSockets和Ajax

应该有很好的文档说明,你还能够使用WebSockets和Ajax来映射网络。

我做了一次尝试(也调整了BeEF来尝试它的端口扫描模块,只使用WebSockets和Ajax);我发现这两种方法产生的结果非常的不可靠。

如果我在这方面有所遗漏,请告诉我。

网络安全学习资源分享:

给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

因篇幅有限,仅展示部分资料,朋友们如果有需要全套《网络安全入门+进阶学习资源包》,需要点击下方链接即可前往获取 

 读者福利 | CSDN大礼包:《网络安全入门&进阶学习资源包》免费分享(安全链接,放心点击)

同时每个成长路线对应的板块都有配套的视频提供: 

大厂面试题

视频配套资料&国内外网安书籍、文档

当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料

所有资料共282G,朋友们如果有需要全套《网络安全入门+进阶学习资源包》,可以扫描下方二维码或链接免费领取~ 

 读者福利 | CSDN:《网络安全入门&进阶学习资源包》免费分享~~(安全链接,放心点击)

特别声明:

此教程为纯技术分享!本教程的目的决不是为那些怀有不良动机的人提供及技术支持!也不承担因为技术被滥用所产生的连带责任!本教程的目的在于最大限度地唤醒大家对网络安全的重视,并采取相应的安全措施,从而减少由网络安全而带来的经济损失。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/471393.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL(5)【数据类型 —— 字符串类型】

阅读导航 引言一、char🎯基本语法🎯使用示例 二、varchar🎯基本语法🎯使用示例 三、char 和 varchar 比较四、日期和时间类型1. 基本概念2. 使用示例 五、enum 和 set🎯基本语法 引言 之前我们聊过MySQL中的数值类型&…

百度搜索AI探索版多线程批量生成TXT原创文章软件-可生成3种类型文章

百度搜索AI探索版是百度推出的一款基于大语言模型文心一言的综合搜索产品‌。以下是关于百度搜索AI探索版的详细介绍: ‌产品发布‌:百度搜索AI探索版在百度世界大会上进行了灰度测试,并面向用户开放体验‌。 ‌核心功能‌:与传…

websocket初始化

websocket初始化 前言 上一集我们HTTP的ping操作就可以跑通了,那么我们还有一个协议---websocket,我们在这一集就要去完成我们websocket的初始化。 分析 我们在初始化websocket的之前,我们考虑一下,我们什么时候就要初始化我们…

Git在版本控制中的应用

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 Git在版本控制中的应用 Git在版本控制中的应用 Git在版本控制中的应用 引言 Git 概述 定义与原理 发展历程 Git 的关键技术 分布…

[JAVAEE] 面试题(四) - 多线程下使用ArrayList涉及到的线程安全问题及解决

目录 一. 多线程下使用ArrayList 1.1. 自行判断加锁 1.2 使用Collections.synchronizedList()套壳加锁 1.3 CopyOnWriteArrayList类 二. 总结 一. 多线程下使用ArrayList 多线程下使用ArrayList会涉及到线程安全问题, 例如: public static void main(String[] args) thro…

python——面向对象

一、面向对象编程 1.1 面向过程与面向对象 面向过程和面向对象都是一种编程方式,只不过再设计上有区别。 1.1.1 面向过程pop: 举例:孩子上学 1. 妈妈起床 2. 妈妈洗漱 3. 妈妈做饭 4. 妈妈把孩子叫起来 5. 孩子起床 6. 孩子洗漱 7. 孩子吃…

【缺陷检测】Anomaly Detection via Reverse Distillation from One-Class Embedding

论文地址 代码地址 动机 论文针对传统的知识蒸馏的方案提出了一个问题:认为之前的(基于像素点的重建)方案[1,2]容易阻碍异常表现的多样性 传统的知识蒸馏teacher和student的网络架构很相似或者几乎相同而且teacher和student的输入流都是…

【PHP】ThinkPHP基础

下载composer ComposerA Dependency Manager for PHPhttps://getcomposer.org/ 安装composer 查看composer是否安装 composer composer --version 安装 ThinkPHP6 如果你是第一次安装的话,首次安装咱们需要打开控制台: 进入后再通过命令,在命令行下面&a…

SpringBoot(十八)SpringBoot集成Minio

项目上传文件集成一下Minio,下面是我在项目中集成Minio的全过程。 首先介绍一下Minio:MinIO是高性能的对象存储,单个对象最大可达5TB。适合存储图片、视频、文档、备份数据、安装包等一系列文件。是一款主要采用Golang语言实现发开的高性能、分布式的对象存储系统。客户端支…

宗馥莉的接班挑战:内斗升级,竞品“偷家”

内斗不止,外患环伺,情怀助力娃哈哈短暂回暖,但市场认可与持续增长仍充满不确定性。 转载:原创新熵 作者丨晓伊 编辑丨蕨影 一波未平,一波又起。继换办公楼、逼员工签新合同和宗馥莉疑似出走等事件后,娃哈哈…

K8S单节点部署及集群部署

1.Minikube搭建单节点K8S 前置条件:安装docker,注意版本兼容问题 # 配置docker源 wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo# 安装docker环境依赖 yum install -y yum-utils device-m…

MySQL —— MySQL逻辑架构与查询过程

文章目录 MySQL逻辑架构整体分为三层连接层服务层查询缓存解析器优化器执行器 存储引擎层系统文件层 MySQL 查询过程查询过程框图 博客1 博客2 MySQL逻辑架构整体分为三层 最上层为客户端层,并非MySQL所独有,诸如:连接管理、授权认证、权限校…

【大数据学习 | HBASE高级】storeFile文件的合并

Compaction 操作分成下面两种: Minor Compaction:是选取一些小的、相邻的StoreFile将他们合并成一个更大的StoreFile,对于删除、过期、多余版本的数据不进行清除。 Major Compaction:是指将所有的StoreFile合并成一个StoreFile&am…

微服务day08

Elasticsearch 需要安装elasticsearch和Kibana,应为Kibana中有一套控制台可以方便的进行操作。 安装elasticsearch 使用docker命令安装: docker run -d \ --name es \-e "ES_JAVA_OPTS-Xms512m -Xmx512m" \ //设置他的运行内存空间&#x…

操作系统lab4-页面置换算法的模拟

操作系统lab4-页面置换算法的模拟 文章目录 操作系统lab4-页面置换算法的模拟实验目的实验内容实验分析 代码测试用例运行结果 实验目的 1、掌握请求分页存储管理的常用理论:页面置换算法。 2、理解请求分页中的按需调页机制。 实验内容 独立地用高级语言编写和…

react-redux useSelector钩子 学习样例 + 详细解析

(一)react-redux useSelector 学习样例 详细解析 创建一个新项目,将依赖正确安装: npx create-react-app my-redux-app cd my-redux-app# 安装 Redux 和 React-Redux npm install redux react-redux# 安装 ajv npm install ajv#…

IP数据云 识别和分析tor、proxy等各类型代理

在网络上使用代理(tor、proxy、relay等)进行访问的目的是为了规避网络的限制、隐藏真实身份或进行其他的不正当行为。 对代理进行识别和分析可以防止恶意攻击、监控和防御僵尸网络和提高防火墙效率等,同时也可以对用户行为进行分析&#xff…

《Django 5 By Example》阅读笔记:p76-p104

《Django 5 By Example》学习第4天,p76-p104总结,总计29页。 一、技术总结 1.环境变量管理 这里作者使用的是:python-decouple,本人在实际项目中使用的是python-dotenv,这里只是简单的使用,感觉两者差不…

【IC每日一题:IC常用模块--RR/handshake/gray2bin】

IC每日一题:IC常用模块--RR/handshake/gray2bin 1 RR仲裁器2 异步握手信号处理3 格雷码和二进制相互转换 1 RR仲裁器 应用:在多个FIFO请求pop时存在仲裁策略,还有比如多master申请总线控制权的仲裁等这些应用场合;假如当前是最高…

【Visual Studio】使用VS调试(Debug)

确保在Debug模式下而不是Release 打断点(break point) 直接在有代码的行前单击,会出现红色的点(再次单击会取消);或者光标停留在某行,按F9 这意味着程序当执行到这一行时会终止 在打完断点后点击”本地Windows调试器“或者按F5 往下翻会…