【笔记】Nmap工具原理探索

【笔记】Nmap工具原理探索

原文章:【THM】Nmap(Nmap工具使用简介)-学习 - Hekeatsll - 博客园 (cnblogs.com)

Nmap是一款跨平台的开源端口扫描软件,它用来扫描计算机的开放端口,以确定运行的网络服务,并推断出计算机运行的操作系统

Nmap三种基本扫描类型

TCP连接扫描(-sT)

工作原理:通过依次与每个目标端口进行TCP三次握手来确认端口状态。(TCP连接原理可以查看: 【TCP三次握手和四次挥手】)

​ Nmap将会尝试连接到每个指定的TCP端口(通过发送SYN包),然后通过本地机所接收到的响应消息来确定目标端口是否打开。

​ 如果TCP请求消息被发送到一个开放端口,目标服务器将会响应一个设置了SYN/ACK标志位的TCP数据包,然后Nmap会将此端口标记为打开状态(并会通过发送一个带有ACK标志位的TCP数据包来完成握手)。(你完成握手了,你与目标服务建立了连接)

image

​ 如果Nmap发送一个设置了SYN标志的TCP请求消息到一个关闭端口,那么目标服务器将响应一个设置了RST (Reset)标志的TCP数据包,通过此响应消息,Nmap就可以确定目标端口已关闭。

image

​ 如果目标端口是开放的,但此端口隐藏在防火墙后面。有很多防火墙可能会被配置为简单地丢弃传入数据包,如果Nmap发送一个TCP SYN请求,但没有收到任何回复消息,这表示目标端口正在受到防火墙的保护,因此该端口会被Nmap认为是过滤的(filtered)。

image-20240715155309984

tips:TCP连接扫描一般不推荐使用,因为会留下TCP连接日志。

SYN扫描(-sS)

工作原理:通过依次与每个目标端口进行发送设置了SYN标志的TCP请求消息来确认端口状态,并且迅速发送一个设置了RST标志位的TCP数据包断开。

SYN扫描执行的是不完整的TCP三次握手过程,在SYN扫描中,客户端在接收到来自服务器的一个设置了SYN/ACK标志位的数据包之后,将直接发送一个设置了RST标志位的TCP数据包结束握手(这可以防止服务器端重复尝试发出TCP数据包)。image

SYN扫描的优点:

  • SYN扫描可以用来绕过一些旧的入侵检测系统(IDS)。因为那些使用旧技术的IDS所检测的是完整的TCP三次握手,而现代IDS解决方案通常不再只是检测完整的TCP三次握手;正是基于前述原因,SYN扫描现在仍然会被称为“隐形-Stealth”扫描。
  • 不会被web日志记录。侦听开放端口的web应用程序通常不会记录SYN扫描行为,因为一个标准的web日志是在TCP连接完全建立后才开始记录,这再次说明了SYN扫描是隐秘的。
  • 速度更快。使用SYN扫描时,本地计算机无需针对每个目标端口完成TCP三次握手(以及最后断开连接)的全过程,因此,SYN扫描比标准的TCP连接扫描要快得多。

SYN扫描的缺点:

  • 权限需求高。SYN扫描需要使用sudo权限才能在Linux中正常工作,这是因为SYN扫描需要创建原始数据包,在默认情况下,这是root用户才能拥有的特权。
  • 导致目标服务崩溃。不稳定的服务有时会因SYN扫描而宕机,如果客户提供给渗透测试人员的是处于生产环境下的目标机器,则可能会出现一些重大问题。

SYN扫描和TCP连接扫描十分相似,但SYN是不会跟端口服务进行TCP连接的。

UDP扫描(-sU)

工作原理:通过依次与每个目标端口进行多次发送UDP数据包来确认端口状态。

与TCP连接不同,UDP连接是无状态的。UDP连接只是简单地将数据包发往目标端口,并希望数据包能够成功到达,即:UDP并非是通过“握手”来启动连接的,UDP只管发送不管送没送到。

当一个数据包被发送到一个开放的UDP端口时:理论上应该不会有响应消息,此时Nmap会将该端口识别为open|filtered状态(UDP扫描会猜测目标UDP端口是开放的,但该目标端口也可能是被防火墙过滤的);

如果客户端得到一个UDP响应消息(这是非常不寻常的,一般响应的消息是部分错误回收到IP层的ICMP报文来通知有问题的消息,如,网络不可达,端口不可达,主机不可用等),那么Nmap会将目标UDP端口识别为开放状态;

