Nmap

Posted by wsxq2 on 2020-06-12
TAGS:  Nmap扫描

本文最后一次编辑时间:2020-06-15 11:04:17 +0800

本文记录的是我学习著名扫描工具 Nmap 的笔记、实验和一些使用经验

简介

  Nmap(网络映射器)是一款用于网络发现和安全审计的网络安全工具,它是自由软件。软件名字Nmap是Network Mapper的简称。通常情况下,Nmap用于:

  • 列举网络主机清单
  • 管理服务升级调度
  • 监控主机
  • 服务运行状况

  Nmap可以检测目标主机是否在线、端口开放情况、侦测运行的服务类型及版本信息、侦测操作系统与设备类型等信息。 它是网络管理员必用的软件之一,用以评估网络系统安全。

  Nmap 是不少黑客及脚本小子爱用的工具 。系统管理员可以利用Nmap来探测工作环境中未经批准使用的服务器,黑客通常会利用Nmap来搜集目标电脑的网络设定,从而计划攻击的方法。

  Nmap通常用在信息搜集阶段,用于搜集目标机主机的基本状态信息。扫描结果可以作为漏洞扫描、漏洞利用和权限提升阶段的输入。例如,业界流行的漏洞扫描工具Nessus与漏洞利用工具Metasploit都支持导入Nmap的XML格式结果,而Metasploit框架内也集成了Nmap工具(支持Metasploit直接扫描)。

  Nmap不仅可以用于扫描单个主机,也可以适用于扫描大规模的计算机网络(例如,扫描英特网上数万台计算机,从中找出感兴趣的主机和服务)。

  ——引用自 Nmap - 维基百科,自由的百科全书

以及:

  Nmap(“网络映射器”)是一种免费的开源(许可证)实用程序,用于网络发现和安全审核。许多系统和网络管理员还发现它对于诸如网络清单,管理服务升级计划以及监视主机或服务正常运行时间之类的任务很有用。Nmap以新颖的方式使用原始 IP 数据包来确定网络上可用的主机,这些主机提供的服务(应用程序名称和版本),它们正在运行的操作系统(和 OS 版本),包过滤器/防火墙的类型。在使用中,还有许多其他特性。它旨在快速扫描大型网络,也可以在单个主机上正常运行。 Nmap 可在所有主要的计算机操作系统上运行,并且官方二进制软件包可用于 Linux , Windows 和 Mac OSX。除了经典的命令行 Nmap 可执行文件外,Nmap套件还包括高级 GUI 和结果查看器(Zenmap),灵活的数据传输,重定向和调试工具(Ncat),用于比较扫描结果的实用程序(Ndiff)以及数据包生成和响应分析工具(Nping)。

  Nmap 被 Linux Journal、Info World、LinuxQuestions.Org 和 Codetalker Digest 评为“年度安全产品”。它甚至出现在十二部电影中,包括《黑客帝国2:重装上阵》、《虎胆龙威4》、《龙纹身的女孩》和《谍影重重3》。

  ——谷歌翻译自https://nmap.org/

常用链接

参数解析

本部分内容主要参考自 Nmap参考指南(Man Page)Chapter 15. Nmap Reference Guide | Nmap Network Scanning

选项概要

