Nmap简介

网络映射器( Nmap )是一个用 C、C++、Python 和 Lua 编写的开源网络分析和安全审计工具。它旨在通过原始数据包扫描网络,并识别网络上哪些主机可用,以及可能的服务和应用程序,包括名称和版本。它还可以识别这些主机的操作系统和版本。除了其他功能外,Nmap 还提供扫描功能,可以确定数据包过滤器、防火墙或入侵检测系统(IDS)是否按预期配置。

架构

Nmap 提供了多种不同类型的扫描,可以用来获取关于我们目标的多种结果。基本上,Nmap 可以分为以下扫描技术:

  • 主机发现
  • 端口扫描
  • 服务枚举和检测
  • 操作系统检测
  • 服务交互

扫描技术

1
2
3
4
5
6
7
8
9
SCAN TECHNIQUES:
-sS/sT/sA/sW/sM: TCP SYN/Connect()/ACK/Window/Maimon scans
-sU: UDP Scan
-sN/sF/sX: TCP Null, FIN, and Xmas scans
--scanflags <flags>: Customize TCP scan flags
-sI <zombie host[:probeport]>: Idle scan
-sY/sZ: SCTP INIT/COOKIE-ECHO scans
-sO: IP protocol scan
-b <FTP relay host>: FTP bounce scan

主机扫描

当我们需要对一家公司的整个网络进行内部渗透测试时,例如,我们首先应该了解哪些系统是在线的,我们可以与之工作。为了在网络中主动发现这样的系统,我们可以使用各种 Nmap 主机发现选项。 Nmap 提供了许多选项来确定我们的目标是否存活。最有效的主机发现方法是使用 ICMP 回显请求,我们将对此进行探讨。

始终建议保存每一次扫描。这之后可用于比较、文档记录和报告。毕竟,不同的工具可能会产生不同的结果。因此,区分哪个工具产生了哪些结果可能会有所帮助。

扫描网络范围

1
sudo nmap 10.129.2.0/24 -sn -oA tnet | grep for | cut -d" " -f5

扫描IP列表

在内网渗透测试中,我们通常会获得一个包含需要测试的主机的 IP 列表。 Nmap 还提供了处理列表的选项,可以从列表中读取主机而不是手动定义或输入它们。

1
2
3
4
5
6
7
8
9
cat hosts.lst

10.129.2.4
10.129.2.10
10.129.2.11
10.129.2.18
10.129.2.19
10.129.2.20
10.129.2.28

1
2
3
4
5
sudo nmap -sn -oA tnet -iL hosts.lst | grep for | cut -d" " -f5

10.129.2.18
10.129.2.19
10.129.2.20

端口扫描

了解我们使用的工具如何工作以及它如何执行和处理不同功能至关重要。如果我们知道它们的意义以及它们是如何获得的,我们才能理解结果。因此,我们将更仔细地查看和分析一些扫描方法。在我们发现目标存活后,我们希望更准确地了解系统。我们需要的信息包括:

  • 开放端口及其服务
  • 服务版本
  • 提供的服务信息
  • 操作系统

我们可以获得扫描端口的 6 种不同状态:

State 状态 Description 描述
open 这表明与扫描端口已建立连接。这些连接可以是 TCP 连接、UDP 数据报以及 SCTP 关联。
closed 当端口显示为关闭时,TCP 协议表明我们收到的数据包包含 RST 标志。这种扫描方法也可以用来判断我们的目标是否存活。
filtered Nmap 无法正确识别扫描的端口是开启还是关闭,因为目标端口没有返回任何响应,或者我们从目标处收到了一个错误代码。
unfiltered 端口处于这种状态仅在 TCP-ACK 扫描期间发生,这意味着该端口是可访问的,但它无法确定是开启还是关闭。
`open\ filtered` 如果我们没有收到特定端口的响应, Nmap 会将其设置为该状态。这表明防火墙或数据包过滤器可能保护了该端口。
`closed\ filtered` 这种状态仅发生在 IP ID 空闲扫描中,表明无法确定扫描的端口是否被关闭或被防火墙过滤。

发现端口

使用-Pn禁用ICMP

TCP扫描

默认情况下, Nmap 使用 SYN 扫描( -sS )扫描前 1000 个 TCP 端口。由于创建原始 TCP 数据包所需的套接字权限,这种 SYN 扫描仅在以 root 身份运行时才设置为默认值。否则,默认执行 TCP 扫描( -sT )。这意味着如果我们不定义端口和扫描方法,这些参数将自动设置。我们可以逐个定义端口( -p 22,25,80,139,445 ),通过范围( -p 22-445 ),通过 Nmap 数据库中已标记为最频繁的顶级端口( --top-ports=10 ),通过扫描所有端口( -p- ),或者通过定义快速端口扫描,其中包含前 100 个端口( -F )。

UDP扫描

