Nmap使用指南
Posted H3rmesk1t
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nmap使用指南相关的知识,希望对你有一定的参考价值。
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安装
- Windows的话直接去官网下载安装包直接安装,下载地址
- MacOS的话可以通过从Nmap站点或通过Homebrew下载".dmg"安装软件包来安装Nmap,使用
brew install nmap
- Kali的话是已经自带了nmap
- Ubuntu和Debian如果没有安装的话,使用命令
sudo apt update\\sudo apt install nmap
即可安装- CentOS和Fedora如果没有安装的话,使用
sudo dnf install nmap
即可安装
Nmap基本扫描
- 扫描单个网络:
nmap 192.168.1.1/www.baidu.com
- 扫描多个网络/目标:
nmap 192.168.1.1 192.168.1.2 将扫描同个网段内不同的ip地址
- 扫描连续的IP地址:
nmap 192.168.2.1-192.168.2.100 将扫描同个网段内不同的ip地址
nmap 192.168.2.1/24 nmap也可以用使用CIDR(无类别域间路由)表示法整个子网
- 扫描目标列表:
nmap -iL [LIST.txt] 如果你有大量的系统进行扫描,就可以在文本文件中输入IP地址(或主机名),并使用该文件作为输入
- 扫描随机目标:
nmap -ir [主机数] 该-IR参数可以用来选择随机Internet主机进行扫描,NMAP会随机生成目标的指定数量,并试图对其进行扫描
nmap 192.168.2.1/24 -exclude 192.168.2.10 该-exclude选项与用于从NMAP的扫描中排除主机
- 侵入性扫描:
nmap -A 主机 最常用的选项,试图用一个简单字母A的替代长字符串,它也会执行路由跟踪等
Nmap各个阶段
指定目标
除了选项,所有出现在 Nmap 命令行上的都被视为对目标主机的说明;最简单的情况是指定一个目标IP地址或主机名;Nmap 接受可以多个主机,并且它们不必是相同类型,例如
nmap scanme.nmap.org 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.org 的 IP 地址是 205.217.153.62,scanme.nmap.org/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 个:
- 判断是否存活
- 获取端口的开放情况
如果没有指定目标探测的方式,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.org ) 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 种情况:
- ICMP 端口无法到达的回应报文:表明目标端口关闭。UDP 探测得到一个 ICMP 端口无法到达的回应报文,这对于 Nmap 意味着该目标存活
- 许多其它类型的 ICMP 错误:表示目标不存活或网络不可到达。ICMP 错误包括:主机/网络无法到达或者 TTL 超时等等
- 没有回应:如果到达一个开放的端口,大部分服务会忽略这个空报文,不做任何回应。这就是为什么默认探测端口是 31338 这样一个极不可能被使用的端口
- 空的 UDP 报文:少数服务如 chargen 会响应一个空的 UDP 报文,从而向 Nmap 表明该机器正在运行
- 该扫描类型的主要优势是它可以穿越只过滤 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.org/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.org ) at 2019-05-29 11:35 CST
Nmap scan report for baidu.com (123.125.114.144)
Host is up (0.023s latency).
Other addresses for baidu.com (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.org ) 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 连接当作以太网对待)
以上是关于Nmap使用指南的主要内容,如果未能解决你的问题,请参考以下文章