Nmap安全扫描器

2023-02-03 15:41:31 浏览数 (2)

Nmap安全扫描器介绍:

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

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

Nmap是...

  • 灵活:支持数十种先进技术,可绘制出充满IP过滤器,防火墙,路由器和其他障碍物的网络。这包括许多端口扫描机制(TCP和UDP),操作系统检测,版本检测,ping扫描等。请参阅文档页面。
  • 强大:Nmap已被用于扫描实际上数十万台机器的庞大网络。
  • 可移植:支持大多数操作系统,包括Linux,Microsoft Windows, FreeBSD, OpenBSD, Solaris, IRIX, Mac OS X, HP-UX, NetBSD, Sun OS, Amiga等。
  • 简便:Nmap为高级用户提供了丰富的高级功能,但是您可以像" nmap -v -A targethost " 一样简单地开始  。传统命令行版本和图形(GUI)版本都可以满足您的喜好。二进制文件可供那些不希望从源代码编译Nmap的人使用。
  • 免费:Nmap项目的主要目标是帮助使Internet更加安全,并为管理员/审计员/黑客提供探索其网络的高级工具。Nmap可免费下载,还附带完整的源代码,您可以根据许可条款对其进行修改和重新分发。
  • 有据可查:大量的精力已经投入到最新的综合手册,白皮书,教程,甚至整本书中!在这里找到多种语言的内容。
  • 支持:虽然Nmap不提供任何保修,但它由活跃的开发人员和用户社区很好地支持。大多数交互都发生在Nmap邮件列表上。大多数错误报告和问题应发送到nmap-dev列表,但前提是您必须阅读指南。我们建议所有用户都订阅低流量的nmap-hackers公告列表。您还可以在Facebook和Twitter上找到Nmap 。
  • 广受好评:Nmap赢得了无数奖项,包括 Linux Journal,Info World和Codetalker Digest 的"年度信息安全产品 "。它在数百本杂志文章,几部电影,数十本书和一本漫画系列中都有特色。
  • 流行:每天都有成千上万的人下载Nmap,并且它包含在许多操作系统中(Redhat Linux,Debian Linux,Gentoo,FreeBSD,OpenBSD等)。它是Freshmeat.Net存储库中排名前十(总共30,000个)程序之一。这很重要,因为它使Nmap充满活力地进行开发并获得用户支持社区。

Nmap安全扫描器规格参数:

用法:nmap [扫描类型] [选项] {目标规范}    - 目标规格:

  可以传递主机名,IP地址,网络等。   例如:scanme.nmap.org,microsoft.com / 24、192.168.0.1;10.0.0-255.1-254   -iL <输入文件名>:从主机/网络列表输入   -iR <主机数目>:选择随机目标   --exclude <host1 [,host2] [,host3],...>:排除主机/网络   --excludefile <exclude_file>:从文件中排除列表       - 主机发现:   -sL:列出扫描-仅列出要扫描的目标   -sn:Ping扫描-禁用端口扫描   -Pn:将所有主机视为联机-跳过主机发现   -PS / PA / PU / PY [端口列表]:对给定端口的TCP SYN / ACK,UDP或SCTP发现   -PE / PP / PM:ICMP回显,时间戳和网络掩码请求发现探针   -PO [协议列表]:IP协议Ping   -n / -R:从不解析DNS /始终解析[默认值:有时]   --dns-servers <serv1 [,serv2],...>:指定自定义DNS服务器   --system-dns:使用操作系统的DNS解析器   --traceroute:跟踪到每个主机的跃点路径       - 扫描技术:   -sS / sT / sA / sW / sM:TCP SYN / Connect()/ ACK / Window / Maimon扫描   -sU:UDP扫描   -sN / sF / sX:TCP空,FIN和Xmas扫描   --scanflags <标志>:自定义TCP扫描标志   -sI <僵尸主机[:probeport]>:空闲扫描   -sY / sZ:SCTP INIT / COOKIE-ECHO扫描   -sO:IP协议扫描   -b <FTP中继主机>:FTP退回扫描       - 端口规格和扫描顺序:   -p <端口范围>:仅扫描指定的端口     例如:-p22; -p1-65535; -p U:53,111,137,T:21-25,80,139,8080,S:9   --exclude-ports <端口范围>:从扫描中排除指定端口   -F:快速模式-扫描的端口少于默认扫描   -r:连续扫描端口-不要随机化   --top-ports <编号>:扫描<编号>最常见的端口   --port-ratio <比率>:扫描端口比<比率>更常见       - 服务/版本检测:   -sV:探测打开的端口以确定服务/版本信息   --version-intensity <级别>:设置为0(浅)至9(尝试所有探针)   --version-light:限制为最可能的探针(强度2)   --version-all:尝试每个探针(强度9)   --version-trace:显示详细的版本扫描活动(用于调试)       - 脚本扫描:   -sC:相当于--script = default   --script = <Lua脚本>:<Lua脚本>是逗号分隔的列表            目录,脚本文件或脚本类别   --script-args = <n1 = v1,[n2 = v2,...]>:提供脚本参数   --script-args-file =文件名:在文件中提供NSE脚本args   --script-trace:显示所有发送和接收的数据   --script-updatedb:更新脚本数据库。   --script-help = <Lua脚本>:显示有关脚本的帮助。            <Lua脚本>是逗号分隔的脚本文件列表,或者            脚本类别。       - 操作系统检测:   -O:启用操作系统检测   --osscan-limit:将操作系统检测限制为有希望的目标   --osscan-guess:更积极地猜测操作系统时间和性能:   花费<time>的选项以秒为单位,或附加" ms"(毫秒),   " s"(秒)," m"(分钟)或" h"(小时)到值(例如30m)。   -T <0-5>:设置时序模板(越高越快)   --min-hostgroup / max-hostgroup <大小>:并行主机扫描组大小   --min-parallelism / max-parallelism <numprobes>:探针并行化   --min-rtt-timeout / max-rtt-timeout / initial-rtt-timeout <时间>:指定 探测往返时间。   --max-retries <tries>:限制端口扫描探针重传的次数。   --host-timeout <时间>:在很长一段时间后放弃目标   --scan-delay /-max-scan-delay <时间>:调整探头之间的延迟   --min-rate <number>:每秒发送数据包的速度不低于<number>   --max-rate <number>:每秒发送数据包的速度不超过<number>       - 防火墙/避规和分片:   -F; --mtu <val>:分段数据包(可选,带有给定的MTU)   -D <decoy1,decoy2 [,ME],...>:用诱饵掩盖扫描   -S <IP地址>:欺骗源地址   -e <iface>:使用指定的接口   -g /-source-port <端口号>:使用给定的端口号   --proxies <url1,[url2],...>:通过HTTP / SOCKS4代理中继连接   --data <十六进制字符串>:将自定义有效负载附加到发送的数据包   --data-string <字符串>:将自定义ASCII字符串附加到发送的数据包   --data-length <num>:将随机数据附加到发送的数据包   --ip-options <选项>:发送具有指定ip选项的数据包   --ttl <val>:设置IP生存时间字段   --spoof-mac <mac地址/前缀/供应商名称>:欺骗您的MAC地址   --badsum:发送带有虚假TCP / UDP / SCTP校验和的数据包       - 输出:   -oN / -oX / -oS / -oG <文件>:以普通,XML,s | <rIpt kIddi3,      和Grepable格式分别更改为给定的文件名。   -oA <basename>:一次以三种主要格式输出   -v:提高详细程度(使用-vv或更高的效果更好)   -d:提高调试级别(使用-dd或更多以获得更大的效果)   --reason:显示端口处于特定状态的原因   --open:仅显示打开(或可能打开)的端口   --packet-trace:显示所有发送和接收的数据包   --iflist:打印主机接口和路由(用于调试)   --append-output:追加而不是破坏指定的输出文件   --resume <文件名>:恢复中止的扫描   --stylesheet <路径/ URL>:XSL样式表,可将XML输出转换为HTML   --webxml:Nmap.Org的参考样式表,用于更便携式的XML   --no-stylesheet:防止关联带有XML输出的XSL样式表       - MISC:   -6:启用IPv6扫描   -A:启用操作系统检测,版本检测,脚本扫描和跟踪路由   --datadir <目录名>:指定自定义Nmap数据文件位置   --send-eth /-send-ip:使用原始以太网帧或IP数据包发送   --privileged:假设用户具有完全特权   --unprivileged:假设用户缺乏原始套接字特权   -V:打印版本号   -h:打印此帮助摘要页面。       - 例子:   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