一些系统管理员有时会忘记过滤 UDP 端口,除了 TCP 端口。由于 UDP 是一个 stateless protocol ,它不需要像 TCP 那样的三次握手。我们不会收到任何确认。因此,超时时间会变得很长,使得整个 UDP scan-sU )比 TCP scan-sS )慢得多。

还有一个缺点,导致我们经常没有收到回应,因为 Nmap 向扫描的 UDP 端口发送空数据报文,而我们没有收到任何回应。所以我们无法确定 UDP 数据包是否到达。如果 UDP 端口是 open ,只有当应用程序配置为此目的时,我们才会收到回应。

保存结果

在我们运行各种扫描时,我们应该始终保存结果。我们可以使用这些结果来检查我们使用过的不同扫描方法之间的差异。 Nmap 可以以 3 种不同的格式保存结果。

  • 普通输出( -oN )带有 .nmap 文件扩展名
  • 可 grep 输出( -oG )带有 .gnmap 文件扩展名
  • XML 输出( -oX )带有 .xml 文件扩展名

样式表

使用 XML 输出,我们可以轻松创建易于阅读的 HTML 报告,即使对于非技术人员也是如此。这对于文档编制来说后来非常有用,因为它以详细和清晰的方式展示了我们的结果。要将存储的结果从 XML 格式转换为 HTML,我们可以使用工具 xsltproc

1
xsltproc target.xml -o target.html

Nmap 脚本引擎

Nmap 脚本引擎( NSE )是 Nmap 的另一个实用功能。它为我们提供了使用 Lua 创建脚本以与某些服务交互的可能性。这些脚本可以分成总共 14 个类别:

Category 分类 Description 描述
auth 确定认证凭据。
broadcast 脚本,用于通过广播发现主机和已发现的主机,可以自动添加到剩余扫描中。
brute 执行尝试使用凭据暴力破解登录相应服务的脚本。
default 使用 -sC 选项执行的默认脚本。
discovery 评估可访问的服务。
dos 这些脚本用于检查服务中的拒绝服务漏洞,但由于会损害服务,因此使用频率较低。
exploit 这类脚本试图利用扫描端口已知的漏洞。
external 使用外部服务进行进一步处理的脚本。
fuzzer 该脚本通过发送不同字段来识别漏洞和意外数据包处理,这可能需要大量时间。
intrusive 可能对目标系统产生负面影响的侵入式脚本。
malware 检查是否有恶意软件感染目标系统。
safe 不执行侵入性和破坏性访问的防御性脚本。
version 服务检测扩展。
vuln 识别特定漏洞。

Nmap - 指定脚本

1
sudo nmap 10.129.2.28 -p 25 --script banner,smtp-commands

Nmap - 侵略性扫描

Nmap 还给我们提供了使用侵略性选项( -A )扫描目标的能力。这会使用多种选项扫描目标,包括服务检测( -sV )、操作系统检测( -O )、traceroute( --traceroute ),以及默认的 NSE 脚本( -sC )。

借助已使用的扫描选项( -A ),我们查明了系统上运行着哪种 Web 服务器( Apache 2.4.29 )、使用了哪种 Web 应用程序( WordPress 5.3.4 ),以及网页的标题( blog.inlanefreight.com )。此外, Nmap 显示它很可能运行着 Linux96% )操作系统。

优化

扫描性能在我们需要扫描大型网络或处理低网络带宽时起着重要作用。我们可以使用各种选项来告诉 Nmap 测试数据包应该有多快( -T <0-5> )、以何种频率( --min-parallelism <number> )、具有哪些超时( --max-rtt-timeout <time> )、应同时发送多少数据包( --min-rate <number> ),以及扫描目标时应为扫描端口设置多少重试次数( --max-retries <number> )。

超时

当 Nmap 发送数据包时,它需要一些时间( Round-Trip-Time - RTT )从扫描的端口接收响应。通常, Nmap 以 100ms( --min-RTT-timeout )的高超时开始。

1
sudo nmap 10.129.2.0/24 -F --initial-rtt-timeout 50ms --max-rtt-timeout 100ms

在比较两次扫描时,我们可以看到优化扫描找到的主机数量减少了两个,但扫描时间只用了四分之一。由此我们可以得出结论,将初始 RTT 超时( --initial-rtt-timeout )设置得太短可能会导致我们遗漏主机。

最大重试次数

另一种提高扫描速度的方法是指定发送数据包的重试速率( --max-retries )。默认值为 10 ,但我们可以将其减少到 0 。这意味着如果 Nmap 没有收到某个端口的重试,它将不再向该端口发送任何数据包,并跳过该端口。

1
sudo nmap 10.129.2.0/24 -F --max-retries 0

费率

在白盒渗透测试中,我们可能会被安全系统列入白名单,以便检查网络中的系统漏洞,而不仅仅是测试防护措施。如果我们知道网络带宽,我们可以根据数据包发送速率来工作,这可以显著加快我们的扫描速度,使用 Nmap 。当设置发送数据包的最小速率( --min-rate <number> )时,我们会告诉 Nmap 同时发送指定数量的数据包。它将尝试相应地保持该速率。