常见的情况是客户端不会得到任何响应消息,在此情况下,数据包请求将会被第二次发送给目标UDP端口以进行双重检查,如果第二次发送数据包仍然没有得到响应,那么目标UDP端口就会被识别为open|filtered状态,然后Nmap将继续扫描下一个目标UDP端口。

当一个数据包被发送到一个关闭的UDP端口时:目标服务器应该响应一个ICMP (ping)数据包,其中会包含一个"端口不可达"的消息,Nmap会清楚地识别到这个UDP端口是关闭状态,然后Nmap将继续扫描下一个目标UDP端口。

由于很难识别UDP端口是否实际开放,所以与其他各种基于TCP的扫描相比,UDP扫描往往非常慢(在连接良好的情况下,仍可能要20分钟才能扫描完前1000个端口);基于前述原因,在运行UDP扫描时,通常可以启用--top-ports <number>,例如,我们可以使用nmap -sU ——top-ports 20 <target>扫描前20个最常用的UDP端口,这样就能够获得一个更可接受的扫描时间。

当扫描不常用的UDP端口时,Nmap通常会发送完全空的请求——发送原始UDP数据包;对于通常由知名服务所占用的UDP端口(常用UDP端口),Nmap将转而发送特定于协议的数据包(比如53端口是运行dns服务的标准UDP端口,在对53端口进行探测时,Nmap会发送dns数据包),这更有可能得到目标的响应,从而能得出更准确的结果。

Nmap不常见的端口扫描类型:NULL, FIN和Xmas扫描

NULL, FIN和Xmas扫描并不是很常用的扫描类型(这三种扫描类型都是基于TCP的),所以我们在此仅作简单介绍;这三种扫描是相互关联的,它们往往比SYN隐形扫描更加隐蔽。

TCP Null扫描

顾名思义,NULL扫描(-sN)在发送TCP请求时不会设置任何标志位。

如果此时目标端口是关闭的,那么目标主机应该响应一个设置了RST标志的数据包。

image

TCP FIN扫描

FIN扫描(-sF)的工作方式与NULL扫描几乎相同,但是,FIN扫描不会发送一个完全空的数据包,而是发送一个带有FIN标志的数据包(FIN标志可用于关闭正在活动的TCP连接);

同样,如果此时目标端口是关闭状态,Nmap会期望得到一个设置了RST标志的数据包响应。

image

TCP Xmas扫描

与NULL扫描、FIN扫描类似,Xmas扫描(-sX)会发送一个格式错误的TCP数据包。

如果此时目标端口是关闭状态,Nmap会期望得到一个设置了RST标志的响应数据包。

Xmas扫描被称为圣诞(xmas的含义为圣诞)扫描,因为Xmas扫描所发送的TCP数据包设置了PSH标志(PSH标志用于指示发送方应该尽快将数据发送给接收方,而不是等待缓冲区填满再发送。)、URG标志(URG标志指示数据包中包含紧急数据,这通常意味着这些数据应该被优先处理。)和FIN标志,当我们使用Wireshark进行数据包捕获时——相关的捕获结果看起来就像一棵闪烁的圣诞树。

image

使用以上三种扫描方式来探测一个开放端口,那么预期可得到的响应情况是相同的——如果目标端口是开放的,则目标端口不会对以上三种扫描所发送的畸形数据包进行响应;

不幸的是(就像开放的UDP端口一样),目标端口还可能正被防火墙所保护(这也是一种预期的情况),因此,NULL, FIN和Xmas扫描往往会将目标端口识别为open|filtered(开放|过滤)状态、closed(关闭)状态或者filtered(过滤)状态;

如果一个端口被以上三种扫描之一识别为filtered(过滤)状态,那么通常是因为目标已经响应了一个ICMP不可达数据包。

(结论:三种扫描方式没有接收到目标端口的响应会将目标端口识别为open|filtered(开放|过滤)状态;收到目标端口一个设置了RST标志的响应数据包会将目标端口识别为closed(关闭)状态;收到目标端口响应的一个ICMP不可达数据包会将目标端口识别为filtered(过滤)状态)

ICMP网络扫描

工作原理:通过发送给范围内的每个IP地址发送ICMP报文来确认主机存活状态。

为了探测目标主机存活情况,我们可以使用Nmap执行 ICMP 网络扫描(也就是ping扫描),在ping扫描中,Nmap会向指定网络范围内的每个IP地址发送 ICMP 报文,当接收到响应时,Nmap则会将发出响应的IP地址标记为活动主机。执行ping扫描得到的结果并不总是准确的,但是它仍然可以提供一些参考信息。