Nmap主机发现:

任何网络侦察任务的第一步就是将一组(有时是巨大的)IP范围缩减为一组活动或有趣的主机。扫描每个IP地址的每个端口很慢,通常是不必要的。当然,使主机变得有趣的原因很大程度上取决于扫描目的。网络管理员可能只对运行某种服务的主机感兴趣,而安全审核员可能会关心每个具有IP地址的设备。管理员可能只使用ICMP ping就能在其内部网络上定位主机,而外部渗透测试仪可能会使用数十种探针来逃避防火墙的限制,这可能会让他们感到很舒服。

由于主机发现的需求是如此多样,因此Nmap提供了多种用于自定义所用技术的选项。主机发现有时称为ping扫描,但它远远超出了与无处不在的ping工具关联的简单ICMP回显请求数据包。用户可以通过列表扫描(-sL)或禁用ping(完全跳过ping步骤-Pn),或通过多端口TCP SYN / ACK,UDP,SCTP INIT和ICMP探针的任意组合使网络参与。这些探针的目的是征求表明IP地址实际上处于活动状态(正在由主机或网络设备使用)的响应。在许多网络上,在任何给定时间只有一小部分IP地址处于活动状态。这对于私有地址空间(例如10.0.0.0/8)尤其常见。该网络具有1600万个IP,但是我看到它被少于一千台计算机的公司所使用。主机发现可以在稀疏分配的IP地址中找到那些机器。

如果未提供主机发现选项,则Nmap发送ICMP回显请求,将TCP SYN数据包发送到端口443,将TCP ACK数据包发送到端口80和ICMP时间戳请求。(对于IPv6,省略了ICMP时间戳记请求,因为它不是ICMPv6的一部分。)这些默认值等同于-PE -PS443 -PA80 -PP选项。ARP例外 (用于IPv4)和邻居发现 (用于IPv6)扫描,用于本地以太网上的任何目标。对于非特权Unix Shell用户,默认探测是使用connect系统调用到端口80和443的SYN数据包。 扫描本地网络时,此主机发现通常就足够了,但是建议使用更全面的发现探针集来进行安全审核。

-P*选项(选择平的类型)可被组合。通过使用不同的TCP端口/标志和ICMP代码发送许多探测类型,可以增加穿透严格防火墙的几率。另请注意,ARP /邻居发现 即使您指定其他-P*选项,默认情况下也会针对本地以太网网络上的目标执行此操作 ,因为它几乎总是更快,更有效。

默认情况下,Nmap会进行主机发现,然后对它确定在线的每个主机执行端口扫描。即使您指定了非默认主机发现类型(例如UDP探针(-PU)),也是如此。阅读有关该 -sn选项的信息,以了解如何仅执行主机发现,或用于-Pn跳过主机发现和端口扫描所有目标主机。以下选项控制主机发现:

-sL (列表扫描)

列表扫描是主机发现的一种简写形式,它仅列出指定网络中的每个主机,而不发送任何数据包到目标主机。默认情况下,Nmap仍然对主机进行反向DNS解析以了解其名称。简单的主机名提供了多少有用的信息通常令人惊讶。例如, fw.chi是一家公司的芝加哥防火墙的名称。Nmap还会报告末尾的IP地址总数。列表扫描是一个很好的检查,以确保您拥有适合目标的IP地址。如果主机使用您不认识的域名,则值得进一步调查以防止扫描错误的公司网络。

代码语言:javascript复制
由于此想法只是打印目标主机的列表,因此无法将用于更高级别功能(例如端口扫描,OS检测或ping扫描)的选项与此结合。如果您希望在仍然执行此类高级功能的同时禁用ping扫描,请继续阅读 `-Pn`(跳过ping)选项。

-sn (无端口扫描)

此选项告诉Nmap在主机发现之后不要执行端口扫描,并且仅打印出响应主机发现探针的可用主机。这通常称为" ping扫描 ",但是您也可以请求运行traceroute和NSE主机脚本。默认情况下,这比列表扫描更具干扰性,并且可以经常用于同一目的。它允许对目标网络进行轻侦察,而不会引起太多关注。与每个IP和主机名的列表扫描所提供的列表相比,知道启动了多少台主机对攻击者而言更有价值。

代码语言:javascript复制
系统管理员经常发现此选项也很有价值。它可以轻松地用于计算网络上的可用计算机或监视服务器可用性。这通常称为ping扫描,并且比ping广播地址更可靠,因为许多主机不回复广播查询。

默认情况下,完成的主机发现`-sn`包括ICMP回显请求,对端口443的TCP SYN,对端口80的TCP ACK和ICMP时间戳请求。当由非特权用户执行时,仅SYN数据包(使用`connect`呼叫)发送到目标上的端口80和443。当特权用户尝试扫描本地以太网上的目标时,除非`--send-ip`指定,否则将使用ARP请求 。该`-sn`选项可以与任何发现探针类型(`-P*`选项,不包括`-Pn`)以获得更大的灵活性。如果使用这些探针类型和端口号选项中的任何一个,则默认探针将被覆盖。如果在运行Nmap的源主机和目标网络之间放置了严格的防火墙,则建议使用这些高级技术。否则,当防火墙丢弃探针或其响应时,主机可能会丢失。

在以前的Nmap版本中,`-sn`称为 `-sP`。

-Pn (无ping)

此选项完全跳过Nmap发现阶段。通常,Nmap使用此阶段来确定用于较重扫描的活动计算机。默认情况下,Nmap仅对发现正常的主机执行繁重的探测工作,例如端口扫描,版本检测或操作系统检测。使用禁用主机发现-Pn会导致Nmap尝试针对每个主机尝试请求的扫描功能 指定的目标IP地址。因此,如果在命令行上指定了B类目标地址空间(/ 16),则将扫描所有65,536个IP地址。与列表扫描一样,将跳过正确的主机发现,但是Nmap不会停止并打印目标列表,而是继续执行请求的功能,就像每个目标IP处于活动状态一样。要跳过ping扫描端口扫描,同时仍然允许NSE运行,请同时使用这两个选项 -Pn -sn

代码语言:javascript复制
对于本地以太网上的计算机,由于Nmap需要MAC地址来进一步扫描目标主机,因此仍将执行ARP扫描(除非 `--disable-arp-ping`或未`--send-ip`指定)。在Nmap的以前的版本,`-Pn`是 `-P0` 和 `-PN`。

-PS *<port list>* (TCP SYN Ping)

