诸神之眼-nmap详细使用介绍1!基础使用与主机发现篇! (*╹▽╹*) 信息收集 ~ 其二

350 阅读26分钟

文章目录

前言

当前网络安全领域,有很多学习者都喜欢跳过一些基础的知识,直接去使用高级技术,这样虽然在短时间能有明显的反馈,利于让我们找到继续学习下去的动力,但并不适合长期发展。很多技术如果没有一些计算机基础知识,就如同隔空造楼,在中后期我们很难寸进。本博客是博主本人在看过一本书<诸神之眼-Nmap网络安全审计技术揭秘>后根据自己的总结经验,并相当于笔记的形式记录分享给大家。
在这里插入图片描述

安装

Nmap作为一个kali自带的工具,在Windows环境下安装也很简单,安装过程就不在做过多介绍,所有选项都选择默认值即可,除非你很明确你点击的选项是什么作用外,一路点击下一步即可。中间可能让你在安装一个第三方插件,根据要求安装就行。

手动添加环境变量

默认情况下,安装好nmap后他会自动帮我们添加环境变量,但如果因为一些特殊原因你没有添加上环境变量,可以手动进行添加。(在控制台输入nmap看是否有会报错,如果报错则是没有添加环境变量,反之亦然。)
在这里插入图片描述
将nmap添加进入环境变量后,我们在控制台(cmd或powershell都行)输入nmap即可查看一些基本信息

nmap基础使用

nmap最基础的使用方法是nmap <目标IP地址>
如: nmap 127.0.0.1
我们可以使用nmap扫描一下本地端口,查看一下他扫描出来的信息
在这里插入图片描述

