Nmap使用指南

编程知识 更新时间:2023-05-02 01:35:04

Nmap使用指南

  • Nmap介绍
  • Nmap安装
  • Nmap基本扫描
  • Nmap各个阶段
    • 指定目标
      • ip/numbit 形式
      • 用 - 指定范围
      • 随机选择目标
      • 排除目标
      • 排除文件中的目标
    • 目标探测
      • 列出目标
      • 不进行端口扫描(Ping 扫描)
      • Ping 扫描
      • 禁止目标存活判断
      • TCP SYN Ping
      • TCP ACK Ping
      • UDP Ping
      • SCTP INIT Ping
      • ICMP Ping Types
      • IP Protocol Ping
      • ARP Ping
      • 不进行 ARP 或者 ND Ping
      • 追踪到主机的路径
      • 不进行反向域名解析
      • 所有目标都进行反向域名解析
      • 扫描所有解析出的地址
      • 使用系统域名解析器
      • 指定反向域名解析的 DNS 服务器
    • 服务和版本探测
      • 版本探测
      • 不排除端口
      • 版本扫描强度
      • 轻量级模式
      • 尝试每个探测
      • 跟踪版本扫描活动
      • RPC 扫描
    • 操作系统探测
      • 启用操作系统检测
      • 操作系统检测只针对特定的目标
      • 推测操作系统检测结果
    • 时间和性能
      • 调整并行扫描组的大小
      • 调整探测报文的并行度
      • 调整探测报文超时时间
      • 放弃低速目标主机
      • 调整探测报文的时间间隔
      • 设置时间模板
    • 输出
      • 标准输出
      • XML 格式输出
      • ScRipT KIdd|3 oUTpuT
      • Grep 输出
      • 输出至所有格式
      • 输出信息的详细程度
      • 设置调试级别
      • 跟踪发送和接收的报文
      • 列举接口和路由
      • 在输出文件中添加
      • 继续中断的扫描
      • 设置 XSL 样式表,转换 XML 输出
      • 忽略XML声明的XSL样式表
  • Nmap端口扫描
    • 端口状态
      • open(开放)
      • closed(关闭)
      • filtered(过滤)
      • unfiltered(未被过滤)
      • open|filtered(开放或者被过滤)
      • closed|filtered(关闭或者被过滤)
    • 端口扫描技术
      • TCP SYN 扫描
      • TCP connect() 扫描
      • UDP 扫描
      • TCP Null、FIN、Xmas 扫描
      • TCP ACK扫描
      • TCP Maimon 扫描
      • 定制 TCP 扫描
      • Idle scan(空转扫描)
      • IP 协议扫描
      • FTP 反弹扫描
    • 指定端口和扫描顺序
      • 只扫描指定的端口
      • 快速扫描(有限的端口)
      • 顺序扫描端口
  • Namp进阶(前文精简版)
    • 常用选项
    • TCP扫描选项
    • UDP扫描选项
    • 目标端口选项
    • 输出选项
    • 时间排程控制选项
    • 扫描IPv6主机
    • 脚本引擎功能(Nmap Scripting Engine,NSE)
    • 规避检测的选项

Nmap介绍

Nmap 是一个网络连接端扫描软件,用来扫描网上电脑开放的网络连接端。确定哪些服务运行在哪些连接端,并且推断计算机运行哪个操作系统(这是亦称 fingerprinting)。它是网络管理员必用的软件之一,以及用以评估网络系统安全。它不局限于仅仅收集信息和枚举,同时可以用来作为一个漏洞探测器或安全扫描器。

除了端口扫描外,Nmap还具备如下功能:

1、主机探测:Nmap可査找目标网络中的在线主机。默认情况下Nmap通过4种方式,ICMP-echo请求(ping)、向443端口发送TCP-SYN包、向80端口发送TCP-ACK包和ICMP-时间戳请求,发现目标主机。
2、服务/版本检测:在发现开放端口后,Nmap可进一步检查目标主机的检测服务协议、应用程序名称、版本号等信息。
3、操作系统检测:Nmap向远程主机发送一系列数据包,并能够将远程主机的响应与操作系统指纹数据库进行比较。如果发现了匹配结果,它就会显示匹配的操作系统。它确实可能无法识别目标主机的操作系统;在这种情况下,如果您知道目标系统上使用的何种操作系统,可在它提供的从URL里提交有关信息,更新它的操作系统指纹数据库。 
4、网络路由跟踪:它通过多种协议访问目标主机的不同端口,以尽可能访问目标主机。Nmap 路由跟踪功能从TTL的高值开始测试,逐步递减TTL,直到它到零为止。
5、Nmap脚本引擎:这个功能扩充了Nmap的用途。如果您要使用Nmap实现它(在默认情况下)没有的检测功能,可利用它的脚本引擎手写一个检测脚本。目前,Nmap可检査网络服务的漏洞,还可以枚举目标系统的资源。

Nmap 使用不同的技术来执行扫描,包括:TCP 的 connect 扫描,TCP 反向的 ident 扫描,FTP 反弹扫描等。所有这些扫描的类型有自己的优点和缺点。

Nmap 的各个

Nmap安装

  1. Windows的话直接去官网下载安装包直接安装,下载地址
  2. MacOS的话可以通过从Nmap站点或通过Homebrew下载".dmg"安装软件包来安装Nmap,使用brew install nmap
  3. Kali的话是已经自带了nmap
  4. Ubuntu和Debian如果没有安装的话,使用命令sudo apt update\sudo apt install nmap即可安装
  5. CentOS和Fedora如果没有安装的话,使用sudo dnf install nmap即可安装

Nmap基本扫描

  1. 扫描单个网络:
nmap 192.168.1.1/www.baidu
  1. 扫描多个网络/目标:
 nmap 192.168.1.1 192.168.1.2        将扫描同个网段内不同的ip地址
  1. 扫描连续的IP地址:
nmap 192.168.2.1-192.168.2.100     将扫描同个网段内不同的ip地址
nmap 192.168.2.1/24                nmap也可以用使用CIDR(无类别域间路由)表示法整个子网
  1. 扫描目标列表:
nmap -iL [LIST.txt]                如果你有大量的系统进行扫描,就可以在文本文件中输入IP地址(或主机名),并使用该文件作为输入
  1. 扫描随机目标:
nmap -ir [主机数]                   该-IR参数可以用来选择随机Internet主机进行扫描,NMAP会随机生成目标的指定数量,并试图对其进行扫描
nmap 192.168.2.1/24 -exclude 192.168.2.10                该-exclude选项与用于从NMAP的扫描中排除主机
  1. 侵入性扫描:
nmap -A 主机                        最常用的选项,试图用一个简单字母A的替代长字符串,它也会执行路由跟踪等

Nmap各个阶段

指定目标

除了选项,所有出现在 Nmap 命令行上的都被视为对目标主机的说明;最简单的情况是指定一个目标IP地址或主机名;Nmap 接受可以多个主机,并且它们不必是相同类型,例如

nmap scanme.nmap 192.168.0.0/8

也是可以的;注意,IPv6 地址只能用规范的 IPv6 地址或主机名指定,所以以下均为指定 IPv4 地址范围的技巧

ip/numbit 形式

Nmap 支持 CIDR 风格的地址,要扫描整个网络段的主机的话可以在一个IP地址或主机名后面附加一个/<numbit>;例如,192.168.10.0/24将会扫描192.168.10.0(二进制格式:11000000 10101000 00001010 00000000)和 192.168.10.255(二进制格式: 11000000 10101000 00001010 11111111)之间的 256 台主机;假设主机 scanme.nmap 的 IP 地址是 205.217.153.62,scanme.nmap/16 将扫描205.217.0.0和205.217.255.255之间的65536个 IP 地址
注意,这种指定方式,numbit 最小值是 1,这将会扫描半个互联网;最大值是 32,这将会扫描该主机或 IP 地址,因为所有的比特都固定了

用 - 指定范围

ip/numbit 形式不够灵活,因为192.168.0.0/16中包含了广播地址;Nmap 还可以利用,或者-隔开的数字为 IP 地址指定范围;例如,192.168.0-255.1-254 将略过在该范围内以 .0和.255结束的地址;指定范围不限于最后的 8 位,例如:0-255.0-255.13.37 将在整个互联网范围内扫描所有以 13.37 结束的地址

随机选择目标

-iR <hostnum>

Nmap 随机生成 ip 地址进行扫描,<hostnum>为生成的数量,若为 0,则会一直生成

排除目标

--exclude <host1[,host2][,host3]...>

后面接的host1是排除在外的 ip 地址

排除文件中的目标

--excludefile <excludefile>

功能与 --exclude 选项一样,使用方式与 -iL 一样

目标探测

目标探测的目的主要有 2 个:

  1. 判断是否存活
  2. 获取端口的开放情况

如果没有指定目标探测的方式,Nmap 默认发送一个 ICMP 回声请求和一个 TCP ACK 报文到目标的80端口;一个例外在局域网中使用 ARP 扫描目标机器,对于非 root 权限的 Linux/UNIX shell 用户,会使用#include<sys/socket.h> 中的connect(),发送一个 SYN 报文而不是 ACK;这些默认行为和使用 -PA -PE 选项的效果相同

-P* 选项(用于选择 ping 的类型)可以结合使用,可以通过使用不同的 TCP 端口/标志位和 ICMP 码来发送许多探测报文,增加穿透防火墙的机会;注意,即使指定了 -P* 选项,在局域网中,默认通过 ARP(-PR)来探测目标,因为它总是更快更有效

列出目标

-sL

这个选项仅仅列出指定网络上的每台主机,不发送任何报文;但是默认情况下,Nmap会对目标进行反向域名解析来获取它们的域名,所以如果真的想只列出所有目标,或许还需要加个 -n

Nmap 最后还会报告列表中 IP 地址的总数:

┌──(kali㉿kali)-[~/Desktop]
└─$ sudo nmap -sL 192.168.1.1/24
[sudo] password for kali: 
Starting Nmap 7.91 ( https://nmap ) at 2021-07-25 22:05 EDT
Nmap scan report for 192.168.1.0
Nmap scan report for 192.168.1.1
Nmap scan report for 192.168.1.2
...
...
Nmap scan report for 192.168.1.254
Nmap scan report for 192.168.1.255
Nmap done: 256 IP addresses (0 hosts up) scanned in 0.39 seconds

因为它仅仅打印出目标主机的列表,所以其它一些高级的功能如端口扫描、操作系统探测或者 Ping 扫描的选项就没用了

不进行端口扫描(Ping 扫描)

-sn(旧版本中也叫-sP)

此选项告诉 Nmap 在主机发现后不进行端口扫描,只打印出探测到的可用主机;这通常称为ping 扫描,但你也可以请求运行 traceroute 和 NSE 主机脚本。默认情况下,这比列表扫描更具侵入性,并且通常可用于相同的目的;它允许对目标网络进行轻微侦察,而不会引起太多关注。知道有多少主机对攻击者而言比每个 IP 和主机名列表扫描提供的列表更有价值;系统管理员经常发现此选项也很有价值,它可以轻松用于统计网络上的可用计算机或监控服务器可用性;这通常称为 ping扫描,并且比 ping 广播地址更可靠,因为许多主机不回复广播查询,使用-sn完成的默认主机发现包括 ICMP 回送请求,TCP SYN 到端口 443,TCP ACK 到端口 80,默认情况下为 ICMP 时间戳请求;当由非特权用户执行时,仅将 SYN 数据包(使用连接调用)发送到目标上的端口 80 和 443,当特权用户尝试扫描本地以太网网络上的目标时,除非指定了–send-ip,否则将使用 ARP 请求;-sn选项可以与任何发现探测器类型(-P*选项,不包括-Pn)组合使用,以获得更大的灵活性,如果使用任何探测类型和端口号选项,则会覆盖默认探测;当在运行 Nmap 的源主机和目标网络之间建立严格的防火墙时,建议使用这些高级技术;否则,当防火墙丢弃探测器或其响应时,可能会错过某些主机;在以前的 Nmap 版本中,-sn 被称为 -sP

Ping 扫描

-sP

该选项告诉 Nmap 仅仅进行 ping 扫描(主机发现),然后打印出对扫描做出响应的那些主机,没有进一步的测试(如端口扫描或者操作系统探测),相当于执行了 ping xxxx;当目标为整个局域网的时候,这个方法类似 ping 广播地址,但是它更可靠,因为许多主机对广播请求不响应,同 -sn

禁止目标存活判断

-Pn(旧版本中也叫-P0或者-PN)

该选项完全跳过 Nmap 目标存活判断,即认为每个目标都是存活的;一般来说,Nmap 首先判断目标是否存活,如果存活再进行进一步的探测,如端口扫描、版本探测、或者操作系统探测等等,用 -P0 会使得 Nmap 对每一个目标都直接进行所要求的扫描

TCP SYN Ping

-PS [portlist]

该选项发送一个设置了 SYN 标志位的空 TCP 报文;默认目的端口为 80,这个端口可以通过改变 nmap.h 文件中的 DEFAULT-TCP-PROBE-PORT 值进行配置,但不同的端口也可以作为选项指定,甚至可以指定一个以逗号分隔的端口列表,如 -PS22,23,25,80,113,1050,35000,在这种情况下,并发地扫描每个端口

SYN 标志位告诉目标开始建立一个连接,回应的数据包有 2 种情况:

  • RST (复位) 包:表明目标端口关闭
  • SYN/ACK 的 TCP 报文:表明目标端口开放。因为目标会进行 TCP 三步握手的第二步,所以会回应一个 SYN/ACK 的 TCP 报文,然后运行 Nmap 的机器会杀死这个正在建立的连接,发送一个 RST 而非 ACK 报文;注意,此时 RST 报文是运行 Nmap 的机器而不是 Nmap 本身发送的,因为它没有发起四次握手却莫名其妙地收到了 SYN/ACK

Nmap 并不关心端口开放还是关闭,因为无论返回的是 RST 还是 SYN/ACK 响应都告诉 Nmap 该主机正在运行

注意,在 Linux/UNIX 机器上,通常只有 root 权限能发送和接收原始的 TCP 报文;因此作为一个变通的方法,对于非 sudo 权限, Nmap 会为每个目标主机进行调用 connect() 函数,它也会发送一个 SYN 报文来尝试建立连接,如果 connect() 函数迅速返回成功或者失败(ECONNREFUSED),下面的 TCP 堆栈一定已经收到了一个 SYN/ACK 或者 RST,该主机将被认定为存活,如果连接超时了,该主机就认定为没有存活;这种方法也用于 IPv6 连接,因为 Nmap 目前还不支持原始的 IPv6 报文

TCP ACK Ping

-PA [portlist]

TCP ACK ping 和刚才讨论的 SYN ping 相当类似,区别就是设置 TCP 的 ACK 标志位而不是 SYN 标志位;ACK 报文表示确认一个建立连接的尝试,但该连接尚未完全建立,所以远程主机存活的话,应该总是回应一个 RST 报文,因为它们并没有发出过连接请求到运行 Nmap 的机器

-PA 选项的默认端口也是 80,也可以用相同的格式指定目标端口列表,如果非 sudo 权限尝试使用该功能,或者指定的是 IPv6 目标,会使用前面说过的 connect() 函数,这个替代方法在这里有点问题,因为它实际上发送的是 SYN 报文,而不是 ACK 报文

提供 SYN 和 ACK 两种 ping 探测的原因是增大穿过防火墙的机会,许多管理员会配置他们的路由器或者防火墙来封锁 SYN 报文,除非连接目标是那些公开的服务器,比如公司网站或者邮件服务器。这可以阻止其它试图进入内部的连接,同时也允许用户访问互联网,这种无状态的方法几乎不占用防火墙/路由器的资源,因而被硬件和软件过滤器广泛采用;Linux Netfilter/iptables 防火墙软件提供方便的 --syn 选项来实现这种无状态的方法,当这样的无状态防火墙规则存在时,发送到关闭目标端口的 SYN ping 探测 (-PS)很可能被拦截,这种情况下,ACK 探测格外好使

另外一种常用的防火墙用有状态的规则来封锁非预期的报文,这一特性一开始只存在于高端防火墙,但是这些年来它越来越普遍了;Linux Netfilter/iptables 通过 --state 选项来支持这一特性,它根据连接状态把报文进行分类,对于这样的系统,SYN 探测更有可能成功,因为没头没脑的 ACK 报文通常会被识别成伪造的而拦截,解决这个两难的方法是通过同时指定 -PS 与 -PA 来同时发送 SYN 与 ACK

UDP Ping

-PU [portlist]

还有一个主机发现的选项是 UDP ping,它发送一个空的(除非指定了 --data-length)UDP报文到给定的端口,端口列表的格式和前面讨论过的-PS和-PA选项是一样;如果不指定端口,默认是31338,该默认值可以通过在编译时改变nmap.h文件中的 DEFAULT-UDP-PROBE-PORT值进行配置,默认使用这样一个奇怪的端口是因为对开放端口进行这种扫描一般都是讨人厌的

回应的数据包有 5 种情况:

  1. ICMP 端口无法到达的回应报文:表明目标端口关闭。UDP 探测得到一个 ICMP 端口无法到达的回应报文,这对于 Nmap 意味着该目标存活
  2. 许多其它类型的 ICMP 错误:表示目标不存活或网络不可到达。ICMP 错误包括:主机/网络无法到达或者 TTL 超时等等
  3. 没有回应:如果到达一个开放的端口,大部分服务会忽略这个空报文,不做任何回应。这就是为什么默认探测端口是 31338 这样一个极不可能被使用的端口
  4. 空的 UDP 报文:少数服务如 chargen 会响应一个空的 UDP 报文,从而向 Nmap 表明该机器正在运行
  5. 该扫描类型的主要优势是它可以穿越只过滤 TCP 的防火墙和流量过滤器

SCTP INIT Ping

-PY <port list>

此选项发送包含最小 INIT 块的 SCTP 数据包,默认目标端口为 80(通过更改 nmap.h 中的 DEFAULT_SCTP_PROBE_PORT_SPEC 并编译来进行配置);可以将备用端口指定为参数,语法与-p相同,但不允许使用类似s:的端口类型说明符,实例是-PY22和-PY22,80,179,5060;请注意,-PY和端口列表之间不能有空格,如果指定了多个探测器,它们将并行发送

INIT 块向远程系统暗示尝试建立关联,通常目标端口将关闭,并且将返回 ABORT 块,如果端口恰好打开,则目标将通过响应 INIT-ACK 块来进行 SCTP 四次握手的第二步,如果运行 Nmap 的机器具有功能性 SCTP 堆栈,那么它通过响应 ABORT 块来进行四方握手的下一步,而不是发送 COOKIE-ECHO 块消除新的关联,ABORT 数据包由运行 Nmap 的机器的内核发送,以响应意外的 INIT-ACK,而不是 Nmap 本身,Nmap 不关心端口是打开还是关闭;之前讨论的 ABORT 或 INIT-ACK 响应告诉 Nmap 主机可用且响应迅速,在 Unix 机器上,只有特权用户 root 通常能够发送和接收原始 SCTP 数据包,对于非特权用户,目前无法使用 SCTP INIT Pings

ICMP Ping Types

-PE、-PP、-PM

除了前面讨论的这些不常见的 TCP 和 UDP 主机发现类型,Nmap也能发送 ping 所发送的报文,Nmap 发送一个 ICMP type 8(回声请求)报文到目标地址,期待从运行的主机得到一个 type 0(回声响应)的报文,不幸的是许多主机和防火墙现在拦截了这些报文,参见 RFC 1122;因此,仅仅使用 ICMP 扫描对于互联网上的目标通常是不够的,但对于系统管理员监视一个内部网络,它们可能是比较有效的方式,使用 -PE 选项打开回声请求功能

虽然回声请求是标准的 ICMP ping 查询,但是 Nmap 并不止步于此,ICMP 标准(RFC 792)还规范了时间戳请求、信息请求、地址掩码请求,它们的代码分别是 13,15 和 17,虽然这些查询的表面目的是为了获取信息,比如地址掩码和当前时间,但是它们也可以很容易地用于主机发现,判断方式很简单,有回应的目标就是存活的,不过 Nmap 目前没有实现信息请求的报文,因为它们还没有被广泛支持,RFC 1122 坚持 主机不应该实现这些消息,时间戳和地址掩码查询可以分别用-PP和-PM选项发送,时间戳请求的响应(ICMP 代码 14)或者地址掩码请求的响应(代码 18)都表示目标存活,当管理员特别封锁了回声请求报文而忘了其它 ICMP 查询的时候,这两个查询方式可能很有利用价值

IP Protocol Ping

-PO <protocol list>

其中一个较新的主机发现选项是 IP Protocol ping,它发送的 IP 数据包在其 IP 头中设置了指定的协议号,协议列表采用与前面讨论的 TCP,UDP 和 SCTP主机发现选项中的端口列表相同的格式,如果未指定协议,则默认为为 ICMP(协议 1),IGMP(协议 2)和 IP-in-IP(协议 4)发送多个 IP 数据包;通过更改 nmap.h 中的 DEFAULT_PROTO_PROBE_PORT_SPEC,可以在编译时配置默认协议,请注意,对于 ICMP,IGMP,TCP(协议 6),UDP(协议 17)和 SCTP(协议 132),数据包与适当的协议头一起发送,而其他协议在发送时没有 IP 头之外的其他数据(除非指定了–data,–data-string或–data-length选项中的任何一个,此主机发现方法查找使用与探测器相同的协议的响应,或 ICMP 协议不可达的消息,这表示在目标主机上不支持给定的协议,两种类型的响应都表示目标主机存活

ARP Ping

-PR

最常见的 Nmap 使用场景之一是扫描一个局域网,在大部分局域网中,特别是那些使用基于 RFC1918 私有地址范围的网络,绝大部分 IP 地址都是没有使用的,当 Nmap 试图发送一个原始 IP 报文如 ICMP 回声请求时,操作系统必须确定对应目标 IP 的硬件地址(MAC),这样它才能把以太帧送往正确的地方,这一般比较慢而且会出现一些问题,因为操作系统设计者认为一般不会在短时间内对没有运行的机器作几百万次的 ARP 请求

当进行 ARP 扫描时,Nmap 用它优化的算法管理 ARP 请求,这使得 ARP 扫描比基于 IP 的扫描更快更可靠,所以默认情况下,如果 Nmap 发现目标主机就在它所在的局域网上,它会进行 ARP 扫描,即使指定了不同的 ping 类型(如 -PI 或者 -PS) ,Nmap 也会对任何相同局域网上的目标机使用 ARP,如果真的不想要ARP扫描,需要指定–send-ip

不进行 ARP 或者 ND Ping

--disable-arp-ping

Nmap 通常对本地连接的以太网主机进行 ARP 或 IPv6 Neighbor Discovery(ND)发现,即使使用其他主机发现选项(如-Pn或-PE)也是如此,要禁用此隐式行为,请使用–disable-arp-ping选项

默认行为通常更快,但此选项在使用代理 ARP 的网络上很有用,其中路由器回复所有 ARP 请求,使得每个目标通过 arp 扫描看起来都是存活的

追踪到主机的路径

--traceroute

使用扫描结果中的信息在扫描后执行跟踪路由,以确定最有可能到达目标的端口和协议,它适用于除连接扫描(-sT)和空闲扫描(-sI)之外的所有扫描类型,所有追踪都使用 Nmap 的动态时序模型并行执行

Traceroute 通过发送具有低 TTL(生存时间)的数据包来尝试从扫描器和目标主机之间的中间跃点中引出 ICMP 超时消息,标准 traceroute 实现以 TTL 为 1 开始,并递增 TTL,直到到达目标主机,Nmap的 traceroute 以高 TTL 开始,然后递减 TTL 直到达到零,向后执行操作可让 Nmap 采用巧妙的缓存算法来加速多个主机上的跟踪,平均而言,Nmap 每个主机发送的数据包少于 5-10 个,具体取决于网络状况,如果正在扫描单个子网(即192.168.0.0/24),Nmap 可能只需要向大多数主机发送两个数据包

不进行反向域名解析

-n

告诉 Nmap 不对它发现的存活的 IP 地址进行反向域名解析,因为 DNS 一般比较慢,所以这个选项可以让扫描更快些

所有目标都进行反向域名解析

-R

告诉 Nmap 对所有的目标 IP 地址进行反向域名解析,一般只有当发现机器正在运行时才指定这项操作

扫描所有解析出的地址

--resolve-all

如果主机名目标解析出多个地址,那就扫描所有地址,默认行为是仅扫描第一个解析到的地址,无论如何,只扫描相应地址系列中的地址:默认情况下为 IPv4,IPv6 为-6

使用系统域名解析器

--system-dns

默认情况下,Nmap 通过直接发送查询到你的主机上配置的域名服务器来解析域名,为了提高性能会并发执行许多请求(一般几十个),如果您希望使用系统自带的解析器,就指定该选项(原理是通过调用 getnameinfo() 函数,调用一次解析一个 IP),一般不使用该选项,因为它很慢,除非 Nmap 的 DNS 相关的代码有 bug(如果是这样,请联系我们),所以系统解析器基本上是用于 IPv6 的扫描

指定反向域名解析的 DNS 服务器

--dns-servers <server1>[,<server2>[,...]]

默认情况下,Nmap 从 resolv.conf 文件(Unix)或注册表(Win32)确定你的 DNS 服务器(用于 rDNS 解析),或者你可以使用此选项指定备用服务器,如果你使用–system-dns,则不接受此选项,使用多个 DNS 服务器通常更快,特别是如果你为目标 IP 空间选择权威服务器,此选项还可以提升隐蔽性,因为你的请求可以在互联网上的任何递归 DNS 服务器之间弹跳

扫描专用网络时,此选项也很方便,有时只有少数名称服务器提供正确的 rDNS 信息,你甚至可能不知道它们在哪里,你可以扫描网络端口 53(可能带有版本检测),然后尝试使用–dns-servers一次指定一个名称服务器的 Nmap 列表扫描(-sL),直到找到有效的端口

如果 DNS 响应超过 UDP 数据包的大小,则可能不会遵循此选项,在这种情况下我们的 DNS 解析器会尽力从截断的数据包中提取响应,如果不成功,它将回退到使用系统解析器,此外包含 CNAME 别名的响应将回退到使用系统解析器

服务和版本探测

版本探测

-sV

打开版本探测,也可以用-A同时打开操作系统探测和版本探测

不排除端口

--allports

默认情况下,Nmap 版本探测会跳过 TCP 端口 9100,因为一些打印机会无脑地将送到该端口的任何数据打印出来,这回导致数十页 HTTP get 请求、二进制 SSL 会话请求等等被打印出来,这一行为可以通过修改或删除 nmap-service-probes 中的 Exclude 指示符改变,您也可以不理会任何 Exclude 指示符,指定 --allports扫描所有端口

版本扫描强度

--version-intensity <intensity>

当进行版本扫描(-sV)时,nmap 发送一系列探测报文,每个报文都被赋予一个 1 到 9 之间的值,作为强度水平,较低值的探测报文对大范围的常见服务有效,而较高值的报文一般没什么用,强度水平说明了应该使用哪些探测报文,数值越高,服务越有可能被正确地识别,然而,高强度的扫描需要花更多时间,强度值必须在 0 和 9 之间,默认是 7

当探测报文已经通过 nmap-service-probes ports 指令注册到目标端口后,无论指定什么强度水平,都会尝试这个探测报文,这保证了 DNS 探测将永远在任何开放的 53 端口进行尝试,SSL 探测将在 443 端口进行尝试等等

轻量级模式

--version-light

这是 --version-intensity 2 方便的别名,轻量级模式使版本扫描快许多,但它识别服务的可能性也略微小一点

尝试每个探测

--version-all

–version-intensity 9 的别名,保证对每个端口都尝试每个探测报文

跟踪版本扫描活动

--version-trace

这会使得 Nmap 打印出详细的关于正在进行的扫描的调试信息,它是你用 --packet-trace 所得到的信息的子集

RPC 扫描

-sR

这种方法和许多端口扫描方法结合起来使用,它对所有发现的开放的 TCP/UDP 端口都执行 SunRPC 程序 NULL 命令来尝试确定它们是否是 RPC 端口,如果是的话,具体是什么程序和版本号,因此你可以获得和 rpcinfo -p 一样的信息,即使目标的端口映射在防火墙后面(或者被 TCP 包装器保护),Decoys 目前不能和 RPC scan 一起工作

它作为版本扫描(-sV)的一部分自动启用,由于版本探测包含它并且全面得多,因此很少需要使用-sR

操作系统探测

启用操作系统检测

-O

也可以使用-A来同时启用操作系统检测和版本检测。

操作系统检测只针对特定的目标

--osscan-limit

发现了一个打开和关闭的 TCP 端口时,再进行操作系统检测会更有效,使用这个选项,Nmap 将只对满足这个条件的主机进行操作系统检测,这样可以节约时间,特别是在使用 -P0 扫描多个主机时,注意,这个选项仅在使用 -O或-A 进行操作系统检测时起作用

推测操作系统检测结果

--osscan-guess、--fuzzy

当 Nmap 无法确定所检测的操作系统时,会尽可能地提供最相近的匹配,Nmap 默认进行这种匹配,使用上述任一个选项使得 Nmap 的推测更加激进

时间和性能

Nmap 开发时的最高优先级是性能,在本地网络对一个主机的默认扫描(nmap <hostname>)需要 1/5 秒,而仅仅在眨眼之间,就需要扫描上万甚至几十万的主机,一些特定的扫描选项会明显增加扫描时间,如 UDP 扫描和版本检测;同样,防火墙配置以及特殊的响应速度限制也会增加时间,Nmap 使用了并行算法和许多先进的算法来加速扫描,用户对 Nmap 如何工作有最终的控制权,高级用户可以仔细地调整 Nmap 命令,在满足时间要求的同时获得他们所关心的信息

改善扫描时间的技术有:

  • 忽略非关键的检测
  • 升级最新版本的 Nmap(性能增强不断改善)
  • 优化时间参数也会带来实质性的变化
  • 优化时间的参数如下:

调整并行扫描组的大小

--min-hostgroup <milliseconds>、--max-hostgroup <milliseconds>

Nmap 具有并行扫描多主机端口或版本的能力,Nmap 将多个目标 IP 地址空间分成组,然后在同一时间对一个组进行扫描,通常大的组更有效,缺点是只有当整个组扫描结束后才会提供主机的扫描结果;例如,如果组的大小定义为 50,则只有当前 50 个主机扫描结束后才能得到报告(详细模式中的补充信息除外)

默认方式下,Nmap 采取折衷的方法,开始扫描时的组较小,最小为 5,这样便于尽快产生结果;随后增长组的大小,最大为 1024。确切的大小依赖于所给定的选项,为保证效率,针对 UDP 或少量端口的 TCP 扫描,Nmap 使用较大的组

--max-hostgroup选项用于说明使用最大的组,Nmap 不会超出这个大小;--min-hostgroup选项说明最小的组,Nmap 会保持组大于这个值,如果没有足够的目标主机来满足所指定的最小值,Nmap 可能会采用比所指定的值小的组,这两个参数虽然很少使用,但都用于保持组的大小在一个指定的范围之内

这些选项的主要用途是说明一个最小组的大小,使得整个扫描更加快速,通常选择 256 来扫描 C 类网段,对于端口数较多的扫描,超出该值是没有意义的,对于端口数较少的扫描,2048 或更大的组是更有用的

调整探测报文的并行度

--min-parallelism <milliseconds>、--max-parallelism <milliseconds>

这些选项控制用于主机组的探测报文数量,可用于端口扫描和主机发现,默认状态下,Nmap 基于网络性能计算一个理想的并行度,这个值经常改变,如果报文被丢弃,Nmap 就降低速度,探测报文数量减少。随着网络性能的改善,理想的探测报文数量会缓慢增加,这些选项确定这个变量的大小范围,默认状态下,当网络不可靠时,理想的并行度值 可能为 1,在好的条件下,可能会增长至几百

最常见的应用是–min-parallelism值大于 1,以加快性能不佳的主机或网络的扫描,这个选项具有风险,如果过高则影响准确度,同时也会降低 Nmap 基于网络条件动态控制并行度的能力,这个值设为 10 较为合适,这个值的调整往往是作为最后的手段

调整探测报文超时时间

--min-rtt-timeout <milliseconds>、--max-rtt-timeout <milliseconds>、--initial-rtt-timeout <milliseconds>

Nmap 使用一个超时值来确定等待探测报文响应的时间,随后会放弃或重新发送探测报文,Nmap 基于上一个探测报文的响应时间来计算超时值,如果网络延迟比较显著和不定,这个超时值会增加几秒,初始值的比较保守(高),而当 Nmap 扫描无响应的主机时,这个保守值会保持一段时间

这些选项以毫秒为单位,采用小的–max-rtt-timeout值,使 --initial-rtt-timeout值大于默认值可以明显减少扫描时间,特别是对不能 ping 通的扫描(-P0)以及具有严格过滤的网络,如果使用太小的值,使得很多探测报文超时从而重新发送,而此时可能响应消息正在发送,这使得整个扫描的时间增加

如果所有的主机都在本地网络,对于–max-rtt-timeout值来说,100 毫秒比较合适,如果存在路由,应首先使用 ICMP ping 工具 ping 主机,或使用其它报文工具如 hpings(它可以更好地穿透防火墙)查看大约 10 个包的最大往返时间,然后将 --initial-rtt-timeout设成这个时间的 2 倍,–max-rtt-timeout 可设成这个时间值的 3 倍或 4 倍,不管 ping 的时间是多少,最大的 rtt 值不得小于 100ms且不能超过 1000ms

–min-rtt-timeout这个选项很少使用,当网络不可靠时,Nmap 的默认值也显得过于激进,这时这个选项可起作用,当网络看起来不可靠时,Nmap 仅将超时时间降至最小值,这个情况是不正常的,可以向 nmap-dev 邮件列表报告 bug

–max-parallelism选项通常设为 1,以防止 Nmap 在同一时间向主机发送多个探测报文,和选择 --scan-delay 同时使用非常有用,虽然这个选项本身的用途已经很广了

放弃低速目标主机

--host-timeout <milliseconds>

由于性能较差或不可靠的网络硬件或软件、带宽限制、严格的防火墙等原因,一些主机需要很长的时间扫描,这些极少数的主机扫描往往占据了大部分的扫描时间,因此最好的办法是减少时间消耗并且忽略这些主机,使用 --host-timeout选项来说明等待的时间(毫秒),通常使用 1800000 来保证 Nmap 不会在单个主机上使用超过半小时的时间,需要注意的是,Nmap 在这半小时中可以同时扫描其它主机,因此并不是完全放弃扫描,超时的主机被忽略,因此也没有针对该主机的端口表、操作系统检测或版本检测结果的输出

调整探测报文的时间间隔

--scan-delay <milliseconds>、--max-scan-delay <milliseconds>

这个选项用于 Nmap 控制针对一个主机发送探测报文的等待时间(毫秒),在带宽控制的情况下这个选项非常有效,例如Solaris 主机在响应 UDP 扫描探测报文报文时,每秒只发送一个 ICMP 消息,因此 Nmap 发送的很多数探测报文是浪费的,这是需要将–scan-delay 设为 1000,使 Nmap 低速运行,Nmap 尝试检测带宽限制并相应地调整扫描的延迟,但并会不影响明确指明何种速度最佳

–scan-delay的另一个用途是躲闭基于阈值的入侵检测和预防系统(IDS/IPS)

设置时间模板

-T <Paranoid|Sneaky|Polite|Normal|Aggressive|Insane>

上述优化时间控制选项的功能很强大也很有效,但有些用户会被迷惑,往往选择合适参数的时间超过了所需优化的扫描时间;因此,Nmap 提供了一些简单的方法,使用 6 个时间模板,使用时采用-T选项及数字(0 - 5) 或名称,模板名称有:

  • paranoid:0
  • sneak:1
  • polite:2
  • normal:3
  • aggressive:4
  • insane:5

前两种模式用于躲避 IDS,Polite 模式降低了扫描速度以使用更少的带宽和目标主机资源,默认模式为 Normal,因此-T3 实际上是未做任何优化,Aggressive 模式假设用户具有合适及可靠的网络从而加速扫描。Insane模式假设用户具有特别快的网络或者愿意为获得速度而牺牲准确性

用户可以根据自己的需要选择不同的模板,由 Nmap 负责选择实际的时间值,模板也会针对其它的优化控制选项进行速度微调,例如,-T4 针对 TCP 端口禁止动态扫描延迟超过 10ms,-T5对应的值则为 5ms,模板可以和优化调整控制选项组合使用,但模板必须首先指定,否则模板的标准值会覆盖用户指定的值,建议在扫描可靠的网络时使用 -T4,即使自己想要增加优化控制选项时也使用(在命令行的较前面部分),从而从这些额外的较小的优化中获益

在有足够的带宽或以太网连接的情况,仍然建议使用 -T4 选项,有些用户喜欢-T5选项,但这个过于激进,有时用户考虑到避免使主机崩溃或者希望更礼貌一些会采用-T2选项,他们并没意识到-T Polite选项是如何的慢,这种模式的扫描比默认方式实际上要多花 10 倍的时间,使用默认时间选项(-T3)很少出现有主机崩溃和带宽问题,比较适合于谨慎的用户,不进行版本检测比进行时间调整能更有效地解决这些问题

虽然-T0和-T1选项可能有助于避免 IDS 告警,但在进行上千个主机或端口扫描时,会显著增加时间,对于这种长时间的扫描,宁可设定确切的时间值,而不要去依赖封装的-T0和-T1选项

  • T0:选项的主要影响是对于连续扫描,在一个时间只能扫描一个端口, 每个探测报文的发送间隔为 5 分钟
  • T1:发送探测报文间隔为 15 秒。
  • T2:类似 T1,发送探测报文间隔为 0.4 秒
  • T3:Nmap 的默认选项,包含了并行扫描
  • T4:等价于–max-rtt-timeout 1250 --initial-rtt-timeout 500 ,最大 TCP 扫描延迟为 10ms
  • T5:等价于 --max-rtt-timeout 300 --min-rtt-timeout 50 --initial-rtt-timeout 250 --host-timeout 900000,最大 TCP 扫描延迟为 5ms

输出

标准输出

-oN <filespec>

要求将标准输出直接写入指定的文件,这个格式与交互式输出略有不同

XML 格式输出

-oX <filespec>

要求 XML 输出直接写入指定的文件,Nmap 包含了一个文档类型定义(DTD),使 XML 解析器有效地进行 XML 输出,这主要是为了程序应用,同时也可以协助人工解释 Nmap 的 XML 输出,DTD 定义了合法的格式元素,列举可使用的属性和值,最新的版本可在 http://www.insecure/nmap/data/nmap.dtd 获取

XML 提供了可供软件解析的稳定格式输出,主要的计算机 语言都提供了免费的 XML 解析器,如 C/C++,Perl,Python 和 Java,针对这些语言有一些捆绑代码用于处理 Nmap 的输出和特定的执行程序,例如 perl CPAN 中的 Nmap::Scanner 和 Nmap::Parser,对几乎所有与 Nmap 有接口的主要应用来说,XML 是首选的格式

XML 输出引用了一个 XSL 样式表,用于格式化输出结果,类似于 HTML,最方便的方法是将 XML 输出加载到一个 Web 浏览器,如 Firefox 或 IE,由于 nmap.xsl 文件的绝对路径,因此通常只能在运行了 Nmap 的机器上工作(或类似配置的机器),类似于任何支持 Web 机器的 HTML 文件,–stylesheet 选项可用于建立可移植的 XML 文件

ScRipT KIdd|3 oUTpuT

-oS <filespec>

脚本小子输出类似于交互工具输出,但是会进行事后处理,类似于 l33t HaXXorZ,将正常的字符替换为长得类似奇怪的字符
对比:

Starting Nmap 7.70 ( https://nmap ) at 2019-05-29 11:35 CST
Nmap scan report for baidu (123.125.114.144)
Host is up (0.023s latency).
Other addresses for baidu (not scanned): 220.181.57.216
Not shown: 998 filtered ports
PORT    STATE SERVICE
80/tcp  open  http
443/tcp open  https

Nmap done: 1 IP address (1 host up) scanned in 14.89 seconds

和脚本小子模式

$taRt!nG NmAp 7.70 ( HttpS://nmap ) At 2019-05-29 11:34 CsT
NmAp $can rEp0rt FOr baidu.c0m (220.181.57.216)
HOsT iS up (0.026s lat3NCy).
0th3r aDdrEs$Ez f0r baidU.coM (noT $Canned): 123.125.114.144
n0t $h0Wn: 998 f1Lter3d p0rt$
pORT    STat3 SERV1CE
80/tcp  op3n  HTtp
443/tcp 0PEn  httpz

Nmap done: 1 1P addr3ss (1 h0$t Up) $cann3D 1n 4.94 SecoNDS

Grep 输出

-oG <filespec>

XML 输格式很强大,便于有经验的用户使用,XML 是一种标准,由许多解析器构成,而 Grep 输出更简化,XML 是可扩展的,以支持新发布的 Nmap 特点,使用 Grep 输出的目的是忽略这些特点,因为没有足够的空间

然而,Grep 输出仍然很常使用,它是一种简单格式,每行一个主机,可以通过 UNIX 工具(如 grep、awk、cut、sed、diff)和 Perl 方便地查找和分解,常可用于在命令行上进行一次性测式,查找 ssh 端口打开或运行 Sloaris 的主机,只需要一个简单的 grep 主机说明,使用通道并通过 awk 或 cut 命令打印所需的域

Grep 输出可以包含注释(每行由#号开始),每行由 6 个标记的域组成,由制表符及冒号分隔,这些域有主机,端口,协议,忽略状态,操作系统,序列号,IP ID 和状态

这些域中最重要的是 Ports,它提供了所关注的端口的细节,端口项由逗号分隔,每个端口项代表一个所关注的端口,每个子域由/分隔。这些子域有:端口号,状态,协议,拥有者,服务,SunRPCinfo 和版本信息

输出至所有格式

-oA <basename>

为使用方便,利用 -oA<basename>选项可将扫描结果以标准格式、XML 格式和 Grep 格式一次性输出,分别存放在 <basename>.nmap<basename>.xml<basename>.gnmap文件中,也可以在文件名前指定目录名,例如在 UNIX 中,使用~/nmaplogs/foocorp/,在 Window 中,使用c:\hacking\sco

输出信息的详细程度

-v

通过提高详细度,Nmap可以输出扫描过程的更多信息,输出发现的打开端口,若 Nmap 认为扫描需要更多时间会显示估计的结束时间,这个选项指定两、三次,会提供更详细的信息,个选项使用三次以上则不起作用

大部分的变化仅影响交互式输出,也有一些影响标准和脚本小子输出模式,其它输出类型由机器处理,此时 Nmap 默认提供详细的信息,不需要人工干预,其它模式也会有一些变化,省略一些细节可以减小输出大小;例如,Grep 输出中的注释行提供所有扫描端口列表,但由于这些信息过长,因此只能在细节模式中输出

设置调试级别

-d [level]

当详细模式也不能为用户提供足够的数据时,使用调试可以得到更多的信息,使用细节选项(-v)时,可启用命令行参数(-d),多次使用可提高调试级别,也可在-d 后面使用参数设置调试级别。例如,-d9设定级别9,这是最高的级别,将会产生上千行的输出,除非只对很少的端口和目标进行简单扫描,才会设置成这么大

如果 Nmap 因为 Bug 而挂起或者对 Nmap 的工作及原理有疑问,调试输出非常有效,主要是开发人员用这个选项,调试行不具备自我解释的特点;例如:

Timeoutvals: srtt: -1 rttvar: -1 to: 1000000 delta 14987 ==> srtt: 14987 rttvar: 14987 to: 100000

如果对某行输出不明白,可以忽略、查看源代码或向开发列表(nmap-dev)求助,有些输出行会有自我解释的特点,但随着调试级别的升高,会越来越含糊

跟踪发送和接收的报文

--packet-trace

要求 Nmap 打印发送和接收的每个报文的摘要,通常用于调试,有助于新用户更好地理解 Nmap 的真正工作,为避免输出过多的行,可以限制扫描的端口数,如-p20-30,如果只需进行版本检测,使用–version-trace

列举接口和路由

--iflist

输出 Nmap 检测到的接口列表和系统路由,用于调试路由 问题或设备描述失误(如 Nmap 把 PPP 连接当作以太网对待)

在输出文件中添加

--append-output

当使用文件作为输出格式,如-oX或-oN,默认该文件被覆盖,如果希望文件保留现有内容,将结果添加在现有文件后面,就使用–append-output选项,有指定的输出文件都被添加,但对于XML(-oX)扫描输出文件无效,无法正常解析,需要手工修改

继续中断的扫描

--resume <filename>

一些扩展的 Nmap 运行需要很长的时间 —— 以天计算,这类扫描往往不会很快结束,可以进行一些限制,禁止 Nmap 在工作时间运行,导致网络中断、运行 Nmap 的主机计划或非计划地重启、或者 Nmap 自己中断,运行 Nmap 的管理员可以因其它原因取消运行,按下 ctrl-C 即可,从头开始启动扫描可能令人不快,如果标准扫描 (-oN)或 Grep 扫描(-oG)日志被保留,用户可以要求 Nmap 恢复终止的扫描,只需要简单地使用选项 --resume并说明 标准/Grep 扫描输出文件,不允许使用其它参数,Nmap 会解析输出文件并使用原来的格式输出,使用方式如nmap --resume <logfilename>, Nmap 将把新地结果添加到文件中,这种方式不支持 XML 输出格式,原因是将两次运行结果合并至一个 XML 文件比较困难

设置 XSL 样式表,转换 XML 输出

--stylesheet <path or URL>

Nmap 提供了 XSL 样式表 nmap.xsl,用于查看或转换 XML 输出至 HTML,XML 输出包含了一个 xml-stylesheet,直接指向 nmap.xml 文件,该文件由 Nmap 安装(或位于 Windows 当前工作目录),在 Web 浏览器中打开 Nmap 的 XML 输出时,将会在文件系统中寻找 nmap.xsl 文件,并使用它输出结果,如果希望使用不同的样式表,将它作为 --stylesheet的参数,必须指明完整的路径或 URL,常见的调用方式是--stylesheet http://www.insecure/nmap/data/nmap.xsl

忽略XML声明的XSL样式表

--no-stylesheet

使用该选项禁止 Nmap 的 XML 输出关联任何 XSL 样式表,–xml-stylesheet指定将被忽略

Nmap端口扫描

Nmap 最初就是以端口扫描起家,直到现在,功能越来越多,端口扫描依然是它的核心功能

端口状态

许多传统的端口扫描器只列出所有端口是开放还是关闭的,Nmap 的信息粒度要比它们要细得多;Nmap 把端口分成六个状态,这些状态并非端口本身实际的状态,而是由 Nmap 判断出来的,例如对于某个目标的 135/tcp 端口,在内网中进行扫描显示它是 open,而在外网进行完全相同的扫描则可能显示它是 filtered

open(开放)

应用程序正在该端口接收 TCP 连接或者 UDP 报文,发现这一点常常是端口扫描的主要目的,安全意识强的人知道每个开放的端口都是攻击的入口,攻击者或者入侵者想要发现开放的端口,而管理员则试图关闭它们或者用防火墙保护它们以免阻碍了合法用户,非安全检测性质的扫描可能对开放的端口也感兴趣,因为它们显示了网络上那些服务可供使用

closed(关闭)

关闭的端口对于 Nmap 来说是可到达的(它接受 Nmap 的探测报文并作出响应),但没有应用程序在监听,它们表明该 IP 地址上的主机是存活的,例如进行主机发现或者 ping 扫描的时候,同时也是进行操作系统探测的一部分,因为关闭的端口代表主机是可到达的,也许值得再扫描一下,可能等一下这个端口就开放了,系统管理员可能会考虑用防火墙封锁这样的端口,那样他们就会被显示为被过滤的状态

filtered(过滤)

由于包过滤阻止了探测报文到达端口,所以 Nmap 无法确定该端口是否开放,过滤可能来自专业的防火墙设备、路由器规则或者主机上的软件防火墙,这样的端口几乎不提供任何信息,有时候它们响应 ICMP 错误消息如类型 3 代码 13(destination unreachable: communication administratively prohibited),但更普遍的是过滤器只是丢弃探测帧,不做任何响应,这迫使 Nmap 重试若干次以访万一探测包是由于网络阻塞丢弃的,这会使得扫描速度明显变慢

unfiltered(未被过滤)

未被过滤的状态意味着端口可到达,但 Nmap 不能确定它是开放还是关闭,只有 ACK 扫描才会把端口分类到这种状态,用其它类型的扫描方式如窗口扫描,SYN 扫描,或者 FIN 扫描,来扫描这种未被过滤的端口可以帮助确定端口是否开放

open|filtered(开放或者被过滤)

当无法确定端口是开放还是被过滤时,Nmap 就把端口划分成这种状态,开放的端口不响应就是一个例子,没有响应也可能意味着报文过滤器丢弃了探测报文或者由它引发的任何回应,因此 Nmap 无法确定该端口是开放的还是被过滤的,UDP、IP 协议、FIN、NULL 和 Xmas 扫描都可能把端口归为此类

closed|filtered(关闭或者被过滤)

该状态用于 Nmap 不能确定端口是关闭的还是被过滤时,它只可能出现于 IPID Idle 扫描中

端口扫描技术

Nmap 支持的大约十几种扫描技术,一般一次只用一种方法,除了 UDP 扫描(-sU)可能和任何一种 TCP 扫描类型结合使用,端口扫描类型的选项格式是-s<C>, 其中 <C>是个显眼的字符,通常是扫描技术的第一个字母,一个例外是 deprecated FTP bounce 扫描(-b),默认情况下Nmap 执行一个 SYN 扫描,但是如果用户没有权限发送原始报文(在 Linux/UNIX 上需要 root 权限)或者如果指定的是 IPv6 目标,Nmap 调用 connect() 函数,在后续列出的扫描中,非特权用户只能执行 connect() 和 ftp bounce 扫描

TCP SYN 扫描

-sS

SYN 扫描作为默认的也是最受欢迎的扫描选项,是有充分理由的,它执行得很快,在一个没有入侵防火墙的快速网络上,每秒钟可以扫描数千个端口,SYN 扫描相对来说不张扬,不易被注意到,因为它从来不完成 TCP 连接,它可以适用于任何兼容的 TCP 协议栈,不像 Fin/Null/Xmas、Maimon 和 Idle 扫描依赖于特定的平台,它还可以明确可靠地区分 open、closed 和 filtered 状态

SYN 扫描常常被称为半开放扫描,因为它不打开一个完全的 TCP 连接,它发送一个 SYN 报文,就像真的要建立一个连接,然后等待响应
回应的数据包有 4 种情况:

  1. SYN/ACK:表示端口在监听(开放)
  2. RST(复位):表示没有在监听
  3. 没响应:如果数次重发后仍无响应,该端口就被标记为被过滤
  4. ICMP 不可到达错误:例如,类型 3,代号 1,2,3,9,10,或者 13,该端口也被标记为被过滤

TCP connect() 扫描

-sT

当 SYN 扫描不能用,例如当用户没有权限发送原始报文或者扫描 IPv6 网络时,TCP 扫描默认使用 TCP Connect() 扫描,Nmap 通过调用 connect() 函数来要求操作系统与目标以及端口建立连接,而不像其它扫描方式那样直接发送原始报文,这个方式和 Web 浏览器,P2P 客户端以及其它大多数网络应用程序用来建立连接的方式一样,是 Berkeley Sockets API 编程接口的一部分,Nmap 用这个 API 获得每个连接尝试的状态,而不是直接读取响应的原始报文,当 Nmap 建立连接后不发送数据直接关闭连接,许多 Linux/UNIX 系统上的服务会在 syslog 中留下记录,有时候是一条加密的错误消息,此时少数服务会崩溃

当 SYN 扫描与TCP connect() 扫描都可用时,前者通常是更好的选择,因为 Nmap 对高层 connect() 调用的控制力度比对原始报文控制力度更弱,所以后者效率较低,且connect()进行完整的三次握手来连接到开放的目标端口而不是像 SYN 扫描进行半开放的扫描,这不仅会花更长时间、需要更多报文得到同样信息,目标也更可能记录下连接的尝试,如果管理员在日志里看到来自同一系统的一堆连接尝试,他就应该知道他的系统已经被扫描了

较好的 IDS(入侵检测系统)可以捕获这两种扫描,但大部分机器没有这样的警报系统。

UDP 扫描

-sU

虽然互联网上很多流行的服务运行在 TCP 协议上,但是 UDP 服务也不少,DNS(53 端口)、SNMP(161/162 端口)、和 DHCP(67/68 端口)是最常见的三个,因为 UDP 扫描一般较慢,比 TCP 更加困难,所以一些安全审查人员常常忽略这些端口,这是一个错误的做法,因为可探测的 UDP 服务相当普遍,攻击者当然不会忽略这整个协议,Nmap 可以帮助记录并报告 UDP 端口

UDP 扫描用 -sU 选项激活,它可以和 TCP 扫描如 SYN 扫描(-sS)结合使用来同时检测这两种协议

UDP 扫描发送空的(没有数据)UDP 报头到每个目标端口,回应的数据包有 4 种情况:

  1. ICMP 端口不可到达错误:例如,类型 3,代号 3,表明该端口是 closed
  2. 其它 ICMP 不可到达错误;例如 类型3,代号 1、2、9、10、或者 13,表明该端口是 filtered
  3. 响应一个 UDP 报文:证明该端口是 open
  4. 没有响应:如果几次重试之后还没有响应,该端口就被认为是 open|filtered。这意味着该端口可能是开放的,也可能包过滤器正在封锁通信。这时可以用版本扫描(-sV)来帮助区分真正的开放端口和被过滤的端口
    UDP 扫描面临的巨大挑战是怎样使它扫得更快。open 和filtered 的端口很少进行响应,这使得 Nmap 会等到超时然后再次进行探测,以防探测帧或者响应丢失导致误判。更大的问题是关闭的端口,它们一般发回一个 ICMP 端口无法到达错误,但是不像关闭的 TCP 端口响应 SYN 或者 connect() 扫描所发送的 RST 报文,许多主机在默认情况下限制发送 ICMP 端口不可到达消息。Linux 和 Solaris 对此特别严格。例如,Linux 2.4.20 内核限制一秒钟只发送一条目标不可到达消息(详见 net/ipv4/icmp.c)

Nmap 能够探测网络中的速度限制并相应地减慢速度来避免那些会被目标丢弃的无用报文阻塞网络。但是很不幸,Linux 的风格是限制一秒钟一个报文,加速 UDP 扫描的方法包括并发扫描更多的主机、先只对主要端口进行快速扫描、在防火墙后面进行扫描、使用 --host-timeout 来跳过响应较慢的主机

TCP Null、FIN、Xmas 扫描

-sN、-sF、-sX

这三种扫描类型(以及用下一节中的 --scanflags 选项的指明的更多类型)在 TCP RFC 中发掘出了一个巧妙的方法来区分 open 和 closed 端口

如果被扫描的系统遵循该 RFC,当端口关闭时,任何不包含 SYN、RST 或者 ACK 的报文会导致响应一个 RST,而当端口开放时,应该没有任何响应。至于如何构造这样的报文,任何其它三种(FIN、PSH 和 URG)的组合都不包含 SYN、RST 或者 ACK。Nmap 有三种扫描类型利用了这一点:

  1. Null 扫描:-sN
    不设置任何标志位(tcp flag 头部是 0)
  2. FIN扫描:-sF
    只设置 TCP FIN 标志位。
  3. Xmas扫描:-sX
    设置 FIN、PSH、和 URG 标志位,就像点亮圣诞树上所有的灯一样。

除了探测报文的标志位不同之外,这三种扫描在行为上完全一致,如果收到一个 RST 报文,该端口被认为是 closed,而没有响应则意味着端口是 open|filtered,如果收到 ICMP 不可到达错误(类型 3,代号 1、2、3、9、10 或者 13),该端口就被标记为 filtered

这些扫描方式有 2 个优点:

  1. 最大的优势:它们能躲过一些无状态的防火墙和报文过滤路由器
  2. 这些扫描类型甚至比 SYN 扫描还要隐蔽一些,但是别过于依赖它们 —— 大多数 现代的 IDS 产品可以检测到它们

缺点也有 2 个:

  1. 最大的缺点:并非所有系统都会严格遵循 RFC 793,许多系统不管端口开放还是关闭,都响应 RST,这导致所有端口都标记为 closed,这样的操作系统主要有 Microsoft Windows、许多 Cisco 设备、BSDI 以及 IBM OS/400,但是这种扫描对多数 Linux/UNIX 系统都能正常工作
  2. 它们不能辨别 open 端口和一些特定的 filtered 端口,从而返回 open|filtered

TCP ACK扫描

-sA

这种扫描与目前为止讨论的其它扫描的不同之处在于,它不能确定 open 或者 open|filtered 的端口,它用于探测防火墙规则,确定它们是有状态的还是无状态的、哪些端口是被过滤的

ACK 扫描探测报文只会设置 ACK 标志位(除非使用了 --scanflags),当扫描未经过滤的目标时,open 和 closed 的端口都会返回 RST 报文,Nmap 把它们标记为 unfiltered,意思是 ACK 报文可以到达,但至于它们是 open 或者 closed 则无法确定,不响应的端口或者发送特定的 ICMP 错误消息(类型3,代号 1、2、3、9、10、或者 13)的端口,则被标记为 filtered

TCP Maimon 扫描

-sM

这项技术和 Null、FIN 以及 Xmas 扫描完全一样,除了探测报文是 FIN/ACK,根据 RFC 793(TCP),无论端口开放或者关闭,都应该对这样的探测响应 RST 报文。然而,如果端口是开放的,许多基于 BSD 的系统仅仅是丢弃该探测报文,不做相应

定制 TCP 扫描

--scanflags

真正的 Nmap 高级用户不会被这些现成的扫描类型束缚, --scanflags选项允许你通过指定任意 TCP 标志位来设计属于自己的扫描来躲开那些仅靠本手册的扫描方式添加规则的入侵检测系统

–scanflags 选项可以是一个数字标记值如 9(PSH 和 FIN),但使用字符名更容易些,只要是 URG、ACK、PSH、RST、SYN 和 FIN 的任何组合就行,例如–scanflags URGACKPSHRSTSYNFIN 设置了所有标志位,标志位的顺序是无关紧要的

Nmap 还可以设置 TCP 扫描类型(如-sA或者-sF)与–scanflags配合使用,这时扫描类型告诉 Nmap 怎样解释响应,例如SYN 扫描认为没有响应意味着 filtered,而 FIN 扫描则认为是 open|filtered(注意只有指定了 TCP 的标记位时,指定扫描类型才是指定如何解释响应,否则 Nmap 仅仅把它当做扫描类型进行扫描),如果没有指定基本类型,就默认将响应按照 SYN 扫描的响应来解释

Idle scan(空转扫描)

-sI <zombie host[:probeport]>

这种高级的扫描方法允许对目标进行真正的 TCP 端口盲扫描(这意味着没有任何报文会发送到目标),这个扫描采用side-channel 攻击,利用 zombie 主机上已知的 IP 分段的 ID 序列生成算法来收集目标的开放端口的信息,IDS 系统则显示扫描来自你指定的 zombie 机(它必须运行并且符合一定的标准)而不是你自己

除了极端隐蔽(因为它不从真实 IP 地址直接发送任何报文给目标)之外,该扫描方式还可以建立机器间的基于 IP 的信任关系,因为扫描得到的开放端口列表是从 zombie 的角度得到的,因此你可以尝试使用你认为可被(路由器/包过滤规则)信任的 zombies 来扫描目标

Nmap 在这种扫描里会使用默认端口(80),如果需要改变,需要在 zombie 主机后加上一个冒号和端口号

IP 协议扫描

-sO

IP 协议扫描可以让你确定目标机支持哪些 IP 协议(TCP、ICMP、IGMP 等等),从技术上说,这不是端口扫描技术,因为它遍历的是 IP 协议号而不是 TCP 或者 UDP 端口号,但是它仍使用 -p 选项来选择要扫描的协议号,并用正常的端口表格来报告结果,甚至用和真正的端口扫描一样的扫描引擎

IP 协议扫描以和 UDP 扫描类似的方式工作,但是它发送的是 IP 报文头部,不是在 UDP 报文的端口的域上遍历,而是在 IP 协议的域的 8 位上遍历,报文头部通常是空的,不包含数据,甚至不包含所申明协议的正确报文的头部,TCP、UDP 和 ICMP 是三个例外,它们三个会使用正常的协议头部,否则某些操作系统拒绝发送,并且 Nmap 已经有函数可以创建它们,IP 协议扫描不关注 ICMP 端口不可到达的响应,而是关注 ICMP 协议不可到达的响应。

如果 Nmap 从目标主机收到任何协议的任何响应,Nmap 就把那个协议标记为 open,ICMP 协议不可到达错误(类型 3,代号 2)导致协议被标记为 closed,其它 ICMP 不可到达错误(类型 3,代号 1、3、9、10 或者 13)导致协议被标记为 filtered(但是与此同时它们证明了 ICMP 是 open 的),如果重试之后仍没有收到响应, 该协议就被标记为 open|filtered

FTP 反弹扫描

-b <ftp relay host>

FTP 协议的一个有趣特征是支持所谓代理 ftp 连接(RFC 959),它允许用户先连接到一台 FTP 服务器,然后要求文件送到一台第三方服务器,这个特性在很多层面上被滥用,所以许多服务器已经停止支持它了,其中一种利用方式就是请求 FTP 服务器轮流发送一个文件到目标主机上的端口,即让 FTP 服务器对其它主机的端口进行扫描,FTP 的错误消息会描述目标端口是开放还是关闭的,这是个绕过防火墙的好方法,因为 FTP 服务器常常被放置于更加内部的位置,使得它可以访问比 Web 主机更多的其它内部主机,Nmap 使用 -b 选项来支持ftp反弹扫描,参数的格式是 <username>:<password>@<server>:<port><server> 是某个 FTP 服务器的名字或者 IP 地址,如果 FTP 服务器上启用了匿名用户(user:anonymous password:-wwwuser@),则可以省略<username>:<password>,如果<server>使用默认的 FTP 端口(21),那么连端口号(以及前面的冒号)也可以省略

指定端口和扫描顺序

只扫描指定的端口

-p <port ranges>

该选项指明你想扫描的端口,覆盖默认值,单个端口加上连字符表示端口范围(如 1-1023)也可以,范围中的开始以及/或者结束值都可以被省略,分别会导致 Nmap 使用 1 和 65535,所以可以指定 -p-从端口 1 扫描到 65535,如果特别指定,也可以扫描端口 0,对于 IP 协议扫描(-sO)来说,该选项指定希望扫描的协议号,范围是 0-255

当既扫描 TCP 端口又扫描 UDP 端口时,可以通过在端口号前加上T: 或者U:来指定协议,协议限定符会一直生效直到指定了另一个,例如参数 -p U:53, 111, 137, T:21-25, 80, 139, 8080 将扫描 UDP 端口53、111 和 137,同时扫描列出的 TCP 端口,要既扫描 UDP 又扫描 TCP,必须指定 -sU,以及至少一个 TCP 扫描类型(如 -sS、-sF 或者 -sT),如果没有给出协议限定符,端口号会被加到所有协议的端口列表中

快速扫描(有限的端口)

-F

在 Nmap 的 nmap-services 文件中(对于-sO,是协议文件)指定你想要扫描的端口,这比扫描所有 65535 个端口快得多,因为默认的 nmap-services 文件中包含了太多的 TCP 端口(1200 个),这和默认的 TCP 扫描(大约 1600 个端口)速度差别不是很大,但是如果用–datadir选项指定你自己的较小的 nmap-services文件 ,差别会很惊人

顺序扫描端口

-r

默认情况下,Nmap 按随机扫描端口(除了出于效率的考虑,将常用的端口前移之外),这种随机化通常都是可取的,但也可以指定-r来按顺序进行端口扫描

Namp进阶(前文精简版)

Nmap可以识别出的6种端口状态

开放:工作于开放端口的服务器端的应用程序可以受理TCP连接、接收UDP数据包或者响应SCTP(流控制传输协议)请求
关闭:虽然我们确实可以访问有关的端口,但是没有应用程序工作于该端口上
过滤:Nmap不能确定该端口是否开放,包过滤设备屏蔽了我们向目标发送的探测包
未过滤:虽然可以访问到指定端口,但Nmap不能确定该端口是否处于开放状态
打开|过滤:Nmap认为指定端口处于开放状态或过滤状态,但是不能确定处于两者之中的哪种状态,在遇到没有响应的开放端口时,Nmap会作出这种判断,这可以是由于防火墙丢弃数据包造成的
关闭|过滤:Nmap认为指定端口处于关闭状态或过滤状态,但是不能确定处于两者之中的哪种状态

常用选项

服务版本识别(-sV),Nmap可以在进行端口扫描的时候检测服务端软件的版本信息,版本信息将使后续的漏 洞识别工作更有针对性

root@kali:~# nmap -sV 192.168.31.13 -p 8080
Starting Nmap 7.70 ( https://nmap ) at 2018-08-13 00:02 CST
Nmap scan report for 192.168.31.13
Host is up (0.00076s latency).

PORT     STATE SERVICE VERSION
8080/tcp open  http    Apache Tomcat 8.5.14
MAC Address: 00:0C:29:99:D3:E6 (VMware)

Service detection performed. Please report any incorrect results at https://nmap/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 12.75 seconds

操作系统检测(-O),Nmap还能识别目标主机的操作系统

root@kali:~# nmap -O 192.168.31.13 
Starting Nmap 7.70 ( https://nmap ) at 2018-08-13 00:03 CST
Nmap scan report for 192.168.31.13
Host is up (0.00072s latency).
Not shown: 998 closed ports
PORT      STATE SERVICE
8080/tcp  open  http-proxy
10010/tcp open  rxapi
MAC Address: 00:0C:29:99:D3:E6 (VMware)
Device type: general purpose
Running: Linux 3.X|4.X
OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4
OS details: Linux 3.2 - 4.9
Network Distance: 1 hop

OS detection performed. Please report any incorrect results at https://nmap/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 3.49 seconds

禁用主机检测(-Pn),如果主机屏蔽了ping请求,Nmap可能会认为该主机没有开机,这将使得Nmap无法进行进一 步检测,比如端口扫描、服务版本识别和操作系统识别等探测工作,为了克服这一问题,就 需要禁用Nmap的主机检测功能,在指定这个选项之后,Nmap会认为目标主机已经开机并会 进行全套的检测工作

强力检测选项(-A),启用-A选项之后,Nmap将检测目标主机的下述信息

  • 服务版本识别(-sV)
  • 操作系统识别(-O)
  • 脚本扫描(-sC)
  • Traceroute(–traceroute)

TCP扫描选项

  1. TCP连接扫描(-sT):指定这个选项后,程序将和目标主机的每个端口都进行完整的三次握手,如果成功建立连接,则判定该端口是开放端口,由于在检测每个端口时都需要进行三次握手,所以这种扫描方式比较慢,而且扫描行为很可能被目标主机记录下来,如果启动Nmap的用户的权限不足,那么默认情况下Nmap程序将以这种模式进行扫描
  1. SYN扫描(-sS):该选项也称为半开连接或者SYN stealth,采用该选项后,Nmap将使用 含有SYN标志位的数据包进行端口探测,如果目标主机回复了SYN/ACK包,则说明该端口处 于开放状态:如果回复的是RST/ACK包,则说明这个端口处于关闭状态;如果没有任何响应 或者发送了ICMP unreachable信息,则可认为这个端口被屏蔽了,SYN模式的扫描速度非常好,而且由于这种模式不会进行三次握手,所以是一种十分隐蔽的扫描方式,如果启动Nmap 的用户有高级别权限,那么在默认情况下Nmap程序将以这种模式进行扫描
  1. TCP NULL(-sN)、FIN(-sF)及XMAS(-sX)扫描:NULL 扫描不设置任何控制位; FIN扫描仅设置FIN标志位:XMAS扫描设置FIN、PSH和URG的标识,如果目标主机返回 了含有RST标识位的响应数据,则说明该端口处于关闭状态;如果目标主机没有任何回应, 则该端口处于打开|过滤状态
  1. TCP Maimon扫描(-sM):Uriel Maimon 首先发现了TCP Maimom扫描方式。这种模式的探测数据包含有FIN/ACK标识,对于BSD衍生出来的各种操作系统来说,如果被测端口处于开放状态,主机将会丢弃这种探测数据包;如果被测端口处于关闭状态,那么主机将会回复 RST
  1. TCPACK扫描(-sA):这种扫描模式可以检测目标系统是否采用了数据包状态监测技术(stateful)防火墙,并能确定哪些端口被防火墙屏蔽,这种类型的数据包只有一个ACK标识位,如果目标主机的回复中含有RST标识,则说明目标主机没有被过滤
  1. TCP窗口扫描(-sW):这种扫描方式检测目标返回的RST数据包的TCP窗口字段,如果目标端口处于开放状态,这个字段的值将是正值;否则它的值应当是0
  1. TCP Idle扫描(-sI):采用这种技术后,您将通过指定的僵尸主机发送扫描数据包,本机并不与目标主机直接通信,如果对方网络里有IDS,IDS将认为发起扫描的主机是僵尸主机

UDP扫描选项

Nmap有多种TCP扫描方式,而UDP扫描仅有一种扫描方式(-sU),虽然UDP扫描结果没有 TCP扫描结果的可靠度高,但渗透测试人员不能因此而轻视UDP扫描,毕竟UDP端口代表着可能会有价值的服务端程序,但是UDP扫描的最大问题是性能问题,由于Linux内核限制1秒内最多发送一次ICMP Port Unreachable信息,按照这个速度,对一台主机的65536个UDP端口进行完整扫描总耗时必定会超过18个小时

优化方法主要是:

  1. 进行并发的UDP扫描
  2. 优先扫描常用端口
  3. 在防火墙后面扫描
  4. 启用–host-timeout选项以跳过响应过慢的主机

假如需要找到目标主机开放了哪些 UDP端口,为提高扫描速度,仅扫描 53端口 (DNS)和161端口(SNMP),可以使用命令nmap -sU 192.168.56.103 -p 53,161

目标端口选项

默认情况下,Nmap将从每个协议的常用端口中随机选择1000个端口进行扫描,其nmapservices文件对端口的命中率进行了排名
可以自定义端口参数:

  • -p端口范围:只扫描指定的端口,扫描1〜1024号端口,可设定该选项为–p 1-1024,扫描1 〜65535端口时,可使用-p-选项
  • -F(快速扫描):将仅扫描100个常用端口
  • -r(顺序扫描):指定这个选项后,程序将从按照从小到大的顺序扫描端口
  • -top-ports <1 or="" greater="">:扫描nmap-services里排名前N的端口

输出选项

Nmap可以把扫描结果保存为外部文件,在需要使用其他工具处理Nmap的扫描结果时,这一 功能十分有用,即使设定程序把扫描结果保存为文件,Nmap还是会在屏幕上显示扫描结果

Nmap支持以下几种输出形式:

正常输出(-oN):不显示runtime信息和警告信息。
XML	文件(-oX):生成的XML格式文件可以转换成HTML格式文件,还可被Nmap的图形用户界面解析,也便于导入数据库,建议尽量将扫描结果输出为XML文件
生成便于Grep使用的文件(-oG):虽然这种文件格式已经过时,但仍然很受欢迎,这种格式的文件,其内容由注释(由"#"开始)和信息行组成,信息行包含6个字段,每个字段的字段名称和字段值以冒号分割,字段之间使用制表符隔开,这些字段的名称分别为Host、Ports、Protocols、Ignored State、OS、Seq Index、IP ID	Seq	和Status,这种格式的文件便于grep或awk之类的UNIX指令整理扫描结果
输出至所有格式(-oA):为使用方便,利用-oA选项可将扫描结果以标准格式、XML格式和Grep格式一次性输出,分别存放在.nmap,.xml和.gnmap文件中

时间排程控制选项

Nmap可通过-T选项指定时间排程控制的模式,它有6种扫描模式

paranoid(0):每5分钟发送一次数据包,且不会以并行方式同时发送多组数据,这种模式的扫描不会被IDS检测到
sneaky(1):每隔15秒发送一个数据包,且不会以并行方式同时发送多组数据
polite(2):每0.4	秒发送一个数据包,且不会以并行方式同时发送多组数据
normal(3):此模式同时向多个目标发送多个数据包,为Nmap默认的模式,该模式能自 动在扫描时间和网络负载之间进行平衡
aggressive(4):在这种模式下,Nmap对每个既定的主机只扫描5分钟,然后扫描下一台主机,它等待响应的时间不超过1.25秒
insane(5):在这种模式下,Nmap对每个既定的主机仅扫描75秒,然后扫描下一台主机,它等待响应的时间不超过0.3秒

默认的扫描模式通常都没有问题,除非您想要进行更隐匿或更快速的扫描,否则没有必要调整这一选项

扫描IPv6主机

启用Nmap的-6选项即可扫描IPv6的目标主机,当前只能逐个指定目标主机的IPv6地址

nmap -6	fe80::a00:27ff:fe43:1518

同一台主机在IPv6网络里开放的端口比它在IPv4网络里开放的端口数量要少,这是因为部分服务程序尚未支持IPv6网络

脚本引擎功能(Nmap Scripting Engine,NSE)

最后但是同样重要的,Nmap本身已经很强大了,但是加上它的脚本引擎更加开挂了,NSE 可使用户的各种网络检査工作更为自动化,有助于识别应用程序中新发现的漏洞、检测程序版本等Nmap原本不具有的功能,虽然Nmap软件包具有各 种功能的脚本,但是为了满足用户的特定需求,它还支持用户撰写自定义脚本

auth:此类脚本使用暴力破解等技术找出目标系统上的认证信息
default:启用--sC或者-A选项时运行此类脚本,这类脚本同时具有下述特点:执行速度快;输出的信息有指导下一步操作的价值;输出信息内容丰富、形式简洁;必须可靠;不会侵入目标系统;能泄露信息给第三方
discovery:该类脚本用于探索网络
dos:该类脚本可能使目标系统拒绝服务,请谨慎使用
exploit:该类脚本利用目标系统的安全漏洞,在运行这类脚本之前,渗透测试人员需要获取被测单位的行动许可
external:该类脚本可能泄露信息给第三方
fuzzer:该类脚本用于对目标系统进行模糊测试
instrusive:该类脚本可能导致目标系统崩溃,或耗尽目标系统的所有资源
malware:该类脚本检査目标系统上是否存在恶意软件或后门
safe:该类脚本不会导致目标服务崩溃、拒绝服务且不利用漏洞
version:配合版本检测选项(-sV),这类脚本对目标系统的服务程序进行深入的版本检测
vuln:该类脚本可检测检査目标系统上的安全漏洞
在Kali Linux系统中,Nmap脚本位于目录/usr/share/nmap/scripts
-sC	或--script=default:启动默认类NSE	脚本
--script <filename>|<category>|<directories>:根据指定的文件名、类别名、目录名,执行相应的脚本
--script-args <args>:这个选项用于给脚本指定参数,例如在使用认证类脚本时,可通过这个选项指定用户名和密码
nmap --script http-enum,http-headers,http-methods,http-php-version	-p	80 192.168.56.103

规避检测的选项

在渗透测试的工作中,目标主机通常处于防火墙或 IDS 系统的保护之中,在这种环境中使用 Nmap 的默认选项进行扫描,不仅会被发现而且往往一无所获,此时我们就要使用Nmap规避检测的有关选项

-f(使用小数据包):这个选项可避免对方识别出我们探测的数据包,指定这个选项之后,Nmap将使用8字节甚至更小数据体的数据包
--mtu:这个选项用来调整数据包的包大小,MTU(Maximum Transmission Unit,最大传输单元)必须是8的整数倍,否则Nmap将报错
-D(诱饵):这个选项应指定假IP,即诱饵的IP,启用这个选项之后,Nmap在发送侦测数据包的时候会掺杂一些源地址是假IP(诱饵)的数据包,这种功能意在以藏木于林的方法掩盖本机的真实IP,也就是说对方的log还会记录下本机的真实IP,可使用RND生成随机的假IP地址,或者用`RND:number`的参数生成`<number>`个假IP地址,所指定的诱饵主机应当在线,否则很容易击溃目标主机,另外,使用了过多的诱饵可能造成网络拥堵,尤其是在扫描客户的网络的时候,应当极力避免上述情况
--source-port <portnumber>或-g(模拟源端口):如果防火墙只允许某些源端口的入站流量,这个选项就非常有用
--data-length:这个选项用于改变Nmap发送数据包的默认数据长度,以避免被识别出来是Nmap的扫描数据
--max-parallelism:这个选项可限制Nmap并发扫描的最大连接数
--scan-delay <time>:这个选项用于控制发送探测数据的时间间隔,以避免达到IDS/IPS端口扫描规则的阈值

参考链接:https://www.tr0y.wang/2019/05/24/Nmap-guide/#%E8%BE%93%E5%87%BA
参考链接:https://crayon-xin.github.io/2018/08/12/nmap%E8%B6%85%E8%AF%A6%E7%BB%86%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/

更多推荐

Nmap使用指南

本文发布于:2023-04-25 01:37:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/b89df9599608b7b8560535e019a3087d.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:使用指南   Nmap

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!

  • 101897文章数
  • 26136阅读数
  • 0评论数