跳转至内容

Nmap

来自 ArchWiki

本文章或章节需要扩充。

原因: DNS 解析; Ping 扫描; 默认选项; 空闲扫描; FTP 弹跳; 时间选项; (在 Talk:Nmap 中讨论)

来自 官方网站

Nmap(“Network Mapper”)是一个用于网络探测和安全审计的开源工具。它被设计用于快速扫描大型网络,尽管它对单个主机也工作良好。Nmap 以新颖的方式使用原始 IP 数据包来确定网络上哪些主机可用,这些主机提供哪些服务(应用程序名称和版本),它们运行什么操作系统(以及操作系统版本),使用哪种类型的包过滤器/防火墙,以及数十种其他特征。虽然 Nmap 常用于安全审计,但许多系统和网络管理员发现它对于例行任务非常有用,例如网络清单、管理服务升级计划以及监控主机或服务的运行时间。
警告 在非自身负责的系统、主机或网络范围上调用网络扫描技术在许多司法管辖区是非法的。在执行扫描之前,请仔细检查您只扫描自己的主机(参见 #列表扫描),或重新确认相应所有者的批准!

安装

安装 nmap 包。

Nmap 有一个名为 zenmap 的 GUI,可以单独安装,但本文仅涵盖命令行使用。

用法

参见 nmap(1)

指定目标

提示 要打印 Nmap 发送和接收的每个数据包,请使用 --packet-trace 选项。

有多种方法可以告诉 Nmap 要扫描的 IP 地址列表。最简单的形式就是直接传递地址或域名

$ nmap scanme.nmap.org
$ nmap 74.207.244.221

指定多个目标

使用 CIDR 表示法,例如扫描以 10.1.1 开头的全部 256 个地址

$ nmap 10.1.1.0/24
注意 上面示例中的末尾 0 没有影响:nmap 10.1.1.0/24 和例如 nmap 10.1.1.134/24 命令是相同的。

使用连字符,例如扫描 10.1.50.110.1.51.110.1.52.1

$ nmap 10.1.50-52.1

使用逗号(功能如你所料)

$ nmap 10.1.50,51,52,57,59.1

全部组合

$ nmap 10.1,2.50-52.1/30 10.1.1.1 10.1.1.2

列表扫描

列表扫描选项 (-sL) 在进行实际扫描之前,用于确保指定了正确的地址。

$ nmap -sL 10.1,2.50-52.1/30 10.1.1.1 10.1.1.2

列表扫描只是打印指定的地址,而不向目标发送任何数据包。

默认选项

如果您只指定了 IP 地址或域名而没有其他选项

$ nmap 74.207.244.221

Nmap 将执行以下操作

  1. IP 地址被反向 DNS 解析为域名,反之亦然(如果指定了域名)(要禁用,请使用 -n
  2. 使用 TCP ACK:80 和 ICMP 进行 Ping 扫描。这等同于 -PA -PE(要禁用,请使用 -PN
  3. 扫描主机最受欢迎的 1000 个端口。作为 root 运行时,使用 SYN 隐蔽扫描。作为用户运行时,使用 connect 扫描。

Ping 扫描

Ping 扫描(主机发现)是一种用于确定指定计算机是否正在运行的技术。Nmap 默认在进行端口扫描之前执行 Ping 扫描,以避免将时间浪费在未连接的主机上。要指示 Nmap 执行 Ping 扫描

$ nmap -sn 10.1.1.1/8

这将导致 Nmap Ping 指定的每个地址,然后报告响应 Ping 的主机列表。

Nmap 在以用户或 root 权限运行时,以及在扫描相同或不同子网时,使用不同类型的 Ping 数据包。

外部 IP 本地 IP
用户权限 TCP SYN (端口 80 & 443) TCP SYN (端口 80 & 443) 和 ARP
Root 权限 TCP SYN (端口 80 & 443) 和 IGMP ARP

Ping 扫描类型

选项 Ping 扫描类型
-Pn 完全禁用 Ping 扫描
-PS TCP SYN(默认端口 80)
-PA TCP ACK(默认端口 80)
-PU UDP
-PY SCTP INIT
-PE ICMP Echo
-PP ICMP time stamp
-PM ICMP address mask
-PO Other IP protocol
-PR ARP 扫描

当机器受到严格的防火墙保护,TCP 80 和 443 端口以及 IGMP 请求被阻止,但 IP 地址上可能仍有机器监听其他不常用端口时,-Pn 非常有用。

端口扫描

端口可以处于 3 种主要状态

  • open - 有程序正在监听并响应此端口的请求
  • closed - 对于此端口的请求,主机回复“错误:此端口上没有程序在监听”
  • filtered - 主机根本不回复。这可能是由于严格的防火墙规则,“丢弃”了数据包而未发送回复

除了这三种状态外,Nmap 还可以将端口分类为另外 3 种状态。当 Nmap 无法可靠地确定状态但怀疑三种可能状态中的两种时,就会使用这些状态。

  • open|closed (unfiltered) - 端口要么是开放的,要么是关闭的
  • closed|filtered - 端口要么是关闭的,要么是被过滤的
  • open|filtered - 端口要么是开放的,要么是被过滤的

默认情况下,Nmap 扫描 /usr/share/nmap/nmap-services 中找到的最流行的 1000 个端口。要指定不同数量的常用端口

$ nmap --top-ports 1000 10.1.1.1

要指定自定义端口号,请使用 -p

$ nmap -p -25,135-137 10.1.1.1

连字符和逗号的使用方式与 #指定目标 中相同。此外,还可以通过在给出某个端口时省略起始/结束端口来指定该端口之前/之后的所有端口。例如,要扫描所有可能的 65535 个端口(不包括 端口号 0

$ nmap -p -

扫描类型

选项 端口扫描类型
-sP Ping 扫描
-sS TCP SYN (隐蔽) (root 用户的默认)
-sT TCP connect (普通用户的默认)
-sA TCP ACK
-sF TCP FIN
-sX TCP FIN, SYN, ACK
-sW TCP window
-sM TCP Maimon
-sU UDP 扫描
-sI 空闲扫描
-b FTP 弹跳扫描
-sO 其他 IP 协议

反扫描技术

iptables PSD 模块

PSDiptables 的一个扩展模块。它也被用于一些基于 Linux 的商业路由器。

它有 4 个参数

  • --psd-weight-threshold threshold,默认值:21
来自同一主机、具有不同目标端口的最新 TCP/UDP 数据包的总权重,将被视为端口扫描序列。
  • --psd-delay-threshold delay,默认值:300(3 秒)
来自同一主机、具有不同目标端口的数据包被视为可能的端口扫描子序列的延迟(以百分之一秒为单位)。
  • --psd-lo-ports-weight weight,默认值:3
具有特权(<1024)目标端口的数据包的权重。
  • --psd-hi-ports-weight weight,默认值:1
具有非特权(>=1024)目标端口的数据包的权重。

PSD 的基本原理很简单。如果在 delay 秒内,来自单个 IP 的请求的总权重超过 threshold,则该 IP 被归类为端口扫描器。在数学表达式中

lo_ports_weight * REQUESTS_LOW + hi_ports_weight * REQUESTS_HIGH >= threshold

其中

REQUESTS_LOW = number of requests to privileged (0 to 1023) ports within last delay seconds
REQUESTS_HI = number of requests to non-privileged (1024 to 65535) ports within last delay seconds

这里有一些例子

  • 使用默认参数,如果在 3 秒内命中至少 7 个特权端口,则被归类为端口扫描。
  • 使用默认参数,如果在 3 秒内命中至少 21 个非特权端口,则被归类为端口扫描。
  • 使用默认参数,如果在 3 秒内命中 4 个特权端口和 9 个非特权端口,则被归类为端口扫描,因为 4*3 + 9*1 >= 21

避免被检测

避免 PSD 的最简单方法之一就是 慢速扫描。对于默认值,此参数就足够了。

$ nmap --scan-delay 3.1 192.168.56.1

关于 PSD 的另一个有趣的事实是,当 ackrst 标志被设置时,它不会将请求检测为端口扫描(请参见 xt_psd.c 中的 is_portscan 函数)。

另外,如果您正在对一个主机进行端口扫描,而后者在其上运行着 HTTP(S) 服务,nmap 将使用 Mozilla/5.0 (compatible; Nmap Scripting Engine; https://nmap.org/book/nse.html) 作为默认用户代理。因此,您的行为很容易被检测到,特别是如果管理员或机器人采取措施应对此类用户代理出现在日志中。幸运的是,nmap 允许我们轻松更改该字符串:只需传递 -script-args http.useragent="您想要的用户代理"来源

技巧与提示

限制扫描速度

Nmap 扫描非常快速。虽然这通常是一个理想的特性,但它也可能适得其反。例如,当您想测试系统的防火墙而不禁用任何已激活的洪水检测规则时,或者当您想对特定端口/服务运行长期测试时。以下选项指定了 Nmap 发送数据包的速度。

每 3.333 秒最多发送一个数据包

$ nmap --max-rate 0.3 192.168.56.1

或者,每 3.1 秒发送一个数据包

$ nmap --scan-delay 3.1 192.168.56.1

有关其他时间和并行化选项,请参见 nmap(1)

从列表文件中指定目标

通常需要扫描大量不相邻的地址。在命令行上传递它们通常不方便。为此,Nmap 支持从列表文件(-iL)进行输入input from a list file)。

addresses.txt
10.1.1.1 10.1.1.2 10.1.1-10.3
10.3.1.3 10.3.1.50 10.3.2.55
10.1.1.100
...
$ nmap -iL addresses.txt

文件中的地址必须用空格分隔。

或者,Nmap 可以从标准输入读取列表(在许多命令行程序中,- 表示标准输入)

$ echo "10.1.1.1 10.1.1.2 10.1.1-10.3" | nmap -iL -

指定要排除在扫描之外的目标

$ nmap 10.1.1.1-10 --exclude 10.1.1.5,7 

从文件中排除也是如此

$ nmap 10.1.1.1-10 --excludefile excludeaddr.txt

欺骗

欺骗源 IP

$ nmap -S 192.168.56.35 -e vboxnet0 192.168.56.11

欺骗源 MAC 地址

$ nmap --spoof-mac 01:02:03:04:05:06 192.168.56.11

欺骗源端口

$ nmap --source-port 22 192.168.56.11

加速扫描

默认情况下,Nmap 对目标执行 DNS/反向 DNS 解析。要指示 Nmap 永不执行任何 DNS 解析,请使用 -n 选项。

$ nmap -n 192.168.56.0/24

这将使扫描速度大约提高 2 倍。

扫描端口号 0

默认情况下,即使指定了 -p -,端口 0 也会被跳过扫描。要扫描它,必须明确指定。例如,要扫描所有可能的端口

$ nmap -p 0-65535

请记住,根据 RFC 标准,此端口号无效。然而,它可能被恶意软件等利用来绕过更粗糙的端口扫描器。

文件输出格式

Nmap 除了终端输出外,还内置了文件输出支持。

  • -oN 文件名
正常输出,与终端输出相同
  • -oX 文件名
XML 输出,包含扫描的详细信息,易于用软件解析
  • -oG 文件名
Grepable 输出,已弃用
  • -oA 基础文件名
上述所有格式的组合。创建的文件名为 基础文件名.nmap基础文件名.xml基础文件名.gnmap

例如,输出到终端、文件和 XML 文件

$ nmap -oN output.txt -oX output.xml scanme.nmap.org

参见

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.