# 当前是在2020-11-02 21:35使用了Nmap7.8版本
Starting Nmap 7.80 ( https://nmap.org ) at 2020-11-02 21:35 ?D1ú±ê×?ê±??
# 生成关于127.0.0.1的主机报告
Nmap scan report for hub5emu.sandai.net (127.0.0.1)
# 给出目标主机的状态(up:意味着这台主机处于开机并连上了互联网的状态),并且显示了此主机和我们使用电脑的延迟
Host is up (0.0016s latency).
# 表示在进行的端口扫描中有990个是关闭的
Not shown: 990 closed ports
# 开启端口的表格,PORT:端口、STATE:状态(open:打开, filtered:过滤)、SERVICE:运行的服务名
PORT     STATE    SERVICE
135/tcp  open     msrpc
443/tcp  open     https
445/tcp  open     microsoft-ds
902/tcp  open     iss-realsecure
912/tcp  open     apex-mesh
1001/tcp filtered webpush
5357/tcp open     wsdapi
8000/tcp open     http-alt
8080/tcp open     http-proxy
8082/tcp open     blackice-alerts
# 扫描报告(Nmap完成扫描:扫描1个IP地址(1台主机启动)共用时7.99秒)
Nmap done: 1 IP address (1 host up) scanned in 7.99 seconds

对连续范围内的主机进行扫描

如果觉得接下来扫描耗时较长,我们可以添加参数 -sn: (nmap -sn 127.0.0.1)只进行主机发现,不进行端口扫描(老版本中曾使用-sP,效果和此参数相同)
命令语法: Nmap [IP地址范围]
如: nmap 192.168.1.1-255nmap 192.168.1.* (我寝室的网关如下图),如果你也是Windows系统,可以执行Linux,找到你所在的局域网进行扫描。如果局域网中有任何设备都会被扫描出来。(包括安卓、iOS等手机设备或物联网智能音箱等。)
在这里插入图片描述

在这里插入图片描述

扫描整个子网(C端存活主机探测)

Nmap支持使用CIDR(Classless Inter-Domain Routing, 无类别域间路由),也就是在安全领域中常说的C端存活主机探测主要方式有两种,一种是使用IP+掩码,另一种是在IP最后一位使用*。
命令语法: nmap [IP地址 / 掩码位数]nmap [IP地址前三段.*]
如: nmap 192.168.1.1/24nmap 192.168.1.*(从我上面截图的网关信息中可以看出,我的子网掩码是255.255.255.0,所以我的掩码号就是24,这两个扫描和上述nmap 192.168.1.1-255效果是相同的,这里就不在重复演示了)
在这里插入图片描述

对多个不连续的主机进行扫描(-sn)

命令语法: nmap [ 扫描目标1 扫描目标2 .... 扫描目标n ]
如: nmap -sn 192.168.1.102 192.168.1.162 192.168.1.186 192.168.1.197 192.168.1.217 192.168.1.224 192.168.1.243 192.168.1.249
在这里插入图片描述

在扫描的时候排除指定的目标(--exclude)

加入在扫描一个局域网时候,我们正在使用的设备也处于这个局域网中,这时候我们可以选择排除我们的设备进行扫描。
命令语法: Nmap [ 目标 ] --exclude [排除IP1, 排除IP2, ....排除IPn](如果有多个排除IP需要使用英文逗号,隔开)
如: nmap -sn 192.168.1.1/24 --exclude 192.168.1.162(192.168.1.162:这是我自己电脑的IP)或nmap -sn 192.168.1.1/24 --exclude 192.168.1.162,192.168.1.1
在这里插入图片描述

对一个文本文件中的地址列表进行扫描(-iL)

如果需要经常对一些地址进行扫描,那么我们每次扫描这些地址都需要手动输入是非常麻烦的事情。可以将常用地址保存在一个文本文件中(.txt),扫描的时候只需要将这个文本文件设定为目标即可。
命令语法: nmap -iL [文本文件]
在这里插入图片描述

随机确定扫描目标(-iR)

Nmap还可以随机产生一些目标扫描。(ps:说实话我也不知道这功能有啥用,感觉有点那种 真·没事找事 的感觉!)
命令语法: nmap -iR [目标的数量]
在这里插入图片描述

发现活跃主机(-sn)

上述我已提到过-sn参数作用,在发现活跃主机这块,因为还为涉及到端口扫描技术,我所有的命令都会添加此参数用于减少扫描量,加快扫描速率。除了上述参数外,我还会使用到一个参数--packet-trace,这个参数对我们剖析nmap的原理非常有用,他会返回他当前发送的数据包信息,让我们可以直观的看到他发送了那些数据包。

发现活跃主机技术简介

活跃主机: 处于运行状态,并且网络功能正常的主机。

在现实生活中,如果一台主机处于永久性的无法使用网络状态甚至是关闭电源状态,那么这个主机是非活跃主机。这样的主机我们可以认定为是"绝对安全"的状态。类似这样的主机并不是我们渗透测试关注的对象。

如何发现一个主机是否活跃?我们假设他为如何确定一户人家当前是否有人?
最直接的方法我们可以去敲门,如果房内有人就会做出一定的回应。这个回应可能是问一句"谁?"或者直接开门等操作。
房内的人做出回应这是一个默认的约定,而这套操作同样适用于计算机,只不过需要通过数据包来替换"敲门"的动作。如果对方主机做出了回应,那么就代表这是台活跃主机。

接下来我们要解决的问题就是:

  1. 要像目标主机发送什么数据包?
  2. 为什么目标主机接收到数据包一定要进行回应?

了解这部分技术需要对计算机网络有一定的了解,至少知道TCP/IP分层协议, 他是OSI七层模型的一个精简版,将七层模型合并为四层模型。
在这里插入图片描述

  • 数据链路层(又称:网络接口层): 直接作用于硬件之上的,他们主要负责接收IP数据包,并把这些数据包发送至目标网络。
  • 网络层: 实现网络之间的互联, 根据数据包的IP地址将数据包从一个网络发送到另一个网络。著名的IP协议, ARP协议, ICMP协议, IGMP协议等都在这一层。
  • 传输层: 这层协议算是最少的,主要是TCP和UDP两个,功能是为双方主机提供端到端的服务。有兴趣的可以看我之前写的一篇博客Python使用套接字(socket)实现UDP与TCP通信
  • 应用层功能主要针对客户发出的请求,服务器做出相应并提供相应的服务。很多我没熟知的协议都会在这一层,比如:HTTP协议(超文本传输协议), FTP协议(文件传输协议), SMTP协议(电子邮件传输协议)等。应用层的协议数量是最多的。
    想要了解上述协议具体内容,可以去查看RFC文档 RFC官网不过官网是纯英文的,官方多语言支持。想看中文版本的可以去协议分析网
    接下来发现活跃主机时,我们网络层,传输层,应用层的协议都会涉及。

基于ARP协议的主机发现

ARP协议介绍

ARP协议:地址解析协议(Address Resolution Protocol)

  • TCP/IP协议族: 网络层
  • 主要解决问题: 逻辑地址和物理地址的转换关系。

了解此协议我们先要知道什么是逻辑地址?什么是物理地址?
在整个网络中,我们通常会使用两种地址,一种是逻辑地址,一种是物理地址。同一网段(可以看成是同一个局域网)一般使用的是物理地址,而不同网段成员之间,则使用的是逻辑地址。

为什么要搞这么多地址而不统一成一个地址来的简单?这里我们可以先看一个例子:
你妈想要网购一个鸡毛掸子揍你,那么他需要填写自己的收货地址(天朝-西域-白水城某某小区)通过快递小哥送到家,但如果她发现家里(卧室)本来就有鸡毛掸子,这时候你可能就要出事。这里天朝-西域-白水城某某小区就相当于逻辑地址,而卧室则相当于物理地址。从中我们可以看出,逻辑地址适合长距离的运输,但他其实表达的并不是很精准,而物理地址则可以很精准到表达出一个东西的位置。如果在家里本来就有鸡毛掸子的情况下,你妈还要使用逻辑地址通过快递小哥送到他手上,显然这样会很麻烦。
而在设计软件的时候应用也考虑到了类似为了,为了不 让舍近求远的这种事情发生,我们使用逻辑地址和物理地址两种地址。
上述我们提到同一网段中使用的是物理地址,哪如何定义同一网段呢,连接到同一个交换机(曾经是:集线器, 不过已经被淘汰了),我们当前常用的路由器就内置交换机的功能。

我当前电脑的逻辑地址是192.168.1.162, 我想与192.168.1.1的主机A进行通信,但我并不知道主机B的物理地址,这时候我需要一个可以将我的逻辑地址转换成物理地址的协议,这个协议就是地址解析协议(ARP):RFC826
官方文档说明很详细但过于繁琐,这里我就简述一下:根据ARP规定,我会发出一个ARP请求:内容大概是你好,我的逻辑地址是:192.168.1.162, 我的物理地址是: 9C:B6:D0:1B:8D:3D, 逻辑地址为 192.168.1.1 的主机在吗?我需要和你通信,请告诉我你的物理地址,收到请回答!这个数据包会已广播的形式发送给网段中所有设备。不过只有主机A会回应他,大改就是嗨! 我就是逻辑地址为192.168.1.1的主机,我的物理地址是8C:AB:8E:97:3E:E1。完成这个过程后,我才能和主机A开始正常通信。
在这里插入图片描述

在Nmap中使用ARP协议(-PR)

  • 优点: 准确度高,速度快,结果准确,切暂无有效防御手段(如果不遵循ARP协议,那么将意味着无法正常建立通信!)
  • 缺点: 只能用于同一网段内的主机扫描
  • 使用场景: 当目标主机与我们处于同一网段内

命令语法: nmap -PR [目标]
如: nmap -sn -PR 192.168.1.201
在这里插入图片描述

Nmap中使用ARP协议发送的数据包

我使用抓包软件对Nmap进行了抓包,如下图:
在这里插入图片描述

Frame 40: 42 bytes on wire (336 bits), 42 bytes captured (336 bits) on interface \Device\NPF_{7F4955F9-7D3D-4E3F-87E3-208309681200}, id 0
    Interface id: 0 (\Device\NPF_{7F4955F9-7D3D-4E3F-87E3-208309681200})
    Encapsulation type: Ethernet (1)
    Arrival Time: Nov  3, 2020 19:12:27.387116000 中国标准时间
    [Time shift for this packet: 0.000000000 seconds]
    Epoch Time: 1604401947.387116000 seconds
    [Time delta from previous captured frame: 0.136665000 seconds]
    [Time delta from previous displayed frame: 0.000000000 seconds]
    [Time since reference or first frame: 2.494133000 seconds]
    Frame Number: 40
    Frame Length: 42 bytes (336 bits)
    Capture Length: 42 bytes (336 bits)
    [Frame is marked: False]
    [Frame is ignored: False]
    [Protocols in frame: eth:ethertype:arp]
    [Coloring Rule Name: ARP]
    [Coloring Rule String: arp]
Ethernet II, Src: RivetNet_1b:8d:3d (9c:b6:d0:1b:8d:3d), Dst: Broadcast (ff:ff:ff:ff:ff:ff)
    Destination: Broadcast (ff:ff:ff:ff:ff:ff)
    Source: RivetNet_1b:8d:3d (9c:b6:d0:1b:8d:3d)
    Type: ARP (0x0806)
Address Resolution Protocol (request)
    Hardware type: Ethernet (1)
    Protocol type: IPv4 (0x0800)
    Hardware size: 6
    Protocol size: 4
    Opcode: request (1)
    Sender MAC address: RivetNet_1b:8d:3d (9c:b6:d0:1b:8d:3d)
    Sender IP address: 192.168.1.162
    Target MAC address: 00:00:00_00:00:00 (00:00:00:00:00:00)
    Target IP address: 192.168.1.201

在这里插入图片描述

Frame 41: 42 bytes on wire (336 bits), 42 bytes captured (336 bits) on interface \Device\NPF_{7F4955F9-7D3D-4E3F-87E3-208309681200}, id 0
    Interface id: 0 (\Device\NPF_{7F4955F9-7D3D-4E3F-87E3-208309681200})
    Encapsulation type: Ethernet (1)
    Arrival Time: Nov  3, 2020 19:12:27.493718000 中国标准时间
    [Time shift for this packet: 0.000000000 seconds]
    Epoch Time: 1604401947.493718000 seconds
    [Time delta from previous captured frame: 0.106602000 seconds]
    [Time delta from previous displayed frame: 0.106602000 seconds]
    [Time since reference or first frame: 2.600735000 seconds]
    Frame Number: 41
    Frame Length: 42 bytes (336 bits)
    Capture Length: 42 bytes (336 bits)
    [Frame is marked: False]
    [Frame is ignored: False]
    [Protocols in frame: eth:ethertype:arp]
    [Coloring Rule Name: ARP]
    [Coloring Rule String: arp]
Ethernet II, Src: MEIZUTec_a7:d9:07 (90:f0:52:a7:d9:07), Dst: RivetNet_1b:8d:3d (9c:b6:d0:1b:8d:3d)
    Destination: RivetNet_1b:8d:3d (9c:b6:d0:1b:8d:3d)
    Source: MEIZUTec_a7:d9:07 (90:f0:52:a7:d9:07)
    Type: ARP (0x0806)
Address Resolution Protocol (reply)
    Hardware type: Ethernet (1)
    Protocol type: IPv4 (0x0800)
    Hardware size: 6
    Protocol size: 4
    Opcode: reply (2)
    Sender MAC address: MEIZUTec_a7:d9:07 (90:f0:52:a7:d9:07)
    Sender IP address: 192.168.1.201
    Target MAC address: RivetNet_1b:8d:3d (9c:b6:d0:1b:8d:3d)
    Target IP address: 192.168.1.162

基于ICMP协议的主机发现

ICMP协议介绍

ICMP协议:互联网控制报文协议(Internet Control Message Protocol)

  • TCP/IP协议族: 网络层
  • 主要解决问题: 在IP主机、路由器之间传递控制消息。

相比于ARP协议,ICMP协议会复杂很多,从下述图片可以看出,主要分为差错报告报文和查询报文。

在这里插入图片描述

我们可以用来进行主机发现的主要是查询报文中的

  1. 响应请求或应答
    用来测试发送与接收两端链路及目标主机TCP/IP协议是否正常(只要收到就是正常),我们长使用的ping命令就是基于此报文发送的请求。
  2. 时间戳请求或应答
    ICMP时间戳请求允许系统向另一个系统查询当前的时间。
  3. 地址掩码请求或应答
    ICMP地址掩码请求由源主机发送, 用于无盘系统在引导过程中获取自己的子网掩码,由于一些规定(RFC),需要一些授权才能进行应答。但不是所有设备都会遵循这些规定

在Nmap中使用ICMP协议(-PE-PP-PM)

注: 从这里开始就不要在使用同网段的主机测试了,具体原因我会在下方同网段主机扫描处介绍!

  1. 发送响应请求或应答
    命令语法: nmap -PE [目标]
    如: nmap -sn -PE 218.199.144.6
  2. 发送时间戳请求
    命令语法: nmap -PP [目标]
    如: nmap -sn -PP 218.199.144.6
  3. 发送地址掩码请求或应答
    命令语法: nmap -PM [目标]
    如: nmap -sn -PM 218.199.144.6
    在这里插入图片描述

因为ICMP协议是很多安全机制防御的重点,所有ICMP扫描出来的结果准确度并不高!

使用ping扫描(-PI)

ping扫描这里我就不用多介绍了,nmap中的-PI扫描的原理和我们在命令行中直接使用ping是一样的,能被正常ping通的机器就能被-PI参数扫描到。

在这里插入图片描述

基于TCP协议的主机发现

TCP协议介绍

TCP协议:传输控制协议(Transmission Control Protocol)

  • TCP/IP协议族: 传输层
  • 作用: 一种面向连接的、可靠的、基于字节流的传输层通信协议。

如果有计算机网络基础的同学应该都知道TCP的三次握手,不知道也没关系。
在这里插入图片描述

三次握手过程:

  1. 客户端向服务端发送建立连接(SYN:synchronous)的请求,并携带x值,并且进入建立连接发送(SYN_SEND)状态。
  2. 服务器收到建立连接报文会回应一个确认/建立连接的报文,并携带y值和x+1值,并且进入确认接收状态。
  3. 客户端接收到服务端确认的报文,回应一个确认(ACK:acknowledgement)的请求,并携带y+1值。进入建立(Established)状态

说道网络层应用就不得不提及端口(post)了,网络层的所有协议都会作用在一个确定的端口上,端口最形象的比喻莫过于网上常用的房子的门,我们知道房子的逻辑地址(可以看成是IP),为了分辨网络中多种多样的服务(Web服务,FTP服务, SMTP服务等),会开多个’门’,不同的服务从不同的门进入,而这个’门’就是端口。我会在下面端口扫描技术中详细介绍端口

为什么在这里我会提到端口,因为TCP或下面的UDP之类的运行在网络层的协议,不仅需要目标主机IP,还需要一个端口才行。

在Nmap中使用TCP协议

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

Nmap会去对目标主机发送建立连接的数据包,默认发送到目标主机的80端口上,当目标主机收到Nmap所发送的建立连接请求数据包后会认为我们想要和他的一个端口建立连接,如果这个端口是开放的,目标主机就会按照TCP协议三次握手规定,发送确认/建立连接,如果这个接口是关闭的,目标主机会拒绝这次连接,发送重置(RST:reset)信号。不过在这里我们并不在乎目标主机的接口是否开放,只要他对我们的探针做出了回应就代表他是一个活跃的主机。

命令语法: nmap -PS'端口1,端口2,端口3 ....' [目标]
如: nmap -sn -PS --packet-trace 218.199.144.6
可以手动指定多个端口nmap -sn -PS'22,80,113,1050,35000' 218.199.144.6nmap -sn -PS22-25 218.199.144.6但在只进行主机发现操作(-sn)的情况下,如果发现主机是活跃主机即会立即停止对剩下端口的扫描。如果想扫描多个端口,最好不要携带-sn参数
在这里插入图片描述

注: 如果目标主机是开放的,他给我们发送了确认/建立连接数据包后,我们Nmap并不会返回确认(ACK:acknowledgement)信号,来彻底建立连接,而是会发送重置(RST:reset)信号,取消这次连接,因为这样做可能避免对方的日志记录,降低被发现的可能性。
在这里插入图片描述

TCP 确认(ACK:acknowledgement)扫描(-PA)

这里TCP确认扫描指的并不是进行TCP协议三次握手后最后的确认,而是直接对目标主机发送确认(ACK:acknowledgement)信号,目标主机显然会不清楚这是怎么回事,只能给我们回应一个重置(RST:reset)信号。
在这里插入图片描述

命令语法: nmap -PA'端口1,端口2,端口3 ....' [目标]
如: nmap -sn -PA 218.199.144.6在这里插入图片描述
注: 但在真实环境中,大多数安全防御机制会过滤掉这种莫名其妙的数据包,而造成Nmap的误报。

基于UDP协议的主机发现

UDP协议介绍

UDP协议:用户数据报协议(User Datagram Protocol)

  • TCP/IP协议族: 传输层
  • 作用: UDP完成的工作和TCP是相同的,但UDP协议是非面向连接的。

我的博客Python使用套接字(socket)实现UDP与TCP通信详细介绍了它俩的区别。
因为UDP没有三次握手这种建立连接的过程,导致对UDP端口的扫描难度是高于TCP的,但可靠性却没有TCP端口高。
没有建立连接的过程,我们只能通过UDP的另一种特性进行主机发现,如果一个UDP端口收到一个UDP数据包时,他是关闭的,就会给源端发回一个ICMP端口不可达数据包。如果它是开放的,没有特定的设置下是不会返回任何信息的。
根据这个特性,我们可以利用UDP进行主机发现。利用这个接口,我们要尽量避免使用那些常用的UDP协议端口(DNS:端口53, SNMP:端口161)。因为如果我们发送一个UDP数据包没有得到任何应答,不仅可能是对方是非活跃主机,还可能是已开放的接口。(也可能是数据包在传输过程中丢失)

在Nmap中使用UDP协议(-PU)

Nmap在我们使用UDP扫描活跃主机的时候,会自动选择一个值比较大的端口。
命令语法: nmap -PU [目标]
如: nmap -sn -PU 192.168.43.97
如果我们收到了目标主机的回应就可以判断目标主机是活跃的。
在这里插入图片描述

基于SCTP协议的主机发现

SCTP协议:流控制传输协议(Stream Control Transmission Protocol)

  • TCP/IP协议族: 传输层
  • 作用: 一种面向连接的、可靠的、基于消息流并且运行多地址同时连接的传输层通信协议。

SCTP协议相比于同样是在网络层的TCP和UDP协议来说,使用要少很多,其很大原因是SCTP协议(RFC 2960)的出现相较于TCP(RFC 793)和UDP(RFC 768)要晚20年。

SCTP协议介绍

想要具体了解SCTP协议可以看此博客: SCTP协议详解

在Nmap中使用SCTP协议(-PY)

目前支持这个协议的主机占比并不大,所以这个协议只能作为一个备用手段。
命令语法: nmap -PY [目标]
如: nmap -sn -PY 192.168.43.97
在这里插入图片描述

Nmap中的IP协议

IP协议介绍

IP协议是TCP/IP协议簇(TCP/IP四层模型中所有的协议共同构成)中的核心协议和载体。无论是位于网络层的ICMPIGMP等协议,还是传输层TCPUDP协议都是已IP数据包格式进行传送。
其中协议域长度为8位用来标识是哪个协议向IP传输数据(比如ICMP为1, IGMP为2, IP-in-IP为4, TCP为6, UDP为17, GRE为47, RSP为50等)
Nmap可以向目标主机发送IP数据包来检测对方主机是否活跃,默认情况下,Nmap会使用ICMP,IGMP,IP-in-IP这三种IP协议,不过理论上有上百种IP协议可供我们使用。

在Nmap中指定IP协议(-PO)

命令语法: nmap -PO [目标]
如: nmap -sn -PO 192.168.1.201 相当于 nmap -sn -PO'1,2,4' 192.168.1.201 (这里的-PO中的O,是英文单词中大写的字母,而不是数字0!)
这种方法发送的内容都是空的,容易被目标的安全机制过滤掉,为了避免被过滤,我们可以使用参数--data-length [随机添加字符的大小]
比如 nmap -sn -PO'6,17' --data-length 25 192.168.1.201
在这里插入图片描述

Nmap中的DNS相关选项(-R-n)

DNS: 域名系统(Domain Name System)

  • TCP/IP协议族: 应用层。
  • 主要解决问题: 将输入的网站转换成网站真实IP。

而对外提供服务的WEB服务器大部分都有属于自己的域名。我们可以通过nmap的一些参数从IP中逆向获取到他的域名。如果你当前进行渗透测试的站点服务器是分布式的,可以通过此技术来获取到的域名来获取更多相关服务器IP。默认情况下,Nmap只会扫描处于活跃状态下目标的域名,不过我们可以使用-R强制获取目标域名。

命令语法: nmap -R [目标IP]
在这里插入图片描述
如果目标主机没有设防,我们是可以扫描出对方IP所绑定的域名的。
如果我们已知对方IP只是想用DNS相关技术来扫描对方是否是活跃主机的话,可以使用-n参数替换-R参数。

其他主机发现技术相关属性

跳过主机发现(-P0-Pn)

Nmap所有的主机发现手段都是主动的,所以都可能会被目标主机察觉从而进行一些防御和拦截,但根据Nmap的机制,如果经过扫描我发现对方是非活跃主机,可能就会造成之后比如端口扫描,系统检测等技术的失效。
如果我们通过一些特殊手段,已经知道对方主机的确切IP可以跳过主机发现阶段,从而避免被对方防火墙发现而进行拦截操作。跳过操作也很简单,我们可以使用-P0-Pn这两个参数中的任意一个,添加这个参数的目标会跳过主机发现阶段,强制将主机设置为活跃状态,这两个参数没有区别,早期版本中是-P0,可能是为了避免和-PO混淆,所以又添加了-Pn
命令语法: nmap -Pn [目标IP]
我们可以随便找一个关闭的IP如: nmap -sn -Pn 22.22.22.22
在这里插入图片描述

同网段主机扫描

上述我在测试的时候,基本使用的都是同网段的主机,其实这样的扫描是有问题的,因为Nmap在主机发现这块的设计思路会首先判断目标主机是Nmap所在主机是否在同一网段,如果是相同网段,则直接使用ARP扫描模式,他会覆盖我们指定的扫描模式。

nmap -sn --packet-trace 22.22.22.22
nmap -sn --packet-trace 192.168.1.201

在这里插入图片描述
而且就算强制指定扫描方式,也只会使用ARP的方式进行扫描!

nmap -sn -PY --packet-trace 22.22.22.22
nmap -sn -PY --packet-trace 192.168.1.200

在这里插入图片描述

总结

查看进度

nmap在进行一些扫描操作的时候效率会比较慢,我们可以随机键入一些东西(比如输入个空格之类的)可以查看当前扫描进度。
PS: 别按Ctrl+C!!! 这是停止扫描的命令。
在这里插入图片描述

观察Nmap发送的数据包(--packet-trace)

观察Nmap数据包有两种方式

  1. 我们可以使用--packet-trace参数,此参数会让nmap输出一些相关请求,虽然这些信息并不是所有信息,但几乎包含了所有我们想要看到的信息。
  2. 使用抓包软件,因为Nmap发送的数据包种类众多,所有我这里推荐大家使用Wireshark他不仅功能强大,还是一款支持中文并且免费使用的软件。(官网)使用抓包软件,我们可以查看nmap发送的包的详细信息。

基础使用和主机发现相关参数

参数作用
-sn对多个不连续的主机进行扫描
–exclude在扫描的时候排除指定的目标
-iL对一个文本文件中的地址列表进行扫描
-iR随机确定扫描目标
-sn只进行活跃主机操作
–packet-trace查看当前发送的数据包
-PRARP协议主机发现
-PEICMP协议发送响应请求主机发现
-PPICMP协议发送时间戳请求主机发现
-PMICMP协议发送地址掩码请求主机发现
-PIping(ICMPecho请求)扫描
-PSTCP 建立连接(SYN:synchronous)扫描主机发现
-PATCP 确认(ACK:acknowledgement)扫描主机发现
-PB这是默认的ping扫描选项。它使用TCP 确认(ACK:acknowledgement)扫描主机发现(-PT)和ping(ICMPecho请求)扫描(-PI)两种扫描类型并行扫描。
-PUUDP扫描主机发现
-PYSCTP扫描主机发现
-POIP协议主机发现
-R或-nDNS相关
-P0、-Pn跳过主机发现