此选项发送一个空的TCP数据包,该数据包设置了SYN标志。默认目标端口为80(可在编译时通过更改配置DEFAULT_TCP_PROBE_PORT_SPEC 在nmap.h)。 可以将备用端口指定为参数。-p除了T:不允许的端口类型说明符 ,语法与其他语法相同 。例子是 -PS22和 -PS22-25,80,113,1050,35000。请注意,-PS端口列表和端口列表之间不能有空格。如果指定了多个探针,则将并行发送它们。

代码语言:javascript复制
SYN标志向远程系统建议您正在尝试建立连接。通常,目标端口将关闭,然后发送回RST(复位)数据包。如果端口恰好是开放的,则目标将执行TCP三向握手的第二步 通过使用SYN / ACK TCP数据包进行响应。然后,运行Nmap的计算机通过使用RST响应而不是发送ACK数据包来断开新生的连接,这将完成三向握手并建立完整的连接。RST数据包由运行Nmap的计算机的内核发送,以响应意外的SYN / ACK,而不是由Nmap本身发送。

Nmap不在乎端口是打开还是关闭。前面讨论的RST或SYN / ACK响应都告诉Nmap主机可用并且是响应性的。

在Unix机器上,只有特权用户 `root` 通常能够发送和接收原始TCP数据包。 对于非特权用户,将自动采用解决方法 从而`connect`针对每个目标端口启动系统调用。试图将SYN数据包发送到目标主机,以尝试建立连接。如果`connect`以快速成功或ECONNREFUSED失败返回,则基础TCP堆栈必须已收到SYN / ACK或RST,并且主机被标记为可用。如果连接尝试一直挂起直到达到超时,主机将标记为关闭。

-PA *<port list>* (TCP确认Ping)

TCP ACK ping与刚刚讨论的SYN ping非常相似。您可能会猜到的区别是,设置了TCP ACK标志而不是SYN标志。这种ACK数据包声称是通过已建立的TCP连接确认数据的,但是不存在这种连接。因此,远程主机应始终以RST数据包作为响应,以公开其在进程中的存在。

代码语言:javascript复制
该`-PA`选件使用与SYN探针(80)相同的默认端口,并且还可以采用相同格式的目标端口列表。如果非特权用户尝试此操作,`connect`则使用前面讨论的 解决方法。此解决方法并不完美,因为`connect`实际上是在发送SYN数据包而不是ACK。

同时提供SYN和ACK ping探查的原因是为了最大程度地绕过防火墙。许多管理员将路由器和其他简单的防火墙配置为阻止传入的SYN数据包,但发给公共服务(如公司网站或邮件服务器)的数据包除外。这样可以防止与组织的其他传入连接,同时允许用户与Internet进行畅通无阻的传出连接。这种无状态方法占用了防火墙/路由器上的很少资源,并且得到了硬件和软件过滤器的广泛支持。Linux Netfilter / iptables 防火墙软件提供了 `--syn`方便的选项来实现这种无状态方法。当无状态防火墙规则到位时,SYN ping探针(`-PS`)发送到关闭的目标端口时很可能被阻止。在这种情况下,ACK探针会在遵循这些规则时发光。

防火墙的另一种常见类型使用状态规则,该规则会丢弃意外的数据包。此功能最初主要在高端防火墙上发现,尽管多年来已变得越来越普遍。Linux Netfilter / iptables系统通过该`--state`选项支持此功能,该 选项根据连接状态对数据包进行分类。由于通常将意外的ACK数据包识别为伪造的并丢弃,因此SYN探针更有可能针对此类系统进行工作。解决这个难题的方法是通过指定`-PS`和来发送SYN和ACK探测 `-PA`。

-PU *<port list>* (UDP Ping)

另一个主机发现选项是UDP ping,它将UDP数据包发送到给定的端口。对于大多数端口,数据包将为空,尽管某些端口使用协议特定的有效负载,该负载更有可能引发响应。有关有效负载nmap-payloads数据库的描述,请参见" UDP有效负载:" 部分。 包内容也可以与受影响的--data, --data-string--data-length选项。

代码语言:javascript复制
端口列表采用与前面讨论的`-PS`和`-PA`选项相同的格式 。如果未指定任何端口,则默认值为40125。 该默认值可以在编译时通过更改配置 `DEFAULT_UDP_PROBE_PORT_SPEC` 在`nmap.h`。 默认情况下使用高度不常见的端口,因为对于这种特定的扫描类型,通常不希望发送到打开的端口。

击中目标计算机上的关闭端口后,UDP探测应返回ICMP端口不可达数据包。这向Nmap表示机器已启动并且可用。许多其他类型的ICMP错误,例如主机/网络无法访问或TTL超过,都表明主机已关闭或无法访问。缺乏回应也可以这样解释。如果达到了开放端口,则大多数服务只会忽略空数据包,而无法返回任何响应。这就是为什么默认探针端口为40125(极不可能使用)的原因。诸如字符生成器(Chargen Generator,收费)协议之类的一些服务将响应一个空的UDP数据包,从而向Nmap公开该计算机可用。

这种扫描类型的主要优点是,它绕过了防火墙并仅过滤TCP。例如,我曾经拥有一个Linksys BEFW11S4无线宽带路由器。该设备的外部接口默认情况下会过滤所有TCP端口,但是UDP探测仍会引发端口不可访问的消息,从而放弃设备。

-PY *<port list>* (SCTP INIT Ping)

此选项发送包含最小INIT块的SCTP数据包。默认目标端口为80(可在编译时通过更改配置 DEFAULT_SCTP_PROBE_PORT_SPEC 在nmap.h)。可以将备用端口指定为参数。-p除了S:不允许的端口类型说明符 ,语法与其他语法相同 。例子是 -PY22和 -PY22,80,179,5060。请注意,-PY端口列表和端口列表之间不能有空格。如果指定了多个探针,则将并行发送它们。

代码语言:javascript复制
INIT块向远程系统建议您正在尝试建立关联。通常,目标端口将关闭,并且ABORT块将被发回。如果端口恰好是开放的,则目标将采取SCTP四次握手的第二步 通过响应一个INIT-ACK块。如果运行Nmap的计算机具有可正常工作的SCTP堆栈,则它将通过使用ABORT块而不是发送COOKIE-ECHO块来进行响应,从而断开新生的关联,这将是四次握手的下一步。ABORT数据包是由运行Nmap的计算机的内核发送的,以响应意外的INIT-ACK,而不是由Nmap本身发送的。

Nmap不在乎端口是打开还是关闭。前面讨论的ABORT响应或INIT-ACK响应都告诉Nmap主机可用并且响应。

在Unix机器上,只有特权用户 `root` 通常能够发送和接收原始SCTP数据包。 当前,非特权用户无法使用SCTP INIT Pings。

-PE-PP-PM(ICMP Ping类型)

除了前面讨论过的异常的TCP,UDP和SCTP主机发现类型外,Nmap还可以发送由无处不在的ping程序发送的标准数据包 。Nmap向目标IP地址发送ICMP类型8(回显请求)数据包,期望从可用主机返回的类型为0(回显应答)。 不幸的是,对于网络浏览器而言,许多主机和防火墙现在阻止了这些数据包,而不是按照RFC 1122的要求进行响应。 因此,针对Internet上未知目标的纯ICMP扫描很少具有足够的可靠性。但是对于系统管理员监视内部网络而言,它们可以是一种实用且有效的方法。使用-PE选项启用此回显请求行为。