最新版本:https://nmap.org/data/nmap.usage.txt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# nmap
Nmap 6.40 ( http://nmap.org )
Usage: nmap [Scan Type(s)] [Options] {target specification}
TARGET SPECIFICATION:
  Can pass hostnames, IP addresses, networks, etc.
  Ex: scanme.nmap.org, microsoft.com/24, 192.168.0.1; 10.0.0-255.1-254
  -iL <inputfilename>: Input from list of hosts/networks
  -iR <num hosts>: Choose random targets
  --exclude <host1[,host2][,host3],...>: Exclude hosts/networks
  --excludefile <exclude_file>: Exclude list from file
HOST DISCOVERY:
  -sL: List Scan - simply list targets to scan
  -sn: Ping Scan - disable port scan
  -Pn: Treat all hosts as online -- skip host discovery
  -PS/PA/PU/PY[portlist]: TCP SYN/ACK, UDP or SCTP discovery to given ports
  -PE/PP/PM: ICMP echo, timestamp, and netmask request discovery probes
  -PO[protocol list]: IP Protocol Ping
  -n/-R: Never do DNS resolution/Always resolve [default: sometimes]
  --dns-servers <serv1[,serv2],...>: Specify custom DNS servers
  --system-dns: Use OS's DNS resolver
  --traceroute: Trace hop path to each host
SCAN TECHNIQUES:
  -sS/sT/sA/sW/sM: TCP SYN/Connect()/ACK/Window/Maimon scans
  -sU: UDP Scan
  -sN/sF/sX: TCP Null, FIN, and Xmas scans
  --scanflags <flags>: Customize TCP scan flags
  -sI <zombie host[:probeport]>: Idle scan
  -sY/sZ: SCTP INIT/COOKIE-ECHO scans
  -sO: IP protocol scan
  -b <FTP relay host>: FTP bounce scan
PORT SPECIFICATION AND SCAN ORDER:
  -p <port ranges>: Only scan specified ports
    Ex: -p22; -p1-65535; -p U:53,111,137,T:21-25,80,139,8080,S:9
  -F: Fast mode - Scan fewer ports than the default scan
  -r: Scan ports consecutively - don't randomize
  --top-ports <number>: Scan <number> most common ports
  --port-ratio <ratio>: Scan ports more common than <ratio>
SERVICE/VERSION DETECTION:
  -sV: Probe open ports to determine service/version info
  --version-intensity <level>: Set from 0 (light) to 9 (try all probes)
  --version-light: Limit to most likely probes (intensity 2)
  --version-all: Try every single probe (intensity 9)
  --version-trace: Show detailed version scan activity (for debugging)
SCRIPT SCAN:
  -sC: equivalent to --script=default
  --script=<Lua scripts>: <Lua scripts> is a comma separated list of
           directories, script-files or script-categories
  --script-args=<n1=v1,[n2=v2,...]>: provide arguments to scripts
  --script-args-file=filename: provide NSE script args in a file
  --script-trace: Show all data sent and received
  --script-updatedb: Update the script database.
  --script-help=<Lua scripts>: Show help about scripts.
           <Lua scripts> is a comma separted list of script-files or
           script-categories.
OS DETECTION:
  -O: Enable OS detection
  --osscan-limit: Limit OS detection to promising targets
  --osscan-guess: Guess OS more aggressively
TIMING AND PERFORMANCE:
  Options which take <time> are in seconds, or append 'ms' (milliseconds),
  's' (seconds), 'm' (minutes), or 'h' (hours) to the value (e.g. 30m).
  -T<0-5>: Set timing template (higher is faster)
  --min-hostgroup/max-hostgroup <size>: Parallel host scan group sizes
  --min-parallelism/max-parallelism <numprobes>: Probe parallelization
  --min-rtt-timeout/max-rtt-timeout/initial-rtt-timeout <time>: Specifies
      probe round trip time.
  --max-retries <tries>: Caps number of port scan probe retransmissions.
  --host-timeout <time>: Give up on target after this long
  --scan-delay/--max-scan-delay <time>: Adjust delay between probes
??? from here until ???END lines may have been inserted/deleted
  --min-rate <number>: Send packets no slower than <number> per second
  --max-rate <number>: Send packets no faster than <number> per second
FIREWALL/IDS EVASION AND SPOOFING:
  -f; --mtu <val>: fragment packets (optionally w/given MTU)
  -D <decoy1,decoy2[,ME],...>: Cloak a scan with decoys
  -S <IP_Address>: Spoof source address
  -e <iface>: Use specified interface
  -g/--source-port <portnum>: Use given port number
  --data-length <num>: Append random data to sent packets
  --ip-options <options>: Send packets with specified ip options
  --ttl <val>: Set IP time-to-live field
  --spoof-mac <mac address/prefix/vendor name>: Spoof your MAC address
  --badsum: Send packets with a bogus TCP/UDP/SCTP checksum
OUTPUT:
  -oN/-oX/-oS/-oG <file>: Output scan in normal, XML, s|<rIpt kIddi3,
     and Grepable format, respectively, to the given filename.
  -oA <basename>: Output in the three major formats at once
  -v: Increase verbosity level (use -vv or more for greater effect)
  -d: Increase debugging level (use -dd or more for greater effect)
  --reason: Display the reason a port is in a particular state
  --open: Only show open (or possibly open) ports
  --packet-trace: Show all packets sent and received
  --iflist: Print host interfaces and routes (for debugging)
  --log-errors: Log errors/warnings to the normal-format output file
  --append-output: Append to rather than clobber specified output files
  --resume <filename>: Resume an aborted scan
  --stylesheet <path/URL>: XSL stylesheet to transform XML output to HTML
  --webxml: Reference stylesheet from Nmap.Org for more portable XML
  --no-stylesheet: Prevent associating of XSL stylesheet w/XML output
MISC:
  -6: Enable IPv6 scanning
  -A: Enable OS detection, version detection, script scanning, and traceroute
  --datadir <dirname>: Specify custom Nmap data file location
  --send-eth/--send-ip: Send using raw ethernet frames or IP packets
  --privileged: Assume that the user is fully privileged
  --unprivileged: Assume the user lacks raw socket privileges
  -V: Print version number
  -h: Print this help summary page.
EXAMPLES:
  nmap -v -A scanme.nmap.org
  nmap -v -sn 192.168.0.0/16 10.0.0.0/8
  nmap -v -iR 10000 -Pn -p 80
SEE THE MAN PAGE (http://nmap.org/book/man.html) FOR MORE OPTIONS AND EXAMPLES

目标说明

IP

1
192.168.1.1

域名

1
www.baidu.com

/(CIDR)

1
2
3
4
192.168.10.0/24
scanme.nmap.org/16
0/1 # 半个互联网
192.168.1.1/32 # 和 192.168.1.1 等价

-

1
2
192.168.0-255.1-254
0-255.0-255.13.37

,

1
2
10.0.0,1.1
10.0.0,1.1,4

*

1
192.168.0.*

-iL <inputfilename>

从文件中读取目标主机,以空格或制表符或换行分隔。文件中的主机描述支持上述所有格式(IP、域名、/-,)。支持标准输入(-)。

-iR <num hosts>

随机选择目标。自动过滤不合需要的 IP,如特定的私有、组播或者未分配的地址。例如:

1
nmap -sS -PS80 -iR 0 -p 80

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

排除特定目标。同样支持前述所有格式(IP、域名、/-,

` –excludefile `

--exclude作用相同,只是从文件中读取,以空格或制表符或换行分隔。文件中的主机描述支持上述所有格式(IP、域名、/-,)。支持标准输入(-)。

主机发现

-sL(List scan)

只进行域名解析。一个看似简单的域名往往能提供很多有用的信息

-sn(No port scan)

探测目标主机是否在线。默认行为是依次向目标主机发送如下包进行探测:

  1. 类型为Echo Request(代码为8)的 ICMP 包(ping命令发送的就是这种包)
  2. 目标端口为443的 SYN 包(TCP 三次握手第一步)
  3. 目标端口为80的 ACK 包(TCP 三次握手中的第三步)
  4. 类型为Timetamp Request(代码为13)的 ICMP

如果上述四个包都没有收到响应,则nmap会逆序再发一遍。(这是使用 Wireshark 抓包得到的结论)

如果以非 root 用户执行,则只会向 80 和 443 端口发送 SYN 包(使用connect函数)

如果 root 用户扫描的主机位于本地局域网,则会使用 ARP 请求,除非指定了--send-ip选项

可以将-sn选项与任何发现探测类型(-P*选项,-Pn除外)组合使用,以提高灵活性。如果使用这些探测类型和端口号选项中的任何一个,则默认行为将被覆盖。

在之前的版本中-sn被叫做-sP

-Pn(No ping)

完全跳过 Nmap 发现阶段(-sn),即假设所有目标主机都是在线的。

要跳过发现阶段和端口扫描阶段,同时仍允许 NSE 运行,请同时使用这两个选项:-Pn-sn

在以前的版本中,-Pn被叫做-P0-PN

-PS [port list](TCP SYN Ping)

该选项发送一个设置了 SYN 标志位的空 TCP 报文。默认端口为 80。也可以指定一个以逗号分隔的端口列表(如-PS22,23,25,80,113,1050,35000),在这种情况下,每个端口会被并发地扫描。

  1. 如果目标主机在线:
    1. 如果目标端口关闭,回复 RST 包;
    2. 如果目标端口开启,回复 SYN + ACK 包。
  2. 如果目标主机离线:无回复

-PA [port list] (TCP ACK Ping)

该选项发送一个设置了 ACK 标志位的空 TCP 报文。默认端口为 80。也可以指定一个以逗号分隔的端口列表(如-PS22,23,25,80,113,1050,35000),在这种情况下,每个端口会被并发地扫描。

  1. 如果目标主机在线:回复 RST 包
  2. 如果目标主机离线:无回复

如果非特权用户尝试该功能,或者指定的是 IPv6 目标,前面说过的connect()函数将被使用。这个方法并不完美,因为它实际上发送的是 SYN 报文,而不是 ACK 报文。

许多管理员会配置他们的路由器或者其它简单的防火墙来封锁 SYN 报文,除非连接目标是那些公开的服务器(如公司网站或者邮件服务器)。这种无状态的方法几乎不占用防火墙/路由器的资源,因而被硬件和软件过滤器广泛支持。Linux Netfilter/iptables 防火墙软件提供方便的--syn选项来实现这种无状态的方法。所以可以通过使用该参数(-PA)绕过防火墙,探测目标主机是否在线

另外一种常用的防火墙用有状态的规则来封锁非预期的报文。Linux Netfilter/iptables 通过--state选项支持这一特性,它根据连接状态把报文进行分类。SYN 探测更有可能用于这样的系统,由于没头没脑的ACK报文通常会被识别成伪造的而丢弃。解决这个两难的方法是通过既指定-PS又指定-PA来既发送 SYN 又发送 ACK 。

-PU [port list] (UDP Ping)

该选项发送一个空的(除非指定了--data-length)UDP 报文到指定的端口(默认端口为 31338)

  1. 如果目标主机在线:回复 ICMP 端口无法到达的回应报文
  2. 如果目标主机离线:回复主机/网络无法到达或者 TTL 超时或者无回复

如果指定的端口是开放的端口,则大部分服务仅仅忽略这个空报文而不做任何回应,从而导致无法判定目标主机是否在线

该扫描类型的主要优势是它可以穿越只过滤TCP的防火墙和过滤器

-PY <port list> (SCTP INIT Ping)

TODO

-PE; -PP; -PM (ICMP Ping Types)

  • -PE(ICMP echo): Nmap 发送一个 ICMP type 8 (回声请求)报文到目标 IP 地址,期待从运行的主机得到一个 type 0 (回声响应)报文。不幸的是,许多主机和防火墙现在封锁这些报文,而不是按期望的那样响应
  • -PP(timestamp request): Nmap 发送一个 ICMP type 13 (时间戳请求)报文到目标 IP 地址,期待从运行的主机得到一个 type 14 (时间戳响应)报文
  • -PM(netmask request): Nmap 发送一个 ICMP type 17 (地址掩码请求)报文到目标 IP 地址,期待从运行的主机得到一个 type 18 (地址掩码响应)报文

事实上,只要上面的各种 ICMP 请求收到了响应,就可以认为目标主机在线,否则认为离线

-PO <protocol list> (IP Protocol Ping)

TODO

--disable-arp-ping (No ARP or ND Ping)

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

默认行为通常更快,但是此选项在使用代理 ARP 的网络上很有用,在该网络中,路由器以推测方式答复所有 ARP 请求,从而根据 ARP 扫描使每个目标都处于启动状态。

--traceroute (Trace path to host)

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

标准跟踪路由的实现以 TTL 为 1 开始并递增 TTL ,直到到达目标主机为止。 Nmap 的跟踪路由以较高的 TTL 开始,然后递减 TTL 直到达到零。向后执行此操作可使 Nmap 使用聪明的缓存算法来加快对多个主机的跟踪。(?)(实测确实要比 Windows 的 tracert 快得多(www.baidu.com, 31.68s < 1min30s))

-n (No DNS resolution)

告诉 Nmap 永远不要对找到的活动 IP 地址进行 DNS 解析

-R (DNS resolution for all targets)

告诉 Nmap 始终对目标 IP 地址执行反向 DNS 解析。通常,反向 DNS 仅对响应型(在线)主机执行。

--resolve-all (Scan each resolved address)

如果主机名目标解析为多个地址,则扫描所有地址。默认行为是仅扫描第一个解析的地址。

--system-dns (Use system DNS resolver)

默认情况下,Nmap 通过将查询直接发送到主机上配置的 DNS 服务器,然后侦听响应来反向解析 IP 地址。并行执行许多请求(通常是几十个)以提高性能。指定此选项可改为使用系统解析器(通过getnameinfo调用一次解析一个IP)。

系统解析器始终用于正向查找(从主机名获取 IP 地址)。

--dns-servers <server1>[,<server2>[,...]] (Servers to use for reverse DNS queries)

默认情况下,Nmap 通过resolv.conf文件(Unix)或注册表(Win32)确定 DNS 服务器(用于 rDNS 解析)。或者,您可以使用此选项来指定备用服务器。

如果使用--system-dns,则不支持该选项。

使用多个 DNS 服务器通常更快,尤其是如果您为目标 IP 空间选择了权威服务器时。

此选项还可以提高隐身性,因为您的请求几乎可以在 Internet 上的任何递归 DNS 服务器上被退回。

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

如果 DNS 响应超过 UDP 数据包的大小,则可能不支持该选项。在这种情况下,我们的 DNS 解析器将尽最大努力从截断的数据包中提取响应,如果失败,它将回退到使用系统解析器。同样,包含 CNAME 别名的响应将回退到系统解析器。

常用选项

  1. -sn:探测目标主机是否在线。
  2. -sn -Pn: 同样探测目标主机是否在线,但是不ping(Ping no)。事实上,该选项组合没有多大实际意义,详情参见 network - What -sn -Pn does in Nmap? - Information Security Stack Exchange。抓包也没有看到向目标主机发送任何包
  3. -sS(包含-sn): 本质是根据端口开放的概率依次(Open 概率高的先探测)向目标主机的端口发送 SYN 包,默认会探测 1000+ 端口。如果想知道具体是哪些端口,可能使用 Wireshark 抓包查看。发送 SYN 包后:如果目标主机相应的端口关闭,则回复一个 RESET 包,nmap 判为 closed;如果目标主机相应的端口开启,则回复 SYN+ACK 包,这时 nmap 不会回复第三次握手需要的 ACK 包,nmap 判为 open;如果目标主机未回复任何内容,则 nmap 判为 filtered。

    一个例子:

    1
    
    nmap -sS 192.168.1.1
    

    本选项会在探测端口前检查目标上机是否在线(相当于加了-sn选项),如果不在线,则不进行端口探测,可节省大量时间

  4. -sS -Pn:和-sS作用相同,只是不进行主机是否在线的检查。
  5. -sV(包含-sn-sS):版本探测
  6. -A(包含-sn-sS-O-sV-sC--script=default)、--traceroute):全面探测

链接

下面总结了本文中使用的所有链接: