Nmap 介绍

  • Nmap(Network Mapper)是一款用于网络探测和安全评估的开源工具。

  • 它设计用于扫描大型网络中的主机,并识别目标主机上运行的服务、操作系统类型以及开放的网络端口。

  • 正如大多数被用于网络安全的工具 Nmap 也是不少黑客及骇客(又称脚本小子)爱用的工具 。

  • 系统管理员可以利用 Nmap 来探测工作环境中未经批准使用的服务器,但是黑客会利用 Nmap 来搜集目标电脑的网络设定,从而计划攻击的方法。

  • Nmap 官网:https://nmap.org/

注:Nmap 的图形化工具是 Zenmap,但不常用,这里不做讲解。

  • 以下是 Nmap 的一些主要功能和特点:
    • 网络发现:Nmap 可以帮助您发现局域网或广域网上的活动主机。它使用 ICMP、ARP、TCP 和UDP 等协议来探测网络上的主机,并提供有关每个主机的信息,如IP地址、MAC地址和主机名等。
    • 端口扫描:Nmap 可以扫描目标主机上的开放端口。它可以执行各种类型的端口扫描,包括 TCP 全连接扫描、TCP SYN 扫描、TCP ACK 扫描、UDP 扫描等。通过检查目标主机上的开放端口,可以确定可能存在的服务和应用程序。
    • 服务识别:Nmap 可以通过分析目标主机上开放的端口和服务响应来识别正在运行的服务。它可以检测并报告目标主机上的各种服务,如Web服务器(如 Apache、Nginx)、邮件服务器(如 SMTP、POP3)、数据库服务器(如 MySQL、PostgreSQL)等。
    • 操作系统检测:Nmap 通过分析目标主机的网络响应和特征,Nmap 可以尝试识别目标主机所运行的操作系统。它使用一系列技术,如 TCP/IP 堆栈指纹、TCP 序列号分析和 IP ID 序列分析等,来推断操作系统类型和版本。
    • 漏洞评估:Nmap 可以用于执行漏洞评估和漏洞扫描。它可以与漏洞扫描工具(如 Nessus)或脚本(如 Nmap 脚本引擎)结合使用,以检测目标主机上的已知漏洞或弱点。
    • 脚本引擎:Nmap 具有一个强大的脚本引擎,称为 Nmap 脚本引擎(NSE)。它允许用户编写和执行自定义脚本,以执行各种网络扫描和安全评估任务。NSE 提供了大量的预定义脚本,可以用于执行常见的任务,如漏洞扫描、服务探测、操作系统检测等。

Nmap 安装

  • Windows 直接官网下载对应 exe 安装包即可:

image-20231026235032248

  • Linux 使用软件包安装工具下载:
1
2
3
4
# RedHat 系
yum install -y nmap
# Debian 系
apt install -y nmap

注:Kali 系统已自带。

Nmap 参数详解

前情提要:

  • 攻击机:Kali 2023.3 - 10.10.8.134
  • 靶机:Window7(MS17-010)- 10.10.8.128
  • Nmap 命令结构如下:
1
nmap [Scan Type(s)] [Options] {target specification}

目标指定

  • 除了选项所有出现在 Nmap 命令行上的都被视为对目标主机的说明,最简单的情况是指定一个目标 IP 地址或主机名,比如:
    • www.baidu.com
    • nmap.org/24
    • 192.168.0.1
    • 10.10.10.1-254
命令 命令说明
nmap -iL filename 从主机/网络列表文件中读取输入
nmap -iR hostnum 随机选择目标。如果 -iR 指定为 0,则是无休止的扫描
nmap –exclude host1[, host2] 排除指定的主机/网络
nmap –exculdefile exclude_file 排除文件中的 IP,格式和 -iL 指定扫描文件的格式相同

主机发现

命令 命令说明
nmap -sL 仅仅是显示,扫描的 IP 数目,不会进行任何扫描
nmap -sn Ping 扫描,禁用端口扫描
nmap -Pn 将所有主机视为在线状态,跳过主机发现
nmap -PS/PA/PU/PY TCP SYN Ping/TCP ACK Ping/UDP Ping 发现
nmap -PE/PP/PM 使用 ICMP echo、timestamp and netmask 请求包发现主机
nmap -PO 使用 IP 协议包探测对方主机是否开启
nmap -n/-R 禁用/始终解析 DNS
nmap –dns-servers <serv1[,serv2],…> 指定自定义 DNS 服务器
nmap –system-dns 使用操作系统的 DNS 解析器
nmap –traceroute 对每个主机进行跳跃路径跟踪