代码语言:javascript复制
虽然回显请求是标准的ICMP ping查询,但Nmap不会在那里停止。ICMP标准(RFC 792 和 RFC 950 )还将时间戳请求,信息请求和地址掩码请求数据包分别指定为代码13、15和17。这些查询的表面目的是学习诸如地址掩码和当前时间之类的信息,但它们可以轻松地用于主机发现。可以答复的系统已启动并且可用。Nmap当前未实现信息请求包,因为它们并未得到广泛支持。RFC 1122坚持 " 主机不应该实现这些消息 "。可以使用`-PP`和发送时间戳和地址掩码查询 `-PM`选项。时间戳回复(ICMP代码14)或地址掩码回复(代码18)表明主机可用。当管理员专门阻止回显请求数据包而忘记了其他ICMP查询可以用于相同目的时,这两个查询将非常有用。

-PO *<protocol list>* (IP协议Ping)

IP协议ping是较新的主机发现选项之一,它发送IP数据包,该IP数据包在其IP标头中设置了指定的协议号。协议列表采用与前面讨论的TCP,UDP和SCTP主机发现选项中的端口列表相同的格式。如果未指定协议,则默认为发送多个IP数据包用于ICMP(协议1),IGMP(协议2)和IP-in-IP(协议4)。默认协议可以在编译时通过更改配置 DEFAULT_PROTO_PROBE_PORT_SPEC 在nmap.h。请注意,对于ICMP,IGMP,TCP(协议6),UDP(协议17)和SCTP(协议132),将使用适当的协议头发送数据包 而其它的协议与超出IP报头没有额外的数据发送(除非任何的 --data, --data-string或 --data-length 选项指定)。

代码语言:javascript复制
此主机发现方法使用与探针相同的协议来查找响应,或者使用ICMP协议不可达消息来表明目标主机不支持该给定协议。两种类型的响应都表明目标主机处于活动状态。

--disable-arp-ping (无ARP或ND Ping)

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

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

--traceroute (主机的跟踪路径)

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

代码语言:javascript复制
Traceroute通过发送具有低TTL(生存时间)的数据包来工作,以尝试从扫描程序和目标主机之间的中间跃点中引出ICMP超时消息。标准traceroute实施以TTL为1开始,并递增TTL,直到到达目标主机为止。Nmap的跟踪路由以较高的TTL开始,然后递减TTL直到达到零。向后执行此操作可使Nmap使用聪明的缓存算法来加快对多个主机的跟踪。平均而言,根据网络状况,Nmap每台主机少发送5-10个数据包。如果正在扫描单个子网(即192.168.0.0/24),则Nmap可能只需要向大多数主机发送两个数据包。

-n (没有DNS解析)

告诉Nmap 永远不要对找到的活动IP地址进行DNS解析。由于即使使用Nmap的内置并行存根解析器,DNS也会变慢,因此此选项可以减少扫描时间。

-R (所有目标的DNS解析)

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

--resolve-all (扫描每个解析的地址)

如果主机名目标解析为多个地址,请扫描所有地址。默认行为是仅扫描第一个解析的地址。无论如何,将仅扫描适当地址族中的地址:默认为IPv4,带的IPv6 -6

--system-dns (使用系统DNS解析器)

默认情况下,Nmap通过将查询直接发送到主机上配置的名称服务器,然后侦听响应来反向解析IP地址。并行执行许多请求(通常是几十个)以提高性能。指定此选项可改为使用您的系统解析器(通过getnameinfo呼叫一次使用一个IP )。除非您在Nmap并行解析器中发现错误(如果您这样做了,请告诉我们),这速度较慢且很少有用。系统解析器始终用于正向查找(从主机名获取IP地址)。

--dns-servers *<server1>*[,*<server2>*[,...]] (用于反向DNS查询的服务器)

默认情况下,Nmap通过resolv.conf文件(Unix)或注册表(Win32)确定DNS服务器(用于rDNS解析)。或者,您可以使用此选项来指定备用服务器。如果使用,则不支持该选项--system-dns。使用多个DNS服务器通常更快,尤其是如果您为目标IP空间选择了权威服务器时。此选项还可以提高隐身性,因为您的请求几乎可以在Internet上的任何递归DNS服务器上被退回。

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

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

Nmap端口扫描基础:

尽管Nmap的功能已经增长了很多年,但它最初是一个高效的端口扫描程序,至今仍是其核心功能。简单的命令nmap <target>扫描主机上的1,000个TCP端口 <target>。传统上,许多端口扫描程序将所有端口都集中到打开或关闭状态,而Nmap则更为精细。它把港口到六个州:open, closedfiltered, unfiltered, open|filtered,或 closed|filtered

这些状态不是端口本身的固有属性,而是描述Nmap如何看待它们。例如,从与目标服务器相同的网络进行的Nmap扫描可能会将端口显示135/tcp为打开,而在Internet上同时使用相同选项进行的一次扫描可能会将端口显示为filtered

Nmap识别的六个端口状态:

  • 打开
  • 应用程序正在该端口上积极接受TCP连接,UDP数据报或SCTP关联。查找这些通常是端口扫描的主要目标。具有安全意识的人知道,每个开放端口都是攻击的途径。攻击者和测试人员想利用开放的端口,而管理员试图用防火墙关闭或保护它们,而又不妨碍合法用户。对于非安全性扫描,开放端口也很有趣,因为它们显示可用于网络的服务。
  • 关闭
  • 一个封闭的端口是可访问的(它接收并响应Nmap探测数据包),但是没有应用程序在监听它。它们可以帮助显示主机位于IP地址上(主机发现或ping扫描),并且可以作为操作系统检测的一部分。由于关闭的端口是可访问的,因此如果某些端口打开,则稍后值得进行扫描。管理员可能要考虑使用防火墙阻止此类端口。然后它们将以过滤状态出现,接下来进行讨论。
  • 已过滤
  • Nmap无法确定端口是否打开,因为数据包筛选会阻止其探针到达端口。过滤可以来自专用防火墙设备,路由器规则或基于主机的防火墙软件。这些端口使攻击者感到沮丧,因为它们提供的信息很少。有时,它们以ICMP错误消息响应,例如类型3代码13(目标不可访问:在管理上被禁止通信),但是仅丢弃探针而不响应的过滤器则更为常见。这迫使Nmap重试几次,以防万一由于网络拥塞而不是过滤导致探针被丢弃。这会大大降低扫描速度。
  • 未过滤
  • 未过滤状态表示可以访问端口,但是Nmap无法确定端口是打开还是关闭。仅用于映射防火墙规则集的ACK扫描将端口分类为此状态。使用其他扫描类型(例如窗口扫描,SYN扫描或FIN扫描)扫描未过滤的端口可能有助于解决端口是否打开的问题。
  • 打开|过滤
  • 当Nmap无法确定端口是打开还是已过滤时,Nmap会将端口置于此状态。对于打开端口不响应的扫描类型,会发生这种情况。缺乏响应还可能意味着数据包过滤器丢弃了探针或其引发的任何响应。因此,Nmap无法确定端口是打开还是被过滤。UDP,IP协议,FIN,NULL和Xmas扫描以这种方式对端口进行分类。
  • 封闭的
  • 当Nmap无法确定端口是关闭还是过滤时,将使用此状态。它仅用于IP ID空闲扫描。

Nmap端口扫描技术:

作为从事汽车维修的新手,我可能要花几个小时才能尝试将基本工具(锤子,胶带,扳手等)安装在手边的任务上。当我悲惨地失败并把我的锯齿状的锯给一个真正的机械师时,他总是在一个巨大的工具箱里闲逛,直到拉出完美的小物件,这使工作变得轻松。端口扫描的技术与此类似。专家了解数十种扫描技术,并为给定任务选择适当的一种(或组合)。没有经验的用户和脚本小子, 另一方面,尝试使用默认的SYN扫描解决所有问题。由于Nmap是免费的,因此掌握端口扫描的唯一障碍是知识。这肯定会超越汽车世界,在汽车世界中,可能需要很熟练的技巧来确定您是否需要支撑弹簧压缩机,然后您仍然需要为此付出数千美元。

大多数扫描类型仅对特权用户可用。 这是因为它们发送和接收原始数据包, 这需要在Unix系统上进行root访问。推荐使用Windows上的管理员帐户,尽管Nmap有时已在Npcap已加载到操作系统中的情况下适用于该平台上的非特权用户。当Nmap在1997年发布时,要求root特权是一个严重的限制,因为许多用户只能访问共享的shell帐户。现在,世界已经不同了。电脑更便宜,人们可以一直在线直接访问互联网,台式Unix系统(包括Linux和Mac OS X)盛行。现在可以使用Windows版本的Nmap,使其可以在更多台式机上运行。由于所有这些原因,用户较少需要通过有限的共享Shell帐户运行Nmap。这是幸运的,因为特权选项使Nmap更加强大和灵活。

尽管Nmap试图产生准确的结果,但是请记住,它的所有见解都是基于目标计算机(或它们前面的防火墙)返回的数据包的。这样的主机可能是不可信的,并且会发送旨在混淆或误导Nmap的响应。更常见的是不符合RFC要求的主机,它们对Nmap探针的响应不佳。FIN,NULL和Xmas扫描特别容易受到此问题的影响。此类问题特定于某些扫描类型,因此将在各个扫描类型条目中进行讨论。

本节介绍了Nmap支持的十几种端口扫描技术。一次只能使用一种方法,但可以将UDP扫描(-sU)和任何一种SCTP扫描类型(-sY-sZ)与任何一种TCP扫描类型组合使用。作为一种内存辅助,端口扫描类型选项的格式为,其中 扫描名称中的突出字符通常是第一个字符。一个例外是不推荐使用的FTP退回扫描()。默认情况下,Nmap执行SYN扫描,但是如果用户没有适当的特权发送原始数据包(在Unix上需要root访问权限),它会替代连接扫描。在本节列出的扫描中,非特权用户只能执行connect和FTP退回扫描。-s*<C>*<C>-b

-sS (TCP SYN扫描)

出于充分的原因,SYN扫描是默认和最受欢迎的扫描选项。它可以快速执行,在不受限制性防火墙阻碍的快速网络上每秒扫描数千个端口。由于它从不完成TCP连接,因此它也相对不引人注目和隐秘。SYN扫描可用于任何兼容的TCP堆栈,而不必像Nmap的FIN / NULL / Xmas,Maimon和空闲扫描那样依赖于特定平台的特性。它还允许之间的明确,可靠的分化open, closedfiltered 状态。

