​​​​​​ 基于Nmap的异步无状态端口扫描技术

​​​​​​ 基于Nmap的异步无状态端口扫描技术

传统的端口扫描,主要是依靠TCP三次握手去连接,而建立连接的各个过程都存在连接状态,这些状态由操作系统在底层实现存储,可利用这些状态对应用层的数据进行处理。但是,这需要消耗大量的系统资源。一般的操作系统中,系统TCP/IP协议栈能同时保持的连接数只有几十或几百,即便是网络应用服务器,默认保持的连接数只有1500左右,很容易达到连接数的上限。因此,传统的端口扫描方式在扫描速度上受到了极大的限制。

针对上述问题,产生了一种基于无状态的端口扫描方式。无状态是指不需要操作系统关心TCP连接的状态。这种方式所建立的连接不占用操作系统的TCP/IP协议栈资源,而是应用程序在底层直接进行管理和维持,不需要操作系统对连接状态进行会话组包。在实现上,是把关键的状态位及数据信息通过程序直接放在数据包的本身。通过这种方式,能同时保持的连接数不再受操作系统的限制。应用程序直接从底层进行数据组包,并对连接进行维持和管理,决定连接的数量,从而使扫描速度得到极大的提高。

1)异步无状态端口扫描技术

扫描过程中,向目标服务器发送数据包,若采用有状态的扫描方式,需等待目标服务器的回复,要设置timeout参数。当进行大量扫描时,等待时间会成为提高扫描速率的瓶颈,即使使用多线程也会很慢,所以采用异步的无状态的扫描方式来提升扫描速度。

启动程序后,对每一个网卡建立一个异步处理的线程对,分别是发送数据包线程和接收数据包线程。如果目标服务器的端口是开放的就会返回响应数据包,响应数据包由接收数据包线程接收,并解析收到的数据包。发送数据包线程只负责发送,接收数据包线程只接收特定TCP flags字段的数据包,两者之间没有交互,这样就没有了等待回复的时间,程序工作流程图如下图所示:

  • 1 数据包收发流程

地址随机化算法是将扫描目标的所有IP和PORT组成的目标地址进行随机化,组装数据包发送建立连接的请求。

发送数据包线程的执行过程如下:

(1)初始化变量;

(2)创建一个指向外部变量的指针,用于通知线程内的发送数据包的数量以及当前的发送速度等信息;

(3)初始化用户的IP和端口;

(4)设置数据包的发送速度,当速度过大,本地流量达不到要求时,会导致部分数据包丢失;

(5)计算扫描任务的扫描数量,即扫描的IP数与每个IP的端口数的乘积:NUM(IP)*NUM(PORT);

(6)循环本次扫描任务的扫描数量;

(7)执行完本次循环后,执行下一扫描范围循环;

(8)将发送队列中的剩余数据包发送出去。

接收数据包线程的执行过程如下:

(1)初始化变量;

(2)创建一个指向外部变量的指针,用于通知线程内的接收数据包的数量以及当前的接收速度等信息;

(3)将发送数据包线程分配到偶数编号的CPU,将接收数据包线程分配到奇数编号的CPU,实现更好的异步操作;

(4)利用pcap文件接收原生数据包,并创建接收表对异步操作导致的重复响应进行最优去重;

(5)如果是离线模式,等待发送线程结束后就关闭;

(6)接收数据包,执行一个while循环。

2)基于Nmap的异步无状态端口扫描技术

端口扫描有很多方法,常用的端口扫描方法以及扫描工具各有优缺点。Nmap能够主机发现,支持多端口、多网段的端口扫描,可对目标域名进行扫描;能够识别端口服务类型及版本、操作系统、设备类型等,但是如果进行大网段全端口扫描,Nmap的扫描能力就受到限制,扫描周期过长。通过前面对目标的信息收集,发现一个目标可能与多个主机相关。一个主机有65535个端口,所以,为了增大全面探测主机的效率,先采用基于异步无状态的端口扫描方式:构造相应flag的TCP报文发送到目标主机的所有端口。

通过对目标主机的所有端口采用异步无状态的端口扫描,得到目标主机所有的开放端口信息,并对开放的端口进行侦测,用来识别各个端口上所运行的服务及其版本。一般来说,每一个服务都有一个固定的默认端口。Nmap可以检测数百种应用协议,识别数千种应用的签名。调用Nmap的API进行端口探测,可以有效的识别目标主机上各个端口所运行的服务和版本。

操作系统是根据banner和fingerprint进行探测。如果直接抓到banner信息,那么很大概率上可以直接得到操作系统的类型和版本。但是如果没有,就要根据已知的指纹信息,来进行对应的推测。Nmap提供了上千种设备的指纹数据,通过调用Nmap的API对目标主机进行操作系统探测,能够有效的识别操作系统类型和版本号。