在Ping扫描中,如何确认目标主机在线:

  • 当ping扫描发送TCP ACK报文到目标机80端口时,存活主机可能会以TCP RST报文作为响应;
  • 当ping扫描发送ICMP echo 请求到目标机时,存活主机可能会作出一个正常的Ping应答(CMP Echo reply);
  • 当ping扫描发送ICMP时间戳请求到目标机时,存活主机可能会返回当前系统时间;(ICMP时间戳请求允许一个系统向另一个系统查询当前的时间,如果目标主机返回了时间,则说明目标主机是活动的)
  • 当ping扫描发送TCP SYN报文到目标机的443端口时,存活主机可能会以TCP SYN+ACK报文或者RST报文作为响应。

tips:使用-sn参数开关的ping扫描会默认发送四种不同类型的数据包来探测目标主机是否在线,只要收到其中一个数据包的回复,那就证明目标机是开启的;使用四种不同类型的数据包可以避免因防火墙阻塞或丢包造成的探测错误。

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

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

相关文章

QUIC(更新中... ...)

本文档只记录我个人认为应该着重进行一下笔记的部分。 RFC QUIC 基本内容介绍在RFC 9000,加密的实现在9001,丢包检测和拥塞机制在9002。 简介 是由Google开发的一种基于UDP的传输层协议,旨在提高网络传输的性能和安全性。关键要素:UDP 443端口,将TLS 1.3内置在QUIC协议报文…

论文阅读:使用集合预测网络进行联合实体和关系提取

github代码:http://github.com/DianboWork/SPN4RE 目的从本质上讲,句子中提到的关系三元组是集合的形式,它没有元素之间的内在顺序,并表现出排列不变的特征。(多个三元组的抽取顺序,对抽取结果没有影响) 然而,以前基于 seq2seq 的模型需要事先使用一些启发式全局规则将…

打造个人贴身助理-小白必备AI技能

打造个人贴身助理-小白必备AI技能 将你的公众号接入AI智能体 登录后台开启开发者功能coze 后台创建 bot 登录 Coze 国内官网地址:https://www.coze.cn。点击右上角【开始使用】。 创建智能体 点击左上角【创建Bot】配置选择模型配置人设和插件发布到自己的公众号成功发布进入公…

免费可视化工具如何打造动态销售管理看板?

在这个数据驱动的时代,销售管理不再仅仅依赖于传统的报表和口头汇报,而是越来越倾向于直观、动态的可视化展示。可视化工具的出现,无疑为中小企业乃至大型企业提供了强大的助力,帮助销售团队构建高效、直观的销售管理看板,让数据说话,决策有据可依。今天要说的是,如何利…

jmeter分布式实战

一、原理(jdk和jmeter版本必须一致)二、配置执行机slave 修改配置文件:JMETER_HOME/bin/jmeter.properties 中如下信息即可完成配置执行机远程启动端口(默认为 1099) server_port=1029 server.rmi.localport=1029 server.rmi.ssl.disable改为true 启动执行机服务器: 管理…

Microsoft Office 自定义安装部署工具 | Mocreak

软件简介: Mocreak 是一款一键自动化下载、安装、部署正版 Office 的办公增强工具。该工具完全免费、无广告、绿色、无毒、简约、高效、安全。 软件特点: 一键快速下载、安装、部署最新版 Microsoft Office 软件。提供简约、高效,且可自定义的图形界面,提升部署效率。支持将…

旋转相册

做自己的太阳,成为别人的光!

Spring MVC 中的拦截器的使用“拦截器基本配置” 和 “拦截器高级配置”

1. Spring MVC 中的拦截器的使用“拦截器基本配置” 和 “拦截器高级配置” @目录1. Spring MVC 中的拦截器的使用“拦截器基本配置” 和 “拦截器高级配置”2. 拦截器3. Spring MVC 中的拦截器的创建和基本配置3.1 定义拦截3.2 拦截器基本配置3.3 拦截器的高级配置4. Spring M…

docker化 spring boot 项目参数传入

例如有如下参数: spring.rabbitmq.host = localhost spring.rabbitmq.port = 5672 spring.rabbitmq.username = guest spring.rabbitmq.password = guest resolute.rabbitmq.publishQueueName = resolute-run-request resolute.rabbitmq.exchange = resolute通过环境变量传入,…

vscode --- 编辑框禁止差异对比

如上图,编辑框差异对比太花哨,可关闭

[极客大挑战 2020]Greatphp 1

原生类反序列化 <?php error_reporting(0); class SYCLOVER {public $syc;public $lover;public function __wakeup(){if( ($this->syc != $this->lover) && (md5($this->syc) === md5($this->lover)) && (sha1($this->syc)=== sha1($this-…