Nmap扫描技巧:掌握Nmap参数与扫描类型深度解析

Nmap – Nmap的开关和扫描类型(第一部分)

Nmap可能是最著名的渗透测试工具和黑客工具之一。它本质上是一个端口扫描工具,可以帮助您扫描网络并识别网络中可用的各种端口和服务。此外,它还能提供有关目标的更多信息,包括反向DNS名称、操作系统猜测、设备类型和MAC地址。在网络审计过程中,Nmap也同样非常方便。

Nmap的基本语法是:

$ nmap [FLAGS] [IP]

请注意,有时您可能还需要以sudo特权运行Nmap来执行某些特定类型的扫描。

Nmap开关

Nmap是一款强大而灵活的网络扫描工具,它可以通过命令行传递的标志进行自定义扫描。一些重要的标志包括:

  • -h:显示帮助摘要页面。
  • -sS:执行TCP SYN扫描。
  • -sU:执行UDP扫描。
  • -sV:探测开放端口以确定服务/版本信息。
  • -O:启用操作系统检测。
  • -v:启用详细输出。您可以设置详细级别,例如:
    • -vv:二级详细输出。建议使用的最低详细级别。
    • -v3:三级详细输出。您可以通过指定数字来设置详细级别。
  • -oA:以“普通”、XML和可grep格式保存Nmap输出。您也可以通过以下方式指定输出格式:
    • -oN:将普通输出重定向到指定文件名。
    • -oX:生成干净的XML格式输出并存储到指定文件。
    • -oG:生成“可grep”输出并存储到文件。此格式已弃用,用户现在更倾向于XML输出。
  • -A:启用“激进”扫描。目前这会启用操作系统检测(-O)、版本扫描(-sV)、脚本扫描(-sC)和路由跟踪(--traceroute)。
  • -p:指定要扫描的端口。可以是单个端口,也可以是端口范围。例如:
    • nmap -p 80 127.0.0.0.1:扫描本地主机的80端口。
    • nmap -p 1-100 127.0.0.1:扫描本地主机的1到100端口。
    • nmap -p- 127.0.0.1:扫描本地主机的全部端口。

Nmap中的扫描类型

Nmap支持许多不同的扫描类型。然而,最受欢迎的类型是:

1. TCP连接扫描 (-sT)

在这种类型的扫描中,Nmap向设置了SYN标志的端口发送一个TCP数据包。在这种情况下,可能发生三件事情:

  • 目标响应一个RST数据包,表示端口已关闭。
  • 目标完全没有响应,可能是由于防火墙丢弃了所有传入数据包,在这种情况下端口将被视为被过滤。
  • 目标响应一个设置了SYN/ACK标志的TCP数据包,这表示端口是开放的,然后Nmap会响应一个设置了ACK标志的TCP数据包,从而完成TCP三次握手。

这种扫描技术并不是非常可靠,因为很容易通过配置防火墙规则来回应RST数据包或者丢弃所有进入的数据包。此外,这种方法非常缓慢,因为它要等待整个TCP三次握手过程。

2. SYN “半开放式” 扫描 (-sS)

SYN扫描,也被称为“半开放式”或“隐蔽扫描”,是对以前方法的改进。在以前的方法中,我们在收到SYN/ACK数据包后发送带有ACK标志的TCP数据包,现在我们将发送一个RST数据包。这样可以阻止服务器反复尝试发出请求,大大减少了扫描时间。

这种方法是之前方法的改进之处,原因在于:

  • 它们速度更快。
  • 它们可能能够绕过一些简单的防火墙。
  • 通常,SYN扫描不会被端口上运行的应用程序记录,因为大多数应用程序只有在连接完全建立后才开始记录连接,而SYN扫描并非如此。

然而,不建议在生产环境中运行SYN扫描,因为它可能会破坏某些不稳定的应用程序。还需要注意的是,SYN扫描也需要sudo特权,因为它需要制作原始数据包。

当以sudo权限运行时,事实上,Nmap默认使用SYN扫描;否则,Nmap默认使用TCP扫描。

3. UDP扫描 (-sU)

UDP扫描比之前的两种方式要不可靠得多,因为UDP连接天生是无状态的。这意味着没有像TCP那样的“反馈机制”。UDP遵循“发送即忘记”的原则,将数据包发送到目标端口,并希望其能够到达。这更加注重速度而非质量。然而,缺乏反馈机制使得很难识别开放的端口。