扫描方法

命令 命令说明
nmap -sS/sT/sA/sW/sM TCP SYN/TCP connect()/ACK/TCP 窗口扫描 /TCP Maimon 扫描
nmap -sU UDP 扫描
nmap -sN/sF/sX TCP Null、FIN、Xmas 扫描
nmap –scanflags 自定义 TCP 包中的 flags
nmap -sI zombie host[:probeport] Idle 扫描
nmap -sY/sZ SCTP INIT/COOKIE-ECHO 扫描
nmap -sO 使用 IP Protocol 扫描确定目标机支持的协议类型
nmap -b <FTP relay host> FTP 弹跳扫描

端口指定&扫描顺序

命令 命令说明
nmap -p 特定的端口 -p80,443 或者 -p1-65535
nmap -p U:PORT 扫描 udp 的某个端口,-p U:53
nmap -F 通常情况下的 Nmap 扫描最常见的1000个端口,用 -F 将会减少到100个
nmap -r 网上有两种说法:
(1)默认情况下Nmap 会随机扫描端口,指定 -r 为顺序(从最低到最高排序)端口扫描
(2) Nmap 将尝试将目标主机的IP地址转换为主机名,以提供更详细的主机标识
nmap –top-ports “number” 扫描开放概率最高的 number 个端口
-port-ratio “ratio” 扫描指定频率以上的端口

服务/版本识别

命令 命令说明
nmap -sV 用于通过发送特定的网络请求来识别开放端口上运行的服务和版本信息。通过对目标主机的端口进行扫描,并分析响应内容,可以推断出正在运行的服务以及其具体版本号。
nmap –version-intensity <level> 数用于设置版本探测的强度级别。可以指定从 0(轻量级)到 9(尝试所有探测)的级别。级别越高,探测的种类越多,但扫描可能需要更长的时间。一般情况下,较低的级别可以提供基本的服务和版本信息。
nmap –version-light 参数用于限制探测的种类,仅使用最有可能的探测方法(强度级别 2)。这种模式适用于快速获取服务和版本信息的情况。
nmap –version-all 参数用于尝试每一种探测方法(强度级别 9),以获取尽可能详细的服务和版本信息。这种模式可能需要更长的时间扫描,但可以提供更全面的结果。
nmap –version-trace 参数用于显示详细的版本探测活动,主要用于调试目的。它可以提供更详细的扫描日志和输出信息,帮助分析和排除问题。

脚本扫描

命令 命令说明
nmap -sC 等效于 –script=default
nmap –script=”Lua scripts” 调用的脚本
nmap –script-args=n1=v1,[n2=v2] 调用的脚本传递的参数
nmap –script-args-file=filename 使用文本传递参数
nmap –script-trace 显示所有发送和接收到的数据
nmap –script-updatedb 更新脚本的数据库
nmap –script-help=”Lua script” 显示指定脚本的帮助

操作系统识别

命令 命令说明
nmap -O 启用操作系统检测
nmap –osscan-limit 针对指定的目标进行操作系统检测(至少需确知该主机分别有一个 open 和 closed 的端口)
nmap –osscan-guess 推测操作系统检测结果,当 Nmap 无法确定所检测的操作系统时,会尽可能地提供最相近的匹配,Nmap 默认进行这种匹配

时序&性能

命令 命令说明
nmap -T <0-5> 设置定时模板,用于控制扫描的速度和准确性,其中 0 为最慢、5 为最快
nmap –min-hostgroup/max-hostgroup <size> 设置并行主机扫描组的最小和最大大小
nmap -min-parallelism/max-parallelism <numprobes> 设置并行探测的最小和最大数量
nmap –min-rtt-timeout/max-rtt-timeout/initial-rtt-timeout <time> 指定探测往返时间的最小、最大和初始超时时间
nmap –max-retries <tries> 设置端口扫描探测的最大重试次数
nmap -host-timeout <time> 设置在放弃目标主机之前等待的最长时间
nmap –scan-delay/–max-scan-delay <time> 调整探测请求之间的延迟时间
nmap –min-rate <number> 设置每秒发送的数据包数量的下限,这个选项用于限制扫描过程中的数据包发送速率
nmap –max-rate <number> 设置每秒发送的数据包数量的上限

防火墙/IDS规避&欺骗