代码语言:javascript复制
这种技术通常称为半开扫描,因为您没有打开完整的TCP连接。您发送一个SYN数据包,就好像您要打开一个真实的连接,然后等待响应。SYN / ACK表示端口正在监听(打开),而RST(复位)则表示未监听。如果几次重传后仍未收到响应,则将该端口标记为已过滤。如果收到ICMP无法访问的错误(类型3,代码0、1、2、3、9、10或13),则该端口也被标记为已过滤。如果收到一个SYN数据包(没有ACK标志)作为响应,则该端口也被认为是开放的。这可能是由于一种极为罕见的TCP功能(称为同时打开或拆分握手连接)(请参阅https://nmap.org/misc/split-handshake.pdf)。

-sT (TCP连接扫描)

如果不选择SYN扫描,则TCP连接扫描是默认的TCP扫描类型。用户没有原始数据包特权时就是这种情况。Nmap不会像大多数其他扫描类型那样写入原始数据包,而是通过发出connect系统调用来要求基础操作系统与目标计算机和端口建立连接。这是Web浏览器,P2P客户端和大多数其他启用网络的应用程序用来建立连接的同一高级系统调用。它是称为Berkeley Sockets API的编程接口的一部分。Nmap使用此API来获取有关每次连接尝试的状态信息,而不是直接读取原始数据包响应。

代码语言:javascript复制
如果可以使用SYN扫描,通常是更好的选择。Nmap对高级的控制较少`connect`呼叫比原始数据包要低,因此效率较低。系统调用将完成与打开的目标端口的连接,而不是执行SYN扫描所做的半开复位。这不仅需要更长的时间,并且需要更多的数据包才能获得相同的信息,而且目标计算机更有可能记录连接。不错的IDS可以捕获任何一个,但是大多数机器都没有这样的警报系统。当Nmap连接然后在不发送数据的情况下关闭连接时,普通Unix系统上的许多服务都会在syslog中添加注释,有时还会显示一条错误的错误消息。发生这种情况时,真正可悲的服务会崩溃,尽管这种情况并不常见。从单个系统的日志中看到一堆尝试连接的管理员应该知道自己已被扫描。

-sU (UDP扫描)

尽管Internet上大多数流行的服务都基于TCP协议运行,但UDP服务却得到了广泛的部署。DNS,SNMP和DHCP(注册的端口53、161 / 162和67/68)是最常见的三种。因为UDP扫描通常比TCP慢并且更困难,所以某些安全审核员会忽略这些端口。这是一个错误,因为可利用的UDP服务非常普遍,而且攻击者当然不会忽略整个协议。幸运的是,Nmap可以帮助清点UDP端口。

代码语言:javascript复制
该`-sU`选项激活了UDP扫描。可以将其与TCP扫描类型(例如SYN scan(`-sS`))组合使用,以在同一运行期间检查两个协议。

UDP扫描通过将UDP数据包发送到每个目标端口来工作。对于一些常见的端口,例如53和161,协议特定的有效载荷发送到增加反应速率,但对于大多数端口,除非该分组是空的`--data`, `--data-string`或者`--data-length` 被指定的选项。如果返回ICMP端口不可达错误(类型3,代码3),则端口为`closed`。其他ICMP无法访问的错误(类型3,代码0、1、2、9、10或13)将端口标记为`filtered`。有时,服务会以UDP数据包作为响应,证明它是`open`。如果重传后未收到响应,则端口分类为`open|filtered`。这意味着端口可能是开放的,或者数据包筛选器正在阻止通信。版本检测(`-sV`)可用于帮助区分真正开放的端口和已过滤的端口。

UDP扫描的一大挑战是快速进行。打开和过滤的端口很少发送任何响应,从而使Nmap超时,然后进行重新传输,以防万一探针或响应丢失。封闭端口通常是一个更大的问题。它们通常会发回ICMP端口无法访问的错误。但是,与关闭的TCP端口为响应SYN或连接扫描而发送的RST数据包不同,许多主机对速率进行限制 缺省情况下,ICMP端口不可达消息。Linux和Solaris对此特别严格。例如,Linux 2.4.20内核将目标不可达消息限制为每秒1条(以表示`net/ipv4/icmp.c`)。

Nmap检测速率限制并相应降低速度,以避免目标机器将丢弃的无用数据包淹没网络。不幸的是,Linux风格的每秒1个数据包的限制使65,536端口的扫描耗时超过18个小时。加快UDP扫描速度的想法包括并行扫描更多主机,首先仅对流行端口进行快速扫描,从防火墙后面进行扫描以及`--host-timeout`用于跳过慢速主机。

-sY (SCTP INIT扫描)

SCTP 是TCP和UDP协议的一个相对较新的替代方案,它结合了TCP和UDP的大多数特征,还增加了新功能,例如多宿主和多流。它主要用于与SS7 / SIGTRAN相关的服务,但也有可能用于其他应用程序。SCTP INIT扫描与TCP SYN扫描的SCTP等效。它可以快速执行,在不受限制性防火墙阻碍的快速网络上每秒扫描数千个端口。像SYN扫描一样,INIT扫描也相对不引人注目且隐秘,因为它从未完成SCTP关联。它还允许之间的明确,可靠的分化open, closedfiltered 状态。

代码语言:javascript复制
此技术通常称为半开扫描,因为您没有打开完整的SCTP关联。您发送一个INIT块,就好像您要打开一个真实的关联,然后等待响应一样。INIT-ACK块表示端口正在监听(打开),而ABORT块表示未监听。如果在几次重传后仍未收到响应,则将该端口标记为已过滤。如果收到ICMP无法访问的错误(类型3,代码0、1、2、3、9、10或13),则该端口也被标记为已过滤。

-sN-sF-sX(TCP NULL,FIN和Xmas扫描)

这三种扫描类型(使用--scanflags下一部分中描述的选项可以进行更多扫描 )利用TCP RFC中的细微漏洞来区分端口open和 closed端口。RFC 793的第65页说:" 如果[目标]端口状态为CLOSED...。不包含RST的传入段将导致发送RST作为响应。" 然后,下一页讨论了发送到未设置SYN,RST或ACK位的开放端口的数据包,并指出:" 您不太可能到达此处,但是如果这样做,则丢弃该段并返回。"

代码语言:javascript复制
当扫描符合此RFC文本的系统时,如果端口关闭,则任何不包含SYN,RST或ACK位的数据包都将导致返回RST,如果端口打开则根本没有响应。只要不包含这三个位,则其他三个位(FIN,PSH和URG)的任何组合都可以。Nmap利用三种扫描类型来利用这一点:

这三种扫描类型在行为上完全相同,只是在探测数据包中设置了TCP标志。如果接收到RST数据包,则认为该端口`closed`,而没有响应表示它是`open|filtered`。`filtered`如果收到ICMP无法访问的错误(类型3,代码0、1、2、3、9、10或13),则标记该端口 。

这些扫描类型的主要优点是它们可以穿越某些无状态防火墙和数据包筛选路由器。另一个优点是这些扫描类型甚至比SYN扫描更隐蔽。不过,不要指望-大多数现代IDS产品都可以配置为检测它们。最大的缺点是,并非所有系统都遵循RFC 793。无论端口是否打开,许多系统都会向探针发送RST响应。这会导致所有端口都被标记`closed`。执行此操作的主要操作系统是Microsoft Windows,许多Cisco设备,BSDI和IBM OS / 400。但是,此扫描确实适用于大多数基于Unix的系统。这些扫描的另一个缺点是它们无法区分`open`端口和特定端口。`filtered`,留下您的回应 `open|filtered`。

空扫描(-sN

不设置任何位(TCP标志头为0)

FIN扫描(-sF

仅设置TCP FIN位。

圣诞扫描(-sX

设置FIN,PSH和URG标志,像圣诞树一样照亮数据包。

-sA (TCP ACK扫描)

此扫描与到目前为止讨论的其他扫描有所不同,因为它从不确定open(或什至 open|filtered)端口。它用于映射防火墙规则集,确定它们是否是有状态的以及要过滤哪些端口。

代码语言:javascript复制
ACK扫描探测包仅设置了ACK标志(除非您使用`--scanflags`)。扫描未过滤的系统时, `open`和`closed`端口都将返回RST数据包。Nmap然后将它们标记为 `unfiltered`,这意味着它们可以通过ACK数据包到达,但是不确定`open`还是 `closed`确定。没有响应或发回某些ICMP错误消息(类型3,代码0、1、2、3、9、10或13)的端口被标记为`filtered`。

-sW (TCP窗口扫描)

窗口扫描与ACK扫描完全相同,不同之处在于它利用某些系统的实现细节来区分开放端口和封闭端口,而不是unfiltered在返回RST时始终打印 。它通过检查返回的RST数据包的TCP窗口字段来完成此操作。在某些系统上,开放端口的窗口大小为正(即使对于RST数据包也是如此),而封闭端口的窗口大小为零。因此,而不是总是列出一个端口unfiltered在接收到RST回来,窗口扫描列出端口open或 closed如果在重置TCP窗口值分别为正数或零。

代码语言:javascript复制
该扫描依赖Internet上少数系统的实现细节,因此您不能总是信任它。不支持它的系统通常会返回所有端口 `closed`。当然,机器可能真的没有开放的端口。如果大多数扫描的端口都是, `closed`而少数几个常见端口号(例如22、25、53)是`filtered`,则系统很容易受到攻击。有时,系统甚至会显示完全相反的行为。如果您的扫描显示1,000个开放端口和三个封闭或过滤端口,则这三个端口很可能是真正开放的端口。

-sM (TCP Maimon扫描)

Maimon扫描以其发现者Uriel Maimon命名。 他在《Phrack》杂志第49期(1996年11月)中描述了该技术 。 包含此技术的Nmap在后来发行了两个版本。该技术与NULL,FIN和Xmas扫描完全相同,不同之处在于探针为FIN / ACK。根据RFC 793(TCP),应响应此探测(端口是打开还是关闭)来生成RST数据包。但是,Uriel注意到,如果端口打开,则许多BSD派生的系统只会丢弃该数据包。

--scanflags (自定义TCP扫描)

真正高级的Nmap用户不必将自己局限于提供的固定扫描类型。该--scanflags选项允许您通过指定任意TCP标志来设计自己的扫描。 避开入侵检测系统,让您的创意源源不断 其供应商只需翻阅Nmap手册页即可添加特定规则!

代码语言:javascript复制
所述`--scanflags`参数可以是数值标志值如9(PSH和FIN),但使用符号名是更容易。只是混搭在一起的任意组合 `URG`, `ACK`,`PSH`, `RST`,`SYN`,和 `FIN`。例如,`--scanflags URGACKPSHRSTSYNFIN`设置所有内容,尽管它对扫描不是很有用。这些指定的顺序无关紧要。

除了指定所需的标志之外,您还可以指定TCP扫描类型(例如`-sA`或`-sF`)。该基本类型告诉Nmap如何解释响应。例如,SYN扫描将无响应表示为 `filtered`端口,而FIN扫描则将其视为 `open|filtered`。Nmap的行为方式与基本扫描类型相同,只是Nmap会使用您指定的TCP标志代替。如果未指定基本类型,则使用SYN扫描。

-sZ (SCTP COOKIE ECHO扫描)

SCTP COOKIE ECHO扫描是更高级的SCTP扫描。利用以下事实:SCTP实现应在打开的端口上静默丢弃包含COOKIE ECHO块的数据包,但在端口关闭时发送ABORT。这种扫描类型的优点在于,端口扫描不像INIT扫描那样明显。同样,可能有非状态防火墙规则集阻止INIT块,但不会阻止COOKIE ECHO块。不要上当以为这会使端口扫描不可见。一个好的IDS也将能够检测SCTP COOKIE ECHO扫描。缺点是SCTP COOKIE ECHO扫描无法区分openfiltered 端口,open|filtered 在两种情况下都处于状态。

-sI *<zombie host>*[:*<probeport>*] (空闲扫描)

这种高级扫描方法可以对目标进行真正的盲目TCP端口扫描(这意味着不会从您的真实IP地址向目标发送任何数据包)。取而代之的是,独特的边信道攻击利用僵尸主机上可预测的IP碎片ID序列生成来收集有关目标上开放端口的信息。IDS系统会将扫描显示为来自您指定的僵尸计算机(必须启动并满足某些条件)。此迷人的扫描类型的完整详细信息在 " TCP空闲扫描(-sI)"部分中。

代码语言:javascript复制
除了非常隐蔽(由于其盲目的性质)之外,此扫描类型还允许映射机器之间基于IP的信任关系。端口列表*从僵尸主机的角度*显示了开放的端口 *。*因此,您可以尝试使用您认为可能受到信任的各种僵尸扫描目标 (通过路由器/数据包过滤器规则)。

如果希望探测僵尸上的特定端口以进行IP ID更改,则可以在僵尸主机上添加冒号和端口号。否则,Nmap将使用默认情况下用于TCP ping的端口(80)。

-sO (IP协议扫描)

IP协议扫描使您可以确定目标计算机支持哪些IP协议(TCP,ICMP,IGMP等)。从技术上讲,这不是端口扫描,因为它会遍历IP协议号而不是TCP或UDP端口号。但是,它仍然使用该 -p选项来选择扫描的协议号,以常规端口表格式报告其结果,甚至使用与真正的端口扫描方法相同的基础扫描引擎。因此,它足够接近它所属的端口扫描。

代码语言:javascript复制
协议扫描除了自身有用之外,还展示了开源软件的强大功能。尽管基本思想很简单,但我没有想到要添加它,也没有收到任何对此类功能的要求。然后在2000年夏天,格哈德-里格(Gerhard Rieger) 构思了这个想法,编写了一个出色的补丁实施它,并将其发送到 *公告*邮件列表 (然后称为*nmap-hackers*)。 我将该补丁合并到Nmap树中,并在第二天发布了新版本。很少有商业软件让用户有足够的热情去设计和贡献自己的改进!

协议扫描的工作方式与UDP扫描类似。它没有遍历UDP数据包的端口号字段,而是发送IP数据包头并通过八位IP协议字段进行迭代。标头通常为空,不包含任何数据,甚至不包含所要求协议的正确标头。例外是TCP,UDP,ICMP,SCTP和IGMP。包括适用于这些协议的协议头,因为某些系统不会以其他方式发送它们,并且因为Nmap已经具有创建它们的功能。无需监视ICMP端口不可达消息,而是在查找ICMP *协议*不可达消息的协议扫描 。如果Nmap从目标主机以任何协议接收到任何响应,则Nmap将该协议标记为`open`。ICMP协议不可达错误(类型3,代码2)导致该协议被标记为 `closed`端口不可达(类型3,代码3)标记该协议`open`。其他ICMP无法访问的错误(类型3,代码0、1、9、10或13)导致协议被标记 `filtered`(尽管它们证明ICMP `open`同时存在)。如果重传后未收到响应,则将协议标记为 `open|filtered`

-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>,在这种情况下,将使用匿名登录凭据(用户: anonymouspassword -wwwuser@:)。端口号(和前面的冒号)也可以省略,在这种情况下,将使用默认的FTP端口(21) <server>

代码语言:javascript复制
Nmap于1997年发布时,此漏洞已广泛传播,但已基本修复。易受攻击的服务器仍然存在,因此当所有其他服务器均失败时,值得尝试。如果您的目标是绕过防火墙,请在目标网络中扫描端口21(如果您使用版本检测功能扫描所有端口,甚至在FTP服务中也要扫描),然后使用 `ftp-bounce` NSE脚本。Nmap会告诉您主机是否容易受到攻击。如果您只是想掩盖自己的足迹,则不必(实际上也不应)将自己限制在目标网络上的主机上。在您扫描随机Internet地址以查找易受攻击的FTP服务器之前,请考虑使系统管理员可能不喜欢您以这种方式滥用其服务器。

Nmap服务和版本检测:

Nmap扫描一台远程机器,它可能告诉你,端口25/tcp80/tcp53/udp是开放的。使用它 nmap-services 约2200种知名服务的数据库, Nmap将报告这些端口可能分别对应于邮件服务器(SMTP),Web服务器(HTTP)和名称服务器(DNS)。这种查找通常是准确的-实际上,侦听TCP端口25的绝大多数守护程序都是邮件服务器。但是,您不应以此为押宝!人们可以并且确实在奇怪的端口上运行服务。

即使Nmap是正确的,并且上面的假设服务器正在运行SMTP,HTTP和DNS服务器,信息也不是很多。在对公司或客户进行漏洞评估(甚至是简单的网络清单)时,您确实想知道正在运行哪些邮件和DNS服务器以及版本。拥有准确的版本号有助于显着确定服务器容易受到哪些攻击。版本检测可帮助您获取此信息。

使用其他扫描方法之一发现TCP和/或UDP端口后,版本检测将询问这些端口以确定有关实际运行内容的更多信息。的 nmap-service-probes 数据库包含用于查询各种服务并匹配表达式以识别和解析响应的探针。Nmap尝试确定服务协议(例如FTP,SSH,Telnet,HTTP),应用程序名称(例如ISC BIND,Apache httpd,Solaris telnetd),版本号,主机名,设备类型(例如打印机,路由器),操作系统系列(例如Windows,Linux)。如果可能,Nmap还将获得通用平台枚举(CPE) 此信息的表示形式。有时,可以获得其他详细信息,例如X服务器是否已打开连接,SSH协议版本或KaZaA用户名。当然,大多数服务并不提供所有这些信息。如果Nmap是在OpenSSL支持下编译的,它将连接到SSL服务器以推断出该加密层后面的服务侦听。 在open|filteredUDP端口扫描无法确定端口是打开还是过滤后,某些UDP端口仍处于该 状态。版本检测将尝试从这些端口引起响应(就像打开端口一样),如果成功,则将状态更改为打开。open|filteredTCP端口的处理方式相同。请注意,Nmap -A选项可启用版本检测等功能。

发现RPC服务后,Nmap RPC研磨器 自动用于确定RPC程序和版本号。它使用所有检测为RPC的TCP / UDP端口,并使用SunRPC程序NULL命令填充它们,以尝试确定它们是否为RPC端口,如果是,则确定它们服务的程序和版本号。因此,即使目标的端口映射程序位于防火墙后面(或受TCP包装程序保护),也可以有效地获取与rpcinfo -p相同的信息。诱饵当前不适用于RPC扫描。

当Nmap从服务接收到响应但无法将其与其数据库匹配时,它会打印出一个特殊的指纹和一个URL,供您提交(如果您确定端口上正在运行什么)。请花几分钟时间进行提交,以便您的发现可以使所有人受益。由于这些提交,Nmap具有650种协议(例如SMTP,FTP,HTTP等)的大约6,500个模式匹配。

通过以下选项启用和控制版本检测:

-sV (版本检测)

如上所述,启用版本检测。或者,您可以使用-A,它可以进行版本检测。

代码语言:javascript复制
`-sR` 是的别名`-sV`。在2011年3月之前,它曾与版本检测分开用于激活RPC,但现在这些选项始终结合在一起。

--allports (不要从版本检测中排除任何端口)

默认情况下,Nmap版本检测会跳过TCP端口9100,因为某些打印机只是简单地打印发送到该端口的所有内容,从而导致数十页的HTTP GET请求,二进制SSL会话请求等。可以通过修改或删除以下Exclude 命令来更改此行为:nmap-service-probes,也可以指定--allports扫描所有端口,而不考虑任何Exclude 指令。

--version-intensity *<intensity>* (设置版本扫描强度)

在执行版本扫描(-sV)时,Nmap发送一系列探测,每个探测都被分配一个介于1到9之间的稀有值。编号较低的探测器可有效应对各种常见服务,而编号较高的探测器则很少使用。强度级别指定应使用的探针。数字越高,就越有可能正确识别服务。但是,高强度扫描需要更长的时间。强度必须在0到9之间。 预设值为7。 通过nmap-service-probes ports指令将探针注册到目标端口后 ,无论强度级别如何,都将尝试该探针。这样可以确保始终对任何打开的端口53尝试进行DNS探测,对443等进行SSL探测。

--version-light (启用灯光模式)

这是的方便别名 --version-intensity 2。此轻模式使版本扫描快得多,但是识别服务的可能性却稍低。

--version-all (尝试每个探针)

的别名--version-intensity 9,确保对每个端口尝试每个探测。

--version-trace (跟踪版本扫描活动)

这将导致Nmap打印出有关正在进行的版本扫描的大量调试信息。这是您所获得的东西的子集--packet-trace

Nmap脚本引擎(NSE):

Nmap脚本引擎(NSE)是Nmap最强大,最灵活的功能之一。它允许用户编写(和共享)简单的脚本(使用Lua编程语言 )以自动执行各种联网任务。这些脚本与您期望的Nmap的速度和效率并行执行。用户可以依靠随Nmap分发的不断增长的多样化脚本集,或者编写自己的脚本来满足定制需求。

创建系统时我们想到的任务包括网络发现,更复杂的版本检测,漏洞检测。NSE甚至可以用于漏洞利用。

为了反映这些不同的用途并简化运行脚本的选择,每个脚本都包含一个将其与一个或多个类别相关联的字段。当前定义的类别,如:

auth, broadcast, default。 discovery, dos, exploit, external, fuzzer, intrusive, malware, safe, version,和 vuln。这些都在"脚本类别"一节中进行了描述。

脚本不在沙盒中运行,因此可能会意外或恶意破坏您的系统或侵犯您的隐私。除非您信任作者或自己仔细审核过脚本,否则切勿运行第三方脚本。

所述的Nmap脚本引擎中详细描述以下选项控制:

-sC

使用默认脚本集执行脚本扫描。等同于--script=default。此类别中的某些脚本被认为是侵入性的,未经允许不得在目标网络上运行。

--script *<filename>*|*<category>*|*<directory>*|*<expression>*[,...]

使用文件名,脚本类别和目录的逗号分隔列表运行脚本扫描。列表中的每个元素也可以是布尔表达式,用于描述一组更复杂的脚本。每个元素首先解释为表达式,然后解释为类别,最后解释为文件或目录名称。

代码语言:javascript复制
仅高级用户有两个特殊功能。一种是给脚本名称和表达式加上前缀, ` `以迫使它们正常运行,即使它们通常不会运行(例如,在目标端口上未检测到相关服务)。另一个是该参数`all`可用于指定Nmap数据库中的每个脚本。请注意这一点,因为NSE包含危险脚本,例如漏洞利用,蛮力身份验证破解程序和拒绝服务攻击。

文件和目录名称可以是相对或绝对的。绝对名称直接使用。`scripts`在以下每个位置中寻找相对路径, 直到找到为止:

| `--datadir` |
| `$NMAPDIR` |
| `~/.nmap` (在Windows上未搜索) |
| `*`<HOME>`*AppDataRoamingnmap` (仅在Windows上) |
| 包含`nmap` 可执行文件的目录 |
| 包含`nmap` 可执行文件的目录,后跟`../share/nmap` |
| `NMAPDATADIR` |
| 当前目录。 |

给出目录名称后,Nmap会加载目录中名称以结尾的每个文件`.nse`。所有其他文件都将被忽略,并且不会递归搜索目录。给定文件名时,它不必具有`.nse`扩展名。如有必要,它将自动添加。

`scripts` 默认情况下,Nmap脚本存储在Nmap数据目录的子目录中。为了提高效率,脚本在存储在中的数据库中建立了索引`scripts/script.db`, 其中列出了每个脚本所属的一个或多个类别。

`script.db`通过名称 引用脚本时,可以使用shell样式的' `*`'通配符。

更复杂的脚本可以选择使用来完成 `and`,`or`以及 `not`运营商建立布尔表达式。运算符的优先级 与Lua中的优先级相同 :`not`最高,然后依次是 `and`和`or`。您可以使用括号来更改优先级。由于表达式包含空格字符,因此必须用引号引起来。

nmap-脚本"不侵入"

加载除intrusive类别中的脚本以外的所有脚本 。

nmap --script"默认或安全"

这在功能上等效于 nmap --script" default,safe"。它加载default类别或safe类别或两者中的所有脚本。

nmap --script"默认和安全"

加载那些脚本 default和 safe类别。

nmap --script"(默认或安全或侵入性),而不是http- *"

在加载脚本default, safeintrusive 类别,除了那些名字开始 http-

nmap --script" http- *"

加载名称以开头的所有脚本 http-,例如 http-auth和 http-open-proxy。to的参数 --script必须用引号引起来,以保护通配符不受shell的攻击。

--script-args *<n1>*=*<v1>*,*<n2>*={*<n3>*=*<v3>*},*<n4>*={*<v4>*,*<v5>*}

使您可以为NSE脚本提供参数。参数是一name=value对以逗号分隔的列表。名称和值可以是不包含空格或字符" {"," }"," ="或" ,"的字符串。要将这些字符之一包含在字符串中,请将字符串用单引号或双引号引起来。在带引号的字符串中,' '转引号。在这种特殊情况下,反斜杠仅用于转义引号;在所有其他情况下,反斜杠将按字面意义进行解释。值也可以是包含在中的表{},就像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/) 列出了每个脚本可接受的参数。

--script-args-file *<filename>*

使您可以从文件将参数加载到NSE脚本。命令行上的所有参数都将取代文件中的参数。该文件可以是绝对路径,也可以是相对于Nmap常规搜索路径的路径(NMAPDIR等)。参数可以用逗号分隔或换行符分隔,但是遵循与for相同的规则--script-args,而无需特殊的引号和转义,因为它们不是由外壳解析的。

--script-help *<filename>*|*<category>*|*<directory>*|*<expression>*|all[,...]

显示有关脚本的帮助。对于与给定规范匹配的每个脚本,Nmap将打印脚本名称,其类别和说明。规格与接受的规格相同 --script; 因此,例如,如果您需要有关ftp-anon脚本的帮助,则可以运行 nmap --script-help ftp-anon。除了获得单个脚本的帮助之外,您还可以将其用作针对规范运行哪些脚本的预览,例如,使用nmap --script-help default。

--script-trace

此选项可以做什么--packet-trace,仅比ISO高一层。如果指定了此选项,则将打印脚本执行的所有传入和传出通信。显示的信息包括通信协议,源,目标和发送的数据。如果所有传输数据的5%以上不可打印,则跟踪输出为十六进制转储格式。指定--packet-trace也会启用脚本跟踪。

--script-updatedb

此选项更新找到的脚本数据库scripts/script.db,Nmap使用该数据库来确定可用的默认脚本和类别。仅当您从默认scripts目录中添加或删除了NSE脚本或更改了任何脚本的类别时,才需要更新数据库。此选项通常单独使用:nmap --script-updatedb。

0 人点赞