1
sudo nmap 10.129.2.0/24 -F --min-rate 300

防火墙和IDS/IPS逃逸

Nmap 为我们提供了许多绕过防火墙规则和 IDS/IPS 的方法。这些方法包括数据包分片、使用诱饵等,我们将在本节中讨论这些方法。

防火墙

防火墙是一种针对外部网络未经授权连接尝试的安全措施。每个防火墙安全系统都基于一个软件组件,该组件监控防火墙与传入数据连接之间的网络流量,并根据已设置的规则决定如何处理连接。它检查单个网络数据包是被通过、忽略还是被阻止。这种机制旨在防止可能带来潜在危险的不必要连接。

确定防火墙及其规则

我们知道,当一个端口显示为过滤时,可能有多种原因。在大多数情况下,防火墙会设置某些规则来处理特定连接。数据包要么是 dropped ,要么是 rejecteddropped 数据包会被忽略,主机不会返回任何响应。

对于被拒绝的数据包则不同,它们会触发明确的响应。TCP 数据包会带有 RST 标志返回,而 ICMP 可以包含不同类型的错误代码。

此类错误包括:

  • Net Unreachable 网络不可达
  • Net Prohibited 禁止
  • Host Unreachable 主机不可达
  • Host Prohibited 主机禁止
  • Port Unreachable 端口不可达
  • Proto Unreachable Proto 不可达
    Nmap 的 TCP ACK 扫描( -sA )方法比常规的 SYN( -sS )或连接扫描( sT )更难被防火墙和 IDS/IPS 系统过滤,因为它们只发送一个带有 ACK 标志的 TCP 数据包。当端口关闭或开放时,主机必须响应 RST 标志。与出站连接不同,来自外部网络的所有连接尝试(带有 SYN 标志)通常会被防火墙阻止。然而,带有 ACK 标志的数据包通常会被防火墙通过,因为防火墙无法确定连接是否首先从外部网络建立或从内部网络建立。

    IDS/IPS

    入侵检测系统( IDS )和入侵防御系统( IPS )也是基于软件的组件。 IDS 扫描网络以查找潜在的攻击,分析它们,并报告任何检测到的攻击。 IPS 通过在检测到潜在攻击时采取特定的防御措施来补充 IDS 。此类攻击的分析基于模式匹配和特征。如果检测到特定模式,例如服务检测扫描, IPS 可能会阻止即将进行的连接尝试。

检测IDS/IPS

与防火墙及其规则不同,检测 IDS/IPS 系统要困难得多,因为这些是被动式流量监控系统。 IDS systems 检查主机之间的所有连接。如果 IDS 发现包含定义内容或规格的数据包,管理员将收到通知并在最坏情况下采取适当行动。

IPS systems 独立采取管理员配置的措施,自动防止潜在的攻击。重要的是要知道 IDS 和 IPS 是不同的应用程序,并且 IPS 是 IDS 的补充。

IDS systems 通常用于帮助管理员检测网络上的潜在攻击。管理员可以决定如何处理这些连接。我们可以通过管理员触发某些安全措施,例如,通过积极扫描单个端口及其服务。根据是否采取了特定的安全措施,我们可以检测网络是否安装了某些监控应用程序。

一种确定目标网络中是否存在此类 IPS system 的方法是从单个主机( VPS )进行扫描。如果该主机在任何时候被封锁且无法访问目标网络,我们就知道管理员已经采取了某些安全措施。因此,我们可以使用另一个 VPS 继续我们的渗透测试。

DNS 代理

默认情况下, Nmap 会执行反向 DNS 解析以查找更多关于我们目标的重要信息,除非另有指定。这些 DNS 查询在大多数情况下也会被传递,因为给定的 Web 服务器应该被找到并访问。DNS 查询是通过 UDP port 53 进行的。 TCP port 53 以前仅用于 DNS 服务器之间或大于 512 字节的数据传输的所谓“ Zone transfers ”。由于 IPv6 和 DNSSEC 的扩展,这种情况正在越来越多地改变。这些变化导致许多 DNS 请求通过 TCP 端口 53 进行。

然而, Nmap 仍然给我们一个自己指定 DNS 服务器的方式( --dns-server <ns>,<ns> )。如果我们在非军事区( DMZ ),这种方法对我们来说可能至关重要。公司的 DNS 服务器通常比来自互联网的更值得信赖。因此,例如,我们可以使用它们来与内部网络的主机进行交互。作为另一个例子,我们可以使用 TCP port 53 作为我们扫描的源端口( --source-port )。如果管理员使用防火墙来控制这个端口,并且没有正确过滤 IDS/IPS,我们的 TCP 数据包将被信任并允许通过。

1
sudo nmap 10.129.2.28 -p50000 -sS -Pn -n --disable-arp-ping --packet-trace --source-port 53