Nmap
来自 官方网站
- Nmap (“网络映射器”) 是一款用于网络探测和安全审计的开源工具。它被设计用于快速扫描大型网络,但也适用于扫描单个主机。Nmap 以新颖的方式使用原始 IP 数据包,以确定网络上有哪些主机可用,这些主机提供哪些服务(应用程序名称和版本),它们正在运行哪些操作系统(和操作系统版本),正在使用哪种类型的数据包过滤器/防火墙,以及数十种其他特性。虽然 Nmap 通常用于安全审计,但许多系统和网络管理员发现它对于日常任务也很有用,例如网络清单、管理服务升级计划以及监控主机或服务的正常运行时间。
安装
Nmap 有一个名为 zenmapAUR 的 GUI,可以单独安装,但本文将仅介绍命令行用法。
用法
请参阅 nmap(1)。
指定目标
--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.1
、10.1.51.1
和 10.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 将执行以下操作
- IP 地址被反向 DNS 解析为域名,或者在指定域名的情况下反之亦然(要禁用,请传递
-n
) - 使用 TCP ACK:80 和 ICMP 进行 Ping 扫描。这等效于
-PA -PE
(要禁用,请传递-PN
) - 扫描主机最常用的 1000 个端口。以 root 身份运行时,使用 SYN 隐身扫描。以用户身份运行时,使用连接扫描。
Ping 扫描
Ping 扫描(主机发现)是一种用于确定指定的计算机是否启动并运行的技术。默认情况下,Nmap 在端口扫描之前执行 ping 扫描,以避免在甚至未连接的主机上浪费时间。要指示 Nmap 仅执行 ping 扫描
$ nmap -sn 10.1.1.1/8
这将导致 Nmap ping 每个指定的地址,然后报告已响应 ping 的主机列表。
当使用用户或 root 权限运行以及扫描相同或不同的子网时,Nmap 使用不同类型的 ping 数据包
外部 IP | 本地 IP | |
---|---|---|
用户权限 | 端口 80 和 443 的 TCP SYN | 端口 80 和 443 的 TCP SYN 以及 ARP |
Root 权限 | 端口 80 和 443 的 TCP SYN 以及 IGMP | ARP |
Ping 扫描类型
选项 | Ping 扫描类型 |
---|---|
-Pn |
完全禁用 ping 扫描 |
-PS |
TCP SYN(默认端口 80) |
-PA |
TCP ACK(默认端口 80) |
-PU |
UDP |
-PY |
SCTP INIT |
-PE |
ICMP Echo |
-PP |
ICMP 时间戳 |
-PM |
ICMP 地址掩码 |
-PO |
Other IP 协议 |
-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 连接(默认以用户身份) |
-sA |
TCP ACK |
-sF |
TCP FIN |
-sX |
TCP FIN, SYN, ACK |
-sW |
TCP 窗口 |
-sM |
TCP Maimon |
-sU |
UDP 扫描 |
-sI |
空闲扫描 |
-b |
FTP bounce 扫描 |
-sO |
其他 IP 协议 |
反扫描技术
iptables PSD 模块
PSD 是 iptables 的扩展模块。它也在一些基于 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 背后的原理很简单。如果来自单个 IP 的请求在 delay 秒内获得的值超过 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 的另一个有趣的事实是,当设置了 ack
或 rst
标志时,它不会将请求检测为端口扫描(请参阅 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="user agent you want"
。来源
技巧和窍门
限制扫描速度
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
)
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
默认情况下,端口 0 会从扫描中跳过,即使指定了 -p -
。要扫描它,必须显式指定。例如,扫描每个可能的端口
$ 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