简介
Nmap(网络映射器)是一款用于网络发现和安全审计的网络安全工具,在其首次发布后的前几年之间是 GPL 自由软件,但最近版本的 nmap 是否是 FOSS 自由软件还存在许多质疑和争议。软件名字Nmap是Network Mapper的简称。通常情况下,Nmap用于:
- 列举网络主机清单
- 管理服务升级调度
- 监控主机
- 服务运行状况
Nmap可以检测目标主机是否在线、端口开放情况、侦测运行的服务类型及版本信息、侦测操作系统与设备类型等信息。 它是网络管理员必用的软件之一,用以评估网络系统安全。
Nmap是不少黑客及脚本小子爱用的工具 。系统管理员可以利用Nmap来探测工作环境中未经批准使用的服务器,黑客通常会利用Nmap来搜集目标电脑的网络设定,从而计划攻击的方法。
Nmap通常用在信息搜集阶段,用于搜集目标机主机的基本状态信息。扫描结果可以作为漏洞扫描、漏洞利用和权限提升阶段的输入。例如,业界流行的漏洞扫描工具Nessus与漏洞利用工具Metasploit都支持导入Nmap的XML格式结果,而Metasploit框架内也集成了Nmap工具(支持Metasploit直接扫描)。
Nmap不仅可以用于扫描单个主机,也可以适用于扫描大规模的计算机网络(例如,扫描英特网上数万台计算机,从中找出感兴趣的主机和服务)。
核心功能
主机发现
用于发现目标主机是否处于活动状态。
Nmap 提供了多种检测机制,可以更有效地辨识主机。例如可用来列举目标网络中哪些主机已经开启,类似于Ping命令的功能。
端口扫描
用于扫描主机上的端口状态。
Nmap可以将端口识别为开放(Open)、关闭(Closed)、过滤(Filtered)、未过滤(Unfiltered)、开放或过滤(Open|Filtered)、关闭或过滤(Closed|Filtered)。默认情况下,Nmap会扫描1660个常用的端口[6],可以覆盖大多数基本应用情况。
版本侦测
用于识别端口上运行的应用程序与程序版本。
Nmap目前可以识别数千种应用的签名(Signatures),检测数百种应用协议。而对于不识别的应用,Nmap默认会将应用的指纹(Fingerprint)打印出来,如果用户确知该应用程序,那么用户可以将信息提交到社区,为社区做贡献。
操作系统侦测
用于识别目标主机的操作系统类型、版本编号及设备类型。
Nmap目前提供1500个操作系统或设备的指纹数据库[7],可以识别通用PC系统、路由器、交换机等设备类型。
防火墙/IDS规避和哄骗
Nmap提供多种机制来规避防火墙、IDS的的屏蔽和检查,便于秘密地探查目标主机的状况。
基本的规避方式包括:数据包分片、IP诱骗、IP伪装、MAC地址伪装。
NSE脚本引擎
NSE是Nmap最强大最灵活的特性之一,可以用于增强主机发现、端口扫描、版本侦测和操作系统侦测等功能,还可以用来扩展高级的功能如web扫描、漏洞发现和漏洞利用等。Nmap使用Lua语言来作为NSE脚本语言,目前的Nmap脚本库已经支持350多个脚本。
安装
Windows
Nmap 支持 Microsoft Windows二进制文件(.exe)。即Windows平台的应用程序。可执行的自动安装程序提供,其中包括NMAP的依赖项和Zenmap GUI。支持Windows 7和更新的NMAP,以及Windows Server 2008 R2以及更新。
安装链接:https://nmap.org/dist/nmap-7.95-setup.exe
Mac OS X
Nmap 支持 Mac OS X二进制文件。Apple MacOS(X86-64)的NMAP二进制文件分布为磁盘图像文件 包含一个安装程序。安装程序允许安装nmap,zenmap, NCAT和NDIFF。这些程序已在 Mac OS X 10.9及以后。
安装链接:https://nmap.org/dist/nmap-7.95.dmg
Linux
Nmap 支持Linux RPM源和二进制文件。许多流行的Linux发行版(RedHat,Mandrake,Suse等)都使用 系统 RPM 软件包管理 快速简便的二进制包装安装。
安装链接:https://nmap.org/dist/nmap-7.95-3.x86_64.rpm
源码安装
通过一下命令进行克隆项目源码。建议请先提前挂好代理进行克隆。
git clone https://github.com/nmap/nmap.git
进入目录并查看
cd nmap/
ls
生成 Makefile 文件
./configure
使用 make 进行编译
make
安装
sudo make install
输入以下命令,如果出现这个界面就说明安装成功了。
nmap -h
APT包管理器安装
Kali Linux 默认已经安装好 nmap 工具了。也可以通过一下命令来进行安装。
sudo apt install nmap
Nmap
1. -h
帮助信息
nmap -h
2. 常规使用
语法:nmap [扫描类型...] [选项] {扫描目标说明}
nmap 192.168.174.134
nmap -A -T4 scanme.nmap.org playground
目标说明
可以传递主机名、IP 地址、网络等。
例如:scanme.nmap.org、microsoft.com/24、192.168.0.1; 10.0.0-255.1-254
3. -iL <inputfilename>
从主机/网络列表中输入
从 <inputfilename> 中读取目标说明。在命令行输入一堆主机名显得很笨拙,然而经常需要这样。 例如,您的DHCP服务器可能导出10,000个当前租约的列表,而您希望对它们进行扫描。如果您不是使用未授权的静态IP来定位主机,或许您想要扫描所有IP地址。只要生成要扫描的主机的列表,用 -iL 把文件名作为选项传给Nmap。列表中的项可以是Nmap在命令行上接受的任何格式(IP地址,主机名,CIDR,IPv6,或者八位字节范围)。 每一项必须以一个或多个空格,制表符或换行符分开。 如果您希望Nmap从标准输入而不是实际文件读取列表, 您可以用一个连字符(-)作为文件名。
让nmap扫描文件里面的ip地址。
nmap -iL host_file.txt
4. -iR <num hosts>
选择随机目标
对于互联网范围内的调查和研究, 您也许想随机地选择目标。<num hosts> 选项告诉 Nmap生成多少个IP。不合需要的IP如特定的私有,组播或者未分配的地址自动 略过。选项 0 意味着永无休止的扫描。记住,一些网管对于未授权的扫描可能会很感冒并加以抱怨。 使用该选项的后果自负! 如果在某个雨天的下午,您觉得实在无聊, 试试这个命令nmap -sS -PS80 -iR 0 -p 80随机地找一些网站浏览。
随机扫描100个ip地址。
nmap -iR 100
永无休止的扫描。可以按Ctrl + C 停止扫描。
nmap -iR 0
5. --exclude <host1[,host2][,host3],...>
排除主机/网络
如果在您指定的扫描范围有一些主机或网络不是您的目标, 那就用该选项加上以逗号分隔的列表排除它们。该列表用正常的Nmap语法, 因此它可以包括主机名,CIDR,八位字节范围等等。 当您希望扫描的网络包含执行关键任务的服务器,已知的对端口扫描反应强烈的 系统或者被其它人看管的子网时,这也许有用。
扫描ip地址为192.168.174.133到192.168.174.145,但排除ip地址192.168.174.134
nmap --exclude 192.168.174.134 192.168.174.133-145
6. --excludefile <excludefile>
排除文件中的列表
这和 --exclude 选项的功能一样,只是所排除的目标是用以 换行符,空格,或者制表符分隔的 <excludefile> 提供的,而不是在命令行上输入的。
排除文件可能包含以#开头并扩展到行末尾的注释。
扫描ip地址为192.168.174.133到192.168.174.145,但排除ip地址为 excludefile.txt 文件里面的ip地址。
nmap --excludefile excludefile.txt 192.168.174.133-145
7. --resolve-all
扫描每个已解析的地址
如果主机名目标解析为多个地址,则扫描所有地址。默认行为是仅扫描第一个已解析的地址。无论如何,只会扫描适当地址系列中的地址:默认为 IPv4,IPv6 为 -6。
nmap --resolve-all 192.168.174.145
8. --unique
每个地址仅扫描一次
每个 IP 地址仅扫描一次。默认行为是按照目标列表中指定的次数扫描每个地址,例如当网络范围重叠或不同的主机名解析为同一地址时。
nmap --unique 192.168.174.134
9. --system-dns
使用系统 DNS 解析器
默认情况下,Nmap 通过将查询直接发送到主机上配置的名称服务器,然后监听响应来反向解析 IP 地址。许多请求(通常数十个)并行执行以提高性能。指定此选项以使用您的系统解析器(通过 getnameinfo 调用一次一个 IP)。除非您发现 Nmap 并行解析器中的错误(如果您发现,请告诉我们),否则这会比较慢并且很少有用。系统解析器始终用于正向查找(从主机名获取 IP 地址)。
nmap --system-dns 192.168.174.145
10. --dns-servers <server1>[,<server2>[,...]]
用于反向 DNS 查询的服务器
默认情况下,Nmap 从 resolv.conf 文件(Unix)或注册表(Win32)确定您的 DNS 服务器(用于 rDNS 解析)。或者,您可以使用此选项指定备用服务器。如果您使用 --system-dns,则不支持此选项。使用多个 DNS 服务器通常更快,特别是如果您为目标 IP 空间选择权威服务器。此选项还可以提高隐蔽性,因为您的请求可以从互联网上几乎任何递归 DNS 服务器反弹。
此选项在扫描私有网络时也很有用。有时只有少数名称服务器提供正确的 rDNS 信息,您甚至可能不知道它们在哪里。您可以扫描网络以查找端口 53(可能使用版本检测),然后尝试 Nmap 列表扫描(-sL),使用 --dns-servers 一次指定一个名称服务器,直到找到一个有效的服务器。
如果 DNS 响应超出 UDP 数据包的大小,则此选项可能不受支持。在这种情况下,我们的 DNS 解析器将尽最大努力从截断的数据包中提取响应,如果不成功,它将回退到使用系统解析器。此外,包含 CNAME 别名的响应将回退到系统解析器。
nmap --dns-servers 8.8.8.8,114.114.114.114 192.168.174.135
主机发现
11. -sL
列表扫描 - 仅列出要扫描的目标
列表扫描是主机发现的退化形式,它仅仅列出指定网络上的每台主机, 不发送任何报文到目标主机。默认情况下,Nmap仍然对主机进行反向域名解析以获取它们的名字。简单的主机名能给出的有用信息常常令人惊讶。例如, fw.chi.playboy.com是花花公子芝加哥办公室的防火墙。Nmap最后还会报告IP地址的总数。列表扫描可以很好的确保您拥有正确的目标IP。 如果主机的域名出乎您的意料,那么就值得进一步检查以防错误地扫描其它组织的网络。
既然只是打印目标主机的列表,像其它一些高级功能如端口扫描,操作系统探测或者Ping扫描的选项就没有了。如果您希望关闭ping扫描而仍然执行这样的高级功能,请继续阅读关于 -Pn选项的介绍。
对ip地址192.168.174.128到145进行列表扫描
nmap -sL 192.168.174.128-145
12. -sn
Ping 扫描 - 禁用端口扫描
该选项指示 Nmap 在主机发现后不执行端口扫描,而仅打印出响应主机发现探测的可用主机。这通常被称为“ping 扫描”,但你也可以请求运行 traceroute 和 NSE 主机脚本。默认情况下,它比列表扫描(list scan)更具侵入性一步,并且通常可以用于相同的目的。它允许对目标网络进行轻量级侦察,而不会引起太多注意。对于攻击者来说,了解有多少主机在线,比仅仅获取列表扫描提供的所有 IP 和主机名更有价值。
系统管理员也经常发现该选项很有用。它可以轻松用于计算网络上的可用设备数量或监控服务器的可用性。这通常被称为 ping 扫描(ping sweep),比向广播地址发送 ping 更可靠,因为许多主机不会响应广播查询。
默认情况下,使用 -sn 进行的主机发现包括 ICMP 回显请求(ping)、TCP SYN(端口 443)、TCP ACK(端口 80)和 ICMP 时间戳请求。如果是非特权用户执行扫描,则仅会向目标的端口 80 和 443 发送 SYN 数据包(使用 connect() 进行连接)。如果特权用户在本地以太网网络上扫描目标,则会使用 ARP 请求,除非指定了 --send-ip 选项。
-sn 选项可以与任何主机发现探测类型(-P* 选项)结合使用,以获得更大的灵活性。如果使用了任何探测类型或端口号选项,则默认的探测方式将被覆盖。当 Nmap 运行所在主机与目标网络之间存在严格的防火墙时,建议使用这些高级技术,否则可能会因防火墙丢弃探测包或响应而漏掉某些主机。
在 Nmap 之前的版本中,-sn 选项曾被称为 -sP。
对ip地址 192.168.174.132 进行 Ping 扫描。
nmap -sn 192.168.174.132
13. -Pn
无ping,将所有主机视为在线 - 跳过主机发现
此选项会完全跳过主机发现阶段。通常,Nmap 会在此阶段确定活动的主机,以进行更深入的扫描,并评估网络速度。默认情况下,Nmap 仅对被确认在线的主机执行更深入的探测(如端口扫描、版本检测或操作系统检测)。如果使用 -Pn 禁用主机发现,Nmap 会对命令行指定的每个目标 IP 地址执行请求的扫描功能,而不管其是否在线。例如,如果指定了一个 /16 网络范围,Nmap 将扫描所有 65,536 个 IP 地址。
-Pn 的行为类似于列表扫描(list scan),但不同之处在于,它不会在打印目标列表后停止,而是继续执行请求的扫描任务,假设每个目标 IP 都是活动的。由于默认的扫描时间参数会被应用,这可能会导致扫描速度变慢。如果希望跳过主机发现和端口扫描,但仍然运行 NSE(Nmap Scripting Engine),可以同时使用 -Pn -sn 选项。
对于本地以太网网络上的机器,仍然会执行 ARP 扫描(除非使用 --disable-arp-ping 或 --send-ip 选项禁用),因为 Nmap 需要获取 MAC 地址 以进一步扫描目标主机。
在 Nmap 早期版本中,-Pn 选项曾被称为 -P0 和 -PN。
对ip地址 192.168.174.128 到145进行无 Ping 扫描。
nmap -Pn 192.168.174.128-145
14. -Ps [portlist]
TCP SYN Ping - 对给定端口的 TCP SYN发现
此选项发送一个设置了 SYN 标志的空 TCP 数据包。默认的目标端口是 80(可在编译时通过修改 nmap.h 中的 DEFAULT_TCP_PROBE_PORT_SPEC 进行配置)。可以使用参数指定其他端口,语法与 -p 选项相同,但不能使用端口类型说明符(如 T:)。例如:-PS22 或 -PS22-25,80,113,1050,35000。注意,-PS 和端口列表之间不能有空格。如果指定了多个探测端口,它们将被并行发送。
SYN 标志表示向远程系统请求建立连接。通常情况下,目标端口如果关闭,会返回 RST(重置)数据包;如果端口开放,目标机会响应 SYN/ACK(TCP 三次握手的第二步)。运行 Nmap 的主机在收到 SYN/ACK 后,会返回 RST 终止连接,而不是发送 ACK 完成三次握手。这个 RST 由内核自动发送,而非 Nmap 自行发送。
Nmap 不关心端口是否开放,而是根据 RST 或 SYN/ACK 的响应判断主机是否在线。
在 Unix 系统上,只有 root 用户通常可以发送和接收原始 TCP 数据包。对于非特权用户,Nmap 会自动调用 connect 作为替代方案,每个目标端口都会尝试建立连接。如果 connect 快速返回成功或失败(ECONNREFUSED),说明主机在线;如果连接尝试挂起直到超时,则主机被视为离线。
对ip进行80端口的SYN Ping扫描。
nmap -PS 80 192.168.174.145
对ip进行22,23,80,113,1050,35000端口的SYN Ping扫描。
nmap -PS22,23,80,113,1050,35000 192.168.174.145
15. -PA [portlist]
TCP ACK Ping - 对给定端口的 TCP ACK发现
TCP ACK ping和刚才讨论的SYN ping相当类似。 也许您已经猜到了,区别就是设置TCP的ACK标志位而不是SYN标志位。 ACK报文表示确认一个建立连接的尝试,但该连接尚未完全建立。 所以远程主机应该总是回应一个RST报文, 因为它们并没有发出过连接请求到运行Nmap的机器,如果它们正在运行的话。
-PA选项使用和SYN探测相同的默认端口(80),也可以 用相同的格式指定目标端口列表。如果非特权用户尝试该功能, 或者指定的是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。
nmap -PA 192.168.174.145
16. -PU [portlist]
需要root权限
UDP Ping - 对给定端口的UDP发现
另一种主机发现方法是 UDP Ping,它向指定端口发送 UDP 数据包。对于大多数端口,Nmap 发送的是空数据包,但某些端口会使用特定协议的负载,以提高目标主机响应的可能性。这些负载与 Nmap 服务和版本探测中使用的探测数据相同,定义在 nmap-service-probes 文件中。数据包的内容还可以通过 --data、--data-string 和 --data-length 选项进行自定义。
端口列表的格式与 -PS 和 -PA 选项相同。如果未指定端口,默认使用 40125。这一默认值可以在编译时通过 nmap.h 中的 DEFAULT_UDP_PROBE_PORT_SPEC 进行修改。默认使用较冷门的端口是为了避免影响开放端口上的服务。
当 UDP 探测数据包到达关闭的端口时,目标机应该返回 ICMP 端口不可达(port unreachable) 数据包,Nmap 由此判断该主机在线。如果收到其他 ICMP 错误(如主机/网络不可达或 TTL 超时),通常表示目标主机离线或不可达。如果没有收到任何响应,Nmap 也可能认为主机不可达。
当 UDP 探测数据包到达开放端口时,大多数服务会直接丢弃空数据包,不返回任何响应。这也是默认探测端口设为 40125 的原因——该端口极少被使用。一些特殊服务(如 Character Generator(chargen) 协议)会回应空的 UDP 数据包,因此可以暴露主机的存在。
UDP Ping 的主要优势在于它能够绕过仅过滤 TCP 数据包的防火墙。例如,某些路由器(如 Linksys BEFW11S4 无线路由器)默认会过滤所有外部 TCP 端口,但仍然会对 UDP 探测返回 端口不可达 消息,从而泄露设备的存在。
nmap -PU 192.168.174.145
17. -PY [portlist]
需要root权限
SCTP INIT Ping - 对给定端口的SCTP发现
此选项向目标端口发送 SCTP(流控制传输协议)数据包,其中包含一个最小的 INIT(初始化)块。默认目标端口是 80,但可以在编译时通过 nmap.h 中的DEFAULT_SCTP_PROBE_PORT_SPEC 进行修改。用户也可以通过参数指定其他端口,语法与 -p 选项相同,但不允许使用端口类型前缀(如 S:)。例如:-PY22 或 -PY22,80,179,5060。注意,-PY 和端口列表之间不能有空格。如果指定了多个端口,Nmap 会并行发送探测数据包。
SCTP INIT 探测机制 INIT 块表明 Nmap 试图与目标主机建立 SCTP 连接。通常情况下,目标端口是关闭的,此时目标机会返回 ABORT(中止)块。如果端口开放,目标机会进入 SCTP 四步握手的第二步,返回 INIT-ACK(初始化确认)块。
如果运行 Nmap 的主机具备完整的 SCTP 协议栈,它会终止连接,通过发送 ABORT(中止)块来关闭连接,而不是继续发送 COOKIE-ECHO(Cookie 交换)块(四步握手的下一步)。这个 ABORT 数据包由 Nmap 运行的主机内核自动发送,而不是 Nmap 直接发送的。
Nmap 不关心端口是开放还是关闭。无论目标主机返回 ABORT 还是 INIT-ACK,都足以证明该主机在线且可达。
在 Unix 系统上,只有 root 用户 才能发送和接收原始 SCTP 数据包。普通用户无法使用 SCTP INIT Ping 进行主机探测。
nmap -PY 192.168.174.145
18. -PE/PP/PM
ICMP Ping Types - ICMP 回显、时间戳和网络掩码请求发现探测
除了前面介绍的 TCP、UDP 和 SCTP 主机发现方法外,Nmap 还可以发送标准的 ICMP 数据包,就像常见的 ping 命令一样。Nmap 发送 ICMP 类型 8(回显请求)数据包,并期望从可用的主机接收 ICMP 类型 0(回显应答)数据包。然而,许多主机和防火墙现在会阻止这些数据包,而不是按照 RFC 1122 规定的方式进行响应。因此,ICMP 扫描在互联网上针对未知目标通常不够可靠。但对于系统管理员在内部网络中进行监测,它们仍然是一种实用且高效的方法。使用 -PE 选项可以启用 ICMP 回显请求行为。
虽然回显请求是标准的 ICMP Ping 查询,但 Nmap 并不止于此。ICMP 标准(RFC 792 和 RFC 950)还规定了时间戳请求、信息请求和地址掩码请求数据包,分别对应 ICMP 代码 13、15 和 17。虽然这些查询的本意是获取主机的地址掩码和当前时间等信息,但它们同样可以用于主机发现。只要系统返回响应,就表明主机在线且可用。
Nmap 目前未实现信息请求数据包,因为大多数系统并不支持该功能,而 RFC 1122 也明确规定“主机不应实现这些消息”。但时间戳请求(-PP 选项)和地址掩码请求(-PM 选项)仍然可用。
- -PP(ICMP 时间戳请求 Ping)
发送 ICMP 时间戳请求(类型 13),如果主机返回 ICMP 时间戳应答(类型 14),则表明主机可用。
- -PM(ICMP 地址掩码请求 Ping)
发送 ICMP 地址掩码请求(类型 17),如果主机返回 ICMP 地址掩码应答(类型 18),则表明主机可用。
这些查询方法在管理员屏蔽 ICMP 回显请求(Ping)但忽略其他 ICMP 查询的情况下可能仍然有效。
nmap -PE 192.168.174.145
nmap -PP 192.168.174.132
nmap -PM 192.168.174.132
19. -PO <protocol list>
需要root权限
IP 协议 Ping
较新的主机发现选项之一是 IP 协议 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 协议不可达消息(表示目标主机不支持给定的协议)。任何一种响应都表示目标主机处于活动状态。
nmap -PO 192.168.174.132
20. -n
不用域名解析 - 从不进行 DNS 解析 [默认值:有时]
告诉Nmap 永不对它发现的活动IP地址进行反向域名解析。 既然DNS一般比较慢,这可以让事情更快些。
nmap -n 192.168.174.132
21. -R
为所有目标解析域名
告诉Nmap 永远 对目标IP地址作反向域名解析。 一般只有当发现机器正在运行时才进行这项操作。
nmap -R 192.168.174.132
22. --disable-arp-ping
无 ARP 或 ND Ping
Nmap 通常会对本地连接的以太网主机执行 ARP 或 IPv6 邻居发现 (ND) 发现,即使使用了其他主机发现选项(如 -Pn 或 -PE)。要禁用此隐式行为,请使用 --disable-arp-ping 选项。
默认行为通常更快,但此选项在使用代理 ARP 的网络上很有用,其中路由器会推测性地回复所有 ARP 请求,使每个目标根据 ARP 扫描看起来都处于启动状态。
nmap --disable-arp-ping 192.168.174.135
23. --discovery-ignore-rst
在某些情况下,防火墙可能会伪造 TCP 重置 (RST) 回复以响应对未占用或不允许的地址的探测。由于 Nmap 通常将 RST 回复视为目标已启动的证据,因此这可能会导致浪费时间扫描不存在的目标。使用 --discovery-ignore-rst 将阻止 Nmap 在主机发现期间考虑这些回复。您可能需要选择额外的主机发现选项以确保在这种情况下不会错过目标。
nmap --discovery-ignore-rst 192.168.174.135
24. --traceroute
需要root权限
跟踪到主机的路径
跟踪路由是在扫描后执行的,使用来自扫描结果的信息来确定最有可能到达目标的端口和协议。它适用于除连接扫描 (-sT) 和空闲扫描 (-sI) 之外的所有扫描类型。所有跟踪都使用 Nmap 的动态计时模型并并行执行。
跟踪路由的工作原理是发送具有低 TTL(生存时间)的数据包,以尝试从扫描仪和目标主机之间的中间跳数引出 ICMP 超时消息。标准跟踪路由实现从 TTL 1 开始,然后增加 TTL,直到到达目标主机。Nmap 的跟踪路由从高 TTL 开始,然后减少 TTL,直到达到零。反向执行此操作可让 Nmap 采用巧妙的缓存算法来加快对多个主机的跟踪。平均而言,Nmap 为每个主机发送的数据包减少了 5-10 个,具体取决于网络条件。如果正在扫描单个子网(即 192.168.0.0/24),Nmap 可能只需要向大多数主机发送两个数据包。
nmap --traceroute 192.168.174.135
端口扫描
Nmap所识别的6个端口状态。
open(开放的)
应用程序正在该端口接收TCP 连接或者UDP报文。发现这一点常常是端口扫描 的主要目标。安全意识强的人们知道每个开放的端口 都是攻击的入口。攻击者或者入侵测试者想要发现开放的端口。 而管理员则试图关闭它们或者用防火墙保护它们以免妨碍了合法用户。 非安全扫描可能对开放的端口也感兴趣,因为它们显示了网络上那些服务可供使用。
closed(关闭的)
关闭的端口对于Nmap也是可访问的(它接受Nmap的探测报文并作出响应), 但没有应用程序在其上监听。 它们可以显示该IP地址上(主机发现,或者ping扫描)的主机正在运行up 也对部分操作系统探测有所帮助。 因为关闭的关口是可访问的,也许过会儿值得再扫描一下,可能一些又开放了。 系统管理员可能会考虑用防火墙封锁这样的端口。 那样他们就会被显示为被过滤的状态,下面讨论。
filtered(被过滤的)
由于包过滤阻止探测报文到达端口, Nmap无法确定该端口是否开放。过滤可能来自专业的防火墙设备,路由器规则 或者主机上的软件防火墙。这样的端口让攻击者感觉很挫折,因为它们几乎不提供 任何信息。有时候它们响应ICMP错误消息如类型3代码13 (无法到达目标: 通信被管理员禁止),但更普遍的是过滤器只是丢弃探测帧, 不做任何响应。 这迫使Nmap重试若干次以访万一探测包是由于网络阻塞丢弃的。 这使得扫描速度明显变慢。
unfiltered(未被过滤的)
未被过滤状态意味着端口可访问,但Nmap不能确定它是开放还是关闭。 只有用于映射防火墙规则集的ACK扫描才会把端口分类到这种状态。 用其它类型的扫描如窗口扫描,SYN扫描,或者FIN扫描来扫描未被过滤的端口可以帮助确定 端口是否开放。
open|filtered(开放或者被过滤的)
当无法确定端口是开放还是被过滤的,Nmap就把该端口划分成 这种状态。开放的端口不响应就是一个例子。没有响应也可能意味着报文过滤器丢弃 了探测报文或者它引发的任何响应。因此Nmap无法确定该端口是开放的还是被过滤的。 UDP,IP协议, FIN,Null,和Xmas扫描可能把端口归入此类。
closed|filtered(关闭或者被过滤的)
该状态用于Nmap不能确定端口是关闭的还是被过滤的。 它只可能出现在IPID Idle扫描中。
端口扫描技术
25. -sS
需要root权限
TCP SYN 扫描
SYN 扫描是默认且最流行的扫描选项,原因很充分。它可以快速执行,在不受限制性防火墙阻碍的快速网络上每秒扫描数千个端口。由于它从不完成 TCP 连接,因此它也相对不引人注目且隐秘。SYN 扫描适用于任何兼容的 TCP 堆栈,而不是像 Nmap 的 FIN/NULL/Xmas、Maimon 和空闲扫描那样依赖于特定平台的特性。它还可以清晰、可靠地区分开放、关闭和过滤状态。
这种技术通常称为半开放扫描,因为您不会打开完整的 TCP 连接。您发送一个 SYN 数据包,就好像您要打开一个真正的连接,然后等待响应。SYN/ACK 表示端口正在监听(打开),而 RST(重置)表示非监听者。如果在多次重新传输后仍未收到响应,则端口被标记为已过滤。如果收到 ICMP 不可达错误(类型 3,代码 0、1、2、3、9、10 或 13),端口也会被标记为已过滤。如果收到 SYN 数据包(不带 ACK 标志),端口也会被视为开放。这可能是由于一种极为罕见的 TCP 功能,即同时打开或拆分握手连接(请参阅 https://nmap.org/misc/split-handshake.pdf)。
nmap -sS 192.168.174.132
26. -sT
TCP 连接扫描
当 SYN 扫描不可用时,TCP 连接扫描是默认的 TCP 扫描类型。当用户没有原始数据包权限时,就会出现这种情况。与大多数其他扫描类型不同,Nmap 不会写入原始数据包,而是通过发出连接系统调用来要求底层操作系统与目标机器和端口建立连接。这是 Web 浏览器、P2P 客户端和大多数其他支持网络的应用程序用于建立连接的相同高级系统调用。它是称为 Berkeley Sockets API 的编程接口的一部分。Nmap 不会从线路上读取原始数据包响应,而是使用此 API 获取每次连接尝试的状态信息。
当 SYN 扫描可用时,它通常是更好的选择。Nmap 对高级连接调用的控制比对原始数据包的控制少,因此效率较低。系统调用完成与开放目标端口的连接,而不是执行 SYN 扫描执行的半开重置。这不仅需要更长的时间,需要更多的数据包才能获得相同的信息,而且目标机器更有可能记录连接。一个像样的 IDS 可以捕获这两种情况,但大多数机器没有这样的警报系统。当 Nmap 连接然后关闭连接而不发送数据时,普通 Unix 系统上的许多服务都会向系统日志添加注释,有时还会添加神秘的错误消息。当这种情况发生时,真正可悲的服务会崩溃,尽管这种情况并不常见。如果管理员在日志中看到来自单个系统的大量连接尝试,她应该知道她已被连接扫描。
nmap -sT 192.168.174.132
27. -sU
需要root权限
UDP扫描
虽然互联网上大多数流行的服务都通过 TCP 协议运行,但 UDP 服务也得到了广泛部署。DNS、SNMP 和 DHCP(注册端口 53、161/162 和 67/68)是其中最常见的三种。由于 UDP 扫描通常比 TCP 更慢且更困难,因此一些安全审计员会忽略这些端口。这是一个错误,因为可利用的 UDP 服务非常常见,攻击者当然不会忽略整个协议。幸运的是,Nmap 可以帮助清点 UDP 端口。
使用 -sU 选项激活 UDP 扫描。它可以与 TCP 扫描类型(如 SYN 扫描 (-sS))结合使用,以在同一次运行期间检查两种协议。
UDP 扫描通过向每个目标端口发送 UDP 数据包来工作。对于一些常见端口(如 53 和 161),会发送特定于协议的有效负载以提高响应率,但对于大多数端口,除非指定 --data、--data-string 或 --data-length 选项,否则数据包为空。如果返回 ICMP 端口不可达错误(类型 3,代码 3),则表示端口已关闭。其他 ICMP 不可达错误(类型 3,代码 0、1、2、9、10 或 13)将端口标记为已过滤。有时,服务会使用 UDP 数据包进行响应,证明它是开放的。如果在重新传输后未收到任何响应,则端口被归类为开放|过滤。这意味着端口可能已打开,或者数据包过滤器可能阻止了通信。版本检测(-sV)可用于帮助区分真正开放的端口和已过滤的端口。
UDP 扫描的一大挑战是快速完成。开放和已过滤的端口很少发送任何响应,导致 Nmap 超时,然后进行重新传输,以防探测或响应丢失。关闭的端口通常是一个更大的问题。它们通常会发回 ICMP 端口不可达错误。但是与关闭的 TCP 端口响应 SYN 或连接扫描而发送的 RST 数据包不同,许多主机默认限制 ICMP 端口不可达消息的速率。Linux 和 Solaris 对此特别严格。例如,Linux 2.4.20 内核将目标不可达消息限制为每秒一条(在 net/ipv4/icmp.c 中)。
Nmap 会检测速率限制并相应地减慢速度,以避免目标机器会丢弃的无用数据包充斥网络。不幸的是,Linux 风格的每秒一个数据包的限制使 65,536 个端口的扫描需要超过 18 小时。加快 UDP 扫描速度的想法包括并行扫描更多主机、首先快速扫描常用端口、从防火墙后面扫描以及使用 --host-timeout 跳过速度慢的主机。
nmap -sU 192.168.174.132
28. -sY
需要root权限
SCTP INIT 扫描
SCTP 是 TCP 和 UDP 协议的一个相对较新的替代方案,它结合了 TCP 和 UDP 的大部分特性,还添加了多宿主和多流等新功能。它主要用于 SS7/SIGTRAN 相关服务,但也有潜力用于其他应用程序。SCTP INIT 扫描是 TCP SYN 扫描的 SCTP 等效项。它可以快速执行,在不受限制性防火墙阻碍的快速网络上每秒扫描数千个端口。与 SYN 扫描一样,INIT 扫描相对不引人注目且隐秘,因为它从不完成 SCTP 关联。它还允许清晰、可靠地区分开放、关闭和过滤状态。
这种技术通常称为半开放扫描,因为您不会打开完整的 SCTP 关联。您发送一个 INIT 块,就好像您要打开一个真正的关联,然后等待响应。 INIT-ACK 块表示端口正在监听(打开),而 ABORT 块表示端口未监听。如果在多次重传后仍未收到响应,则端口被标记为已过滤。如果收到 ICMP 不可达错误(类型 3,代码 0、1、2、3、9、10 或 13),端口也会被标记为已过滤。
nmap -sY 192.168.174.135
29. -sN;-sF;-sX
需要root权限
TCP NULL、FIN 和 Xmas 扫描
这三种扫描类型(使用下一节中介绍的 --scanflags 选项,可以实现更多扫描类型)利用 TCP RFC 中的一个微妙漏洞来区分 open (开放)和 closed(关闭)的端口。RFC 793 第 65 页指出,“如果 [目标] 端口状态为 CLOSED .... 不包含 RST 的传入段会导致发送 RST 作为响应。”然后,下一页讨论了发送到未设置 SYN、RST 或 ACK 位的开放端口的数据包,指出:“您不太可能到达这里,但如果到达,请丢弃该段并返回。”
在扫描符合此 RFC 文本的系统时,如果端口已关闭,则任何不包含 SYN、RST 或 ACK 位的数据包都会导致返回 RST,如果端口已打开,则根本不会响应。只要不包括这三个位中的任何一个,其他三个位(FIN、PSH 和 URG)的任意组合都可以。Nmap 利用三种扫描类型利用了这一点:
Null扫描 (-sN)
不设置任何位(TCP 标志头为 0)
FIN 扫描 (-sF)
仅设置 TCP FIN 位。
Xmas 扫描 (-sX)
设置 FIN、PSH 和 URG 标志,使数据包像圣诞树一样亮起来。
除了探测数据包中设置的 TCP 标志外,这三种扫描类型的行为完全相同。如果收到 RST 数据包,则认为端口 closed (已关闭),而没有响应则意味着端口已 open|filtered (打开|过滤)。如果收到 ICMP 不可达错误(类型 3,代码 0、1、2、3、9、10 或 13),则端口被标记为已过滤。
这些扫描类型的主要优势在于它们可以潜入某些非状态防火墙和数据包过滤路由器。另一个优点是这些扫描类型比 SYN 扫描更隐蔽。但不要指望这一点——大多数现代 IDS 产品都可以配置为检测它们。最大的缺点是并非所有系统都严格遵循 RFC 793。许多系统都会向探测器发送 RST 响应,无论端口是否打开。这会导致所有端口都被标记为关闭。执行此操作的主要操作系统是 Microsoft Windows、许多 Cisco 设备、BSDI 和 IBM OS/400。不过,这种扫描确实适用于大多数基于 Unix 的系统。这些扫描的另一个缺点是它们无法区分开放端口和某些 filtered (过滤)端口,导致响应处于 open|filtered (打开|过滤)状态。
nmap -sN 192.168.174.132
nmap -sF 192.168.174.132
nmap -sX 192.168.174.132
30. -sA
需要root权限
TCP ACK 扫描
此扫描与迄今为止讨论的其他扫描不同,因为它从不确定 open (开放)(甚至 open|filtered 开放|过滤)端口。它用于映射防火墙规则集,确定它们是否有状态以及哪些端口被过滤。
ACK 扫描探测数据包仅设置了 ACK 标志(除非您使用 --scanflags)。扫描未过滤的系统时,open (开放)和 closed (关闭)的端口都将返回 RST 数据包。然后 Nmap 将它们标记为未过滤,这意味着它们可以通过 ACK 数据包访问,但它们是 open (开放)还是 closed (关闭)尚不确定。不响应或发回某些 ICMP 错误消息(类型 3,代码 0、1、2、3、9、10 或 13)的端口被标记为 filtered (已过滤)。
nmap -sA 192.168.174.132
31. -sW
需要root权限
TCP 窗口扫描
窗口扫描与 ACK 扫描完全相同,只是它利用某些系统的实现细节来区分开放端口和关闭端口,而不是在返回 RST 时始终打印未过滤端口。它通过检查返回的 RST 数据包的 TCP 窗口字段来实现这一点。在某些系统上,开放端口使用正窗口大小(即使对于 RST 数据包也是如此),而关闭端口的窗口大小为零。因此,当端口收到 RST 返回时,窗口扫描不会始终将端口列为未过滤端口,而是在重置中的 TCP 窗口值为正或为零时分别将端口列为开放或关闭。
此扫描依赖于互联网上少数系统的实现细节,因此您不能总是信任它。不支持它的系统通常会返回所有关闭的端口。当然,机器可能真的没有开放的端口。如果大多数扫描的端口都已关闭,但一些常用端口号(如 22、25、53)已被过滤,则系统很可能容易受到攻击。有时,系统甚至会表现出完全相反的行为。如果您的扫描显示 1,000 个开放端口和 3 个关闭或过滤的端口,那么这 3 个端口很可能是真正开放的端口。
nmap -sW 192.168.174.132
32. -sM
需要root权限
TCP Maimon扫描
Maimon扫描是用它的发现者Uriel Maimon命名的。他在 Phrack Magazine issue #49 (November 1996)中描述了这一技术。 Nmap在两期后加入了这一技术。 这项技术和Null,FIN,以及Xmas扫描完全一样,除了探测报文是FIN/ACK。 根据RFC 793 (TCP),无论端口开放或者关闭,都应该对这样的探测响应RST报文。 然而,Uriel注意到如果端口开放,许多基于BSD的系统只是丢弃该探测报文。
nmap -sM 192.168.174.134
33. --scanflags
定制的TCP扫描
真正的Nmap高级用户不需要被这些现成的扫描类型束缚。 --scanflags选项允许您通过指定任意TCP标志位来设计您自己的扫描。 让您的创造力流动,躲开那些仅靠本手册添加规则的入侵检测系统!
--scanflags选项可以是一个数字标记值如9 (PSH和FIN), 但使用字符名更容易些。 只要是URG, ACK,PSH, RST,SYN,和 FIN的任何组合就行。例如,--scanflags URGACKPSHRSTSYNFIN设置了所有标志位,但是这对扫描没有太大用处。 标志位的顺序不重要。
除了设置需要的标志位,您也可以设置 TCP扫描类型(如-sA或者-sF)。 那个基本类型告诉Nmap怎样解释响应。例如, SYN扫描认为没有响应意味着 filtered端口,而FIN扫描则认为是 open|filtered。 除了使用您指定的TCP标记位,Nmap会和基本扫描类型一样工作。 如果您不指定基本类型,就使用SYN扫描。
nmap --scanflags URGACKPSHRSTSYNFIN 192.168.174.132
34. -sZ
需要root权限
SCTP COOKIE ECHO 扫描
SCTP COOKIE ECHO 扫描是一种更高级的 SCTP 扫描。它利用了这样一个事实:SCTP 实现应该在开放端口上悄悄丢弃包含 COOKIE ECHO 块的数据包,但如果端口关闭,则发送 ABORT。这种扫描类型的优点是,它不像 INIT 扫描那样明显是端口扫描。此外,可能存在非状态防火墙规则集阻止 INIT 块,但不会阻止 COOKIE ECHO 块。不要误以为这会使端口扫描不可见;好的 IDS 也能够检测到 SCTP COOKIE ECHO 扫描。缺点是 SCTP COOKIE ECHO 扫描无法区分 open (开放)端口和 filtered(过滤)端口,在两种情况下,您都处于 open|filtered(打开|过滤)状态。
nmap -sZ 192.168.174.132
35. -sI <zombie host[:probeport]>
需要root权限
空闲扫描
这种高级的扫描方法允许对目标进行真正的TCP端口盲扫描 (意味着没有报文从您的真实IP地址发送到目标)。相反,side-channel攻击 利用zombie主机上已知的IP分段ID序列生成算法来窥探目标上开放端口的信息。 IDS系统将显示扫描来自您指定的zombie机(必须运行并且符合一定的标准)。 这种奇妙的扫描类型太复杂了,不能在此完全描述,所以我写一篇非正式的论文, 发布在https://nmap.org/book/idlescan.html。
除了极端隐蔽(由于它不从真实IP地址发送任何报文), 该扫描类型可以建立机器间的基于IP的信任关系。 端口列表从zombie 主机的角度。显示开放的端口。 因此您可以尝试用您认为(通过路由器/包过滤规则)可能被信任的 zombies扫描目标。
如果您由于IPID改变希望探测zombie上的特定端口, 您可以在zombie 主机后加上一个冒号和端口号。 否则Nmap会使用默认端口(80)。
nmap -sI 192.168.174.132:443 192.168.174.145
36. -sO
需要root权限
IP协议扫描
IP 协议扫描可以让您确定目标机支持哪些IP协议 (TCP,ICMP,IGMP,等等)。从技术上说,这不是端口扫描 ,既然它遍历的是IP协议号而不是TCP或者UDP端口号。 但是它仍使用 -p选项选择要扫描的协议号, 用正常的端口表格式报告结果,甚至用和真正的端口扫描一样 的扫描引擎。因此它和端口扫描非常接近,也被放在这里讨论。
除了本身很有用,协议扫描还显示了开源软件的力量。 尽管基本想法非常简单,我过去从没想过增加这一功能也没收到任何对它的请求。 在2000年夏天,Gerhard Rieger孕育了这个想法,写了一个很棒的补丁程序,发送到nmap-hackers邮件列表。 我把那个补丁加入了Nmap,第二天发布了新版本。 几乎没有商业软件会有用户有足够的热情设计并贡献他们的改进。
协议扫描以和UDP扫描类似的方式工作。它不是在UDP报文的端口域上循环, 而是在IP协议域的8位上循环,发送IP报文头。 报文头通常是空的,不包含数据,甚至不包含所申明的协议的正确报文头 TCP,UDP,和ICMP是三个例外。它们三个会使用正常的协议头,因为否则某些系 统拒绝发送,而且Nmap有函数创建它们。协议扫描不是注意ICMP端口不可到达消息, 而是ICMP 协议不可到达消息。如果Nmap从目标主机收到 任何协议的任何响应,Nmap就把那个协议标记为open。 ICMP协议不可到达 错误(类型 3,代号 2) 导致协议被标记为 closed。其它ICMP不可到达协议(类型 3,代号 1,3,9,10,或者13) 导致协议被标记为 filtered (虽然同时他们证明ICMP是 open )。如果重试之后仍没有收到响应, 该协议就被标记为open|filtered
nmap -sO 192.168.175.145
37. -b <FTP relay host>
FTP 反弹扫描
FTP 协议 (RFC 959) 的一个有趣功能是支持所谓的代理 FTP 连接。这允许用户连接到一个 FTP 服务器,然后要求将文件发送到第三方服务器。这种功能在很多层面上都很容易被滥用,因此大多数服务器已停止支持它。此功能允许的滥用之一是导致 FTP 服务器对其他主机进行端口扫描。只需要求 FTP 服务器依次将文件发送到目标主机的每个相关端口即可。错误消息将描述端口是否打开。这是一种绕过防火墙的好方法,因为组织的 FTP 服务器通常放置在比任何旧 Internet 主机更能访问其他内部主机的地方。Nmap 使用 -b 选项支持 FTP 反弹扫描。它采用 <username>:<password>@<server>:<port> 形式的参数。<Server> 是易受攻击的 FTP 服务器的名称或 IP 地址。与普通 URL 一样,您可以省略 <username>:<password>,在这种情况下将使用匿名登录凭据(user:anonymous password:-wwwuser@)。端口号(和前面的冒号)也可以省略,在这种情况下将使用 <server> 上的默认 FTP 端口 (21)。
此漏洞在 1997 年 Nmap 发布时非常普遍,但已基本得到修复。易受攻击的服务器仍然存在,因此当所有其他方法都失败时,值得尝试。如果您的目标是绕过防火墙,请扫描目标网络中的端口 21(或者如果您使用版本检测扫描所有端口,甚至可以扫描任何 FTP 服务)并使用 ftp-bounce NSE 脚本。Nmap 会告诉您主机是否易受攻击。如果您只是想掩盖自己的踪迹,则不需要(事实上也不应该)将自己限制在目标网络上的主机上。在您开始扫描随机 Internet 地址以查找易受攻击的 FTP 服务器之前,请考虑系统管理员可能不喜欢您以这种方式滥用他们的服务器。
nmap -Pn -b ftp://msfadmin:msfadmin@192.168.174.132:21 192.168.175.145
端口说明和扫描顺序
38. -p <port ranges>
仅扫描指定端口
例如:-p22;-p1-65535; -p U:53,111,137,T:21-25,80,139,8080,S:9
此选项指定您要扫描的端口并覆盖默认值。单个端口号是可以的,范围用连字符分隔也是可以的(例如 1-1023)。范围的开始值和/或结束值可以省略,这会导致 Nmap 分别使用 1 和 65535。因此,您可以指定 -p- 来扫描从 1 到 65535 的端口。如果您明确指定,则可以扫描端口0。对于 IP 协议扫描(-sO),此选项指定您要扫描的协议号(0-255)。
当扫描协议组合(例如 TCP 和 UDP)时,您可以通过在端口号前加上 T:(表示 TCP)、U:(表示 UDP)、S:(表示 SCTP)或 P:(表示 IP 协议)来指定特定协议。限定符持续到您指定另一个限定符为止。例如,参数 -p U:53,111,137,T:21-25,80,139,8080 将扫描 UDP 端口 53、111 和 137,以及列出的 TCP 端口。请注意,要同时扫描 UDP 和 TCP,您必须指定 -sU 和至少一种 TCP 扫描类型(例如 -sS、-sF 或 -sT)。如果没有给出协议限定符,则端口号将添加到所有协议列表中。
还可以根据 nmap-services 中端口的引用来按名称指定端口。您甚至可以将通配符 * 和 ? 与名称一起使用。例如,要扫描 FTP 和所有名称以“http”开头的端口,请使用 -p ftp,http*。请小心使用 shell 扩展,如果不确定,请引用 -p 的参数。
端口范围可以用方括号括起来,以指示 nmap-services 中出现的该范围内的端口。例如,以下命令将扫描 nmap-services 中所有等于或小于 1024 的端口:-p [-1024]。请谨慎使用 shell 扩展,如果不确定,请引用 -p 的参数。
nmap -p 80 192.168.174.0/24
nmap -Pn -p 1-1023 192.168.174.129
-p- 来扫描从 1 到 65535 的端口
nmap -p- 192.168.174.135
nmap -p 0 192.168.174.134
nmap -sO -p 0-255 192.168.174.132
nmap -sU -sS -p U:53,111,137,T:21-25,80,139,8080 192.168.174.132
nmap -p ftp,http* 192.168.174.145
nmap -p [-1024] 192.168.174.145
39. --exclude-ports <port ranges>
从扫描中排除指定端口
此选项指定您希望 Nmap 从扫描中排除哪些端口。<端口范围> 的指定方式与 -p 类似。对于 IP 协议扫描 (-sO),此选项指定您希望排除的协议编号 (0-255)。
当要求排除端口时,它们将被排除在所有类型的扫描之外(即在任何情况下都不会被扫描)。这也包括发现阶段。
nmap -Pn --exclude-ports 21,22,80,443,8080 192.168.174.132
nmap -sO --exclude-ports 100-150 192.168.174.132
40. -F
快速(有限端口)扫描
指定您希望扫描比默认端口更少的端口。通常,Nmap 会扫描每个扫描协议最常见的 1,000 个端口。使用 -F,此数量会减少到 100。
Nmap 需要一个包含频率信息的 nmap-services 文件,以便知道哪些端口最常用。如果没有端口频率信息(可能是因为使用了自定义 nmap-services 文件),Nmap 会扫描所有命名端口以及 1-1024 端口。在这种情况下,-F 表示仅扫描服务文件中命名的端口。
nmap -F 192.168.174.145
41. -r
不要按随机顺序扫描端口
默认情况下,Nmap 会随机化扫描端口的顺序(但出于效率原因,某些常用的可访问端口会被移到开头附近)。这种随机化通常是可取的,但您可以指定 -r 来进行顺序(从低到高排序)端口扫描。
nmap -r 192.168.174.135
42. --port-ratio <ratio><decimal number between 0 and 1>
扫描比 <ratio> 更常见的端口
扫描 nmap-services 文件中所有比率大于给定值的端口。<ratio> 必须介于 0.0 和 1.0 之间。
nmap --port-ratio 0 192.168.174.132
43. --top-ports <n>
扫描 <n> 个最常用的端口
在排除 --exclude-ports 指定的所有端口后,扫描 nmap-services 文件中找到的 <n> 个最高比率端口。<n> 必须为 1 或更大。
nmap --top-ports 10 192.168.174.132
服务和版本探测
44. -sV
版本检测 - 探测开放端口以确定服务/版本信息
启用版本检测,如上所述。或者,您可以使用 -A,它除其他功能外还启用版本检测。
-sR 是 -sV 的别名。2011 年 3 月之前,它用于独立于版本检测激活 RPC 研磨机,但现在这些选项始终结合在一起。
nmap -sV 192.168.174.132
45. --allports
不为版本探测排除任何端口
默认情况下,Nmap版本探测会跳过9100 TCP端口,因为一些打印机简单地打印送到该端口的 任何数据,这回导致数十页HTTP get请求,二进制 SSL会话请求等等被打印出来。这一行为可以通过修改或删除nmap-service-probes 中的Exclude指示符改变, 您也可以不理会任何Exclude指示符,指定--allports扫描所有端口
nmap --allports 192.168.174.132
46. --version-intensity <intensity>
设置版本扫描强度 - 设置为 0(轻度)到 9(尝试所有探测)
当进行版本扫描(-sV)时,nmap发送一系列探测报文 ,每个报文都被赋予一个1到9之间的值。 被赋予较低值的探测报文对大范围的常见服务有效,而被赋予较高值的报文一般没什么用。强度水平说明了应该使用哪些探测报文。数值越高, 服务越有可能被正确识别。 然而,高强度扫描花更多时间。强度值必须在0和9之间。 默认是7。当探测报文通过nmap-service-probes ports指示符注册到目标端口时,无论什么强度水平,探测报文都会被尝试。这保证了DNS 探测将永远在任何开放的53端口尝试, SSL探测将在443端口尝试,等等。
nmap -sV --version-intensity 7 192.168.174.145
47. --version-light
打开轻量级模式 - 限制为最可能的探测(强度 2)
这是 --version-intensity 2的方便的别名。轻量级模式使 版本扫描快许多,但它识别服务的可能性也略微小一点。
nmap -sV --version-light 192.168.174.132
48. --version-all
尝试每个探测(强度 9)
--version-intensity 9的别名, 保证对每个端口尝试每个探测报文。
nmap -sV --version-all 192.168.174.132
49. --version-trace
跟踪版本扫描活动 - 显示详细的版本扫描活动(用于调试)
这导致Nmap打印出详细的关于正在进行的扫描的调试信息。 它是您用--packet-trace所得到的信息的子集。
nmap --version-trace 192.168.174.135
操作系统探测
50. -O
需要root权限
启用操作系统检测
启用操作系统检测,如上所述。或者,您可以使用 -A 来启用操作系统检测以及其他功能。
nmap -O 192.168.174.135
nmap -A -O scan.nmap.org
51. --osscan-limit
将操作系统检测限制在有希望的目标上
如果至少发现一个开放的 TCP 端口和一个关闭的 TCP 端口,操作系统检测将更加有效。设置此选项后,Nmap 将不会尝试对不符合此标准的主机进行操作系统检测。这可以节省大量时间,尤其是在对许多主机进行 -Pn 扫描时。只有当使用 -O 或 -A 请求操作系统检测时,它才有意义。
nmap -A -O --osscan-limit 192.168.174.145
52. --osscan-guess; --fuzzy
推测操作系统检测结果 - 更积极地猜测操作系统
当 Nmap 无法检测到完美的操作系统匹配时,它有时会提供近似匹配作为可能性。默认情况下,匹配必须非常接近,Nmap 才能执行此操作。这两个(等效)选项中的任何一个都会使 Nmap 猜测得更积极。Nmap 仍会告诉您何时打印了不完美的匹配,并显示每个猜测的置信度(百分比)。
nmap --osscan-guess scan.nmap.org
nmap -O --fuzzy scan.nmap.org
53. --max-os-tries
设置针对目标的最大操作系统检测尝试次数
当 Nmap 针对目标执行操作系统检测但未能找到完美匹配时,它通常会重复尝试。默认情况下,如果条件有利于操作系统指纹提交,Nmap 会尝试五次,如果条件不太好,则尝试两次。指定较低的 --max-os-tries 值(例如 1)可加快 Nmap 的速度,但您会错过可能识别操作系统的重试。或者,可以设置较高的值以在条件有利时允许更多重试。除非为了生成更好的指纹以提交并集成到 Nmap 操作系统数据库中,否则很少这样做。
nmap -O --osscan-limit --osscan-guess --max-os-tries 10 192.168.174.132
Nmap 脚本引擎(NSE)
54. -sC
相当于--script=default
使用默认脚本集执行脚本扫描。它相当于 --script=default。此类别中的某些脚本被视为侵入性脚本,未经许可不应针对目标网络运行。
nmap -sC 192.168.174.132
55. --script=<Lua scripts> | --script <filename>|<category>|<directory>/|<expression>[,...]
<Lua scripts> 是一个逗号分隔的目录、脚本文件或脚本类别列表。
使用逗号分隔的文件名、脚本类别和目录列表运行脚本扫描。列表中的每个元素也可能是描述更复杂脚本集的布尔表达式。每个元素首先被解释为表达式,然后被解释为类别,最后被解释为文件或目录名称。
有两个特殊功能仅供高级用户使用。一个是在脚本名称和表达式前加上 + 以强制它们运行,即使它们通常不会运行(例如,在目标端口上未检测到相关服务)。另一个是参数 all 可用于指定 Nmap 数据库中的每个脚本。请谨慎使用此功能,因为 NSE 包含危险脚本,例如漏洞利用、暴力身份验证破解程序和拒绝服务攻击。
文件和目录名称可以是相对的,也可以是绝对的。绝对名称可直接使用。在以下每个位置的脚本中查找相对路径,直到找到:
--datadir
$NMAPDIR
~/.nmap(不在 Windows 系统上搜索)
<APPDATA>\nmap(仅在 Windows 上)
包含 nmap 可执行文件的目录
包含 nmap 可执行文件的目录,后跟 ../share/nmap(不在 Windows 系统上搜索)
NMAPDATADIR(不在 Windows 系统上搜索)
当前目录。
Nmap 脚本目录路径:/usr/share/nmap/scripts/
当给出以 / 结尾的目录名时,Nmap 会加载目录中名称以 .nse 结尾的每个文件。所有其他文件都将被忽略,并且不会递归搜索目录。当给出文件名时,它不必具有 .nse 扩展名;如有必要,它将自动添加。
默认情况下,Nmap 脚本存储在 Nmap 数据目录的 scripts 子目录中。为了提高效率,脚本在存储在 scripts/script.db 中的数据库中编入索引,该数据库列出了每个脚本所属的类别。
当按名称引用 script.db 中的脚本时,可以使用 shell 样式的“*”通配符。
nmap --script "http-*"
加载名称以 http- 开头的所有脚本,例如 http-auth 和 http-open-proxy。 --script 的参数必须放在引号中,以保护通配符不受 shell 的影响。
可以使用 and、or 和 not 运算符来构建布尔表达式,从而完成更复杂的脚本选择。这些运算符的优先级与 Lua 中的优先级相同:not 最高,其次是 and,然后是 or。您可以使用括号来改变优先级。由于表达式包含空格字符,因此必须将它们括起来。
nmap --script "not intrusive"
加载除 intrusive 类别之外的所有脚本。
nmap --script "default or safe"
这在功能上等同于 nmap --script "default,safe"。它加载默认类别或安全类别或两者中的所有脚本。
nmap --script "default and safe"
加载默认和安全类别中的脚本。
nmap --script "(default or safe or intrusive) and not http-*"
加载默认、安全或侵入类别中的脚本,但名称以 http- 开头的脚本除外。
56. --script-args <n1>=<v1>,<n2>={<n3>=<v3>},<n4>={<v4>,<v5>}
为脚本提供参数。
允许您向 NSE 脚本提供参数。参数是逗号分隔的名称=值对列表。名称和值可以是不包含空格或字符“{”、“}”、“=”或“,”的字符串。要在字符串中包含这些字符之一,请将字符串括在单引号或双引号中。在带引号的字符串中,“\”表示对引号进行转义。反斜杠仅用于在这种特殊情况下转义引号;在所有其他情况下,反斜杠都按字面意思解释。值也可以是用 {} 括起来的表,就像在 Lua 中一样。表可以包含简单的字符串值或更多名称-值对,包括嵌套表。许多脚本使用脚本名称限定其参数,例如 xmpp-info.server_name。您可以使用该完整限定版本来仅影响指定的脚本,也可以传递非限定版本(在本例中为 server_name)来影响使用该参数名称的所有脚本。脚本将首先检查其完整限定参数名称(其文档中指定的名称),然后才接受非限定参数名称。脚本参数的一个复杂示例是
--script-args 'user=foo,pass=",{}=bar",whois={whodb=nofollow+ripe},xmpp-info.server_name=localhost'。
在线 NSE 文档门户 https://nmap.org/nsedoc/ 列出了每个脚本接受的参数。
nmap --script "http-brute" --script-args 'user=admin,pass="password' 192.168.174.132
57. --script-args-file <filename>
在文件中提供 NSE 脚本参数。
允许您从文件加载 NSE 脚本的参数。命令行上的任何参数都会取代文件中的参数。文件可以是绝对路径,也可以是相对于 Nmap 常用搜索路径(NMAPDIR 等)的路径。参数可以用逗号分隔或用换行符分隔,但其他方面遵循与 --script-args 相同的规则,无需特殊引用和转义,因为它们不会被 shell 解析。
nmap --script "http-brute" --script-args-file=/home/kali/args.txt 192.168.174.132
#也可以把--script-args-file写成--script-args-file "/home/kali/args.txt"这样的格式。
58. --script-help=<Lua scripts> | --script-help <filename>|<category>|<directory>|<expression>|all[,...]
显示有关脚本的帮助。<Lua scripts> 是一个逗号分隔的脚本文件或脚本类别列表。
显示有关脚本的帮助。对于符合给定规范的每个脚本,Nmap 都会打印脚本名称、其类别及其描述。规范与 --script 接受的规范相同;因此,例如,如果您需要有关 ftp-anon 脚本的帮助,您可以运行 nmap --script-help ftp-anon。除了获取单个脚本的帮助外,您还可以使用它来预览将为规范运行哪些脚本,例如使用 nmap --script-help default。
nmap --script-help ftp-anon
nmap --script-help default
59. --script-trace
显示所有发送和接收的数据。
此选项的作用与 --packet-trace 相同,只是高出一个 ISO 层。如果指定此选项,则打印脚本执行的所有传入和传出通信。显示的信息包括通信协议、源、目标和传输的数据。如果超过 5% 的传输数据无法打印,则跟踪输出为十六进制转储格式。指定 --packet-trace 也会启用脚本跟踪。
nmap --script "http-brute" --script-trace 192.168.174.132
60. --script-updatedb
需要root权限
更新脚本数据库。
此选项更新 scripts/script.db 中的脚本数据库,Nmap 会使用该数据库来确定可用的默认脚本和类别。只有在您从默认脚本目录中添加或删除了 NSE 脚本,或者更改了任何脚本的类别时,才需要更新数据库。此选项通常单独使用:nmap --script-updatedb。
nmap --script-updatedb
时间和性能
使用<time>的选项以秒为单位,或将“ms”(毫秒)、“s”(秒)、“m”(分钟)或“h”(小时)附加到值(例如 30 m)。
61. --min-hostgroup <numhosts>; --max-hostgroup <numhosts>
调整并行扫描组大小
Nmap 能够并行对多个主机进行端口扫描或版本扫描。Nmap 通过将目标 IP 空间划分为组,然后一次扫描一个组来实现此目的。一般来说,组越大效率越高。缺点是,在整个组完成之前无法提供主机结果。因此,如果 Nmap 以 50 的组大小开始,则在前 50 个主机完成之前,用户不会收到任何报告(详细模式下提供的更新除外)。
默认情况下,Nmap 采取折衷方法解决此冲突。它以低至 5 的组大小开始,以便快速获得第一个结果,然后将组大小增加到 1024。确切的默认数字取决于给定的选项。出于效率原因,Nmap 对 UDP 或少量端口 TCP 扫描使用更大的组大小。
当使用 --max-hostgroup 指定最大组大小时,Nmap 将永远不会超过该大小。使用 --min-hostgroup 指定最小大小,Nmap 将尝试保持组大小高于该级别。如果给定接口上剩余的目标主机不足以满足指定的最小值,Nmap 可能必须使用比您指定的更小的组。两者都可以设置为将组大小保持在特定范围内,尽管这很少需要。
这些选项在扫描的主机发现阶段不起作用。这包括普通的 ping 扫描 (-sn)。主机发现始终在大型主机组中工作,以提高速度和准确性。
这些选项的主要用途是指定较大的最小组大小,以便完整扫描运行得更快。常见的选择是 256 以 /24 大小的块扫描网络。对于具有许多端口的扫描,超过该数字不太可能有太大帮助。对于仅扫描几个端口号的扫描,2048 或更大的主机组大小可能会有所帮助。
nmap --min-hostgroup 10 --max-hostgroup 50 192.168.174.145
62. --min-parallelism <numprobes>; --max-parallelism <numprobes>
调整探测报文的并行度
这些选项控制主机组可能未完成的探测总数。它们用于端口扫描和主机发现。默认情况下,Nmap 根据网络性能计算不断变化的理想并行度。如果数据包被丢弃,Nmap 会放慢速度并允许更少的未完成探测。随着网络证明其价值,理想探测数量会缓慢上升。这些选项对该变量设置最小或最大界限。默认情况下,如果网络证明不可靠,理想并行度可能会降至 1,而在完美条件下则上升到几百。
最常见的用法是将 --min-parallelism 设置为大于 1 的数字,以加快对性能不佳的主机或网络的扫描。这是一个有风险的选项,因为将其设置得太高可能会影响准确性。设置此选项还会降低 Nmap 根据网络条件动态控制并行度的能力。值 10 可能是合理的,尽管我只在万不得已的情况下才调整此值。
--max-parallelism 选项有时设置为 1,以防止 Nmap 一次向主机发送多个探测。 --scan-delay 选项(稍后讨论)是另一种实现此目的的方法。
nmap --min-parallelism 1 --max-parallelism 10 192.168.174.145
63. --min-rtt-timeout <time>、--max-rtt-timeout <time>、--initial-rtt-timeout <time>
调整探测报文超时
Nmap 维护一个运行超时值,用于确定在放弃或重新传输探测之前等待探测响应的时间。这是根据先前探测的响应时间计算的。确切的公式在“扫描代码和算法”一节中给出。如果网络延迟显示为显著且可变,则此超时可能会增加到几秒钟。它也从保守(高)水平开始,并且当 Nmap 扫描无响应的主机时可能会保持这种状态一段时间。
指定比默认值更低的 --max-rtt-timeout 和 --initial-rtt-timeout 可以显著缩短扫描时间。对于无 ping(-Pn)扫描和针对严格过滤网络的扫描尤其如此。但不要太激进。如果您指定的值太低,以至于许多探测器在响应传输过程中超时并重新传输,则扫描最终可能需要更长的时间。
如果所有主机都在本地网络上,则 100 毫秒(--max-rtt-timeout 100ms)是一个合理的激进值。如果涉及路由,请先使用 ICMP ping 实用程序或更可能通过防火墙的自定义数据包生成器(如 Nping)对网络上的主机进行 ping。查看十个左右的数据包的最大往返时间。您可能希望将 --initial-rtt-timeout 的往返时间翻倍,将 --max-rtt-timeout 的往返时间翻三倍或四倍。无论 ping 时间是多少,我通常都不会将最大 RTT 设置为低于 100 毫秒。我也不超过 1000 毫秒。
--min-rtt-timeout 是一个很少使用的选项,当网络非常不可靠以至于 Nmap 的默认值都过于激进时,它可能很有用。由于 Nmap 仅在网络看似可靠时才将超时时间减少到最小值,因此这种需求并不常见,应作为错误报告给 nmap-dev 邮件列表。
nmap --min-rtt-timeout 100ms --max-rtt-timeout 500ms --initial-rtt-timeout 200ms 192.168.174.132
64. --max-retries <numtries>
指定端口扫描探测的最大重传次数
如果 Nmap 没有收到端口扫描探测的响应,则可能意味着端口已被过滤。或者探测或响应可能只是在网络上丢失了。目标主机也可能启用了速率限制,从而暂时阻止了响应。因此,Nmap 会通过重传初始探测再次尝试。如果 Nmap 检测到网络可靠性较差,它可能会尝试多次,然后再放弃端口。虽然这有利于提高准确性,但也会延长扫描时间。当性能至关重要时,可以通过限制允许的重传次数来加快扫描速度。您甚至可以指定 --max-retries 0 来防止任何重传,但这仅适用于非正式调查等偶尔错过端口和主机的情况。
默认(无 -T 模板)允许十次重传。如果网络看起来可靠且目标主机没有速率限制,Nmap 通常只进行一次重传。因此,即使将 --max-retries 降低到较低的值(例如 3),大多数目标扫描也不会受到影响。这样的值可以大大加快对慢速(速率受限)主机的扫描。当 Nmap 过早放弃端口时,您通常会丢失一些信息,但这可能比让 --host-timeout 过期并丢失有关目标的所有信息更好。
nmap --max-retries 10 192.168.174.132
65. --host-timeout <time>
放弃速度慢的目标主机 - 经过这么长时间后放弃目标
某些主机需要很长时间才能完成扫描。这可能是由于性能不佳或不可靠的网络硬件或软件、数据包速率限制或限制性防火墙造成的。扫描主机中最慢的百分之几可能会占用大部分扫描时间。有时最好减少损失并最初跳过这些主机。指定 --host-timeout 以及您愿意等待的最长时间。例如,指定 30m 以确保 Nmap 不会在单个主机上浪费超过半小时的时间。请注意,Nmap 可能会在这半小时内同时扫描其他主机,因此这并不是完全的损失。超时的主机将被跳过。不会为该主机打印任何端口表、操作系统检测或版本检测结果。
特殊值 0 可用于表示“无超时”,可用于覆盖 T5 计时模板,该模板将主机超时设置为 15 分钟。
nmap --host-timeout 30m 192.168.174.145
66. --script-timeout <time>
虽然有些脚本可以在几分之一秒内完成,但其他脚本可能需要数小时或更长时间,具体取决于脚本的性质、传入的参数、网络和应用程序条件等。--script-timeout 选项设置脚本执行时间的上限。任何超过该时间的脚本实例都将被终止,并且不会显示任何输出。如果启用了调试 (-d),Nmap 将报告每次超时。对于主机和服务脚本,脚本实例仅扫描单个目标主机或端口,并且下一个实例的超时期限将重置。
特殊值 0 可用于表示“无超时”,可用于覆盖 T5 计时模板,该模板将脚本超时设置为 10 分钟。
nmap --script "http-brute" --script-timeout 5m 192.168.174.132
67. --scan-delay <time>; --max-scan-delay <time>
调整探测报文的时间间隔
此选项使 Nmap 在向给定主机发送的每次探测之间至少等待给定的时间。这在速率限制的情况下特别有用。Solaris 计算机(以及许多其他计算机)通常每秒仅用一条 ICMP 消息响应 UDP 扫描探测数据包。Nmap 发送的任何超过该时间的消息都是浪费。1s 的 --scan-delay 将使 Nmap 保持这种缓慢的速率。Nmap 会尝试检测速率限制并相应地调整扫描延迟,但如果您已经知道哪种速率最有效,则明确指定它不会有什么坏处。
当 Nmap 向上调整扫描延迟以应对速率限制时,扫描速度会急剧变慢。--max-scan-delay 选项指定 Nmap 允许的最大延迟。较低的 --max-scan-delay 可以加快 Nmap 的速度,但这是有风险的。将此值设置得太低可能会导致数据包重新传输浪费,并且当目标实施严格的速率限制时可能会错过端口。
--scan-delay 的另一个用途是规避基于阈值的入侵检测和预防系统 (IDS/IPS)。此技术在名为“实际示例:绕过默认 Snort 2.2.0 规则”的部分中用于击败 Snort IDS 中的默认端口扫描检测器。大多数其他入侵检测系统都可以用同样的方式被击败。
nmap --scan-delay 500ms --max-scan-delay 2s 192.168.174.132
68. --min-rate <number>; --max-rate <number>
直接控制扫描速率
Nmap 的动态计时功能可以很好地找到合适的扫描速度。但是,有时您可能恰好知道网络的合适扫描速率,或者您可能必须保证扫描将在特定时间内完成。或者您可能必须阻止 Nmap 扫描得太快。--min-rate 和 --max-rate 选项就是为这些情况而设计的。
当指定 --min-rate 选项时,Nmap 将尽力以与给定速率一样快或更快的速度发送数据包。该参数是一个正实数,表示每秒数据包的速率。例如,指定 --min-rate 300 意味着 Nmap 将尝试将发送速率保持在每秒 300 个数据包或以上。如果条件允许,指定最小速率不会阻止 Nmap 加快速度。
同样,--max-rate 将扫描的发送速率限制为给定的最大值。例如,使用 --max-rate 100 可将快速网络上的发送速度限制为每秒 100 个数据包。使用 --max-rate 0.1 可每十秒进行一个数据包的慢速扫描。同时使用 --min-rate 和 --max-rate 可将速率保持在一定范围内。
这两个选项是全局的,影响整个扫描,而不是单个主机。它们只影响端口扫描和主机发现扫描。其他功能(如操作系统检测)会实现自己的计时。
实际扫描速率可能低于所要求的最小值的情况有两种。第一种是最小值比 Nmap 可以发送的最快速度快,这取决于硬件。在这种情况下,Nmap 将尽可能快地发送数据包,但请注意,如此高的速率可能会导致准确性下降。第二种情况是 Nmap 没有东西可发送,例如在扫描结束时,最后一个探测已发送,Nmap 正在等待它们超时或响应。在扫描结束时或在主机组之间看到扫描速率下降是正常的。发送速率可能会暂时超过最大值以弥补不可预测的延迟,但平均而言,速率将保持在最大值或以下。
指定最小速率时应谨慎。扫描速度超过网络可以支持的速度可能会导致准确性下降。在某些情况下,使用更快的速率会使扫描花费的时间比使用较慢的速率更长。这是因为 Nmap 的自适应重传算法将检测由过高的扫描速率引起的网络拥塞,并增加重传次数以提高准确性。因此,即使以更高的速率发送数据包,总体上也会发送更多的数据包。如果您需要设置总扫描时间的上限,请使用 --max-retries 选项限制重传次数。
nmap --min-rate 100ms --max-rate 500ms 192.168.174.132
69. --defeat-rst-ratelimit
许多主机长期以来一直使用速率限制来减少它们发送的 ICMP 错误消息(例如端口不可达错误)的数量。一些系统现在对它们生成的 RST(重置)数据包应用类似的速率限制。这会大大降低 Nmap 的速度,因为它会调整其时间以反映这些速率限制。您可以通过指定 --defeat-rst-ratelimit 告诉 Nmap 忽略这些速率限制(对于端口扫描,例如不将无响应端口视为开放的 SYN 扫描)。
使用此选项可能会降低准确性,因为某些端口会显示无响应,因为 Nmap 没有等待足够长的时间来等待速率限制的 RST 响应。对于 SYN 扫描,无响应会导致端口被标记为已过滤,而不是我们在收到 RST 数据包时看到的关闭状态。当您只关心开放端口时,此选项很有用,区分关闭和过滤端口不值得花费额外的时间。
nmap -sS --defeat-rst-ratelimit 192.168.174.132
70. --defeat-icmp-ratelimit
与 --defeat-rst-ratelimit 类似,--defeat-icmp-ratelimit 选项以速度换取准确性,从而提高对限制 ICMP 错误消息速率的主机的 UDP 扫描速度。由于此选项导致 Nmap 不会延迟接收端口不可达消息,因此无响应端口将被标记为关闭|过滤,而不是默认的打开|过滤。这只将实际通过 UDP 响应的端口视为打开。由于许多 UDP 服务不以这种方式响应,因此使用此选项出现不准确性的可能性比使用 --defeat-rst-ratelimit 更大。
nmap -sU --defeat-icmp-ratelimit 192.168.174.132
71. --nsock-engine iocp|epoll|kqueue|poll|select
强制使用给定的 nsock IO 多路复用引擎。只有基于 select(2) 的后备引擎才保证在您的系统上可用。引擎以它们利用的 IO 管理工具的名称命名。当前实现的引擎是 epoll、kqueue、poll 和 select,但并非所有引擎都会出现在任何平台上。默认情况下,Nmap 将使用“最佳”引擎,即此列表中第一个受支持的引擎。使用 nmap -V 查看您的平台支持哪些引擎。
nmap --nsock-engine epoll 192.168.174.145
72. -T<0-5> | -T paranoid|sneaky|polite|normal|aggressive|insane
设置时间模板(越高越快)
虽然上一节中讨论的细粒度计时控制功能强大且有效,但有些人觉得它们令人困惑。此外,选择适当的值有时可能比您尝试优化的扫描花费更多时间。幸运的是,Nmap 提供了一种更简单的方法,有六个计时模板。您可以使用 -T 选项及其编号(0-5)或名称指定它们。模板名称为 paranoid (0)、sneaky (1)、polite (2)、normal (3)、aggressive (4) 和 insane (5)。前两个用于 IDS 规避。Polite模式会减慢扫描速度以使用更少的带宽和目标机器资源。正常模式是默认模式,因此 -T3 不执行任何操作。Aggressive模式通过假设您处于相当快速和可靠的网络上来加快扫描速度。最后,insane模式假设您处于一个非常快的网络上,或者愿意牺牲一些准确性来提高速度。
这些模板允许用户指定他们希望的攻击程度,同时让 Nmap 选择精确的计时值。模板还会对目前尚不存在细粒度控制选项的某些速度进行细微调整。例如,-T4 禁止 TCP 端口的动态扫描延迟超过 10 毫秒,而 -T5 将该值限制为 5 毫秒。模板可以与细粒度控制结合使用,您指定的细粒度控制将优先于该参数的计时模板默认值。我建议在扫描相当现代和可靠的网络时使用 -T4。即使添加细粒度控制,也要保留该选项,以便您从它启用的额外细微优化中受益。
如果您使用的是不错的宽带或以太网连接,我建议始终使用 -T4。有些人喜欢 -T5,尽管它对我来说太过激进。人们有时会指定 -T2,因为他们认为它不太可能使主机崩溃,或者因为他们认为自己总体上比较有礼貌。他们通常没有意识到 -T polite到底有多慢。他们的扫描时间可能比默认扫描长十倍。使用默认计时选项 (-T3) 时,机器崩溃和带宽问题很少见,因此我通常建议谨慎的扫描器使用默认计时选项。省略版本检测比使用计时值更能减少这些问题。
虽然 -T0 和 -T1 可能有助于避免 IDS 警报,但它们将花费非常长的时间扫描数千台机器或端口。对于如此长的扫描,您可能更愿意设置所需的精确计时值,而不是依赖预设的 -T0 和 -T1 值。
T0 的主要作用是序列化扫描,以便一次只扫描一个端口,并在发送每个探测之间等待五分钟。T1 和 T2 类似,但它们在探测之间分别只等待 15 秒和 0.4 秒。T3 是 Nmap 的默认行为,其中包括并行化。 -T4 相当于 --max-rtt-timeout 1250ms --min-rtt-timeout 100ms --initial-rtt-timeout 500ms --max-retries 6,并将最大 TCP 和 SCTP 扫描延迟设置为 10ms。T5 相当于 --max-rtt-timeout 300ms --min-rtt-timeout 50ms --initial-rtt-timeout 250ms --max-retries 2 --host-timeout 15m --script-timeout 10m,并将最大 TCP 和 SCTP 扫描延迟设置为 5ms。T4 或 T5 不会设置最大 UDP 扫描延迟,但可以使用 --max-scan-delay 选项进行设置。
nmap -T5 192.168.174.145
防火墙/IDS躲避和哄骗
73. -f;--mtu
需要root权限
报文分段;使用指定的 MTU - 分段数据包(可选,带给定的 MTU)
-f 选项使请求的扫描(包括主机发现扫描)使用微小的分片 IP 数据包。其想法是将 TCP 报头拆分为多个数据包,使数据包过滤器、入侵检测系统和其他麻烦更难检测到您正在做的事情。请小心使用此选项!有些程序很难处理这些微小的数据包。名为 Sniffit 的老式嗅探器在收到第一个片段后立即出现分段故障。指定此选项一次,Nmap 会在 IP 报头后将数据包拆分为 8 个字节或更少的字节。因此,20 字节的 TCP 报头将被拆分为三个数据包。两个包含 8 个字节的 TCP 报头,一个包含最后 4 个字节。当然,每个片段也有一个 IP 报头。再次指定 -f 以使用每个片段 16 个字节(减少片段数量)。或者,您可以使用 --mtu 选项指定自己的偏移大小。如果您使用 --mtu,请不要同时指定 -f。偏移必须是 8 的倍数。虽然碎片数据包不会被数据包过滤器和将所有 IP 碎片排队的防火墙(例如 Linux 内核中的 CONFIG_IP_ALWAYS_DEFRAG 选项)拦截,但某些网络无法承受由此造成的性能损失,因此将其禁用。其他网络无法启用此功能,因为碎片可能会通过不同的路由进入其网络。某些源系统会在内核中对传出的数据包进行碎片整理。带有 iptables 连接跟踪模块的 Linux 就是这样一个例子。在 Wireshark 等嗅探器运行时进行扫描,以确保发送的数据包是碎片化的。如果您的主机操作系统导致问题,请尝试使用 --send-eth 选项绕过 IP 层并发送原始以太网帧。
碎片仅支持 Nmap 的原始数据包功能,其中包括 TCP 和 UDP 端口扫描(连接扫描和 FTP 反弹扫描除外)和操作系统检测。版本检测和 Nmap 脚本引擎等功能通常不支持碎片,因为它们依赖于主机的 TCP 堆栈与目标服务进行通信。
nmap -f 192.168.174.132
nmap --mtu 64 192.168.174.132
74. -D <decoy1>[,<decoy2>][,ME][,...]
使用诱饵隐藏扫描
执行诱饵扫描,使远程主机认为您指定为诱饵的主机也在扫描目标网络。因此,他们的 IDS 可能会报告来自唯一 IP 地址的 5-10 个端口扫描,但他们不知道哪个 IP 正在扫描它们,哪些是无辜的诱饵。虽然可以通过路由器路径跟踪、响应丢弃和其他主动机制来破解这一点,但它通常是隐藏 IP 地址的有效技术。
用逗号分隔每个诱饵主机,您可以选择使用 ME 作为诱饵之一来表示您的真实 IP 地址的位置。如果您将 ME 放在第六位或更靠后的位置,一些常见的端口扫描检测器(如 Solar Designer's excellent Scanlogd)不太可能显示您的 IP 地址。如果您不使用 ME,Nmap 会将您置于随机位置。您还可以使用 RND 生成随机的非保留 IP 地址,或使用 RND:<number> 生成 <number> 个地址。
请注意,您用作诱饵的主机应该处于启动状态,否则您可能会意外地 SYN 泛洪您的目标。此外,如果网络上只有一个主机处于实际启动状态,则很容易确定哪个主机正在扫描。您可能希望使用 IP 地址而不是名称(这样诱饵网络就不会在其名称服务器日志中看到您)。目前,只有 IPv4 支持随机 IP 地址生成
诱饵既用于初始主机发现扫描(使用 ICMP、SYN、ACK 或其他),也用于实际端口扫描阶段。诱饵还用于远程操作系统检测 (-O)。诱饵不适用于版本检测或 TCP 连接扫描。当扫描延迟生效时,延迟是在每批欺骗探测之间强制执行的,而不是在每个单独的探测之间强制执行的。由于诱饵是一次性批量发送的,因此它们可能会暂时违反拥塞控制限制。
值得注意的是,使用过多诱饵可能会减慢扫描速度,甚至可能降低扫描准确性。此外,一些 ISP 会过滤掉您的欺骗数据包,但许多 ISP 根本不限制欺骗 IP 数据包。
nmap -D 192.168.174.128,192.168.174.129,192.168.174.145 192.168.174.132
nmap -D RND:5,ME 192.168.174.132
73. -S <IP_Address>
源地址哄骗
在某些情况下,Nmap 可能无法确定您的源地址(如果是这种情况,Nmap 会告诉您)。在这种情况下,使用 -S 和您希望通过其发送数据包的接口的 IP 地址。
此标志的另一种可能用途是欺骗扫描,使目标认为其他人正在扫描它们。想象一下一家公司被竞争对手反复进行端口扫描!这种用法通常需要 -e 选项和 -Pn。请注意,您通常不会收到回复数据包(它们将被发送到您正在欺骗的 IP),因此 Nmap 不会生成有用的报告。
74. -e <interface>
使用指定接口
告诉 Nmap 在哪个接口上发送和接收数据包。Nmap 应该能够自动检测到这一点,但如果无法检测到,它会告诉您。
nmap -sS -S 192.168.174.134 -e eth0 -Pn 192.168.174.132
75. --source-port <portnumber>; -g <portnumber>
源端口哄骗
一个令人惊讶的常见错误配置是仅根据源端口号信任流量。很容易理解这是怎么发生的。管理员会设置一个崭新的防火墙,结果却收到大量应用程序停止工作的不知感恩的用户的投诉。特别是,DNS 可能会被破坏,因为来自外部服务器的 UDP DNS 回复无法再进入网络。FTP 是另一个常见的例子。在主动 FTP 传输中,远程服务器尝试建立与客户端的连接以传输请求的文件。
这些问题的安全解决方案是存在的,通常以应用程序级代理或协议解析防火墙模块的形式出现。不幸的是,也有更简单、不安全的解决方案。注意到 DNS 回复来自端口 53,而主动 FTP 来自端口 20,许多管理员陷入了简单地允许来自这些端口的传入流量的陷阱。他们通常认为没有攻击者会注意到并利用此类防火墙漏洞。在其他情况下,管理员认为这只是一个短期的权宜之计,直到他们可以实施更安全的解决方案。然后他们就忘记了安全升级。
陷入这种陷阱的不仅仅是工作过度的网络管理员。许多产品都附带了这些不安全的规则。甚至微软也犯过错误。Windows 2000 和 Windows XP 附带的 IPsec 过滤器包含一个隐式规则,允许来自端口 88(Kerberos)的所有 TCP 或 UDP 流量。在另一个众所周知的案例中,Zone Alarm 个人防火墙 2.1.25 之前的版本允许任何源端口为 53(DNS)或 67(DHCP)的传入 UDP 数据包。
Nmap 提供 -g 和 --source-port 选项(它们是等效的)来利用这些弱点。只需提供一个端口号,Nmap 就会尽可能从该端口发送数据包。大多数使用原始套接字的扫描操作(包括 SYN 和 UDP 扫描)都完全支持该选项。值得注意的是,该选项对使用正常操作系统套接字的任何操作均无效,包括 DNS 请求、TCP 连接扫描、版本检测和脚本扫描。设置源端口对操作系统检测也不起作用,因为 Nmap 必须使用不同的端口号才能使某些操作系统检测测试正常工作。
nmap -sS --source-port 443 192.168.174.145
76. --data <hex string>
将自定义二进制数据附加到已发送的数据包
此选项允许您将二进制数据作为有效负载包含在已发送的数据包中。<hex string> 可以指定为以下任何格式:0xAABBCCDDEEFF<...>、AABBCCDDEEFF<...> 或 \xAA\xBB\xCC\xDD\xEE\xFF<...>。使用示例为 --data 0xdeadbeef 和 --data \xCA\xFE\x09。请注意,如果您指定像 0x00ff 这样的数字,则不会执行字节顺序转换。请确保以接收器期望的字节顺序指定信息。
nmap -sS --data 0xdeadbeef 192.168.174.132
77. --data-string <string>
需要root权限
将自定义字符串附加到已发送的数据包
此选项允许您在已发送的数据包中包含常规字符串作为有效负载。<string> 可以包含任何字符串。但是,请注意,某些字符可能取决于您系统的语言环境,并且接收方可能看不到相同的信息。此外,请确保将字符串括在双引号中,并从 shell 中转义任何特殊字符。示例:--data-string “Scan conducted by Security Ops, extension 7192”或 --data-string “Ph34r my l33t skills”。请记住,除非他们使用嗅探器或自定义 IDS 规则仔细监视网络,否则没有人可能真正看到此选项留下的任何评论。
nmap --data-string "Scan conducted by Security Ops, extension 7192" 192.168.174.145
78. --data-length <number>
需要root权限
发送报文时 附加随机数据
通常,Nmap 发送的数据包仅包含标头。因此,其 TCP 数据包通常为 40 个字节,而 ICMP 回显请求仅为 28 个字节。某些 UDP 端口和 IP 协议默认会获得自定义负载。此选项告诉 Nmap 将给定数量的随机字节附加到其发送的大多数数据包,并且不使用任何特定于协议的负载。(使用 --data-length 0 表示不使用随机或特定于协议的负载。操作系统检测 (-O) 数据包不受影响,因为那里的准确性需要探测一致性,但大多数 ping 和端口扫描数据包都支持这一点。这会稍微减慢速度,但可以使扫描稍微不那么显眼。
nmap --data-length 128 192.168.174.145
79. --ip-options <R|S [route]|L [route]|T|U ... >; --ip-options <hex string>
需要root权限
发送带有指定 IP 选项的数据包
IP 协议提供了几个可以放置在数据包头中的选项。与无处不在的 TCP 选项不同,出于实用性和安全性考虑,IP 选项很少见。事实上,许多互联网路由器会阻止最危险的选项,例如源路由。然而,在某些情况下,选项仍然可用于确定和操纵到目标机器的网络路由。例如,即使更传统的跟踪路由样式方法失败,您也可以使用记录路由选项来确定到目标的路径。或者,如果您的数据包被某个防火墙丢弃,您可以使用严格或宽松的源路由选项指定不同的路由。
指定 IP 选项的最有效方法是简单地将值作为 --ip-options 的参数传递。在每个十六进制数字前面加上 \x,然后加上两位数字。您可以通过在特定字符后跟星号并指定重复次数来重复这些字符。例如,\x01\x07\x04\x00*36\x01 是一个包含 36 个 NUL 字节的十六进制字符串。
Nmap 还提供了一种指定选项的快捷机制。只需传递字母 R、T 或 U 即可分别请求记录路由、记录时间戳或同时请求这两个选项。可以使用 L 或 S 后跟空格,然后是空格分隔的 IP 地址列表来指定松散或严格的源路由。
如果您希望查看发送和接收的数据包中的选项,请指定 --packet-trace。有关使用 Nmap 的 IP 选项的更多信息和示例,请参阅 https://seclists.org/nmap-dev/2006/q3/52。
nmap --ip-options R 192.168.174.1
nmap --ip-options T 192.168.174.1
nmap --ip-options U 192.168.174.1
nmap --ip-options "\x01\x07\x04\x00*36\x01" 192.168.174.145
80. --ttl <value>
需要root权限
设置IP time-to-live域
设置IPv4报文的time-to-live域为指定的值。
nmap --ttl 64 192.168.174.145
81. --randomize-hosts
对目标主机的顺序随机排列
告诉 Nmap 在扫描每组主机(最多 16384 个主机)之前对其进行打乱。这可以使扫描对各种网络监控系统不那么明显,尤其是当您将其与慢速计时选项结合使用时。如果您想对较大的组大小进行随机化,请增加 nmap.h 中的 PING_GROUP_SZ 并重新编译。另一种解决方案是使用列表扫描(-sL -n -oN <filename>)生成目标 IP 列表,使用 Perl 脚本对其进行随机化,然后使用 -iL 将整个列表提供给 Nmap。
nmap --randomize-hosts 192.168.174.145
82. --spoof-mac <MAC address, prefix, or vendor name>
MAC地址哄骗
要求 Nmap 使用给定的 MAC 地址来发送所有原始以太网帧。此选项隐含 --send-eth 以确保 Nmap 实际发送以太网级数据包。给定的 MAC 可以采用多种格式。如果它只是数字 0,Nmap 将为会话选择一个完全随机的 MAC 地址。如果给定的字符串是偶数个十六进制数字(每对数字可选地用冒号分隔),Nmap 将使用这些数字作为 MAC。如果提供的十六进制数字少于 12 个,Nmap 将用随机值填充六个字节的其余部分。如果参数不是零或十六进制字符串,Nmap 将通过 nmap-mac-prefixes 查找包含给定字符串的供应商名称(不区分大小写)。如果找到匹配项,Nmap 将使用供应商的 OUI(三字节前缀)并随机填充剩余的三个字节。有效的 --spoof-mac 参数示例包括 Apple、0、01:02:03:04:05:06、deadbeefcafe、0020F2 和 Cisco。此选项仅影响原始数据包扫描(例如 SYN 扫描或操作系统检测),而不影响面向连接的功能(例如版本检测或 Nmap 脚本引擎)。
nmap --spoof-mac Apple 192.168.174.132
nmap --spoof-mac 0 192.168.174.132
nmap --spoof-mac 01:02:03:04:05:06 192.168.174.132
nmap --spoof-mac deadbeefcafe 192.168.174.132
nmap --spoof-mac 0020F2 192.168.174.132
nmap --spoof-mac Cisco 192.168.174.132
83. --proxies <Comma-separated list of proxy URLs>
通过代理链中继 TCP 连接 - 通过 HTTP/SOCKS4 代理中继连接
要求 Nmap 通过提供的一个或多个 HTTP 或 SOCKS4 代理链与最终目标建立 TCP 连接。代理可以帮助隐藏扫描的真实来源或规避某些防火墙限制,但它们可能会通过增加延迟来妨碍扫描性能。用户可能需要相应地调整 Nmap 超时和其他扫描参数。特别是,较低的 --max-parallelism 可能会有所帮助,因为某些代理拒绝处理 Nmap 默认打开的并发连接数。
此选项将代理列表作为参数,以 proto://host:port 格式的 URL 表示。使用逗号分隔链中的节点 URL。尚不支持身份验证。有效协议为 HTTP 和 SOCKS4。
警告:此功能仍在开发中,并且有局限性。它是在 nsock 库中实现的,因此对扫描的 ping、端口扫描和操作系统发现阶段没有影响。目前只有 NSE 和版本扫描可从此选项中受益 - 其他功能可能会泄露您的真实地址。尚不支持 SSL 连接,也不支持代理端 DNS 解析(主机名始终由 Nmap 解析)。
nmap --proxies http://192.168.174.129:7890 192.168.174.132
84. --badsum
发送带有伪造 TCP/UDP 校验和的数据包
要求 Nmap 对发送到目标主机的数据包使用无效的 TCP、UDP 或 SCTP 校验和。由于几乎所有主机 IP 堆栈都会正确丢弃这些数据包,因此收到的任何响应都可能来自没有验证校验和的防火墙或 IDS。
nmap -Pn --badsum 192.168.174.129
85. --adler32
使用已弃用的 Adler32 而不是 CRC32C 进行 SCTP 校验
要求 Nmap 使用已弃用的 Adler32 算法来计算 SCTP 校验和。如果未指定 --adler32,则使用 CRC-32C(Castagnoli)。RFC 2960 最初将 Adler32 定义为 SCTP 的校验和算法;RFC 4960 后来将 SCTP 校验和重新定义为使用 CRC-32C。当前的 SCTP 实现应该使用 CRC-32C,但为了从旧的、传统的 SCTP 实现中获取响应,最好使用 Adler32。
nmap --adler32 192.168.174.145