命令 命令说明
nmap -f; –mtu <val> 对数据包进行分片(可选使用给定的 MTU)。通过对数据包进行分片,可以绕过一些防火墙或 IDS 设备对大数据包的检测和过滤。
nmap -D <decoy1,decoy2[,ME],…> 使用伪装扫描,将扫描混淆在伪造的主机流量中。指定伪装主机列表作为扫描的干扰,使目标主机难以确定真正的扫描来源。
nmap -S 伪造源 IP 地址,将扫描流量的源地址设置为指定的 IP 地址。这可以欺骗目标主机关于扫描来源的信息。
nmap -e <iface> 指定使用的网络接口。可以选择特定的网络接口来发送扫描流量。
nmap -g/–source-port <portnum> 使用指定的端口号作为源端口,通过更改源端口号,可以使扫描流量看起来更像是合法的网络流量。
nmap –proxies <url1,[url2],…> 通过 HTTP/SOCKS4 代理中继连接。可以通过代理服务器中继扫描流量,以隐藏扫描源的真实 IP 地址。
nmap –data <hex string> 向发送的数据包附加自定义的十六进制载荷。可以在扫描流量中添加自定义数据,以测试目标主机对特定数据的响应。
nmap –data-string <string> 向发送的数据包附加自定义的 ASCII 字符串。与”–data”类似,但是这里使用的是 ASCII 字符串。
nmap –data-length <num> 向发送的数据包附加随机数据。这可以增加扫描流量的复杂性,使其更难以检测和过滤。
nmap –ip-options <options> 使用指定的 IP 选项发送数据包。可以设置特定的 IP 选项字段,以欺骗目标主机或规避防火墙的检测。
nmap –ttl <val> 设置 IP 数据包的生存时间(Time-to-Live, TTL)字段。通过更改 TTL 值,可以模拟不同类型的网络流量或绕过某些防火墙规则。
nmap –spoof-mac <mac address/prefix/vendor name> 伪造 MAC 地址。可以指定一个虚假的 MAC 地址,以隐藏真实的网络接口信息。
nmap –badsum 发送具有错误的 TCP/UDP/SCTP 校验和的数据包。这可以用于规避一些基于校验和的防火墙或 IDS 的检测。

结果输出

命令 命令说明
nmap -oN/-oX/-oS/-oG <file> 这些选项指定了扫描结果的输出格式。-oN 以普通格式输出,-oX 以 XML 格式输出,-oS 以脚本骇客兼容格式输出,-oG 以 Grepable 格式输出。
nmap -oA <basename> 此选项允许您同时将扫描结果以所有三种主要格式(普通格式、XML 格式和 Grepable 格式)保存。
nmap -v 增加详细程度的级别(使用 -vv 或更高级别可以获得更大的效果)。
nmap -d 增加调试级别(使用 -dd 或更高级别可以获得更大的效果)。
nmap -reason 显示端口处于特定状态的原因。
nmap –open 仅显示打开(或可能打开)的端口。
nmap –packet-trace 显示发送和接收的所有数据包。
nmap –iflist 打印主机接口和路由信息(用于调试)。
nmap –append-output 将输出追加到指定的输出文件而不是覆盖。
nmap –resume <filename> 恢复中断的扫描。
nmap –noninteractive 禁用通过键盘的运行时交互。
nmap –stylesheet <path/URL> 指定用于将 XML 输出转换为 HTML 的 XSL 样式表。
nmap –webxml 引用 Nmap.Org 上的样式表以获得更可移植的 XML。
nmap –no-stylesheet 防止将 XSL 样式表与 XML 输出关联。

杂项

命令 命令说明
-6 启用 IPv6 扫描,用于对 IPv6 网络进行扫描。
-A 启用操作系统检测、版本检测、脚本扫描和跟踪路由。
–datadir <dirname> 指定自定义的 Nmap 数据文件位置,可以将数据文件存储在指定的目录中。
–send-eth/–send-ip 选择发送原始以太网帧或 IP 数据包进行扫描。
–privileged 假设用户具有完全特权,用于执行需要特权访问的扫描操作。
–unprivileged 假设用户缺乏原始套接字权限,用于执行不需要特权访问的扫描操作。
-V 打印 Nmap 的版本号。
-h 打印帮助摘要页面,提供 Nmap 的帮助信息和概要。

Nmap 脚本使用

image-20231027144442097

  • 左侧列出了脚本的分类,点击分类可以看到每一个分类下有很多具体的脚本供我们使用,使用方式如下:
1
nmap --script=categories
  • 可以填写下面 14 大分类中的其中之一,也可以填写分类里面的具体漏洞扫描脚本:
    • auth:负责处理鉴权证书(绕开鉴权)的脚本
    • broadcast:在局域网内探查更多服务开启状况,如 dhcp/dns/sqlserver 等服务
    • brute:提供暴力破解方式,针对常见的应用如 http/snmp 等
    • default:使用 -sC 或 -A 选项扫描时候默认的脚本,提供基本脚本扫描能力
    • discovery:对网络进行更多的信息,如SMB枚举、SNMP查询等
    • dos:用于进行拒绝服务攻击
    • exploit:利用已知的漏洞入侵系统
    • external:利用第三方的数据库或资源,例如进行 whois 解析
    • fuzzer:模糊测试的脚本,发送异常的包到目标机,探测出潜在漏洞
    • intrusive:入侵性的脚本,此类脚本可能引发对方的 IDS/IPS 的记录或屏蔽
    • malware:探测目标机是否感染了病毒、开启了后门等信息
    • safe: 此类与 intrusive 相反,属于安全性脚本
    • version:负责增强服务与版本扫描(Version Detection)功能的脚本
    • vuln:负责检查目标机是否有常见的漏洞(Vulnerability),如是否有 MS08_067

Nmap 端口状态

  • Nmap 可以根据对目标主机进行端口扫描后的响应,将端口状态分为以下几种:
状态 说明
Open 表示目标主机上的端口处于打开状态,并且正在监听传入连接请求。这意味着端口上运行着一个活动的服务或应用程序。
Closed 表示目标主机上的端口处于关闭状态,并且没有在监听传入连接请求。这表明端口是被防火墙或主机上的安全策略所阻止的。
Filtered 表示无法确定目标主机上的端口状态,因为对端口进行扫描时没有收到任何响应。这可能是由于网络防火墙、路由器过滤规则或目标主机上的阻止扫描的安全策略所引起的。
Unfiltered 表示对目标主机上的端口进行扫描后,扫描器能够确定端口的状态为未过滤。这意味着端口在目标主机上既不是开放的也不是关闭的,可能是由于防火墙规则允许所有连接通过而不对该端口进行特殊处理。
Open | Filtered 表示无法确定目标主机上的端口状态,因为对端口进行扫描时无法确定是开放还是过滤。这可能是由于网络防火墙、路由器过滤规则或目标主机上的阻止扫描的安全策略所引起的。
Closed | Filtered 表示无法确定目标主机上的端口状态,因为对端口进行扫描时无法确定是关闭还是过滤。这可能是由于网络防火墙、路由器过滤规则或目标主机上的阻止扫描的安全策略所引起的。

Nmap 注意事项

  • 如果 Nmap 命令中没有指出扫描类型,默认的就是 TCP SYN,但是它需要 root/administrator 权限。
  • 当 TCP SYN 扫描不能用时,TCP Connect() 扫描就是默认的 TCP 扫描,当用户没有权限发送原始报文或者扫描 IPv6 网络时,就是这种情况。

Nmap 常用命令组合

默认扫描

  • 默认无选项添加时,扫描内容如下:
    • 判断主机存活:
      • 同网段,ARP 判断存活
      • 不同网段,ICMP(Ping) 判断存活
    • 使用 TCP SYN(-sS) 判断最常见的 1000 端口;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
