诸神之眼-nmap详细使用介绍2!端口扫描技术和操作系统与服务检测篇! (*╹▽╹*) 信息收集 ~ 其三

端口扫描技术相关知识

端口介绍

网上最多对端口形容的方法就是把它比作房子的门,不得不说这个比喻非常形象,他不仅形容出了端口的作用,就算找到目标的房子(IP),我们也得通过具体的门(端口)才能进入到房子内。而且房子是可以有多个门的,这点端口也同样是可以为多个,最多可以达到65536(0~65535)个。
之所以我们需要那么多端口,主要是想实现一机多用,我们一台服务器可以同时上线多个服务,比如我们的一个服务器,既可以运行MySQL服务,跑在3306端口上,又可以运行ssh服务在22端口上,同时还可以运行http服务在80端口上等。

端口分类

上述我们提到过能用的端口一共有65536(0~65535)个,在这么多端口中,其中分了三大类:

  1. 公认端口/常用端口(0~1024): 这些端口是最常用的端口,通常这些端口已明确的和某些服务进行的绑定。(比如: 80的超文本传输协议, 443的加密的超文本传输协议, 22的ssh等)
  2. 注册端口(1025~49151): 这部分端口通常也会被某些程序绑定,但并没有明确规定。(比如MySQL默认会绑定在3306端口,reids会默认绑定6379端口。)
  3. 动态端口/私有端口(49152~65535): 我们常见的服务一般都不会使用这部分端口,这部分端口常常是留给我们用户之间使用的,很多木马病毒就比较喜欢这部分端口。

端口会根据协议(TCP协议端口,UDP协议端口)不同分为不同类型的端口,比如TCP的22端口和UDP的22端口可以同时存在,并且互不影响。

Nmap对端口的定义

我们使用Nmap扫描端口时候他会给我们返回一些端口端口相关信息,这些信息具体情况如下:

名称解释
open(开放的)应用程序正在该端口接收TCP 连接或者UDP报文。
closed(关闭的)关闭的端口对于Nmap也是可访问的(它接受Nmap的探测报文并作出响应), 但没有应用程序在其上监听。
filtered(被过滤的)由于包过滤阻止探测报文到达端口, Nmap无法确定该端口是否开放。
unfiltered(未被过滤的)未被过滤状态意味着端口可访问,但Nmap不能确定它是开放还是关闭。
open|filtered(开放或者被过滤的)当无法确定端口是开放还是被过滤的,Nmap就把该端口划分成 这种状态。开放的端口不响应就是一个例子。
closed|filtered(关闭或者被过滤的)该状态用于Nmap不能确定端口是关闭的还是被过滤的。 它只可能出现在IPID Idle扫描中

Nmap中的端口扫描技术

因为TCP协议更有利于扫描发现的性质和他更广泛的用途导致在Nmap中TCP的检测手段比UDP多的。

指定端口扫描(-p-F)

在众多的端口中,Nmap默认情况下并不会去主动扫描所有端口,而是扫描前一千个端口,如果我们想要指定他扫描的端口,可以使用-p参数。使用-F扫描常见的一百个端口。
比如

  1. 扫描常用端口(具体有哪些,可以自行携带--packet-trace参数查看。): nmap -F 目标namp --top-ports 数量 目标
    其中-F默认是扫描常见的一百个端口,而–top-ports可以指定数量,默认是10个
    nmap -F 192.168.43.36nmap --top-ports 3 192.168.43.36

在这里插入图片描述

  1. 指定端口号查询: nmap -p 端口,端口,端口.... 目标
    nmap -p 22 192.168.43.36nmap -p 22,80,3306 192.168.43.36nmap -p 22-25 192.168.43.36
    PS: 可以使用 namp -p * 目标扫描所有的端口,不过这种扫描速度极慢,切需要消耗大量资源。
    在这里插入图片描述
  2. 使用名字扫描: nmap -p 英文协议名,英文协议名 目标
    nmap -p ssh,http,mysql 192.168.43.36
    在这里插入图片描述
  3. 指定协议扫描: nmap -p U:UDP端口号,T:TCP端口号 目标
    nmap -sU -sT -p U:21,T:80 192.168.43.36
    PS:进行UDP扫描的时候,我们需要指定一些端口的扫描方式。下方我会开始介绍端口的扫描方式
    在这里插入图片描述

TCP建立连接(SYN:synchronous)扫描(-sS)

简介

建立连接扫描(又称之为半连接扫描)是当前最流行的扫描方式,如果我们使用Nmap未指定参数时,Nmap就会默认使用此扫描模式,这种模式扫描速度快,效率高,也有不容易被安全设备发现的特点。不过这种扫描也有限制就是必须要在有超管权限(root或administrator),我在之前的Nmap的主机发现博客介绍过这种扫描,不过当时是进行主机发现,使用的参数并不相同。
这种扫描主要是针对TCP协议的扫描,他通过TCP协议的三次握手,但他并不会完成这个握手操作,在第二步的时候就停止正常握手操作,而是转而发送一个重置(RST:reset)信号来终止对主机的连接,因为没有完成建立连接,目标主机将此次事件写入日志记录,可以减少被发现的可能性。
在这里插入图片描述

使用方法

nmap -sS 目标
nmap -sS 192.168.43.36
在这里插入图片描述

TCP连接(Connect)扫描(-sT)

简介

连接扫描和上述的半连接扫描,这种扫描是建立完整的TCP连接,因为建立了完整的连接,所以nmap就不用去使用超管权限来查看端口的状况,所以就不再需要超管权限(root或administrator)即可完成扫描。
在这里插入图片描述

使用方法

nmap -sT 目标
nmap -sT 192.168.43.36
在这里插入图片描述
因为连接扫描和半连接扫描很像,它们的应答状态是相同的。

TCP 结束连接(FIN:finish)扫描(-sF)

简介

说道TCP结束连接(FIN:finish)扫描,我们要了解一下TCP在关闭连接时候的四次握手, 根据关闭的发起方不同分为主动方和被动方,主动方会主动发起结束连接,在正常情况下,会进行下述图片的操作彻底和关闭连接。
在这里插入图片描述
如果我们访问的对方主机端口是关闭的话,对方如果遵守FTP协议(RFC793),会给我们返回一个重置(RST:reset)标识。但也不排除对方的安全机制会拦截这种莫名其妙的请求。
这种扫描方法使用场景较少,一般情况下都用不到。使用它也很难扫描到常规端口。当前博主本人猜测此功能最主要的作用应该是作为探针探测对方的操作系统,根据操作系统的不同可能我们在未建立连接时发送结束连接(FIN)的返回结果是不同的。

使用方法

nmap -sF 目标
nmap -sF 192.168.192.81
在这里插入图片描述

TCP 空数据(NULL)扫描(-sN)

简介

这个顾名思义是不包含任何标识(比如说建立连接(SYN:synchronous)、结束连接(FIN:finish)数据包。虽然按照FTP协议(RFC793),如果对方端口处于关闭状态他就会给我们返回一个重置(RST:reset)标识。不过有大部分安全机制可能也都会对这样的空数据进行拦截。使得我们无法正常获得对方开启端口的数据。

使用方法

nmap -sN 目标
nmap -sN 192.168.192.81
在这里插入图片描述

TCP Xmas Tree(圣诞树)扫描(-sX)

Xmas Tree中文直译为Xmas Tree,不过我暂不知为什么会给他其一个这样的名字,如果按照他的功能其一个比较贴切的名字,给成全标识扫描会更加准确。说道这个圣诞树扫描,需要先了解一下TCP的六种标识分别是建立连接(SYN:synchronous)、确认(ACK:acknowledgement)、重置(RST:reset)、结束连接(FIN:finish)、紧急(URG:URGent)、推送(PSH:push)。上述我在介绍一些TCP相关扫描技术时候已经介绍过上述其中四种的具体用处,剩余的紧急和推送的作用都是在TCP正常连接中用来传输数据使用,紧急顾民意是就是说的这条信息急需处理,不要排队了,直接插队到最前面发送。
TCP所有标志位被设置为1的数据包被称为圣诞树数据包(XMas Tree packet),之所以叫这个名是因为这些标志位就像圣诞树上灯一样全部被点亮。
当你发送了这样一个数据包之后,不同的操作系统对其的响应方式是不一样的,所以这也是对系统的一种探测手段,很少会直接用这种扫描进行端口开关的检测。此外,通常来说,目标系统需要对这个数据包进行更复杂的处理(毕竟点的灯比较多),相比一般的包处理耗费的资源会更多,因此也可以用作DOS攻击。

应答状态
目标主机的应答目标端口的状态
如果目标主机给一个确认/建立连接(SYN/ACK)应答open(开放的)
如果目标主机给一个重置(RST:reset)应答closed(关闭的)
如果目标主机没有给出应答filtered(被过滤的)
ICMP无法抵达错误(类型3, 代码1, 2, 3, 4, 10, 13)filtered(被过滤的)
如果目标主机没有给出应答(只会出现在结束连接扫描(-sF)、空数据(-sN)、圣诞树(-sX)扫描中)open(开放的)|filtered(被过滤的)
使用方法

nmap -sX 目标
nmap -sX 192.168.192.81
在这里插入图片描述

UDP扫描(-sU)

介绍

这是当前唯一一个用于扫描UDP接口的属性,因为UDP没有建立连接的过程,我们只能通过UDP的另一种特性进行主机发现,如果一个UDP端口收到一个UDP数据包时,他是关闭的,就会给源端发回一个ICMP端口不可达数据包。如果它是开放的,没有特定的设置下是不会返回任何信息的。

使用方法

端口扫描的速度相当慢,使用连接(connect)扫描端口:
nmap -sU 目标
nmap -sU 192.168.192.81

从上图中我们可以看出扫描的时候可能会产生一些open(开放的)\|filtered(被过滤的)状态的接口除此之外还可能有filtered(被过滤的)出现,往往出现这种状态时我们并不能完全确定对方主机是开发还是关闭的,因为UDP程序的服务一般不会对空数据做出回应,并且不同的服务都有着自己不同的数据格式,Nmap将常见的UDP服务的不同数据包都存储在Nmap-service-probes中,我们可以使用-sV-A(这两个参数和操作系统与服务检测有关,在下方我会进行详细介绍),Nmap将会向状态为open(开放的)|filtered(被过滤的)发送一些特定的UDP探针(probe),如果目标端口对任何一个探针有了反应,状态都会被修改为open
在这里插入图片描述

应答状态
目标主机的应答目标端口的状态
从目标端口得到任意的UDP应答open(开放的)
如果目标主机没有给出应答open(开放的)|filtered(被过滤的)
ICMP无法抵达错误(类型3, 代码3)closed(关闭的)
ICMP无法抵达错误(类型3, 代码1, 2, 9, 10, 13)filtered(被过滤的)

操作系统与服务检测

操作系统检测介绍

Nmap可以根据探针的不同回应,猜测对方的一些系统信息(比如:供应商的名字、操作系统、操作系统版本、设备类型等),为了能尽力准确和详细的猜测出对方主机的信息,Nmap会检查初始序列号(ISN)、TCP选项、IP标识符、(ID)数字时间戳、显示拥塞通知(ECN)、窗口大小等细节。
Nmap有个数据库专门存储不同系统对这些探针返回的不同相应(不同的回应组成了系统的指纹信息),在对这些指纹进行对比后,Nmap就能大致猜出来对方到底是什么系统。

操作系统检测Nmap相关参数

参数作用
-O通过端口扫描的信息猜测系统
--osscan-limit只对满足"同时具有状态为open和closed的端口"条件的主机进行操作系统检测(配合-P0扫描可以节省大量时间)
--osscan-guess猜测目标系统
--fuzzy模糊查询,也有猜测目标系统的功能和上述--osscan-guess在操作系统检测功能时和上述返回的结果相同。(一般我喜欢用这个属性是因为他比较短,好记,没特别的作用。)
--max-retries对操作系统检测尝试的次数(默认为5)

操作系统检测并不能保证一定成功,因为操作系统检测是检测对方端口返回的信息生成的指纹信息猜测,如果对方开放的端口过少,或者是只开放了一些并不常规的端口都可能会导致我们检测失败,比如下方我对一台手机进行了系统检测,返回的信息就是:与此主机匹配的指纹太多,无法提供特定的操作系统详细信息。
在这里插入图片描述
正常情况下使用-O,我们就可以探测目标系统,但如果我们Nmap数据库中没有和目标系统匹配的系统,就会出现如下提示(No exact OS matches for host (If you know what OS is running on it, see https://nmap.org/submit/ ).)并且告诉你他的TCP/IP 指纹信息,看到这个信息。
在这里插入图片描述
如果我们使用--fuzzy--osscan-guess,可以让nmap自动猜测目标的未知系统
我当前使用的是win10的20H2版本,nmap当前还未收录此系统,但使用nmap模糊查询到的结果已经很接近正确系统版本了。

TCP/IP指纹信息

我们也可以自行查看TCP/IP指纹信息来判断目标系统
假设当前有如下的指纹信息

SCAN(V=7.80%E=4%D=11/23%OT=9001%CT=1%CU=43451%PV=Y%DS=1%DC=D%G=Y%M=D2BA8F%TM=5FBB9BE2%P=i686-pc-windows-windows)
SEQ(SP=FE%GCD=1%ISR=10B%TI=Z%CI=Z%II=I%TS=A)
OPS(O1=M5B4ST11NW8%O2=M5B4ST11NW8%O3=M5B4NNT11NW8%O4=M5B4ST11NW8%O5=M5B4ST11NW8%O6=M5B4ST11)
WIN(W1=FFFF%W2=FFFF%W3=FFFF%W4=FFFF%W5=FFFF%W6=FFFF)
ECN(R=Y%DF=Y%T=40%W=FFFF%O=M5B4NNSNW8%CC=Y%Q=)
T1(R=Y%DF=Y%T=40%S=O%A=S+%F=AS%RD=0%Q=)
T2(R=N)
T3(R=N)
T4(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)
T5(R=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)
T6(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)
T7(R=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)
U1(R=Y%DF=N%T=40%IPL=164%UN=0%RIPL=G%RID=G%RIPCK=G%RUCK=G%RUD=G)
IE(R=Y%DFI=N%T=40%CD=S)

我的指纹信息并非包含nmap所有相关指纹信息,如果想要了解所有相关信息,可以去自行阅读Nmap官网文档,我当前的是扫描结果包括SCANSEQOPSWINECNT1~T7U1IE, 在这些探针中SEQWINOPS这几个向开放的TCP端口中发送的探针和SCAN等探针我都会详细介绍一下,其中每个探针中的信息之间会使用百分号%隔开

  1. SCAN: 他所包含的信息主要是我们自己的一些信息,如果其他人想要在相同环境下复现我们的扫描时就需要用到这些信息。比如
字母含义
V当前Nmap版本
D当前扫描时间
OTCT扫描中使用的TCP端口(OT指开放open的端口, CT指关闭closed的端口)
CU扫描中使用的UDP端口
PV是否为私有IP
DS指从Nmap到目标主机的距离跳数
G表示扫描的结果状况(Y表示较好,有参考价值)
TM扫描消耗的时间
PNmap所在主机的操作系统类型
  1. SEQ
字母含义
SPTCP随机生成的初始序列号
GCDTCP的增量
ISRISN的序率,用于TCP的生成初始化序列号(ISN应该是一个随机算法,这里的值可能是这个随机算法的种子,这样理解可能不对,如果有大佬知道具体含义,可以在下方评论区指出)
TI给SEQ探针回应的数据包中IP头部的ID值
II给出了ICMP探针回应数据包中的IP头部的ID值
TS返回数据的时间戳
  1. WIN:此探针用来返回值的初始化窗口大小,W1~W6分别指六个窗口。

  2. OPS: 其中O1~O6值相同,代表的含义也一样,具体含义如下
    1. M5B4 给出了TCP数据包每次能够传输的最大数据分段;
    2. ST11确认(ACK)的可选信息和数据包的时间戳内容
    3. N 空操作
    4. W8 指窗口大小(W后的数字是不固定的)

  3. ECN:

字母含义
R目标是否对我们回应(Y代表回应了,N代表没有)
DF表示IP数据包的分段标志位是否被设置
T给出回应数据包IP中的TTL(生存时间)值,(TTL:没进过一个主机TTL就会减一,当TTL变为0时,此数据包就会被丢弃)
WTCP初始化窗口大小信息
OTCP选项信息
CC目标拥塞控制能力(如果是Y则是支持 显式拥塞通知Explicit Congestion Notification (ECN))
  1. T1到T7是发送的七个不同种类的TCP数据包回应,其中六七会发往关闭的端口
  2. U1 UDP端口返回的结果
  3. IE探针是基于ICMP协议,由两个探针组成。
    操作系统的检测还是比较困难的,如果对方有一个比较强大的防火墙,可能就可以让我们无功而返,如下图,我去扫描一个Windows server2019版本的服务器,他的防火墙就会将我的很多探针拦截。

Nmap服务发现

Nmap在扫描端口时会自动将扫描到的开放端口和此端口的常用服务对应,但用过服务器的大家应该都知道,这些服务端口并不是固定的,我们可以手段改变其端口,让其映射到我们想要的端口上,这样Nmap默认将端口对应成的服务可能就是错误的,甚至误导我们使用错误的攻击方式。比如,我在本地的223端口启动了ssh服务,但Nmap扫描我的223端口发现开发后就自动将服务认定成了cdc。
在这里插入图片描述

服务发现常用属性

属性含义
-sV服务版本探测
--allports不为版本探测排除任何端口(nmap会自动排除一些端口,比如我们向打印机常用端口,发送一些探针,可能会被打印机打印出来,使用此属性可以避免排除这些端口)
--version-intensity [0~9]设置服务版本探测的级别(0~9)数字越大,级别就越高,使用的探针就越多,相对的花费的时间也越多,默认情况下为7级--version-intensity 7
--version-light轻量模式的版本探测,相当于2级服务版本探测--version-intensity 2
--version-all使用全部探针探测服务版本,相当于9级服务版本探测--version-intensity 9
--version-trace跟踪版本扫描活动,会输出详细的扫描信息
-sR远程函数调用(Remote Function Call)这种扫描需要和其他扫描方式相结合,根据端口扫描结果选择所有处于打开状态的端口向它们发出SunRPC程序的NULL命令,以确定它们是否是RPC端口。(nmap -sS -sR 目标)

启动服务发现后,我再次探测我223端口,发现这次成功探测到了正确的服务(我的ssh跑在wsl中具体部署方法可以查看我的博客,这篇博客将如何将wsl2部署在Windows server2019服务器中,此方法同样适用开启了wsl的Windows10系统)
在这里插入图片描述

nmap端口扫描和操作系统相关参数

参数 | 作用
-A | 同时使用端口扫描技术和操作系统检测技术等相关技术(还会用一些扫描的脚本)。
-v | 显示详细的扫描信息
-b | FTP反弹攻击(bounce attack) 使用方法-b 用户名(username):密码(password)@服务(server):端口(port),这种方法可以使用,此方法可以利用一台代理服务器帮助我们发送信息。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寻_觅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值