端口和操作系统探测采用基于异步无状态端口扫描和Nmap相结合的方法,工作流程如下图所示:

  • 2 端口扫描流程

(1)用户输入目标,判断目标合法性。目标是前面信息收集到的所有目标相关IP。

(2)采用基于异步无状态的端口扫描方式,对全部IP进行扫描,包括每个主机的65535个端口,得到所有主机的开放端口信息。

(3)调用Nmap的API,探测开放端口的服务以及主机的操作系统类型和版本号。这里需安装python_nmap包,支持Python2.x以及3.x版本,python_nmap包提供了Python调用Nmap的一系列接口。代码中用到的重要的类以及方法分别是class PortScanner()和scan()。class PortScanner()用于创建Nmap扫描器,scan()用于设置扫描方法。

(4)结果存入数据库。

3)与Nmap端口扫描的性能比较

单独使用Nmap对主机进行扫描时,由于扫描效率低,一般只会扫描常用的1000个端口,平均每台主机耗时150秒。但是,运维工程师考虑到安全问题会更改服务的默认端口号。为保证扫描结果的全面性,本系统对全端口进行扫描。

  • 3 端口扫描

对同一台主机,使用Nmap进行全端口扫描至少耗时2个小时,扫描效率比较低。采用异步无状态端口扫描和Nmap相结合方法,效率会大幅提升。如上图所示,利用异步无状态端口扫描方式,一台主机用时只有几十秒,比Nmap快了好多倍。如下图所示,针对开放端口,使用Nmap进行端口服务、操作系统类型和版本探测,平均只需2秒。实验证明,采用异步无状态端口扫描和Nmap相结合的方法比单独使用Nmap提高了近百倍。

  • 4 端口扫描

综上,基于Nmap的异步无状态端口扫描技术,相比单独使用Nmap提高性能近百倍,实现端口扫描以及空间资产测绘速率的大幅提升。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Flutter】 TextField限制长度时, 第三方手写输入法、ios原始拼音输入法输入被吞问题

问题描述 TextField限制长度时, 当你的输入字符长度已经到了最大值-1时,使用第三方手写输入法或者ios原生拼音输入法输入liang(什么拼音都行,这里只是举例),输到i那么li都会消失。 原因分析 这是因为第三…

[论文笔记]AIOS: LLM Agent Operating System

引言 这是一篇有意思的论文AIOS: LLM Agent Operating System,把LLM智能体(代理)看成是操作系统。 基于大语言模型(LLMs)的智能代理的集成和部署过程中存在着许多挑战,其中问题包括代理请求在LLM上的次优调度和资源分配,代理和LLM之间在交互…

苹果将推出“Apple Intelligence”AI系统,专注于隐私和广泛应用|TodayAI

据彭博社报道,苹果公司将在下周的 WWDC 2024 开发者大会上揭晓其全新的 AI 系统——“Apple Intelligence”,该系统将适用于 iPhone、iPad 和 Mac 设备。这一新系统将结合苹果自身技术和 OpenAI 的工具,为用户提供一系列新的 AI 功能,同时重点关注隐私保护和广泛应用。 与…

如何在virtualbox上安装Linux系统(centerOS)

提示:共同学习 注意:一定要在BIOS中的虚拟化打开。 文章目录 第一步: 第一步: 启动 、显示开启 centos基础安装 ​ ​

MongoDB CRUD操作:地理位置查询

MongoDB CRUD操作:地理位置查询 文章目录 MongoDB CRUD操作:地理位置查询地理空间数据GeoJSON对象传统坐标对通过数组指定(首选)通过嵌入文档指定 地理空间索引2dsphere2d 地理空间查询地理空间查询运算符地理空间聚合阶段 地理空…

【Linux】The server quit without updating PID file的几种解决方案

😎 作者介绍:我是程序员洲洲,一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主。 🤓 同时欢迎大家关注其他专栏,我将分享Web前后端开发、人工智能、机器学习、深…

Qt之QGraphicsView —— 笔记3:矩形图元连接(附完整源码)

效果 完整源码 注意:在ui文件中拖入一个QGraphicsView类窗口控件,然后用MyGraphicsView提升该类。 main.cpp #include "widget.h" #include <QApplication>int main(

【Java毕业设计】基于JSP+SSM的物流管理系统

文章目录 目 录摘要ABSTRACT1 概述1.1 课题背景及意义1.2 国内外研究现状1.3 本课题主要工作 2 系统开发环境2.1 JSP技术2.2 JavaScript2.3 B/S结构2.4 HTML简介 3 系统分析3.1 可行性分析3.1.1 技术可行性3.1.2操作可行性3.1.3 经济可行性3.1.4 法律可行性 3.2系统流程设计3.2…