┌──(root㉿kali)-[~]
└─# nmap 10.10.8.128
Starting Nmap 7.94 ( https://nmap.org ) at 2023-10-27 02:11 EDT
Nmap scan report for 10.10.8.128
Host is up (0.00040s latency).
Not shown: 989 closed tcp ports (reset)
PORT STATE SERVICE
135/tcp open msrpc
139/tcp open netbios-ssn
445/tcp open microsoft-ds
3389/tcp open ms-wbt-server
5357/tcp open wsdapi
49152/tcp open unknown
49153/tcp open unknown
49154/tcp open unknown
49155/tcp open unknown
49156/tcp open unknown
49157/tcp open unknown
MAC Address: 00:0C:29:98:0C:70 (VMware)

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

扫描存活主机

  • 可以使用 -sn 参数快速判断对方存活主机:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
┌──(root㉿kali)-[~]
└─# nmap -sn 10.10.8.0/24
Starting Nmap 7.94 ( https://nmap.org ) at 2023-10-27 02:16 EDT
Nmap scan report for 10.10.8.1
Host is up (0.00011s latency).
MAC Address: 00:50:56:C0:00:08 (VMware)
Nmap scan report for 10.10.8.2
Host is up (0.00019s latency).
MAC Address: 00:50:56:EF:47:C3 (VMware)
Nmap scan report for 10.10.8.128
Host is up (0.00014s latency).
MAC Address: 00:0C:29:98:0C:70 (VMware)
Nmap scan report for 10.10.8.254
Host is up (0.00019s latency).
MAC Address: 00:50:56:FD:A4:C1 (VMware)
Nmap scan report for 10.10.8.134
Host is up.
Nmap done: 256 IP addresses (5 hosts up) scanned in 6.32 seconds

识别目标开放端口

  • 可以使用 -p1-65535 的方式,扫描对方开放端口,使用 –min-rate 限制发包量(业务中慎用):

注:若已知目标主机存活,可使用 -Pn 跳过存活判断。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
┌──(root㉿kali)-[~]
└─# nmap -p1-65535 --min-rate 10000 10.10.8.128
Starting Nmap 7.94 ( https://nmap.org ) at 2023-10-27 02:21 EDT
Nmap scan report for 10.10.8.128
Host is up (0.00047s latency).
Not shown: 65524 closed tcp ports (reset)
PORT STATE SERVICE
135/tcp open msrpc
139/tcp open netbios-ssn
445/tcp open microsoft-ds
3389/tcp open ms-wbt-server
5357/tcp open wsdapi
49152/tcp open unknown
49153/tcp open unknown
49154/tcp open unknown
49155/tcp open unknown
49156/tcp open unknown
49157/tcp open unknown
MAC Address: 00:0C:29:98:0C:70 (VMware)

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

识别目标端口服务&系统

  • 使用 -sV 判断对方开放端口服务与系统,使用 –min-rate 限制发包量(业务中慎用):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
┌──(root㉿kali)-[~]
└─# nmap -p135,139,445,3389,5537 --min-rate 10000 -sV -O 10.10.8.128
Starting Nmap 7.94 ( https://nmap.org ) at 2023-10-27 02:53 EDT
Nmap scan report for 10.10.8.128
Host is up (0.00057s latency).

PORT STATE SERVICE VERSION
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
445/tcp open microsoft-ds Microsoft Windows 7 - 10 microsoft-ds (workgroup: WORKGROUP)
3389/tcp open ms-wbt-server?
5537/tcp closed unknown
MAC Address: 00:0C:29:98:0C:70 (VMware)
Device type: general purpose
Running: Microsoft Windows 7|2008|8.1
OS CPE: cpe:/o:microsoft:windows_7::- cpe:/o:microsoft:windows_7::sp1 cpe:/o:microsoft:windows_server_2008::sp1 cpe:/o:microsoft:windows_server_2008:r2 cpe:/o:microsoft:windows_8 cpe:/o:microsoft:windows_8.1
OS details: Microsoft Windows 7 SP0 - SP1, Windows Server 2008 SP1, Windows Server 2008 R2, Windows 8, or Windows 8.1 Update 1
Network Distance: 1 hop
Service Info: Host: SECURITY-PC; OS: Windows; CPE: cpe:/o:microsoft:windows

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

扫描主机漏洞

  • 使用 –script=vuln 扫描主机漏洞(业务中慎用):
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
┌──(root㉿kali)-[~]
└─# nmap --script=vuln --min-rate 10000 10.10.8.128
Starting Nmap 7.94 ( https://nmap.org ) at 2023-10-27 02:25 EDT
Nmap scan report for 10.10.8.128
Host is up (0.0011s latency).
Not shown: 989 closed tcp ports (reset)
PORT STATE SERVICE
135/tcp open msrpc
139/tcp open netbios-ssn
445/tcp open microsoft-ds
3389/tcp open ms-wbt-server
5357/tcp open wsdapi
49152/tcp open unknown
49153/tcp open unknown
49154/tcp open unknown
49155/tcp open unknown
49156/tcp open unknown
49157/tcp open unknown
MAC Address: 00:0C:29:98:0C:70 (VMware)

Host script results:
|_samba-vuln-cve-2012-1182: NT_STATUS_ACCESS_DENIED
| smb-vuln-ms17-010:
| VULNERABLE:
| Remote Code Execution vulnerability in Microsoft SMBv1 servers (ms17-010)
| State: VULNERABLE
| IDs: CVE:CVE-2017-0143
| Risk factor: HIGH
| A critical remote code execution vulnerability exists in Microsoft SMBv1
| servers (ms17-010).
|
| Disclosure date: 2017-03-14
| References:
| https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-0143
| https://technet.microsoft.com/en-us/library/security/ms17-010.aspx
|_ https://blogs.technet.microsoft.com/msrc/2017/05/12/customer-guidance-for-wannacrypt-attacks/
|_smb-vuln-ms10-061: NT_STATUS_ACCESS_DENIED
|_smb-vuln-ms10-054: false

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