当一个UDP数据包被发送到目标端口时,可能会出现三种情况:

  • 通常没有收到响应,在这种情况下Nmap将端口标记为“开放|已过滤”。如果仍未收到响应,它会再次发送一个UDP数据包进行二次检查,如果仍然没有收到响应,它会将端口标记为“开放|已过滤”并继续。
  • 可能会收到UDP响应,这种情况非常罕见。在这种情况下,端口被标记为开放。
  • 如果端口已关闭,并且收到一个ICMP回显请求,表示端口不可达。

Nmap中的特殊扫描

除此之外,还有一些比TCP SYN扫描更加“隐秘”的不太常见的扫描类型。具体如下:

1. TCP空(Null)扫描 (-sN)

在TCP Null扫描中,发送的TCP数据包没有设置任何标志位。根据RFC,在这种情况下,如果端口关闭,目标主机应该用RST进行回复。

2. TCP终止扫描 (-sF)

这与TCP空扫描非常相似,唯一的区别在于它不发送完全空的TCP数据包,而是发送一个带有FIN标志的数据包,该标志用于优雅地关闭连接。根据RFC,如果端口关闭,目标主机必须以RST回应。

3. TCP圣诞扫描 (-sX)

TCP Xmas扫描与最后两种扫描技术非常相似,只是它使用设置了PSH、URG和FIN标志的TCP数据包。与最后两种扫描类型一样,这种扫描也期望在RFC中对关闭的端口收到RST数据包。

限制

由于这些扫描的性质相似,因此它们产生的输出也非常类似于UDP扫描。在这种情况下,我们只能有以下三种回应:

  • 开放|已过滤:当没有收到响应时,端口被归类为这种状态,因为没有响应可能意味着两件事:端口是开放的;端口被防火墙保护,因此被过滤。
  • 已过滤:当端口被防火墙保护,并且防火墙发送回ICMP ping时。
  • 已关闭:当收到RST数据包时。

需要注意的是,虽然RFC 793规定网络主机对于关闭的端口应该用RST TCP数据包回应格式错误的数据包,并且对于开放的端口不应该做出任何应答,但一些系统拒绝遵守这一规定。这种行为主要在Microsoft Windows服务器和某些CISCO设备上观察到,这些系统默认情况下会丢弃所有的格式错误的数据包。

使用Nmap扫描网络主机

连接到网络时,最重要的一件事情就是在进一步探测之前获取网络上所有活动主机的列表。这可以通过“Ping扫描”来实现,顾名思义,就是向网络中的所有IP地址发送ICMP数据包并等待响应。回复ICMP数据包的主机被视为活动主机。

您可以通过使用连字符或CIDR来指定您的目标IP范围,如下所示:

$ nmap -sn 192.168.0.1-254

或者

$ nmap -sn 192.168.0.0/24

-sn参数可以抑制任何端口扫描,并且强制Nmap仅依靠ICMP回显包(或者ARP请求,如果以超级用户权限运行)来识别网络中的活动主机。它还会向目标的443端口发送TCP SYN数据包,并向目标的80端口发送TCP ACK请求(如果以超级用户权限运行,则发送TCP SYN)。

Nmap脚本引擎

Nmap的脚本引擎(NSE)是对其功能的有力补充,可以进一步扩展其功能。由Lua编写,我们可以使用它来编写脚本并自动化很多工作,如漏洞测试和利用。

有许多可用的类别。一些有用的类别包括:

  • safe:不会影响目标。
  • intrusive:不安全,可能会影响目标。
  • vuln:扫描漏洞。
  • exploit:尝试利用漏洞。
  • auth:尝试绕过运行服务的身份验证。
  • brute:尝试对运行服务的凭据进行暴力破解。
  • discovery:尝试查询运行服务以获取有关网络的更多信息。

要运行一个脚本,我们需要将其指定为--script=<脚本名称>

你还可以通过逗号分隔脚本名称(如--script=<脚本1>,<脚本2>)来同时指定多个要运行的脚本。

有些脚本还需要一个参数,可以用 --script-args <参数> 来指定。

有些脚本内置了帮助菜单,可通过以下方式进行查阅:

$ nmap --script-help <脚本名称>

您可以在这里找到一个全面的脚本列表。

结论

Nmap拥有大量免费且精心编写的文档。您可以在他们的官方网站上找到关于标志、脚本和更多内容的许多信息。您可以尝试各种不同的标志和脚本,并观察它们在不同环境下的输出差异。

bannerAds