ES开发及面试手册

入门基础 简介 Elasticsearch是一个基于Lucene的搜索和分析引擎&#xff0c;它提供了一个分布式、多租户能力的全文搜索引擎&#xff0c;具有HTTP Web界面和无模式JSON文档。 使用场景 什么是全文检索 全文检索 是一种信息检索技术&#xff0c;它允许用户通过输入查询关键词来…

CorelDRAW2024发布更新啦!设计师们的得力助手

在数字化的今天&#xff0c;视觉设计已经成为我们生活中不可或缺的一部分。从手机界面到广告海报&#xff0c;从网页布局到包装设计&#xff0c;每一个细节都离不开设计师们的专业与创意。然而&#xff0c;面对日益增长的设计需求和不断提升的审美标准&#xff0c;许多设计师开…

Unity ShaderGraph 扭曲

需要注意的是&#xff1a; HDRP ShaderGraph中 你不能扭曲UI&#xff0c;所以假如你要扭曲视频&#xff0c;请把视频在材质上渲染 播放&#xff0c;这样就可以扭曲视频了喔&#xff0c; ShaderGraph扭曲

vue-el-steps 使用2[代码示例]

效果图 代码 element代码 <template> <div class"app-container"> <el-form :model"queryForm" size"small" :inline"true"> <el-form-item label"内容状态"> <el-button-group> <el-bu…

单列集合.java

单列集合 为了存储不同类型的多个对象&#xff0c;Java提供了一些特殊系列的类&#xff0c;这些类可以存储任意类型的对象&#xff0c;并且存储的长度可变&#xff0c;这些类统称为集合。可以简单的理解为一个长度可变&#xff0c;可以存储不同数据类型的动态数组。集合都位于j…

编写程序,提示用户输入以米/秒(m/s)为单位的速度v和以米/秒的平方(m/s)为单位的加速度 a,然后显示最短跑道长度。

(物理:求出跑道长度)假设一个飞机的加速度是a而起飞速度是v&#xff0c;那么可以使用下 面的公式计算出飞机起飞所需的最短跑道长度: 编写程序&#xff0c;提示用户输入以米/秒(m/s)为单位的速度v和以米/秒的平方(m/s)为单 位的加速度 a&#xff0c;然后显示最短跑道长度。下面…

【数据结构】平衡二叉树左旋右旋与红黑树

平衡二叉树左旋右旋与红黑树 平衡二叉树 定义 平衡二叉树是二叉搜索树的一种特殊形式。二叉搜索树&#xff08;Binary Search Tree&#xff0c;BST&#xff09;是一种具有以下性质的二叉树&#xff1a; 对于树中的每个节点&#xff0c;其左子树中的所有节点都小于该节点的值…

求助!什么软件可以人声分离?手机上可以进行人声分离操作吗?

在数字时代&#xff0c;音频处理变得越来越重要&#xff0c;而人声分离技术则是其中的一项关键技术。很多人可能都有过这样的疑问&#xff1a;什么软件可以实现人声分离&#xff1f;手机上能否进行人声分离操作&#xff1f;今天&#xff0c;我们就来为大家解答这些问题&#xf…

Windows 系统安装 VisualSVN Server

一.下载 VisualSVN Server VisualSVN-Server 是 SVN 版本控制中服务器端要使用的软件,就是我们提交代码存在安装这个软件的电脑上,它将很多配置和服务直接帮你完成,简单好用容易上手。VisualSVN Server有三个版本,社区版免费但限15个用户,另有一般和‘企业’两个收费版本…

利用ArcGIS对长江三角洲地区的gdp水平进行聚类

1、导入矢量图、数据 长三角地区矢量图 长三角地区矢量图对应数据 2、连接 3、设置属性将人均gdp数据导入 4、设置标注和图例 选择布局视图 5、聚类 2020年人均gdp地区聚类 6、2005~2020年各地区人均gdp可视化及聚类汇总 &#xff08;1&#xff09;2005~2020可视化 2005 …

C#操作MySQL从入门到精通(13)——对查询结果使用函数

前言 我们有时候需要对查询到的数据使用函数进行处理,比如去掉空格,比如截取一半长度等操作,下面我来详细介绍: 本文使用的测试数据如下: 1、使用文本处理函数 1.1 Left 返回具有指定长度的字符串的左边部分 下面的代码获取email这个列从左边第一个字符开始计算的一共…

大模型基础——从零实现一个Transformer(1)

一、Transformer模型架构图 主要模块&#xff1a; embedding层&#xff1a; Input/Output Embedding&#xff1a; 将每个标记(token)转换为对应的向量表示。 Positional Encoding&#xff1a;由于没有时序信息&#xff0c;需要额外加入位置编码。 N个 block堆叠: Multi-Head …