Wireshark 学习手册(三)

十二、探索 ICMP

大家都熟悉互联网协议 ( IP ,负责路由和寻址流量。然而,许多人并不熟悉互联网控制消息协议 ( ICMP ),这是一个强大的协议,在传递数据方面起着重要作用。在本章中,我们将学习 ICMP,它是 IP 的伴生协议,工作在 OSI 模型的网络层。我们将从概述开始,以便您对 ICMP 的主要功能有一个大致的了解。

然后,我们将评估 ICMP(与 IPv4 一起使用)和 ICMPv6 (与 IPv6 一起使用),以便您可以比较一些主要差异。此外,您将更好地理解两种类型的消息:错误报告查询。然后,我们将查看常见的类型代码值,并讨论哪些类型的 ICMP 消息不再使用。最后,我们将讨论恶意行为者如何利用 ICMP 发动攻击。然后,我们将概述一些基本的防火墙指南,说明在您的网络上允许什么类型的 ICMP 消息。

本章将通过涵盖以下内容来解决所有这些问题:

  • 了解 ICMP 的目的
  • 剖析 ICMP 和 ICMPv6
  • 发送 ICMP 消息
  • 评估类型和代码值
  • 配置防火墙规则

了解 ICMP 的目的

20 世纪 80 年代初,科学家们开发了驱动互联网流量的协议。此外,他们还发现了可能会阻止流量到达目的地的潜在问题,尤其是在使用 IP 时。这主要是因为 IP 不能保证传输,并且无法与终端设备交流网络问题。ICMP 通过发送查询消息和生成可能需要注意的问题的错误报告来克服 IP 的缺陷。

如下表所示,网络层负责寻址和路由:

Figure 12.1 – The OSI model network layer
)

图 12.1–OSI 模型网络层

网络层有三种主要的协议,它们对于传输数据至关重要。除了 ICMP 之外,其他协议如下:

  • IP 是一种尽力而为的无连接协议,使用逻辑 IP 地址将数据包从源路由到目的地。
  • 地址解析协议 ( ARP )将一个 IPv4 地址(网络层)解析为局域网 ( LAN )上的一个媒体访问控制 ( MAC )(数据链路层)地址,这样帧就可以被传送到合适的主机。

正如我们在 第十一章分析 IPv4 和 IPv6 中了解到的,网络层负责寻址和路由流量。因为 IP 是一个尽力而为的、不可靠的协议,所以 ICMP 对于数据传输是必不可少的,并且必须由每个 IP 模块来实现。

ICMP 有两个主要任务:

  • 传达阻止数据传送的错误。常见问题包括网络或端口不可达。
  • 发出查询,例如在 ping 网络实用工具中使用的 echo 请求/回复,或者路由器请求,它提供了一种请求和接收路由器信息的方法。

因为有两个 IP 版本,所以也有两个 ICMP 版本。这些角色特定于各自的 IP 版本:

  • IPv4 使用 ICMP。
  • IPv6 使用 ICMPv6。

由于其在协助 IP 传送数据中的作用,ICMP 的使用在针对 ICMP 两个版本的意见征询 ( RFC )中做了如下说明:

  • 如 RFC 792 中所述,“ICMP 实际上是 IP 不可分割的一部分,必须由每个 IP 模块来实现。”
  • 如 RFC 4443 中所述,“icmp V6 是 IPv6 不可分割的一部分,基础协议必须由每个 IP 版本 6 节点完全实现。”

为了传递查询或错误,ICMP 消息必须在报头中提供信息。在下一节中,我们将了解 ICMP 数据包如何跟随 IP 报头,以及两个版本中都存在的三个字段。

了解 ICMP 报头

当传递信息时,ICMP 和 ICMPv6 数据包都将跟随 IP 数据包,如下图所示:

Figure 12.2 – ICMP message following an IP header
)

图 12.2–IP 报头后的 ICMP 消息

所有 ICMP 消息都有一个共同的结构,以类型代码校验和开头,如下图顶部所示:

Figure 12.3 – ICMP message
)

图 12.3–ICMP 消息

ICMP 报头中一致的三个字段描述如下:

  • 类型(8 位):该字段表示类型,如Type: 3 (Destination unreachable)
  • 代码(8 位):code字段进一步定义了type字段。例如,Code: 1 (Host unreachable)
  • 校验和(16 位):该字段保存用于错误检测的数值。

typecodechecksum字段值之后,您将找到数据有效载荷。内容取决于 ICMP 类型和代码,可以是 ICMP 错误报告或查询消息。

整个有效负载封装在一个帧中,如下图所示:

Figure 12.4 – ICMP message in an Ethernet II frame
)

图 12.4–以太网 II 帧中的 ICMP 消息

这里我们看到各种报头,包括帧头、IP 头、ICMP 报文、数据和帧校验序列 ( FCS )。

注意

ICMP 没有传输层报头,因为它不交换或传输数据。它的主要作用是测试可达性并报告传输错误。

为了详细检查 ICMP 的几个示例,我们将使用位于http://tcpreplay . app neta . com/wiki/captures . html # big flows-pcapbigFlows.pcap数据包捕获。下载文件并在 Wireshark 中打开它。一旦打开,应用icmp过滤器。选择任何 ICMP 数据包,您将看到TypeCodeChecksum字段。如此处所示,我们看到了帧 202 的细节:

Figure 12.5 – Frame 202 - ICMP message
)

图 12.5–帧 202 - ICMP 消息

在画面细节中,我们看到以下内容:

  • Ethernet II:帧头
  • Internet Protocol Version 6 : IP 头
  • Internet Control Message Protocol:消息
  • Data:特定于 ICMP 回应回复

如图图 12.5 所示,此类 ICMP 消息的细节包括用于标识符和序列号的字段,有助于匹配相应的回应和回复。主机使用此信息来重建发送原始数据报的过程。

TypeCodeChecksum字段之后,ICMP 消息中有一个数据部分。下一节解释了您可能在数据有效负载中发现的内容。

调查数据有效负载

在 ICMP 数据报中,有效负载取决于消息的类型。在标准 ICMP 请求/回复中,数据有效载荷是无意义的,并且将具有 ASCII 字符或空值,这取决于操作系统 ( OS )。

在本节中,我们将探索您可能在 ICMP 数据包中遇到的不同有效载荷。除了数据之外,ICMP 有效负载还可以包括水印,甚至是隐藏数据的证据,例如您可能在 Loki 攻击中看到的内容。

让我们先回顾一下在 ICMP 回应请求中可能会看到什么。

查看回应请求/回复

要查看回应请求的示例,请打开bigFlows.pcap,然后转到帧 38 ,显示一条Type 8Code 0消息。展开 ICMP 标头,如以下屏幕截图所示:

Figure 12.6 – ICMP echo request details
)

图 12.6–ICMP 回应请求详细信息

例如,在帧 38 中所示的回应回复中,数据部分是如下字符串:

00000000138a1a34abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdab cdabcdabcd

此外,您应该在标准 ICMP 回复中看到类似的有效载荷,您可以在帧 74 中看到。

在回送请求/回复中,您将看到一个字符串,而错误消息具有不同的有效负载格式。让我们来看看。

报告错误

每当 ICMP 遇到错误时,ICMP 必须将 IP 报头加上原始数据报的至少前 8 个字节(或 64 位)返回给发送方。

注意

ICMP 错误消息的总长度不能超过 576 字节。

要查看示例,请打开bigFlows.pcap并使用icmp.type == 3过滤器,这将显示所有带有Type 3: Destination unreachable error消息的 ICMP 数据包。

选择帧 4794 并展开 ICMP 标题,您将看到 ICMP Type: 3 (Destination unreachable) Code: 3 (Port unreachable) fields,如第一部分所示:

Figure 12.7 – ICMP echo request details
)

图 12.7–ICMP 回应请求详细信息

因为这是一个错误,ICMP 已经返回了 IP 头和原始数据报。正如您所看到的,ICMP 数据包有几个部分,如下所示:

  • 第一部分( 1 )是指示错误的 ICMP 报头。
  • 第二段( 2 )是原始的 IP 头。
  • 第三个段( 3 )是原始的用户数据报协议 ( UDP )头,后面跟着数据。

在大多数情况下,您可能遇到的唯一 ICMP 有效负载是一个 echo 请求/回复以及错误消息。但是,在其他情况下,您可能会看到有效负载。让我们探索一下这可能在什么时候发生。

包括其他数据

ICMP 被设计成在网络上发出查询和传达错误。然而,随着时间的推移,ICMP 已被用于其他目的,因为 ICMP 请求中的数据部分可以被修改。一种方法是在监控网络时使用非恶意水印来识别公司。另一种方式是通过使用 ICMP 隧道恶意泄漏数据。

让我们先来看看水印是如何使用的。

创建水印

一家网络监控公司(https://www.paessler.com/ping-monitoring)使用 ping 监控来评估网络上设备的健康状况。在 Wireshark 中收集数据包时,您会看到佩斯勒的数据包带有水印,如下图所示:

Figure 12.8 – Ping request with a watermark
)

图 12.8–带水印的 Ping 请求

数据包字节面板中,您可以在右下角看到一个突出显示的区域。数据如下:P•I•N•G• •b•y• •P•R•T•G• •N•

在这种情况下,水印不是恶意的。然而,一个 ICMP 信息包可以被修改成秘密地发送数据,我们将在下面看到。

秘密发送命令

恶意行为者找到了许多方法来隐藏他们的活动。通过网络发送命令的一种方式是使用 Loki 工具执行隐蔽通道攻击,其工作方式如下:

  1. 数据嵌入在 ICMP 回应数据包中。
  2. 数据然后通过网络秘密发送。

与上一节描述的水印不同,这种类型的活动会带来安全风险。因此,网络管理员应该调整设备来检查 ICMP 数据。如果发现有效载荷包含无法识别的数据模式,设备应发送警报,因为这可能是秘密 ICMP 隧道的迹象。

我们现在可以看到,ICMP 是一个重要的网络层协议,它与 IPv4 和 IPv6 一起使用,提供错误报告和信息性消息。接下来我们来对比一下 ICMP 和 ICMPv6 两个版本。

剖析 ICMP 和 ICMPv6

尽管 IPv4 和 IPv6 都负责路由和寻址数据,但这两种协议有许多不同之处。因此,有两个版本的 ICMP。

在下一节中,我们将探讨 ICMP 和 ICMPv6,以便您理解在报告网络问题中的一些基本角色和功能。

先说 ICMP,和 IPv4 一起用。

查看 ICMP

ICMP 与 IPv4 一起用于交流阻止数据传送的网络问题。ICMP 错误和查询消息可以在连接出现问题时提醒终端系统,还可以从中间系统获得诊断信息,例如往返时间。

尽管 ICMP 功能强大,但它无法使 IP 成为可靠的协议;它只通过提供错误消息和信息来帮助数据传递。有时数据传输延迟的原因不在 ICMP 可以发送和报告的消息范围内。在这种情况下,由传输控制协议 ( TCP )或其他更高层的协议来通知主机传输过程中的传输错误。

接下来,让我们看看 ICMPv6,它有许多相同的功能,但还提供了支持 IPv6 的额外功能。

概述 ICMPv6

虽然 IPv4 和 IPv6 在整体功能上很相似,但 IPv6 还有许多其他的优势,包括:

  • 选项和扩展
  • 改进的多播路由
  • 无状态地址自动配置 ( SLAAC

因此,ICMPv6 是为 IPv6 开发的,用于传递更新或错误消息。ICMPv6 消息包含类型代码校验和细节,随后是取决于类型和代码的内容。但是,ICMPv6 有与 IPv6 流量相关的选项。

一个例子是 ICMPv6 路由器请求消息,它警告网络上的其他路由器它们的存在。要查看 ICMPv6 消息与网络上其他设备通信的示例,请访问 CloudShark:https://www.cloudshark.org/captures/0f90f2c2de86?过滤器=帧% 20 和% 20 eth % 20 和% 20 IPv6 % 20 和%20icmpv6

在 Wireshark 中下载并打开test55.pcap。在显示过滤器中,输入icmpv6 并按下输入来运行过滤器。在下面的截图中,第 63 帧有一条 ICMPv6 路由器请求消息:

Figure 12.9 — ICMPv6 router solicitation
)

图 12.9-icmp V6 路由器请求

注意

IPv6 ff02::2目的地址是一个组播地址,使用一个地址发送给网络上的所有节点。

ICMP 和 ICMPv6 都可以提供对网络活动的洞察。下一节将探讨 ICMP 的两个主要功能:报告错误和查询。

发送 ICMP 消息

ICMP 消息分为两类:错误报告和查询。一些消息特定于每个版本;但是,有一些是两个版本共有的,如下所示:

Figure 12.10 – ICMP messages
)

图 12.10–ICMP 消息

对于这两个类别,每个 ICMP 数据包都有typecodechecksum字段。查询的有效负载不同于错误消息,因为每一个都有不同的目的,我们将在下面的章节中看到。

让我们先回顾一下 ICMP 如何报告错误。

报告网络上的错误

ICMP 错误消息报告阻止数据传送的网络问题。通常发送的错误消息被分为具有特定用途的类别,包括以下内容:

  • 目的地不可达是指路由器通知主机无法到达所请求的目的地地址。
  • 当 IPv4 生存时间 ( TTL )值或 IPv6 跳数限制达到零时,发送超时
  • 参数问题当确定标题或扩展标题中的字段值出现问题时,可以报告。

接下来,让我们看看您可能在网络中看到的一些错误示例。

查看示例

我们已经在调查数据有效载荷部分的中看到了一个Destination Unreachable消息的例子。另一个错误是Time Exceeded。要查看该错误的示例,打开bigFlows.pcap,然后转到框 7217 ,显示一条Type 11Code 0信息。展开 ICMP 标头,如以下屏幕截图所示:

Figure 12.11 – ICMP Time Exceeded error message
)

图 12.11–ICMP 超时错误消息

在这种情况下,一旦数据包到达路由器,TTL 将达到零,这将触发 ICMP 错误。

另一个例子是Parameter Problem错误消息。我们可以去 https://www.cloudshark.org/captures/bed61f75bde3 的云鲨找到这个。在 Wireshark 中下载并打开alive6-1.pcap。进入画面 3 ,展开 ICMPv6 表头,如图所示:

Figure 12.12 – ICMPv6 Parameter Problem error message
)

图 12.12–icmp V6 参数问题错误消息

在这种情况下,错误消息是Type: Parameter Problem (4) Code: 2 (unrecognized IPv6 option encountered)

如前所述,ICMPv6 具有许多与 ICMP 相同的功能,但也提供了额外的报告来支持 IPv6。特定于 ICMPv6 的消息之一是Packet Too Big。让我们来看看。

监控数据包大小

除了 IPv4 中报告的三个错误消息之外,ICMPv6 还包括另一个错误Packet Too Big,如下图所示,列出了 ICMPv6 的一些错误消息:

Figure 12.13 – ICMPv6 error messages
)

图 12.13–icmp V6 错误消息

我们在 第十一章解析 IPv4 和 IPv6 中了解到,净荷长度是 IPv6 中的一个字段值。当数据在网络中传输时,会监控数据包的大小。如果数据包太大,ICMPv6 将报告Packet Too Big错误。当设备无法发送数据时,发送该错误,因为数据包大于输出链路的最大传输单位 ( MTU )。

要查看 ICMPv6 Packet Too Big消息的示例,请访问 CloudShark:【https://www.cloudshark.org/captures/7dd0b50eb768。在 Wireshark 中下载并打开packet too big.pcap。打开后,转到框 3 并展开 ICMPv6 标题,如下所示:

Figure 12.14 – ICMPv6 Packet Too Big error
)

图 12.14–icmp V6 数据包太大错误

由于网络的复杂性,有时很难避免这种错误。让我们看看当有效载荷对 MTU 来说太大时我们有什么选择。

管理数据包太大错误

当发送数据时,大多数操作系统采用路径 MTU 发现 ( PMTUD ),该过程用于确定允许多大的数据包在网络网段上传输。如果数据包太大,路由器会向主机发回一条 ICMPv6 Packet Too Big消息。在这种情况下,必须做两件事之一:

  • 该分组必须被丢弃。
  • 如果允许,数据包必须分段。

将数据包分段可以解决数据包过大的问题,因为这样就可以将数据包发送到网络上。正如我们所知,IPv6 报头没有的分片字段,并试图不对数据包进行分片;然而,它可以通过使用扩展头分段。你可以在图 12.14 的最后一行看到一个Fragment Header for IPv6片段扩展头的例子。

注意

网络上的许多设备会阻止碎片数据包,这是有原因的。碎片会给设备带来额外的压力,并可能带来安全风险。

ICMP 错误消息提供了额外的信息,以便主机可以确切地看到发生了什么。TCP、IP 或用户应用接收并处理错误。但是,在某些情况下,ICMP 消息会被忽略。

除了发送错误消息,ICMP 还可以请求和提供信息,这将在下一节中讨论。

发布查询消息

ICMP 查询有两个消息(一个请求和一个回复),它们一起工作,有一个特定的目的:提供状态更新和信息。

请求和答复的两个例子如下:

  • 回应请求/回复:ICMP 数据包作为一个探针来测试远程主机的可达性。
  • 路由器请求/广告:提供一种请求和接收路由器信息的方式,该信息提供了可用路由器接口的 IP 地址。

在主要使用 IPv4 的网络上,大多数 ICMP 消息提供了足够的信息。然而,为了帮助 IPv6 传递数据,ICMPv6 需要提供特定于 IPv6 的信息,我们将在下面看到。

使用 ICMPv6 提供信息

虽然在很多方面,ICMP 和 ICMPv6 相似,但 ICMPv6 的责任更多。原因是 IPv6 不再使用 ARP 广播或互联网群组消息协议 ( IGMP )。因此,ICMPv6 提供了额外的服务来交流网络上的问题,如下图所示:

Figure 12.15 – ICMPv6 informational messages
)

图 12.15–icmp V6 信息性消息

ICMPv6 特有的一些消息如下:

  • 邻居请求 / 广告:这些类型用于邻居发现协议 ( NDP )为主机提供在网络上共享其存在的方法。
  • 组播监听查询 / 报告:用于向路由器和主机交换组组播信息。
  • 组成员关系:用于提醒组播组成员关系中包含的主机上的邻居路由器。

要查看与网络上其他设备通信的众多 ICMPv6 消息的示例,请在 Wireshark 中打开test55.pcap。在显示过滤器中,输入icmpv6并按下输入来运行过滤器。

通过完成以下步骤创建流程图:

  1. 进入统计,然后进入流程图
  2. 一旦打开,转到左下角并选择限制以显示过滤器

结果如以下截图所示:

Figure 12.16 – ICMPv6 flow graph
)

图 12.16–icmp V6 流程图

在流程图中,您可以看到多播监听器报告路由器请求 ICMPv6 数据包。

一些 ICMPv6 报告有更多的细节。对于示例,在单独的捕获文件中,我们可以看到单个报告中提供的详细信息,如下所示:

Figure 12.17 – ICMPv6 Multicast Listener Report
)

图 12.17–icmp V6 多播侦听器报告

ICMPv6 如何在网络上通信的另一个例子是使用邻居请求。这里的是一台失去了与网关的连接的主机。为了建立连接,帧 99 中的主机在网络上发出组播邻居请求消息,如下图所示:

Figure 12.18 – ICMPv6 neighbor discovery
)

图 12.18–icmp V6 邻居发现

您看到多个 ICMPv6 数据包的原因是主机无法到达网关。邻居请求消息将继续,直到连接恢复。

如您所见,ICMPv6 是一个强大的协议。除了错误和信息消息之外,ICMPv6 还提供额外的信息,并与 IPv6 一起保持连接。

如前所述,ICMP 报头包含类型和代码的值。让我们看看这两个字段,以便帮助我们理解 ICMP 试图告诉我们什么。

评估类型和代码值

ICMP 最初的目标是提供网络状态的更新和其他信息性消息。在本节中,我们将回顾 ICMP 和 ICMPv6 的类型和代码值。先说 ICMP。

查看 ICMP 类型和代码值

ICMP 用于 IPv4 已经很多年了。有许多不同类型的 ICMP 消息,其中一些应该看起来很熟悉,例如:

  • 类型 0 :回显回复
  • 类型 3 :目的地不可达
  • 类型 5 :重定向
  • 类型 8 :回送请求
  • 类型 9 :路由器广告

一些(但不是全部)ICMP 类型有一组相应的代码值,用于进一步定义 ICMP 消息。例如,类型 3类型 9 都有一组代码值。

类型 3 (目的地不可达)有许多代码值,包括以下内容:

  • 代码 0 :网(网络)不可达
  • 代码 1 :主机不可达
  • 代码 2 :协议不可达
  • 代码 3 :端口不可达
  • 代码 4 :需要分段,且不分段位被置位

类型 9 (路由器广告)只有两个代码值:

  • 代码 0 :正常路由器广告
  • 代码 16 :不路由普通流量

类型和代码是 ICMP 消息中的前两个字段,用于传递信息。例如在第 543 帧中,ICMP 已经返回了一个 ICMP Type: 3Code: 13,如下面的截图所示:

Figure 12.19 – ICMP Type 3 and Code 13
)

图 12.19–ICMP 类型 3 和代码 13

当 ICMP 返回Type: 3 Destination Unreachable Code: 13 (Communication Administratively Prohibited)时,这意味着防火墙正在阻止该请求。

正如我们所了解的,ICMP 报头包含类型和代码的值,以传达网络上发生的情况。但是,有些 ICMP 类型已不再使用,并且已被弃用。我们来探讨一下这个。

不鼓励使用过时的类型值

虽然 ICMP 列出了多种类型值,但许多已经不再使用,因为随着时间的推移,它们已经被发现是无效的。过时和无效的类型被认为是过时的。以下是一些不推荐使用的 ICMP 类型:

  • 类型 4 :源淬火
  • 类型 33 : IPv6 你在哪里
  • Type 34 : IPv6 I-am-here
  • 类型 35 :移动注册请求
  • 类型 37 :域名请求

不鼓励使用不推荐使用的 ICMP 类型值。要阅读更多关于处理 ICMP 类型和代码值的最佳实践,请访问位于 https://datatracker.ietf.org/doc/html/rfc7279/的 RFC 7279。

与 ICMP for IPv4 一起,ICMPv6 用于传递更新或错误消息,并有自己的一组类型和代码值。在下一节中,我们将回顾 ICMPv6 的一些值。

定义 ICMPv6 类型和代码值

因为 ICMPv6 提供了关于 IPv6 路由器和主机配置的附加数据,所以您会发现有助于提供这些信息的特定类型值。

ICMPv6 类型值的简短列表包括以下内容:

  • 类型 1 :目的地不可达
  • 类型 2 :数据包太大
  • 类型 3 :超时
  • 类型 4 :参数问题
  • 类型 130 :组播监听查询
  • 类型 131 :组播监听报告

在某些情况下,该类型将有一个相应的代码值来进一步定义消息,类似于 IPv4。如果该类型没有对应的代码值,该字段值将被设置为0,如图图 12.17 所示。

下面是 ICMPv6 的各种类型和相应代码值的示例。

类型 1 (目的地不可达)有几个代码值。其中一些如下:

  • 代码 0 :没有到目的地的路线
  • 代码 1 :与目的地的通信被行政禁止
  • 代码 2 :超出源地址范围
  • 代码 3 :地址不可达

类型 3 (超时)有两个代码,如下:

  • 代码 0 :传输中超过跳数限制
  • 代码 1 :碎片重组时间超过

正如我们所知,ICMP 可以在网络上提供大量信息,因此,了解该协议可能被恶意使用是很重要的。因此,应该调整防火墙规则以防止恶意活动,如下一节所述。

配置防火墙规则

ICMP 支持 IP 以帮助确保数据传送;但是,它也可能被恶意使用。例如,ICMP 可以被用来作为攻击的前兆进行侦察,甚至帮助规避防火墙规则。在本节中,我们将举例说明如何使用 ICMP 来获取网络信息或重定向流量。然后,我们将评估一些用于限制攻击有效性的防火墙规则。

让我们先简要讨论几个使用 ICMP 的攻击。

恶意行事

ICMP 可以确定网络的大量信息。因此,它可以用作有效的扫描工具。此外,如果安全设备没有调整到不允许某些类型的 ICMP 数据包,您可能会成为攻击的受害者,例如 T2 分布式拒绝服务或重定向攻击。

首先,让我们从概述 ping 扫描开始,这是一种用于查看哪些网络主机可能处于唤醒状态并做出响应的技术。

发送恶意 ping 扫描

恶意行为者在攻击前使用各种技术扫描网络中易受攻击的主机。一种方法是通过使用 ICMP ping 数据包来确定哪些主机处于活动状态并做出响应。ping 扫描(或 ping 扫描)使用局域网上的一系列 ICMP echo 请求数据包来查看哪些主机处于活动状态并正在响应。如下图所示,攻击者在网络上发送一系列 ping 数据包。发送后,攻击者会等待收到主机的回应,以回应/回复的形式表示主机处于活动状态:

Figure 12.20 – ICMP ping sweep
)

图 12.20–ICMP ping 扫描

一旦识别出响应主机,攻击者将发送更高级的探测来获取有关该主机的更多信息。

除了使用一系列回应请求/回复之外,恶意行为者还可以使用几个 ICMP 查询来在发起攻击之前侦察信息。要查看使用 ICMP 数据包探测网络的示例,请访问 CloudShark:https://www.cloudshark.org/captures/51eabf15169e

在 Wireshark 中下载并打开sniffer_cybercop_scan_1-4223.cap。在显示过滤器中,输入((ip.src == 192.168.10.33) && (icmp)) && !(ip.src == 192.168.10.138)并按下 Enter 运行过滤器,过滤器将显示 12 个数据包。通过完成以下步骤创建流程图:

  1. 进入统计,然后进入流程图
  2. 一旦打开,转到左下角并选择限制以显示过滤器

结果如以下截图所示:

Figure 12.21 – Sending ICMP packets during reconnaissance
)

图 12.21–在侦察期间发送 ICMP 数据包

在这个流程图中,我们看到在192.168.10.33的恶意参与者如何向192.168.10.138主机发送各种 ICMP 消息。除了 ICMP 请求包,恶意行为者也使用时间戳和地址掩码请求。这种类型的探测器发送各种 ICMP 数据包,希望得到回复,以帮助扫描软件排除不同的操作系统以及主机上的其他信息。

接下来,我们来看看另一种使用 ICMP 重定向消息来重定向流量的攻击。

重定向流量

虽然 ICMP 被设计用来帮助数据在网络上移动,但是恶意的参与者已经找到了使用某些类型的消息来发起攻击的方法。

ICMP 和 ICMPv6 都有重定向消息:

  • ICMP 使用Type 5 – Redirect
  • ICMPv6 用途Type 137 – Redirect Message

当用于发起攻击时,恶意行为者会创建专门设计的重定向消息,可用于修改路由表。该消息包含指示存在发送流量的更优路由的信息。一旦攻击被设置,恶意行为者就伪装成路由器,并在网络上发送特制的 ICMP 消息。

要查看使用 ICMP 重定向数据包的示例,请访问https://github . com/bro/bro/blob/master/testing/btest/Traces/ICMP/ICMP 6-redirect . pcap。在页面中间,选择查看原始数据,然后在 Wireshark 中打开icmp6-redirect.pcap。只有一包。展开 IP 和 ICMP 报头,如该屏幕截图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 12.22–icmp V6 重定向数据包

一旦主机收到重定向消息,流量将被重定向到恶意参与者。然后,恶意参与者可以拦截流量以获取敏感信息,将流量重定向到另一台服务器,或者为更高级的攻击做准备。

我们要讨论的最后一种攻击是 IP/ICMP 分段 DDoS 攻击。

拒绝服务

破坏业务的方法之一是发起 DDoS 攻击。当在内部网络上发起时,一种类型的攻击是容量 DDoS 。容量型 DDoS 试图用大量流量淹没设备或网络,从而消耗所有资源,合法流量被封锁。

一个例子是碎片化 IP/ICMP 容量 DDoS 攻击。要查看您在这种类型的攻击中可能会看到的示例,请访问https://www.cloudshark.org/captures/962444a14a56。在 Wireshark 中下载并打开 fragmented-icmp-traffic.pcapng。打开后,您将看到以下内容:

Figure 12.23 – fragmented-icmp-traffic.pcapng
)

图 12.23–分段 icmp 流量. pcapng

在这个捕获中,您将看到以下内容:

  1. 192.168.12.1的主机在帧 1 发送Fragmented IP protocol
  2. 接下来是第二帧的中的Echo (ping) request
  3. 然后,192.168.12.1处的主机在来自192.168.12.2处的主机的每个Echo (ping) reply之后重复该模式。

这意味着在192.168.12.2的主机必须不断地重组碎片包,这将需要额外的资源。

如果您展开帧 1 中的 IP 报头,您将看到以下内容:

Figure 12.24 – A fragmented packet
)

图 12.24–碎片数据包

如(1)所示,跟随 IP 报头的协议是Protocol: ICMP (1)。我们还通过(2)看到数据包是[Reassembled IPv4 in frame: 2]

fragmented-icmp-traffic.pcapng捕获只有 20 个包;但是,如果攻击继续,这可能导致设备无法响应合法主机。

事实证明,ICMP 可用于获取主机信息,并以恶意方式进行操作。因此,最好了解各种类型,只允许绝对必要的 ICMP 数据包,我们将在下一节中看到。

只允许必要的类型

由于 ICMP 可以影响重要系统功能的运行并获取配置信息,黑客在对网络进行侦察或进行主动攻击时会使用 ICMP 消息。因此,最佳实践可以包括以下内容:

  • 在防火墙上用访问控制列表 ( ACL )阻止某些 ICMP 消息,尤其是在边界路由器上的
  • 配置一个入侵检测系统 ( IDS )以便在检测到 ICMP 重定向消息时阻止或警告管理员

虽然 ICMP 可能被恶意使用,但我们必须记住,诊断实用工具(如 Ping 和 Tracert)需要 ICMP。因此,网络管理员必须决定网络上应该允许什么类型的 ICMP 数据包。在设置防火墙时,请记住唯一重要的 ICMP 流量是Destination Unreachable(ICMP 的Type 3和 ICMPv6 的Type 1),以及相应的代码。

所有其他 ICMP 类型都是可选的,这取决于您是否希望在您的网络中允许它们。根据您的组织,允许的其他类型包括:

  • 类型 8/0 :回应请求/回复
  • 类型 11 :超时

ICMP 有助于确保数据得到传递;但是,它可以被恶意使用,因此,您需要确保防火墙得到适当的调整。

总结

现在,您可以看到 ICMP 的许多方面,它是 TCP/IP 套件中的一个重要协议。我们研究了 ICMP 的目的,ICMP 是一种交流阻止数据传输的问题的方法。我们比较了 ICMP 和 ICMPv6,它们的功能相似,但我们现在明白 ICMPv6 的作用更大。因此,您可以在排除故障时使用此协议,我们发现 ICMP 消息可以与主机通信以报告传输错误。此外,我们看到了如何使用查询消息来尝试从主机获取信息。

为了更好地理解 ICMP 类型和代码值,我们研究了它们在传递信息时是如何工作的。此外,我们了解到,有些 ICMP 类型您很少会看到,因为它们现在已被弃用和/或不受支持。到目前为止,您应该认识到 ICMP 是一种功能强大的协议,它有助于在网络上传输流量,但也可能被恶意使用。因此,您应该配置允许或拒绝特定 ICMP 类型的防火墙规则,以减少 LAN 上恶意 ICMP 流量的威胁。

在下一章中,我们将仔细研究如何用 Wireshark 检查域名系统 ( DNS )流量。使用实际的例子,您将能够理解 DNS 在将主机名解析为 IP 地址时是如何工作的。您将发现 DNS 头中的字段值,并逐步完成 DNS 请求/响应事务。此外,由于 DNS 问题在许多网络中很常见,我们将回顾一下可以帮助您使用 Wireshark 计算 DNS 响应时间的工具,以及保护 DNS 的方法。

问题

现在,是时候检查你的知识了。选择最佳答案,然后将您的答案与评估附录中的答案进行核对:

  1. ICMP 传达阻止数据传送的问题。常见问题包括网络或端口是 _____。
    1. 宏伟威严的
    2. 检查
    3. 不能得到的
    4. ARP 已启用
  2. 一些 ICMP 类型已经不再使用,因为随着时间的推移,它们已经被发现是无效的,并被认为是 _____。
    1. 熄灭
    2. 不能得到的
    3. 数字的
    4. 反对
  3. 在 ICMPv6 中,当确定 IPv6 标头或 IPv6 扩展标头中的字段值出现问题时,可以发送 _____ 消息。
    1. 超过时间
    2. 参数问题
    3. 数据包太大
    4. 源抑制
  4. 设置防火墙规则时,唯一重要的 ICMP 流量是 _____。其他的是可选的。
    1. Type 3代表 ICMP,Type 1代表 ICMPv。
    2. Type 123代表 ICMP,Type 17代表 ICMPv。
    3. Type 1代表 ICMP,Type 3代表 ICMPv。
    4. Type 9代表 ICMP,Type 104代表 ICMPv。
  5. ICMP 可以被恶意使用。一种方法是 ______ 扫描,它使用网络上的一系列 ICMP 回应请求数据包来查看哪些主机处于活动状态并正在响应。
    1. 有效载荷
    2. 港口
    3. 校验和
  6. 在 ICMPv6 中,当设备由于数据包大于传出链路的 MTU 而无法发送数据时,可以发送 _____ 消息。
    1. 超过时间
    2. 参数问题
    3. 数据包太大
    4. 源抑制
  7. 一些(但不是全部)ICMP 类型有一组相应的代码值,用于进一步定义 ICMP 消息。例如,_____ 都有一组代码值。
    1. Type 0Type 7
    2. Type 1Type 2
    3. Type 1Type 6
    4. Type 3Type 9

延伸阅读

请参考以下链接了解更多信息:

第四部分:常见协议的深度包分析

一旦您理解了 TCP/IP 套件的基本协议,就该对常用协议进行深入的数据包分析了——HTTP、DNS、DHCP 和 ARP。我们将详细研究每个协议的报头格式和字段值,以及可用于促进数据交换的常见选项。

本节将涵盖以下章节:

十三、潜入 DNS

域名系统 ( DNS )将人类可读的主机名转换成互联网协议 ( IP )地址。它是当今最常用的应用层协议之一,对任何网络都至关重要。在这一章中,我们将回顾 DNS 的目的和简史,以便你能更好地理解它是如何开始的。然后我们将介绍不同类型的服务器,比如根服务器、权威服务器和递归服务器。此外,我们将比较解析 IP 地址和更新区域文件时 DNS 记录的传输方式。

为了更好地理解这个协议,我们将回顾一下资源记录 ( RRs )的一些常见类型和类别。我们还将通过使用 Wireshark 深入查看报头和查询部分来检查 DNS 数据包结构。您将能够识别关键字段值,例如交易标识 ( ID )和标题标志。此外,您将能够分解 DNS 如何呈现查询的答案。然后,我们将逐步完成将主机名解析为 IP 地址的过程。您将了解到操作系统 ( OS )如何存储已解析的地址,以及它可以在缓存中保留多长时间。我们还将介绍 Wireshark 如何在故障排除时帮助您计算 DNS 响应时间,并以讨论保护 DNS 的方式结束。

本章将涵盖以下内容:

  • 认识 DNS 的目的
  • 比较不同类型的记录
  • 查看 DNS 数据包
  • 评估查询和响应

认识域名系统的目的

任何上过基本网络课程的人都会熟悉 DNS。这个众所周知的协议提供了一个基本的服务,将人类可读的主机名翻译成机器可读的数字 IP 地址。

在这一节中,我们将介绍 DNS 如何工作的概念,以及它是如何开始的简短历史。然后,我们将继续回顾解析 IP 地址所涉及的不同类型的服务器,最后比较 DNS 的传输方式。

让我们先讨论一下为什么 DNS 如此重要。

映射 IP 地址

DNS 解析主机和服务的地址,以及连接到互联网的任何对象。此外,还需要发送电子邮件,防御垃圾邮件,或发起基于互联网协议的语音 ( VoIP )对话。

每当主机发出访问资源的请求时,该过程就会通过一系列服务器进行名称解析。操作系统将首先搜索本地缓存,如果没有找到答案,它将搜索范围扩大到其他服务器,直到找到解决方案。

但是这一切是从哪里开始的呢?在下一节中,让我们回顾一下 DNS 的历史。

反思 DNS 的起源

对于我们大多数人来说,DNS 似乎已经存在很久了。但是曾经有一段时间,当互联网还年轻的时候,所有用来定位主机的都是一个纯文本文件。从早期的高级研究计划局网络 ( ARPANET )到 1987 年,DNS 的发展取得了几项重大进展,如图所示:

Figure 13.1 – Key moments in DNS history
)

图 13.1–DNS 历史上的关键时刻

阿帕网始于 1969 年,在整个 20 世纪 70 年代,这个小小的网络开始扩大,每天都在增加主机。类似于我们今天识别主机的方式,ARPANET 基础设施使用数字地址。为了定位另一台主机,科学家们设计了一个名为hosts.txt的文件,将主机名映射到它们的网络地址。

在 https://datatracker.ietf.org/doc/html/rfc597 的发现的Host Status文件包括如下条目:

101      65     UCLA-CCn        IBM 360/91      Server
204     132     UTAH-TIP                        TIP

在 ARPANET 的早期,每台主机都保存着网络上的系统列表。除了网络地址之外,他们还为它们分配了人类可读的名称,以便更容易识别它们。

然后,该文件由人工维护并分发给所有成员。在接下来的二十年中,映射的处理方式发生了重大变化:

  • 1973 年:随着 ARPANET 的扩展,科学家们认识到集中管理文件的局限性,并开始探索共享主机信息的替代方案。
  • 1983 : 征求意见 ( RFC ) 882 和 RFC 883 概述了 DNS 作为分布式(而非集中式)系统的开端。
  • 1984 年 : Berkeley 互联网域名 ( BIND )发布,提供了一种存储和检索关于对象和资源信息的方式。BIND 仍然是世界上最广泛使用的管理主机的方法。
  • 1987 : RFC 1034 和 RFC 1035 概述了我们今天所知的 DNS 框架。

虽然 DNS 以分布式方式工作,但是有一个使用区域的结构化层次结构。区域代表一个区域,管理员可以在其中提供对 DNS 对象的粒度控制。

搜索 IP 地址可能很复杂;然而,所有的起点是 DNS 根区域。我们来探讨一下这个概念。

从根开始

根服务器是响应根区域内查询的名称服务器。服务器是解析地址的重要组成部分,这样数据就可以在互联网上传输。根服务器的结构是顶层是根服务器,后面是顶级域名 ( TLD )服务器,如图所示:

Figure 13.2 – The DNS root server hierarchy
)

图 13.2–DNS 根服务器层级

DNS 根区域由全球 13 台根服务器和大约 600 台冗余根服务器组成。TLD 服务器代表域名的扩展,并提供一种组织数据的方式,以便更容易解析查询。离开 TLD,您将看到特定域的服务器,后面是它们各自的子域,如果有的话。

举个例子,如果我们从 TLD.org 开始,我们会看到以下内容:

虽然根服务器有着重要的作用,但是当发出 DNS 请求时,还会涉及到其他服务器。接下来我们来考察一下这个概念。

DNS 服务器的类型

当请求一个 IP 地址时,有两种主要类型的服务器参与事务,权威递归

首先,让我们看看在解析 IP 地址时,权威服务器是如何发挥重要作用的。

作为权威

在任何 DNS 结构中,都必须有一个权威的 DNS 服务器。权威服务器保存该域的主记录集,并在发生变化时进行更新。

在每个区域中,都有一个权威服务器。在大多数情况下,存在多个冗余。不同的类型如下:

  • 主服务器将存储所有可靠的域记录,包括 IP 地址和管理员名称,以及特定于域的 RRs。
  • 辅助服务器将存放区域文件的只读副本。它会定期通过请求区域转移来获取文件的更新版本。
  • 存根服务器只包含名称服务器 ( NS )数据,因为它的主要作用是向递归服务器发送请求。

需要一个主要权威服务器。辅助权威服务器是可选的。但是,在高请求量期间,通过分担负载来提供冗余和减少依赖性是一种很好的做法。

另一种类型的 DNS 服务器是递归服务器。

使用递归服务器

递归的服务器是一个非权威的服务器,保存普通来回用户查询的缓存副本。

当客户端请求 IP 地址时,查询可以是以下任何一种:

  • 递归是指 DNS 服务器将完成获取响应的工作。
  • 迭代是指客户端必须完成获取响应的工作。

在大多数情况下,当客户端发出 DNS 请求时,它将被定向到递归服务器。如果服务器没有请求的 IP 地址,它将代表客户端继续搜索响应。来自递归服务器的请求以迭代的方式完成,直到它们到达所请求的域的权威 DNS 名称服务器,如图所示:

Figure 13.3 – A DNS query using a recursive server
)

图 13.3–使用递归服务器的 DNS 查询

使用递归查询,GE.com的 IP 地址解析过程如下:

  1. 客户端为GE.com请求一个 IP 地址。
  2. 如果递归服务器在缓存中没有答案,它将需要查询根 DNS 服务器。
  3. 根服务器将把递归服务器指向.com的 TLD。
  4. TLD 服务器将指示递归服务器向权威域名服务器查询GE.com域名。
  5. 递归服务器然后将结果返回给客户端。

显而易见,DNS 过程涉及许多组件来解析 IP 地址。但是 DNS 是如何与其他主机通信的呢?正如我们所知,许多协议使用专用的传输方法。例如,动态主机配置协议 ( DHCP )使用用户数据报协议 ( UDP )作为其传输协议。然而,在下一节中,我们将了解 DNS 如何根据任务使用端口53使用传输控制协议 ( TCP )和 UDP 。

传输域名系统

两个主要的传输层协议是 TCP 和 UDP。区别如下:

  • UDP 是一种无连接的轻量级协议,用于需要快速传输数据的情况。
  • TCP 是一种面向连接的协议,能够在监控拥塞和提供流量控制的同时确保完整的数据传输。

传输数据时,DNS 可以使用 TCP 或 UDP。首先,让我们研究一下为什么 UDP 是发出请求时主要使用的协议。

提供快速解决方案

在大多数情况下,DNS 对主要或反向 DNS 请求使用 UDP。一个关键原因是,当主机发送查询时,目标是提供快速的解决方案。UDP 不经过握手过程;它只是请求解决方案并等待响应。

此外,UDP 是一种轻量级协议,使用小于 512 字节的数据包传输少量数据。大多数情况下,DNS 查询或响应都远远低于这个限制。

使用 UDP 是传输协议的最佳选择,因为 DNS 服务器必须快速响应并能够响应传入的查询,如果服务器必须保持 TCP 连接,这是不可能的。

虽然 UDP 是使用 DNS 时的主要传输协议,但 DNS 使用 TCP 的原因有几个。

确保完全转移

使用 DNS 时,TCP 可能被用作传输协议有两个原因:

  • 完成区域转移时,因为准确性比速度更重要。使用面向连接的流程将确保传输完成。
  • 每当有效负载大于 512 字节时,应用必须使用 TCP。

所有 DNS 记录都不相同。在下一节中,让我们比较一些 DNS RRs。

比较 RRs 的类型和分类

DNS 的核心是 RR,它包括请求资源的名称、类型、生存时间 ( TTL )和 IP 地址等信息。在这一节中,我们将回顾一些不同类型的 RR,并研究其中一种的结构。

让我们从回顾一些不同类型的 RRs 开始。

分解 DNS 类型

每当您向 DNS 服务器发送请求时,请求将包含要返回的记录类型。尽管有许多类型的 DNS RR,我们还是来看看一些常见的类型,如下表所示:

Table 13.1 – The types of DNS RRs
)

表 13.1–DNS RR 的类型

如所示,这些是普通记录;然而,还有更多。有关 DNS 类型的完整列表,请访问 https://phoenixnap.com/kb/dns-record-types。

注意

一个 AAAA 类型的 RR 是一个 IPv6 地址,也被称为四元 T2。此类型使用四个 As,因为 IPv6 地址的长度是 IPv4 地址的四倍。

现在您已经了解了一些 RR 类型,让我们来看看 RR 的结构。

检查 RR 结构

所有 RR 的结构包含描述 RR 的元素,如下表所示:

Table 13.2 – The elements in a DNS RR
)

表 13.2–DNS RR 中的元素

接下来,我们来看一个 DNS 响应包中 RR 应答的例子。为了让你能跟上,我们将从 CloudShark(【https://www.cloudshark.org/captures/13833cdd14ba】)获取一个数据包捕获。下载文件DNS Question & Answer.pcapng,并在 Wireshark 中打开它。选择帧 2 ,展开 DNS 头。然后,展开Queries部分的第一个 RR,如下图所示:

Figure 13.4 – A DNS RR answer
)

图 13.4–DNS RR 答案

在任何交易中,您都会在 DNS 数据包的结构中发现大量信息。接下来让我们对此进行调查。

查看 DNS 数据包

DNS 是一种客户端-服务器模型,用于将主机名解析为 IP 地址。要查看一个完整的 DNS 包,请转到DNS Question & Answer.pcapng并展开帧 2 中的Domain Name System (response)插入符号,如下所示:

Figure 13.5 – Expanded DNS packet
)

图 13.5-扩展的 DNS 数据包

正如您所看到的,DNS 数据包有几个部分,如下所示:

  • 第一部分( 1 )是 DNS 头。
  • 第二节( 2 )总结内容。
  • 第三部分( 3 )是查询部分。
  • 第四部分( 4 )是 Wireshark 特定的引用。

在本节中,我们将回顾 DNS 报头中的字段值,回顾 DNS 数据包的结构,然后比较 DNS 问答部分。

让我们从检查 DNS 头元素开始。

检查割台

客户端或服务器的报头结构是相同的。不同的是每个报头的字段值,它将标识消息是查询还是响应,并包括事务的其他参数。

进入DNS Question & Answer.pcapng后,展开第 2 帧中的Flags插入符号,如以下截图所示:

Figure 13.6 – The expanded DNS header
)

图 13.6–扩展的 DNS 头

检查标题字段时,您会看到两个主要部分:

  • Transaction ID
  • Flags

Transaction ID是 DNS 数据包的基本元素,因为它在查询和响应数据包的交换过程中识别特定的 DNS 事务。Wireshark 跟踪Transaction ID,以便您可以轻松地引用事务的各个部分。例如,在框 2 的底部,您会看到以下指示灯:

Figure 13.7 – Wireshark-created indicators
)

图 13.7-Wireshark 创建的指示器

Request In: 1是一个超链接,它将把您带到Transaction ID: 0x0003的请求包。

注意

Time部分列出了查询和结果响应之间经过的时间。

Transaction ID之后,您将看到Flags部分,它提供了交易的细节。但是,您会注意到,客户端的标志与服务器的标志不同。接下来我们来探讨一下。

比较标志

当比较 DNS 报头中的标志时,您会发现来自客户端的数据包和来自服务器的数据包有明显的不同。

来自客户端的标志如下:

  • 响应:设置为0,其中表示该消息为查询。
  • 操作码:对于大多数请求,操作码 ( 操作码)为0,表示这是一个标准查询。
  • 截断:当设置为0时,表示消息没有被截断。
  • 期望递归:设置为1时,表示客户端请求递归。
  • Z :过时 DNS 实现中使用的弃用标志。
  • 未认证数据:设置为0,因为该标志仅用于响应数据包。

来自服务器的标志是如下的:

  • 响应:设置为1,表示该消息为响应。

  • 操作码:对于大多数响应,操作码是0,这表明这是一个标准查询。

  • 权威:表示该服务器是否是该域的权威。当设置为0时,表示该服务器不是该域的授权机构。

  • 截断:当设置为0时,表示消息没有被截断。

  • 期望递归:设置为1时,表示客户端请求递归。

  • 递归可用:设置为1时,表示服务器可以进行递归查询。

  • Z :过时 DNS 实现中使用的弃用标志。

  • 答案认证:表示答案/权限部分是否通过服务器认证。

  • 非认证数据:用于响应包。如果该值被设置为1,这将表明所包含的所有数据都已经过 DNS 服务器的认证。

  • Reply code: 0 will indicate that there is no error.

    注意

    设置后,截断标志将指示消息是否因超出 UDP 数据包 512 字节的限制而被缩短。

操作码标志将指示正在发送的消息的类型,因为它向 DNS 服务器发出命令来执行一些动作。让我们来看看。

定义操作码

在大多数情况下当检查操作码值时,值将被设置为0,表示这是一个标准查询。但是,也可以设置其他值,如下所示:

Table 13.3 – DNS OpCode
)

表 13.3–DNS 操作码

一些操作码,如 3 和 7–15 等,目前尚未分配。但是,这种情况可能会发生变化,例如,操作码 6 DSO 是一个较新的操作码,在有活动状态时使用,例如在 TLS 会话期间。

最有可能在查询中的1处设置的一个标志是递归标志。让我们来讨论一下这面旗帜的意义。

请求递归

DNS 中有两种类型的查询——递归迭代。每当客户端提交一个 DNS 查询时,通常会看到下面的标志集—Recursion desired: Do query recursively

递归查询是首选选项,因为当可用时,DNS 服务器将完成获取响应的工作。相反,迭代查询适用于客户端必须获取响应的情况。

当服务器响应时,它将使用以下任一方式进行回复:

  • Recursion Available其中标志设置为1,这意味着服务器将完成一个递归查询
  • Recursion Not Available其中标志设置为0,这意味着服务器不会完成递归查询,因为不支持这种类型的查询

当查看请求或回复的 DNS 头时,消息头后面有四个部分。接下来我们就来探讨一下这些。

剖析数据包结构

对于查询或响应,DNS 头后面的四个部分如下:

  • Questions:请求的分辨率
  • Answers RRs:提供答案的 RR 的数量
  • Authority RRs:提供权威 NS 的 IP 地址的 RR 的数量
  • Additional RRs:包含附加信息的 RRs 的数量

举个例子,如内容摘要中的下图所示(如 2 部分所示),我们可以看到有 1 问题,它返回了 11 RRs:

Figure 13.8 – The DNS summary section
)

图 13.8–DNS 摘要部分

沿着数据包结构,您会发现查询部分,它用于发送问题或提供响应。

概述查询部分

当查看 DNS 头详细信息时,DNS 问题的格式不同于 DNS 答案,如下所示:

Figure 13.9 – DNS questions and answers
)

图 13.9–DNS 问题和答案

当客户端向 DNS 服务器发出请求时,它是在请求解析。如果我们从客户端转到DNS Question & Answer.pcapng并展开第 1 帧请求中的Queries插入符号,我们将看到以下信息:

Figure 13.10 – The DNS client query
)

图 13.10–DNS 客户端查询

第一部分( 1 )是 Wireshark 对查询部分的总结。第二部分( 2 )是 DNS 问题部分,包含以下内容:

  • 名称:请求的分辨率。在这种情况下,客户希望分辨率为Google.com
  • 类型:RR 的类型。在这种情况下,客户端请求一个A类型或 A 类型(IPv4)地址。
  • 类别:请求的 RR 的类别。在这种情况下,类被列为IN,这是最常见的 QClass 请求。

当服务器回复 DNS 请求时,它将返回客户端的查询,并(在大多数情况下)返回答案。如果我们从服务器转到DNS Question & Answer.pcapng并在第 2 帧的响应中选择Answers插入符号,我们将看到以下信息:

Figure 13.11 – The DNS server answers
)

图 13.11–DNS 服务器应答

当然,来自服务器的答案可能会有所不同。然而,在这种情况下,服务器返回了 11 个 RR。

现在您已经了解了 DNS 数据包的要素,让我们看看 DNS 进行解析时的其他一些考虑事项。

评估查询和响应

DNS 查询和响应非常简单。客户端向 DNS 服务器发送 IP 地址查询,服务器用该信息进行响应。在本节中,我们将了解事务期间的一些行为,例如缓存响应,以及使用 Wireshark 监视事务期间的平均响应时间。

然后,我们将评估当我们需要对 DNS 进行故障诊断时会发生什么,以及nslookup如何帮助检查和验证响应。最后,我们将看看欺骗 DNS,以及我们如何保护这个过程。

让我们从了解缓存如何在 DNS 过程中发挥作用开始。

缓存响应

网络上的任何事情都有时间限制。DNS 也不例外。当服务器返回响应时,答案中有几个元素。该响应中包含 TTL 值,它反映了记录在消失之前可以在缓存中存在多长时间。

TTL 值因系统而异,但通常由域名所有者设置。

图 13.4 中,我们可以看到Time to live: 4 (4 seconds),这意味着响应可以在缓存中存在 4 秒钟。

注意

请记住,DNS RR 中的 TTL 值不同于 IPv4 报头中的 TTL 值。DNS RR 中的 TTL 是响应可以在缓存中存在多长时间。IP 报头中的 TTL 表示数据包在被路由器丢弃之前可以经过多少跳。

DNS RRs 的 TTL 值变化很大是很常见的。要在 Windows 机器上检查自己的缓存,打开命令提示符并键入ipconfig /displaydns。这将显示缓存中保存的您自己的 DNS RRs 的列表,例如,在运行命令后,我选择了其中一个记录,如下所示:

api.wildtangent.com

记录名称。。。。。:api.wildtangent.com

记录类型。。。。。: 1

是时候活下去了。。。。: 17

数据长度。。。。。: 4

部分。。。。。。。:回答

(主)记录。。。: 34.210.94.123

在响应中,我们可以看到api.wildtangent.com的 RR 答案的Time To Live值为17(秒)。

如果 17 秒后,操作系统需要api.wildtangent.com的 IP 地址,而 DNS 信息不在缓存中,它必须发出另一个 DNS 查询。

大多数 DNS 查询和响应都在 120 毫秒(ms 或 msec)或 0.12 秒以下;然而,一些响应可能需要更长时间。接下来,让我们看看如何使用 Wireshark 来计算响应时间。

计算响应时间

DNS 响应时间可能有所不同;然而,有时回应似乎比平时要长。为了测试响应时间,网络管理员有多种工具。例如,要测试你的 DNS 提供商的速度,去 https://www.dnsperf.com/dns-speed-benchmark 的。一旦出现,在域名字段中输入example.com,然后选择运行测试。该网站将显示世界各地服务器的响应时间。向下滚动,您将看到如下结果:

  • 36 ms [United States] United States, Dallas (DC139)
  • 14 ms [United States] United States, Asheville (DC82)
  • 126 ms [Egypt] Egypt, Cairo (DC225)

您还可以使用 Wireshark 生成的统计数据来查看响应时间。让我们来看看。

查看 DNS 响应时间

为了向您展示一个更长 DNS 响应时间的可视化示例,我们将使用bigFlows.pcap。你可以在http://tcpreplay . app neta . com/wiki/captures . html # big flow-pcap找到 big flow。

打开bigFlows.pcap后,应用以下过滤器:

(((((dns) && (dns.flags.response == 1)) && !(sflow)) && !(icmp)) && !(dns.flags.rcode == 2)) && (dns.time > 0.2)

该过滤器将执行以下操作:

  • 使用dns过滤器显示所有 DNS 流量
  • 使用dns.flags.response == 1过滤器仅显示 DNS 响应
  • 使用!(dns.flags.rcode == 2)忽略任何 DNS 服务器错误
  • 使用!(sflow)) && !(icmp)过滤器移除所有管理流量,例如互联网控制消息协议 ( ICMP )和采样流量 ( sFlow )流量
  • 使用dns.time > 0.2过滤器缩小搜索范围,仅显示响应时间大于 0.2 秒的数据包

运行过滤器后,可以添加一个列标题来显示响应时间。

要添加列标题,请先展开 DNS 标题以查看详细信息。接下来,找到 Wireshark 生成的值Time,如下所示:

Figure 13.10 – The DNS server answers
)

图 13.10–DNS 服务器应答

右键单击该值并选择应用为列。要调整和编辑列以便更好地可视化数据,右键单击任何列标题并选择列首选项…

在那里,您可以通过单击并拖动列标题到所需的位置来移动列。为了显示响应时间,我重命名了快捷方式DNS Response time并禁用了一些列标题,如下所示:

Figure 13.11 – Column preferences
)

图 13.11–列首选项

在您调整了列的标题后,您可以通过单击一次 DNS 响应时间标题来对 DNS 响应时间进行排序,以显示最长的时间值。结果如下所示:

Figure 13.12 – BigFlows showing DNS response times
)

图 13.12–显示 DNS 响应时间的大流量

如图所示,DNS 响应时间可能会有所不同。虽然这是意料之中的,但查看 DNS 服务健康状况的另一种方法是检查统计数据。为此,进入统计 | DNS ,这将打开 DNS 统计窗口。我应用了!(dns.flags.rcode == 2)过滤器,然后删除了服务器故障错误,如下所示:

Figure 13.13 – BigFlows DNS statistics
)

图 13.13–大流量 DNS 统计

在统计窗口中,您可以看到各种计算值。窗口中央是服务统计数据。我们可以从这个(过滤后的)捕获中看到,以毫秒为单位的请求-响应时间如下:

  • 平均请求-响应时间–69.67毫秒

  • 最短请求-响应时间–0.082000毫秒

  • Maximum request-response time – 509.076996 milliseconds

    注意

    在大多数情况下,您会希望看到服务器故障错误。然而,在这个捕获中,有太多的错误扭曲了响应时间统计。

DNS 统计在故障排除过程中是一个非常有用的工具。例如,值得研究以下问题:

  • 请求-响应时间过长或响应失败的查询可能表明 DNS 服务器有问题,例如瓶颈或失败的网络接口卡 ( NIC )。
  • 如果您看到异常大量的请求和响应,这可能表明 DNS 隧道。
  • 大量请求和响应也可能表示主机正在与命令和控制 ( C & C )服务器通信,该服务器用于远程控制受感染的主机。
  • 经历不成比例的大量 DNS 响应可以表明 DNS 拒绝服务 ( DoS )可能在起作用。

接下来,让我们来看看nslookup,这是一个可以在排除 DNS 故障时使用的命令行工具。

使用 nslookup 进行测试

设置和维护 DNS 服务器是一项挑战。 DNS 服务是必不可少的,如果配置不当,这可能会导致主机之间的通信能力出现严重问题。此外,如果 DNS 缓存已中毒,这也将阻止主机通信,并可能将客户端误导到恶意站点。

在 Windows 机器上进行快速测试的一个方法是使用nslookup,这是一个命令行工具,主要用于解决 DNS 问题。

要使用nslookup,请转到启动,然后输入Run。进入应用后,输入cmd,如下图所示:

Figure 13.14 – Using Run
)

图 13.14–使用运行

一旦进入命令行界面,键入nslookup example.com,然后按进入。一旦运行,我的输出如下:

c:\ > nslookup example.com

服务器:cdns01.comcast.net

地址:2001:558:feed::1

非权威回答:

姓名:example.com

地址:2606:2800:220:1:248:1893:25 c8:1946

93.184.216.34

请求首先到我的互联网服务提供商 ( ISP ),然后cdns01.comcast.net解析 IP 地址。

注意

在 macOS 和/或 Linux 上,使用dig命令将提供类似的结果。

DNS 可能遭受恶意活动。在下一节中,让我们讨论一些与 DNS 相关的安全问题。

保护域名系统

DNS 已经被用来解析地址很多年了。在互联网的早期,没有任何保护协议的考虑。因此,它可能会遭受缓存中毒和欺骗等攻击。

首先,让我们概述一下如果恶意行为者毒害缓存会发生什么。

毒害缓存

DNS 对任何网络都是必不可少的。当客户端请求 IP 地址时,它们相信服务器会提供准确的地址。如果地址不正确,客户端可能会被重定向到一个虚假的站点。

DNS RRs 有一个 TTL 值,表示它们可以在缓存中存在多长时间,缓存是 DNS 记录的临时保存区域。缓存是一个重要的概念,因为它提供了一种对查询发送更快响应的方式。

缓存中毒将欺骗信息注入到 DNS 服务器的缓存中。恶意行为者利用这种攻击来误导请求 DNS 解析的客户端。攻击的结果将取决于中毒的服务器。在一个局域网 ( 局域网)上,所有本地用户都会受到影响。然而,毒害 ISP 服务器的缓存将会产生广泛的影响。

防范破坏 DNS 的攻击至关重要。让我们研究一下实现这一点的方法。

捍卫 DNS

DNS 服务器代表易受攻击的目标。为了保护服务器,网络管理员可以采用一些技术:

  • 使用缓存锁定,它控制如何以及何时可以覆盖缓存。
  • 将区域传送限制为只响应受信任的服务器。
  • 使用 DNS 安全扩展 ( DNSSEC ),由提供数据认证和完整性。

此外,应使用所有其他保护 DNS 服务器的标准良好实践技术。技术包括保持服务器更新和修补,并使用防火墙,限制访问只有授权的实体。

总结

在本章中,我们概述了 DNS 的用途,回顾了服务器的类型,然后比较了 DNS 的传输方式。然后,我们评估 RR 的类型和类别,然后分析 RR 中包含的结构和信息。接下来,我们检查了一个 DNS 数据包,深入研究了报头字段和标志,分析了数据包结构,并回顾了查询部分。

到目前为止,您应该对 DNS 查询和响应过程有了很好的理解,并且能够识别 TTL 值,该值表示该值可以在缓存中保留多长时间。此外,我们还了解了如何在 Wireshark 中检查 DNS 统计数据,以及如何使用nslookupdig等工具测试 DNS。然后,我们通过讨论潜在威胁以及如何保护 DNS 的一般建议进行了总结。

在下一章中,我们将首先解释动态主机配置协议 ( DHCP )的必要性,并回顾这一基本协议的目的。为了让您理解如何从 DHCP 服务器获得 IP 地址,我将概述一下发现提供请求确认 ( DORA )过程。然后,我将剖析 DHCP 报头,查看所有字段值标志和端口号,然后以一个 DHCP 示例结束。

问题

现在,是时候检查你的知识了。选择最佳答案,然后检查您的答案,这些答案可在评估附录中找到:

  1. _____ 服务器是响应根区域内查询的名称服务器,是解析地址的重要组成部分。
    1. 递归的
    2. 多余的
    3. 贮藏
  2. 在任何 DNS 结构中,都必须有一个(n)_ _ _ _ _ _ DNS 服务器来保存域的主记录集,并在发生变化时进行更新。
    1. 递归的
    2. 多余的
    3. 命令式的
    4. 贮藏
  3. DNS RR 有很多种。类型 12 _____ 将 IP 地址转换为域名。
    1. AXFR
    2. 麦克斯韦(maxwellˌ磁通量单位)ˌ中性(Middlesex)
    3. AAAA
    4. 中石油
  4. 当被设置时,____ 标志将指示消息是否因为超过了 UDP 数据包 512 字节的限制而被缩短。
    1. 递归的
    2. 贮藏
    3. 变钝
    4. 缩短了的
  5. 经历不成比例的大量 DNS 响应可能表明可能存在 DNS _____ 攻击。
    1. 电子欺骗
    2. 两个
    3. 缩短
    4. 储藏毒药
  6. 在 DNS 问题部分,____ 是请求的解决方案。
    1. 名字
    2. 类型
    3. 班级
    4. 隐藏物
  7. 在 Windows 机器上解决 DNS 问题的一种方法是使用 _____ 命令行工具。
    1. baseline
    2. boost
    3. nslookup
    4. dig

延伸阅读

请参考以下链接了解更多信息:

十四、检查 DHCP

每当你第一次启动你的机器开始你的一天,你的操作系统 ( OS )会经历一系列的事件。其中一个事件是获得一个互联网协议 ( IP )地址。用来获取你的 IP 地址的协议被称为动态主机配置协议 ( DHCP )。在本章中,我们将从回顾 DHCP 的目的开始。然后,我们逐步完成 DHCP 过程,它有四个步骤:发现提供请求确认,也称为多拉过程。

为了熟悉使 DHCP 过程成为可能的元素,我们将仔细研究 DHCP 报头中的字段值。此外,在这个过程中,您将更好地理解客户机和服务器的角色。我们还将了解 DHCPv6,它用于为越来越多的采用 IPv6 的网络提供 IP 地址。我们还将回顾这个基本协议的一些安全方面,然后提供一个 DHCP 事务的例子。

在本章中,我们将讨论以下主题:

  • 认识 DHCP 的目的
  • 逐步完成 DORA 流程
  • 剖析 DHCP 报头
  • 以 DHCP 为例

认识 DHCP 的目的

网络中的每台主机都必须有唯一的 IP 地址,才能与其它网络主机通信。一些主机,比如服务器和打印机,有一个硬编码的 IP 地址,因为他们不希望 IP 地址改变。但是,绝大多数主机都有一个动态分配的 IP 地址。

DHCP 是一种在网络上使用的方法,用于向网络上的主机提供配置信息。除了提供 IP 地址之外,大多数响应还提供了其他信息。这些信息可以包括域名服务 ( DNS )服务器的 IP 地址和网络时间协议 ( NTP ),为网络提供时间服务。

DHCP 让您在繁忙的网络上节省 IP 地址。它还消除了对单个 IP 地址的繁琐和不必要的硬编码的需要。

DHCP 是一种客户端-服务器模型,其中主机请求一个 IP 地址,服务器用一个由租借一段时间的 IP 地址来响应。租用时间可能会有所不同,因为通常由网络管理员来配置 DHCP 服务器的不同参数。

当你请求一个 IP 地址时,一个客户至少会收到一个,但在许多情况下,会提供两个,因为许多网络使用多个服务器来实现冗余。

在企业网络中,DHCP 将使用以下元素:

  • DHCP 客户端:这些主机已经被配置为在其网络绑定中自动获取 IP 地址。
  • DHCP 服务器:这些服务器从可用的地址池中向网络上的客户端发布 IP 地址,以及特定时间段的配置数据。
  • DHCP 中继代理:当 DHCP 服务器与 DHCP 客户端位于不同的子网时,可以选择使用这个代理。中继代理接收请求,并代表客户端将(单播)消息定向到另一个子网上的 DHCP 服务器。

每当主机加入网络或醒来时,它将开始 DHCP 进程以获取 IP 地址并开始通信。为此,必须将主机配置为自动获取 IP 地址。

配置客户端的 IP 地址

在大多数情况下,DHCP 是在主机上自动配置的,例如,进入网络连接并选择您的网络接口卡的属性,互联网协议第 4 版(TCP/IPv4)属性。在那里,您可能会看到自动获取 IP 地址设置,如下面的截图所示:

Figure 14.1 – Internet Protocol Version 4 (TCP/IPv4) Properties
)

图 14.1–互联网协议版本 4 (TCP/IPv4)属性

一个局域网 ( LAN )上的大多数主机都被配置为自动获取一个 IP 地址。每当客户端启动时,它将通过尝试访问 DHCP 服务器来获取 IP 地址。然而,有时 DHCP 服务器与客户端不在同一个子网中。在这种情况下,必须使用中继代理。

使用 DHCP 中继代理

在 IPv4 子网络上,依赖于使用 DHCP 获取 IP 地址的客户端使用网络上的广播开始该过程。如果子网上没有 DHCP 服务器,客户端将需要一种到达服务器的方法。大多数路由器不转发广播,因此如果 DHCP 服务器在路由器的另一端,客户端将需要使用中继代理来代表它们请求 IP 地址。

中继代理配置有 DHCP 服务器的 IP 地址。代理驻留在 DHCP 客户端驻留的路由器接口上,以便它可以响应 DHCP 广播。一旦发现数据包被接受,中继代理将使用单播数据包直接与 DHCP 服务器通信。

中继充当代理,并在 DHCP 客户端和服务器之间提供桥梁,如下图所示:

Figure 14.2 – Using a DHCP relay agent on a router
)

图 14.2–在路由器上使用 DHCP 中继代理

在使用中继代理的子网络上,使用 DHCP 获取 IP 地址的过程按以下方式进行:

  1. 客户端在子网上发送发现广播。
  2. 中继代理代表客户端收集请求。
  3. 请求被重新打包,然后通过单播直接发送到 DHCP 服务器。
  4. 服务器用一个包含 IP 地址的提议来响应中继代理,以及客户机请求的任何可选信息。
  5. 中继代理将要约转发给客户端,并将继续在客户端和服务器之间交换消息,直到最终确认。

DHCP 为 IPv4 主机提供了一种获取 IP 地址的方式。在下一节中,我们将概述网络上使用 IPv6 的客户端获取 IP 地址的方式。

使用 IPv6 地址

虽然今天许多局域网主要使用 IPv4,但我们开始看到一小部分组织采用 IPv6。使用 IPv6 时,有三种方式在主机上配置 IP 地址:

  • 在需要静态 IP 地址的主机(如服务器和打印机)上手动配置地址。
  • 使用无状态地址自动配置 ( SLAAC )自动分配给一个 IP 地址。
  • 使用 DHCPv6 从预先配置的地址池中发布地址。

虽然 LAN 中的少数主机会有一个手动分配的 IPv6 地址,但绝大多数主机需要通过其他方式获得网络地址。让我们比较一下 IPv6 客户端获取 IP 地址的方式。我们将从讨论如何使用 SLAAC 开始。

使用 SLAAC

在 IPv6 网络上,SLAAC 是分配 IP 地址的首选方式。当你使用 SLAAC 时,网络管理员需要配置一个路由器来发布它的前缀。然后使用前缀,以便每个客户端可以生成自己的 IPv6 地址。

SLAAC 通过执行以下操作来创建 IPv6 地址:

  1. 首先,它从客户端的网卡 ( NIC )获取一个 12 位(48 位)媒体访问控制 ( MAC )地址。
  2. 然后,它将组织唯一标识符 ( OUI )和网卡序列号分开。
  3. 最后,它在 OUI 和 NIC 序列号之间插入 16 位标识符0xFFFE

完成后,它将如下所示:

Figure 14.3 – Generating an IPv6 using SLAAC
)

图 14.3–使用 SLAAC 生成 IPv6

当您使用 SLAAC 时,为网络主机生成 IPv6 地址是自动完成的。但是,DHCPv6 仍然可以使用,因为它可以为主机提供额外的配置选项。

使用 DHCPv6 提供信息

虽然 SLAAC 可以提供一种有效的方法来自动创建 IPv6 地址,但是主机可能需要附加信息,这些信息可以通过使用 DHCPv6 来提供。

DHCPv6 服务器可以向网络上的客户端提供的一些配置数据包括以下内容,以及相应的注释请求 ( RFC ,您可以在这里找到更多信息:

Table 14.1 – DHCPv6 options
)

表 14.1–DHCP V6 选项

例如,如果一个客户端已经使用 SLAAC 获得了一个 IP 地址,他们可以发送一个带有概述所请求的配置参数的选项请求Information-Request数据包消息。下面是一个例子:

Figure 14.4 – DHCPv6 Option Request
)

图 14.4–DHCP V6 选项请求

DHCP 是一种广泛使用的协议,它使主机能够自动获取 IP 地址。然而,在使用 DHCP 时,解决可能的安全风险是很重要的。

解决安全问题

DHCP 于 1993 年正式成为一种协议。在那段时间里,很少有人考虑提供方法来保护 DHCP 和 DHCP 服务器免受恶意活动的攻击。然而,流氓设备有可能发起攻击,例如 DHCP 饥饿攻击。

出现这种情况的一个主要原因是,当使用 DHCP 时,客户端和服务器之间没有本地身份验证或授权。因此,网络管理员应该采取措施,确保在任何 DHCP 交互之前,DHCP 服务器只与网络上的合法客户端进行交互。

一种方法是使用 DHCP 侦听。当在第 2 层设备(如交换机)上配置时,DHCP 侦听将监控流量并执行以下操作:

  • 允许有效的 DHCP 客户端消息与 DHCP 服务器通信。
  • 允许有效的 DHCP 服务器消息与 DHCP 客户端通信。
  • 拒绝并丢弃来自不可信来源的流量。

此外,在 Windows Server 环境中,DHCP 服务器必须在 Active Directory 中获得授权,才能开始租用地址。这是一个验证检查,以确保客户端不会从恶意 DHCP 服务器接收地址。

在下一节中,我们将描述使用 DORA 进程获取 IP 地址的过程。

逐步完成 DORA 流程

DHCP 过程是一种向客户端提供地址的有效方式。因为我们想要我们的 IP 地址快,它使用用户数据报协议 ( UDP )作为传输层协议。

DHCP 使用下列 UDP 端口:

  • 客户端使用端口68
  • 服务器和中继代理使用端口67

DHCPv6 使用下列 UDP 端口:

  • 客户端使用端口546
  • 服务器和中继代理使用端口547

当我们检查 DHCP 流量时,您会看到这些端口正在使用。

DHCP 进程在事务处理过程中会经历不同的状态,这将在下一节中介绍。

在 DHCP 状态间移动

在 DHCP 事务的过程中,客户端可以处于六种状态之一。了解这些状态和发生的情况将有助于故障排除。这些 DHCP 状态如下:

  • Initiate :客户端通过在网络上发送广播来搜索 DHCP 服务器,从而开始这个过程。
  • 选择:客户端将选择服务器发送的报价。
  • 请求:客户端将正式向服务器请求报价。
  • 绑定:一旦服务器发送 IP 地址,客户端将保持绑定状态,直到租约到期。
  • 续租:在此状态下,客户端会请求续租。此时,两件事情中的一件可能发生:
    • 如果服务器发送了一个 ACK,租约将被更新,客户端将返回到绑定到阶段。
    • 如果服务器没有发送 ACK,并且 87.5%的时间已经过去,则客户端移动到重新绑定阶段。
  • 重新绑定:在此状态下,客户端将尝试重新绑定。此时,可能会发生以下两种情况之一:
    • 如果服务器发送了一个 ACK,则租约被更新,并且客户端回复到绑定到阶段。

    • If the lease expires or the server sends a Negative Acknowledgment (NAK), the client will revert to the initiate stage.

      注意

      当您处理数据包捕获时,您可能会看到 Wireshark 将应用识别为引导协议(bootpc),因为这是协议的原始名称,如 RFC 951 中所述。但是,要仅查看 DHCP 流量,请使用显示过滤器工具栏中的dhcp(小写)过滤器。

当你经历 DHCP 过程的各个阶段时,必须有一种方法将事务保持在一起。让我们看看交易标识符 ( XID )在这个过程中扮演什么角色。

定义交易 ID

在整个 DORA 过程中,您将看到一个由客户端随机生成的 XID。服务器将采用相同的 XID,客户端和服务器都将能够识别哪些事务属于同一个事务。

在极少数情况下,客户无法提供 XID。在这些情况下,服务器将使用客户端硬件地址 ( chaddr )来识别客户端。通常不建议使用 chaddr,因为它可能会导致不良后果。此外,恶意行为者可以通过使用伪造的 chaddr 向 DHCP 服务器发送大量请求来尝试饥饿攻击。这可能会阻止合法用户获得 IP 地址。

每当客户需要一个 IP 地址时,它就开始通过四个步骤的 DORA 过程。让我们仔细分析一下这个过程。

获取 IP 地址

DORA 流程经历了四个阶段,如所示:

  • DHCP Discover :这个过程始于客户端在网络上发出广播,请求 IP 地址。

  • DHCP Offer :服务器通过提供一个 IP 地址来响应。在回复中,通常有许多参数。

  • DHCP 请求:客户端正式请求 IP 地址。

  • DHCP ACK: The server offers an IP address.

    注意

    DHCP 过程通常用四个步骤来描述。然而,实际上有两个操作——客户端请求 IP 地址,客户端正式请求 IP 地址。因此,前两个和后两个数据包的 XID 可能不同。

在这一节中,我们将概述每个步骤中发生的事情,从客户端尝试定位服务器开始。

搜索 DHCP 服务器

当主机需要 IP 地址时,它通过向子网发出 DHCP Discover广播消息来开始 DORA 进程。chaddr 与客户选择的 XID 一起列出。

Discover包中,可能有请求附加配置参数的 DHCP 选项,以及对 IP 地址的可能建议。

如果在与 DHCP 客户机相同的子网上没有 DHCP 服务器,中继代理将需要从另一个子网上的 DHCP 服务器请求 IP 地址。

一旦广播在 LAN 上发出,一台或多台 DHCP 服务器将响应一个提议。

提供地址

一旦服务器接受了Discover数据包,下一步就是检查 DHCP 池中可用的 IP 地址。如果有可用的地址,服务器将记录 XID 并返回一个 DHCP offer。

报价将有一个供客户使用的网络地址,以及租赁时间参数。此外,客户端可能会在 DHCP Discover数据包中发送对所请求选项的响应。

注意

尽管客户端可能已经请求了一个特定的 IP 地址(例如,一个以前使用过的地址),但是服务器并不一定要接受这个请求。但是,最好的做法是向客户端提供一个请求的 IP 地址,以避免任何冲突。

此时,客户端将从一个或多个 DHCP 服务器接收提议。

请求地址

一旦客户收到报价,下一步就是正式请求 IP 地址。如果 DHCP 客户端收到多个提议,它将检查每个提议,并接受、丢弃或拒绝提议,如下所示:

  • 如果客户端接受来自服务器的 DHCP 提议,DHCP 请求消息将作为广播发送,其中必须包括服务器标识符选项,以及由 DHCP 服务器提供的 IP 地址。
  • 当客户端收到 DHCP offer 消息时,它将检查以确保 DHCP offer XID 与 DHCP discover 消息的 XID 相匹配。如果它们不匹配,客户端将放弃 DHCP 提供。
  • 如果客户端收到多个提议,它将通过向其中一个服务器发送 DHCP 拒绝消息来拒绝提议。

最后一步是服务器用一个 IP 地址或 DHCP NAK 来响应客户端,我们接下来会看到。

确认参数

在发送一个 IP 地址后,服务器等待客户机的响应。一旦服务器接收到广播,它将向客户端发送 DHCP 确认 ( DHCP ACK )以指示四包 DHCP 发现过程的完成。

确认数据包包含 IP 地址,以及客户端在 DHCP 请求数据包中请求的任何配置选项。

然而,有时服务器无法为客户端提供 IP 地址。如果发生这种情况,服务器将向客户端发送 DHCP NAK,客户端必须再次启动 DORA 进程。

DHCP NAK 消息很少出现,但是如果您在网络上看到多个 DHCP NAK 消息,您将需要评估客户端无法获得 IP 地址的根本原因。造成这种情况的一些原因如下:

  • 配置错误的 DHCP 地址池。
  • DHCP 地址池已耗尽(IP 地址已用完)。
  • DHCP 服务器是饥饿攻击的受害者。
  • 配置错误的 DHCP 中继代理。

好消息是,在大多数情况下,客户端会收到一个 IP 地址。此后,客户端将检查是否有任何其他主机正在使用相同的 IP 地址。

检查重复的 IP 地址

一旦客户端获得了一个 IP 地址,它将经历一个过程,以确保新分配的地址还没有被使用。

要检查重复的 IP 地址,可以使用以下方法:

  • 在 IPv4 网络上,客户端会将地址解析协议 ( ARP )请求从广播到网络上,然后等待另一台主机是否响应。
  • 在 IPv6 网络上,客户端会发送互联网控制消息协议 ( ICMPv6 )邻居请求消息。

如果一个 IP 地址已经被使用,客户端必须向服务器发送 DHCP 拒绝,并重新开始 DORA 过程。然而,在大多数情况下,IP 地址还没有被分配,所以客户端可以接受这个 IP 地址。

一旦客户端接受了 IP 地址,并且服务器发送了最终的 DHCP ACK,客户端就进入绑定状态,直到租期结束。接下来,让我们看看当客户端从服务器租用 IP 地址时会涉及到什么。

租用 IP 地址

租赁背后的想法是,网络地址只在短期内需要,在某个时候,主机将不再需要 IP 地址。这使得能够实现更加灵活的环境和有限 IP 地址的高效共享。

租用时间定义了客户端可以使用 IP 地址的时间长度,根据环境的不同而有所不同。

定义租赁时间

DHCP 租借时间默认为 24 小时(1440 分钟)。但是,该值通常由网络管理员设置,并且可能会有所不同,如下所示:

  • 在一个高度不稳定的环境中,客户停留的时间很短,例如在健身房或发廊,将租赁时间设置为 60-90 分钟是合适的。
  • 在短暂的环境中,客户会短暂停留,将租赁时间设置为 1 到 3 天是合适的。
  • 在稳定的环境中,主机很少移动,客户端会停留很长时间,将租用时间设置为 1 到 3 周是合适的。

当计时器开始计时时,租用时间会经历不同的状态,如下图所示:

Figure 14.5 – DHCP lease time process
)

图 14.5–DHCP 租用时间过程

一旦服务器发送了最终的确认,客户机就启动一个定时器来监控租用时间。定时器 1 ( T1 )至定时器 2 ( T2 )的值如下:

  • Rebind (T1)表示 50%的租用时间。
  • 续订(T2)占租赁时间的 87.5%。

随着租赁时间从 T1 移到 T2,会发生各种事件。让我们概述一下这个过程,从 T1 之前发生的事件开始。

接近更新阶段

一旦客户端获得租约,计时器就开始计时。当计时器逐渐接近 T1 时,客户可能(也可能不会)选择延长租期。如果客户端想要更新 IP 地址,更新数据包将直接发送到 DHCP 服务器。此时,如果服务器发送 DHCP ACK,租约将被续订,客户端将恢复到绑定阶段。

但是,如果服务器没有发送 ACK,并且已经过了 87.5%的时间,则客户端进入重新绑定阶段。

走向重新绑定阶段

如果服务器没有及时发送 DHCP ACK,客户端将通过在网络上广播 DHCP 请求消息来尝试重新绑定。如果服务器发送了一个 ACK,租约将被更新,客户端将返回到绑定到阶段。

但是,如果租约到期或服务器发送 NAK,客户端必须返回到 initiate 阶段,重新开始该过程。

现在您已经了解了 DORA 过程,让我们来看看 DHCP 报头,并回顾一下字段值、标志和端口号。

剖析 DHCP 报头

查看 DHCP 数据包时,您会看到报头中有许多字段,如下所示:

Figure 14.6 – DHCP packet structure
)

图 14.6–DHCP 数据包结构

要跟进,请从https://wiki . Wireshark . org/uploads/_ _ moin _ import _ _/attachments/sample captures/DHCP . PCA pand获取一份DHCP.cap的副本,并在 Wireshark 中打开它。展开帧 1 中的 DHCP 报头,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 14.7–DHCP 报头

正如我们所见,每个 DHCP 报头都包含关键字段和标识符。让我们更详细地看看这些。

检查 DHCP 字段值

在标题中,您将看到帮助 DORA 流程在各种状态间移动的关键字段。字段值如下所示:

  • 操作码 ( op ):表示报文类型;比如1 = BOOTREQUEST或者2 = BOOTREPLY。在 Wireshark 中,这显示为Message type,如前面的截图所示。

  • 硬件类型(h 类型):这定义了会话的连接类型。通常,这个字段被列为Ethernet (0X01),因为消息通常来自以太网或 802.11 客户端。

  • 硬件长度 ( hlen ):以字节为单位定义硬件地址的长度。以为例,在帧 1 中,长度为 6(字节),这是 MAC 地址的常见大小。

  • 跳数:该字段为,可选由中继代理使用。通常,该值设置为 0。

  • XID :由客户端选择,用于跟踪客户端和服务器之间的消息。

  • ( ):这指定了从开始 DORA 或更新过程以来已经过去的时间。该值由客户端设置。

  • 旗帜:有两个旗帜,如下:

    • 广播标志:该选项由客户端设置,指示服务器如何将消息发送回客户端。
    • 保留标志:未使用。
  • 客户端 IP 地址 ( ciaddr ):这是客户端的当前 IP 地址,只有当客户端处于以下三种状态之一时才会有一个值:绑定、续订或重新绑定。

  • 您的 IP 地址(yiaddr):DHCP 服务器提供的 IP 地址。

  • 服务器 IP 地址 ( siaddr ):响应请求的 DHCP 服务器的 IP 地址。

  • 中继代理 IP 地址 ( giaddr ):中继代理或网关的 IP 地址。

  • chaddr:客户端的 MAC 地址。

  • 服务器主机名 ( sname ):可选值,包含服务器的名称。

  • 引导文件:这是一个可选文件,用于预引导执行环境 ( PXE ),比如瘦客户端,其中设备通过网络引导。

  • Options: DHCP options are listed after the main header.

    注意

    在报头字段的末尾,您会看到一个名为Magic cookie: DHCP的字段,它提醒网络主机选项是 DHCP,而不是传统的Bootstrap Protocol (BOOTP)

当你在检查 DHCP 流量时,经常会看到像DHCPDISCOVERDHCPOFFER这样的消息。但是,DHCP 还使用其他一些消息来传递信息。

了解 DHCP 消息

DHCP 消息在客户端和服务器之间交换,以请求配置数据等信息或提供状态更新。下表概述了各种类型的消息及其用途:

 Table 14.2 – DHCP messages
)

表 14.2–DHCP 消息

在 DHCP 报头之后,可能会列出几个选项。在接下来的几节中,我们将简要了解一些我们可能会遇到的 DHCP 选项。

比较 DHCP 选项

DHCP.cap帧 1 的 DHCP 报头中,紧接着Magic cookie标识符之后,可以看到一个选项列表,如下所示:

Figure 14.8 – DHCP header
)

图 14.8–DHCP 报头

DHCP 可以有多个选项,如下所述:https://www . iana . org/assignments/BOOTP-DHCP-parameters/BOOTP-DHCP-parameters . XHTML

其中一些选项如下:

  • DHCP 选项 3 :路由器(或网关)地址
  • DHCP 选项 6 : DNS 服务器地址
  • DHCP 选项 50 :请求的 IP 地址
  • DHCP 选项 51 :该 IP 地址的租用时间
  • DHCP 选项 53 :报文类型

在每个选项中,将列出各种参数。例如,在帧 1 中,我们可以看到Option: (61) Client identifier,它列出了客户端的 MAC 地址,如下所示:

Figure 14.9 – DHCP Option 61
)

图 14.9–DHCP 选项 61

虽然有几个选项,但最常用的选项是Option: (53),它描述了消息的类型。例如,在下面的截图中,我已经展开了Option字段,您可以看到消息的类型是 DHCP Release:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 14.10–DHCP 版本选项

现在我们已经了解了 DHCP 的一般作用和用途,以及报头字段值和选项,让我们来看一个 DORA 过程的例子。

以 DHCP 为例

当主机启动并试图加入网络时,他们必须做的第一件事就是获得一个 IP 地址。

在这一节中,我们将看看当客户端发布 DHCP 版本时,您可能会看到什么。然后,我们将逐步完成 DORA 过程,并概述当客户端获得 IP 地址时所采取的每个步骤的细节。

让我们先来看看当一个客户端释放他们的网络地址时会发生什么。

释放 IP 地址

有时您可能需要释放和更新 IP 地址,例如在故障排除练习期间。

在 Windows 机器上释放 IP 地址的一种方法是打开命令提示符并键入ipconfig /release。要更新 IP 地址,请键入ipconfig /renew

我做了手动释放,然后在用 Wireshark 捕获流量时更新。结果如下所示:

Figure 14.11 – DHCP Release and Renew
)

图 14.11–DHCP 释放和更新

第一帧中,可以看到我发布 IP 地址的地方,还有一个0xa7c87247XID,如下图所示:

Figure 14.12 – DHCP Release message
)

图 14.12–DHCP 释放消息

注意

当您发送 DHCP Release 消息时,服务器通过使用 chaddr(即18:47:3d:4d:35:bb)和 ciaddr(即10.0.0.75)来识别客户端。

一旦 DHCP 服务器收到释放消息,IP 地址就会返回到地址池中。

接下来,我进入ipconfig /renew命令,开始 DORA 进程,如图帧 2帧 3帧 4帧 5 。在这个多拉过程中,我们可以看到一个0xb5de0170XID

最后,在帧 6 中,一旦我接受了 IP 地址,我就发送一个 ARP 探测来检查重复的 IP,以确保我的 IP 地址没有被其他主机使用。

现在,让我们一起浏览一下 DORA 流程。要跟进,请在 Wireshark 中打开DHCP.cap,这样您就可以看到前四个数据包中 DORA 过程的四个步骤,如下所示:

Figure 14.13 – The four-packet DORA process
)

图 14.13–四包 DORA 流程

注意

虽然已经列出了各种选择,但我们将主要关注交易的细节。

该过程从客户端在网络上发送广播消息开始。

广播发现包

帧 1 中,我们可以看到DHCP Discover消息,如下图所示:

Figure 14.14 – DHCP Discover packet
)

图 14.14–DHCP 发现数据包

Discover消息中,您可以看到以下关键值:

  • Message type: Boot Request (1)
  • Transaction ID: 0xb5de0170
  • Your (client) IP address: 0.0.0.0
  • Client MAC address: 18:47:3d:4d:35:bb

此时,客户端的 IP 地址是0.0.0.0Transaction ID0x00003d1d,客户端和服务器都将使用它来跟踪事务。在帧 1 的选项中,我们没有看到对特定 IP 地址的请求。但是,如果被请求,服务器通常会提供客户端使用的最后一个地址。

一旦广播在局域网上发出,一台或多台 DHCP 服务器将响应一个提议。

发出要约

服务器接受Discover数据包后,下一步是检查 DHCP 池中的可用 IP 地址。如果有可用的地址,服务器将记录 XID 并返回一个 DHCP Offer。下一步是直接向 DHCP 客户端发送要约。请记住,可能有多个服务器向客户端发送要约。

帧 2 中,服务器为客户端提供一个 IP 地址,如下所示:

Figure 14.15 – DHCP Offer packet
)

图 14.15–DHCP 提供数据包

Offer消息中,您将看到以下关键值:

  • Message type: Boot Reply (2)
  • Transaction ID: 0x00003d1d
  • Your (client) IP address: 0.0.0.0
  • Client MAC address: 00:0b:82:01:fc:42

此时,客户端 IP 地址仍然是0.0.0.0,并且Transaction ID : 0x00003d1dDiscover消息相同。

在 DORA 过程中,DHCP 客户端可能会收到多个报价。如果发生这种情况,客户将检查每一项,接受、放弃或拒绝报价。如果客户机选择接受提议,下一步就是向服务器发送正式请求。

请求 IP 地址

一旦报价被接受,客户端就通过广播在网络上发送 DHCP 请求。

帧 3 所示,该请求将包括由 DHCP 服务器提供的Option: (54) DHCP Server Identifier (192.168.0.1)Option: (50) Requested IP Address (192.168.0.10):

Figure 14.16 – DHCP Request packet
)

图 14.16–DHCP 请求数据包

Request消息中,您将看到以下关键值:

  • Message type: Boot Request (1)
  • Transaction ID: 0x00003d1e
  • Your (client) IP address: 0.0.0.0
  • Client MAC address: 00:0b:82:01:fc:42

客户端的 IP 地址仍然是0.0.0.0,因为它没有 IP 地址。不过,Transaction ID现在是0x00003d1e.

最后一步是服务器用一个 IP 地址或一个 DHCP NAK 来响应客户机,我们将在下面看到。

确认要约

帧 4 中,服务器发送一个指示 IP 地址的最终确认,以及租用时间的参数,如下所示:

Figure 14.17 – DHCP acknowledgment packet
)

图 14.17–DHCP 确认数据包

在 ACK 消息中,您将看到以下关键值:

  • Message type: Boot Reply (2)
  • Transaction ID: 0x00003d1e
  • Your (client) IP address: 192.168.0.10
  • Client MAC address: 00:0b:82:01:fc:42

客户端的 IP 地址现在是192.168.0.10并且Transaction ID0x00003d1e

在这些选项中,我们可以看到租赁时间和其他参数的详细信息,如下:

Figure 14.18 – DHCP acknowledgment options
)

图 14.18–DHCP 确认选项

此时,客户端有了一个 IP 地址,租约计时器开始倒计时。客户端现在可以开始与网络上的其他主机进行交易。

总结

DHCP 是几乎所有局域网都使用的基本协议。如果配置得当,DHCP 是一种无缝分配 IP 地址的方式,几乎不需要干预。在本章中,我们讲述了 DHCP 的用途,并了解了它在为主机提供 IP 地址和配置细节方面的重要作用。我们发现了中继代理的作用,概述了 IPv6 获取 IP 地址的各种方式,并简要讨论了使用 DHCP 时的安全问题。

然后,我们查看了 DORA 流程—discoverofferrequestacknowledge——并研究了 DHCP 租借时间的机制。现在,您应该对 DHCP 报头字段值以及消息类型有了更好的理解。此外,您应该能够识别各种 DHCP 选项。我们总结了这一点,把所有的东西放在一起,并逐步通过一个 DHCP 示例。我们从最初的网络广播发展到提供和正式请求,再到主机获得 IP 地址以便在网络上通信。

在下一章,我们将研究超文本传输协议 ( HTTP ),一种用于浏览网页的应用层协议。我们将学习 HTTP,包括可用的版本和连接方法,并剖析客户机和服务器的头和字段。之后,我们将比较请求和响应消息,看看当我们跟踪一个 HTTP 流时能学到什么。

问题

现在,你该检查一下你的知识了。选择最佳答案,然后检查您的答案,这些答案可在评估附录中找到:

  1. DHCP 过程从一个(n) ___ 数据包开始,该数据包在网络上发出广播请求 IP 地址。
    1. 提供
    2. 请求
    3. 发现
    4. 呼吁
  2. DHCP _____ 数据包由客户端发送,并正式向服务器请求 IP 地址。
    1. 提供
    2. 请求
    3. 请愿
    4. 呼吁
  3. 获取 IPv6 地址的一种方法是使用 _ _ _ _ _ 自动分配 IP 地址。
    1. 自动请求
    2. 就绪选项
    3. 松木期权
    4. 打起精神来
  4. DHCPv6 客户端使用 UDP 端口546。服务器和中继代理使用端口 _____。
    1. 546
    2. 547
    3. 68
    4. 67
  5. 在 DHCP 报头中,____ 以字节为单位定义了硬件地址的长度。
    1. htype
    2. XID
    3. ciaddr
    4. 选吧
  6. DHCP 有几个选项。选项 50 代表 _____。
    1. DNS 服务器地址
    2. 请求的 IP 地址
    3. 此 IP 地址的租用时间
    4. 消息的类型
  7. 当您发送 DHCP Release 消息时,服务器识别客户端的方式是同时使用 chaddr 和 _____。
    1. ciaddr
    2. 旗帜
    3. 贾克德
    4. htype

延伸阅读

请参考以下链接,了解有关本章所涵盖主题的更多信息:

十五、解码 HTTP

在某种程度上,我们大多数人都访问过网页来下载信息。但是当检索一个网页的时候会涉及到什么呢?在这一章中,我们将仔细研究一下超文本传输协议 ( HTTP )。我们将从概述开始,回顾我们在请求内容时可以获得的一些对象和元素。然后我们将比较可用的 HTTP 版本,1.0、1.1 和 2.0,以及使用的方法,比如GETPOSTHEAD。HTTP 有三个版本,每个版本都有一个默认的建立和维护连接的方法。为了让您理解不同方法的机制,我们将比较非持久连接和持久连接之间的差异。

HTTP 是一种无状态协议。您将了解 HTTP 如何通过跟踪每个事务的细节来使用 cookies 维护状态。为了帮助您对 web 连接进行故障诊断,我们将回顾在事务期间发生了什么,并检查请求和响应消息的一般格式。我们将剖析客户机和服务器的 HTTP 头和字段。然后,我们将通过一个 HTTP 流对此进行总结,然后在检查事务 时分解每个元素。

本章将通过涵盖以下主题来解决所有这些问题:

  • 描述 HTTP
  • 跟踪连接
  • 比较请求和响应消息
  • 跟随 HTTP 流

描述 HTTP

HTTP 是一个应用层协议,负责在客户端浏览器和 web 服务器之间交换数据。HTTP 允许我们收集、分发、协作和传播广泛的数据。虽然是一个无状态协议,但 HTTP 有几个请求方法、错误代码和头,允许我们从许多不同类型的应用访问资源。

注意

HTTP 用于通过网络传输数据。另外两个传输数据的协议包括文件传输协议 ( FTP )和简单邮件传输协议 ( SMTP )。所有的都是提供有效的数据交换方式的关键。

在这一节中,我们将从概述网页的定义开始,并描述 HTTP 在从网站检索对象中的功能。我们将比较客户机和服务器的角色,概述目前使用的版本,然后总结不同类型的 HTTP 方法。

让我们从回顾网页的元素开始。

剖析网页

使用一个浏览器,比如 Firefox 或者 Chrome,客户通过点击一个超链接来请求一个页面。该链接将客户端定向到一个网站,该网站是一组链接的网页,服务器将所请求的数据发送给客户端。

我们点击的第一页被称为索引默认,这是我们大多数人在搜索内容时的起点。一旦进入网站,每个页面都包含对象,如超文本标记语言 ( HTML )文件、联合图像专家组 ( JPEG )图像、文本、应用和/或 JavaScript。大多数网站都有许多链接页面,这些页面超链接到网站内的其他内容,以及各种可以提取的信息和对象。

在较高层次上,HTTP 将检索包含元素的网页,如下图所示:

Figure 15.1 – A standard web page
)

图 15.1-标准网页

在下载任何对象之前,客户端必须首先访问网页。接下来,让我们回顾一下从网站请求数据时资源是如何定位的。

寻找目标

当一个客户端请求一个网页时,用户将点击一个链接,使用一个统一资源标识符 ( URI )请求一个对象,该标识符用于在互联网上标识一个对象(或资源)。一个 URI 的两个子集是一个统一资源定位符 ( URL )和一个统一资源名称 ( URN )。

在某些情况下,客户端会向服务器请求特定的页面。例如,如果请求 https://www.nist.gov/blogs/cybersecurity-insights,,URL 将以下列方式分解:

  • 主机名:主机的名为www.nist.gov
  • 路径:具体资源的路径为/blogs/cybersecurity-insights

一旦请求到达目标,下一步就是使用标准或加密连接与服务器交互。

建立联系

当客户端发起与 web 服务器的连接时,它们将根据连接类型使用或者传输控制协议 ( TCP )端口80或者端口443,如下所述:

  • TCP 端口80用于标准的未加密连接。

  • TCP port 443 is used for a secure, encrypted connection.

    注意

    在某些情况下,可以使用备用端口(如http-alt 8080http-alt 8008)访问服务器。

如今,使用安全连接很常见,因为大多数网站都使用加密来保护数据交易。当访问一个安全网站时,URL 将使用 HTTP Secure ( HTTPS )前言进行识别。HTTPS 使用传输层安全性 ( TLS )来保护客户端和服务器之间的所有事务。即使有人能够获得数据流,如果没有适当的密钥来解密数据,他们也不能读取内容。

一旦定位到目标,客户端将向服务器发出请求。每一方在 web 事务中都有一个特定的角色,这将在下面讨论。

比较客户端和服务器角色

HTTP 是一种客户端-服务器模型,客户端向服务器发出请求,服务器响应客户端,如下图所示:

Figure 15.2 – HTTP request and response
)

图 15.2–HTTP 请求和响应

一个客户端是一个主机,它使用浏览器启动每个会话,与服务器接口并检索对象。

服务器是一台永远在线的主机,具有固定互联网协议 ( IP )地址,使用专用的网络服务器软件。虽然有几种 web 服务器应用,但下面列出了前三种:

  • Apache 是当今最流行的开源 web 服务器应用之一。Apache 有一个完整的模块库,支持一组丰富的特性,甚至可以支持最大的站点。
  • nginx(或引擎 X)是第二大流行的开源 web 服务器应用,健壮、可伸缩且易于配置。
  • Cloudflare 是一个流行的选项,用于托管网站并帮助防止恶意攻击,如分布式拒绝服务 ( DDoS )攻击。

每当请求一个网页时,版本将是 HTTP 版本 1.0、1.1 或 2.0,如下所述。

了解 HTTP 版本

HTTP 目前有三个版本在使用。每个都有一个相关的意见征询 ( RFC ),如下所示:

  • RFC 1945 中概述的 HTTP 1.0 ,写于 1996 年。这是最初的版本,是在我们刚刚开始看到互联网可能带来的好处时由开发的。这个精简版提供了有限的功能,只有 16 个响应代码,并且没有一个安全的方法来验证用户与网站的交互。
  • RFC 2068 中概述的 HTTP 1.1 写于 1996 年,在 1.0 版本之后不久。这个版本有许多改进,包括身份验证、改进的性能、重用会话的能力、扩展的状态代码以及细粒度的错误报告。
  • HTTP 2.0 ,在 RFC 7540 中概述,写于 2015 年,由谷歌开发的实验性协议 d 演变而来,称为 SPeeDY ( SPDY )。v2 通过压缩 HTTP 报头来减少开销,多路传输请求和响应,并主动将内容推送到客户端,从而减少延迟并提高效率。

三个版本都在使用中;然而,你很可能会看到今天的大多数网络流量的 1.1 和 2.0 版本,因为这些版本提供了改进的性能。

在进行分析时,您会看到在 HTTP 头中列出了一个方法,该方法将指示所请求的操作类型。

识别 HTTP 方法

HTTP 主要用于获取对象,并使用各种方法与 web 服务器交互以交换信息。下表描述了一些最常用的方法:

Table 15.1 – Common HTTP methods
)

表 15.1–常见的 HTTP 方法

虽然有几种 HTTP 请求方法,但最常用的两种是GETPOST

在下一节中,我们将比较连接方法,并介绍如何使用 cookies 来跟踪事务。

保持对连接的跟踪

HTTP 的每一个版本都在传输和处理数据的方法上有所发展,使用了一些技术,比如使用具有流水线目标的持久连接来优化连接。此外,因为 HTTP 是一种无状态协议,所以 cookies 用于维护有关连接的客户端信息,例如购物车元素和客户端访问过的页面。

在这一部分,我们将比较建立和维护连接的不同方法,以及如何使用 cookies 来保存状态信息。让我们从比较连接类型开始。

评估连接类型

当 HTTP 版本被开发出来时,它只有最少的功能,并且使用非持久连接。随着 1.1 版的推出,增加了一些增强功能。其中一项改进是通过使用持久连接保持数据移动的能力。

让我们从理解非持久连接的机制开始。

使用非持久连接

非持久连接是从网页中获取内容的原始方式之一。该方法以下列方式工作:

  1. 客户端从 web 服务器请求内容。
  2. 服务器将内容返回给客户端。
  3. 连接已关闭。

如果客户机想要从 web 服务器获得更多的内容,必须建立一个新的连接,导致每个请求和响应都有一次往返。可以想象,所有的往返和连接都会增加延迟。

非持久连接有两种方法,如下所述:

  • 非并行(或串行)连接一次使用一个连接。
  • 并行连接使用多个并发连接。

如果可能,使用并行连接,因为这将提高获取对象的整体效率。

使用 HTTP 版时,默认情况下使用非持久连接。HTTP 版本 1.1 通过提供持久连接改进了连接方法,如下所述。

提供持久的连接

为了优化连接,HTTP 版引入了使用持久连接来保持会话活动,直到检索到所有对象。这种类型的连接也称为 HTTP 保持活动,因为它避免了每次发出请求时都必须重新建立新的连接。

注意

尽管在 1.1 版中保持活动的想法是正式的,但 1.0 版采用了一种非正式的方法来保持会话活动。这就是为什么您可能会在事务期间看到使用 keep-alive 的 HTTP 1.0 流量。

使用时,HTTP 头可以设置超时,并定义客户端可以发出的最大请求数。

保持活动数据包在客户端和服务器之间发送,以保持会话活动,并验证两端是否仍在响应。保活数据包没有任何数据;它设置了确认 ( 确认)标志,并且序列号被设置为比当前序列号少 1。

HTTP 版改进了这一选项,允许多个并发事务合并到一个连接中。

HTTP 1.1 将持久连接作为默认模式。接下来,让我们看看持久连接如何受益于一个叫做流水线的概念。

流水线数据传输

为了优化使用持久连接的数据传输,HTTP 可以使用管道技术,它保持与服务器的连接,直到获得所有对象。管道提高了数据事务的效率,因为客户端可以立即继续请求对象,而无需等待服务器发送之前的请求。

服务器不是在请求-响应事务后关闭每个连接,而是保持连接打开并等待进一步的请求。使用管道的持久连接是 HTTP 1.1 中的默认连接方法。就建立连接而言,这种类型的连接需要更多的开销。此外,由于服务器正在等待多个请求,它可能会在短时间内处于空闲状态。但是,这种类型的连接是首选,因为它提高了从 web 服务器获取对象时的整体效率。

因为 HTTP 是一种无状态协议,所以 cookies 用于跟踪每个事务的细节。

用 cookies 维护状态

当使用 HTTP 时,服务器和客户机本身都不维护关于事务状态的信息。为了克服这个问题,HTTP 使用了 cookie 的概念。

cookie 是服务器创建的字符串,可以放在用户的系统上,然后由用户的浏览器管理,与服务器交互。一旦用户接受了 cookie,cookie 中包含的信息就可以用于以下原因:

  • 认证:在用户提供登录信息后,该数据可以作为单点登录 ( SSO )的形式与网站进行交互。
  • 个性化用户体验(UX):cookie 可以收集购物模式的数据。这个将通过保留以前访问过的对象并定期向客户端呈现信息来改善购物体验。

要进一步了解在 HTTP 对话中使用的 cookie,请访问HTTP://tcpreplay . app neta . com/wiki/captures . html # big flows-pcap。一旦到了那里,下载bigFlows.pcap以便你可以跟随。

转到帧 912 ,然后展开 HTTP 头。在那里,您将看到 cookie 和 cookie 对,如下面的屏幕截图所示:

Figure 15.3 – Viewing cookies in an HTTP header
)

图 15.3–查看 HTTP 报头中的 cookies

在大多数情况下,cookies 被设计成有帮助的;但是,它们可能会带来隐私风险,因为它们可以收集营销统计数据和个人信息。这就是为什么在大多数情况下,用户能够选择不允许 cookies 出现在他们的系统上。

在某些情况下,会将 cookie 发送到服务器进行维护和检索,以供客户端将来访问。然而,如果一个 cookie 没有被发送到服务器,它就被认为是非持久的,并且会发生以下情况之一:

  • cookie 将过期。
  • 当用户关闭浏览器时,cookie 将被删除。
  • 用户将移除(或删除)cookie。

在 HTTP 事务中,客户端和服务器之间有一系列的请求和响应。在下一节中,我们将研究请求和响应消息的一般格式。

比较请求和响应消息

当与网页交互时,客户端会向服务器请求对象。在大多数情况下,标准事务包括来自客户端的请求和来自服务器的响应。因为客户端和服务器都传递不同的消息,所以消息头略有不同。在这一部分中,我们将从较高的层次上了解客户机和服务器的 HTTP 头和字段。

让我们从检查 HTTP 请求的元素开始。

查看 HTTP 请求

当查看客户端请求时,您很可能会看到一个请求行,后跟标题行,如下图所示:

Figure 15.4 – HTTP request format
)

图 15.4–HTTP 请求格式

每个请求消息都将指示方法(如GETPOST)和 URL,以及附加参数。以下情况也很常见:

  • \r符号,用于表示回车
  • \n符号,用于表示换行符

标题中的两个符号都提供了格式指南,表示该特定行内容的结尾。要查看示例,返回bigFlows.pcap并选择帧 183 。然后,展开 HTTP 标头,如下所示:

Figure 15.5 – HTTP GET request
)

图 15.5–HTTP GET 请求

HTTP 请求用于检索对象。大多数 web 服务器提供丰富的交互式内容。因此,标头必须指示客户端可以支持的内容类型。在一个 HTTP 请求中,您将会看到一个对多用途互联网邮件扩展 T2 标题的引用。接下来我们来探讨一下。

查看 MIME 标题

MIME 被设计成以各种格式呈现数据,包括文本、图像、音频、应用和视频。最初开发 MIME 头是为了支持电子邮件,后来成为 HTTP 发展的一部分。

当服务器接收到 HTTP 请求时,请求行将列出客户机想要的内容,以及浏览器支持的 HTTP 版本。之后,MIME 头包含与客户端可以支持的内容类型相关的字段。这里显示了一个示例:

Figure 15.6 – HTTP request with a MIME header
)

图 15.6–带有 MIME 头的 HTTP 请求

MIME 头包含浏览器版本等值,以及客户端将接受的字符编码和对象。

一旦服务器收到请求,它将向客户端发送响应。报头格式与 HTTP 请求非常相似;但是,这包含特定于服务器响应的详细信息。

回应客户

来自服务器的 HTTP 响应以状态行开始,表示版本、状态代码和原因。在状态行之后,结构类似于 HTTP 请求,因为我们发现标题行,如下图所示:

Figure 15.7 – HTTP response format
)

图 15.7–HTTP 响应格式

在状态代码和标题行之后,您将看到消息体,它可以包含客户请求的项目,以及交易的细节。

HTTP 响应的主要元素之一是消息的状态。HTTP 通过使用特定的代码来指示状态,如下所述。

了解状态代码

状态码显示在 web 服务器对客户端响应消息的第一行。状态代码按类别分组,如下所示:

  • 1xx 信息:提供关于交易的一般注释,例如请求已经收到和/或流程正在进行
  • 2xx 成功:表示服务器能够肯定地接收和处理请求
  • 3xx 重定向:表示客户端必须被重定向到另一个资源才能完成请求
  • 4xx 客户端错误:表示请求包含无效语法或由于某种原因无法满足
  • 5xx 服务器错误:当服务器一方无法完成动作或请求时,出现

虽然有许多状态代码可用,但一些最常见的代码包括:

  • 200 OK :这是最常见的状态码,代表服务器能够成功返回请求的对象。
  • 301 永久移动:这个表示请求的对象在 URL 上不再可用,已经永久移动到新的位置。
  • 400 错误请求:这个状态意味着 HTTP 客户端请求无效,无法被服务器处理。
  • 404 未找到:如果在服务器上未找到请求的对象,则返回此状态。

在状态行之后,您将看到 MIME 头中与响应相关的各种元素,如下所述。

描述 MIME 标头

每当你从一个网页中检索数据时,你的浏览器会正确地格式化请求。反过来,服务器将响应请求并传送数据。然后,浏览器会将结果呈现给客户端。

当服务器向客户端返回对象时,MIME 头中有各种元素,如下所示:

Figure 15.8 – MIME fields in an HTTP response
)

图 15.8–HTTP 响应中的 MIME 字段

字段值定义了诸如内容类型、来源和长度等细节。

在下一节中,让我们探索从发出请求到显示对象再到关闭连接的过程。

跟随 HTTP 流

为了更好地理解请求和接收网页时会发生什么,我们将通过一个 HTTP 流来逐步完成这个过程。在检查 HTTP 事务时,我们将进一步分解每个元素。

注意

请记住,每个 HTTP 会话都是不同的。这个示例将提供一个示例,说明在查看 HTTP 对话时您会看到什么。在真正的分析练习中,您很可能需要研究一些不同字段值的含义。

对于这个例子,我们将使用HTTP.pcap,因为它是一个完整的对话。要获取副本,请前往 https://www.cloudshark.org/captures/0012f52602a3 的,然后下载文件并在 Wireshark 中打开。打开后,展开 TCP 标题下的帧 1 ,您将看到以下内容:

[Conversation completeness: Complete, WITH_DATA (31)]

这是一个只有 40 个数据包的小捕获,因此不难看到完整对话的所有元素。但是,查看主机之间活动的一种方法是运行流程图。要查看整个对话,进入统计菜单选项,然后选择流程图。Wireshark 将运行该图,如下面的屏幕截图所示:

Figure 15.9 – Viewing the HTTP flow
)

图 15.9–查看 HTTP 流

一旦进入流量图设置,您可以选择限制以显示过滤器,如图表左侧所示。但是,因为这个捕获只包含一个对话,所以这是不必要的。

查看流程图后,退出窗口,以便我们可以专注于捕获。要查看客户端和服务器之间的对话,将光标放在帧 4 上,单击右键,选择跟随 | TCP 流,如以下截图所示:

Figure 15.10 – Following the TCP stream
)

图 15.10–跟随 TCP 流

选中后,Wireshark 将出现一个窗口,显示以下对话:

Figure 15.11 – Viewing Follow TCP Stream
)

图 15.11–查看跟随 TCP 流

在窗口中,您将看到以下内容:

  • 客户端请求在窗口的上方,如图所示,图 15.11 使用红色字体
  • 服务器响应,从窗口中间开始,如图图 15.11 所示,使用蓝色字体

现在我们已经看到了整个对话,让我们来看一下整个过程。第一步是客户端使用三次握手与服务器建立联系。

开始对话

在交换任何数据之前,该过程从三方握手开始,我们在HTTP.pcap帧 1帧 2帧 3 中可以看到,如下图所示:

Figure 15.12 – Viewing a three-way handshake
)

图 15.12–查看三次握手

三次握手是客户端(192.168.1.140)和服务器(174-143.213.184)之间的同步 ( SYN )和 ACK 数据包的交换,在这里有更详细的描述:

  • 客户端通过向服务器发送一个 SYN 数据包来开始这个过程。
  • 服务器通过向客户端发送 SYN-ACK 来响应。
  • 客户端通过向服务器发送 ACK 进行响应。

没有数据交换,因为握手只是建立连接。建立之后,下一步是客户端向服务器发出请求。

请求数据

第 4 帧开始了对话,客户端向服务器请求图像。HTTP 头如下面的截图所示:

Figure 15.13 – Client-side HTTP request
)

图 15.13–客户端 HTTP 请求

当检查客户机请求时,我们看到 HTTP 头中有几个值。第一行是从服务器请求数据的GET方法。以下是该请求的参数:

  • Request Method : GET,客户端用来从服务器获取信息。
  • Request URI:客户端正在使用img/layout/logo.png路径请求logo.png图像。
  • Request Version:客户端正在使用HTTP/1.0

按照GET方法,您将看到这些值:

  • User-Agent:列出的用户代理是Wget/1.12: (linux-gnu),是一个简单的非交互浏览器,用于使用 HTTP、FTP 等方法获取文件。
  • Accept:列出*/*,这是一个通配符值,表示客户端将接受任何 MIME 类型的对象。
  • Host:请求的主机是packetlife.net
  • Connection : Keep-Alive列为连接方式,告知服务器继续发送数据,无需打开新的连接请求。

在字段值之后,我们可以看到 Wireshark 生成的三个详细信息,如下所述:

  • [Full request URI: http://packetlife.nimg/layout/logo.png]:这是一个超链接,指向所请求对象的确切位置。
  • [HTTP request 1/1]:这表示该请求是一(1)个 HTTP 请求中的第一个。
  • [Response in frame: 36]:这是一个超链接,指向包含 HTTP 响应的框架。

在客户机请求被发送到服务器之后,数据被发送到客户机。从第 5 帧第 35 帧,您将看到一系列来自客户端和服务器的 ACK 数据包,它们确认数据正在被传输和接收。

一旦完成,服务器将响应客户端,并指示所有数据都已发送。

回应客户

帧 36 中,我们看到服务器返回了一个Status Code: 200 OK响应,意味着数据已经被成功传送。

与请求数据包不同,我们看到 HTTP 响应中包含更多信息,如下面的屏幕截图所示:

Figure 15.14 – Server-side HTTP response
)

图 15.14–服务器端 HTTP 响应

当检查服务器响应时,我们看到 HTTP 头中有几个值。数据传输的第一行是 Wireshark 生成的值,表示响应的状态,如下所示:

[专家信息(聊天/序列):HTTP/1.1 200 OK\r\n]

该行定义HTTP/1.1 200 (PNG)属于专家信息控制台中的Chat严重性。要查看这个,选择 Wireshark 界面左下角的青色Expert Info图标。打开后,展开第二个Chat条目,将显示以下信息:

Figure 15.15 – Viewing Expert Information entries
)

图 15.15–查看专家信息条目

在 Wireshark 生成的值之后,您将看到以下内容:

  • Response Version:该值表示服务器使用的是 HTTP 版本 1.1。
  • Status Code:在这种情况下,数据传输成功,所以服务器返回一个Status Code 200响应。
  • [Status Code Description: OK]:这一行是 Wireshark 生成的值,表示响应没有问题。
  • Response Phrase:该字段值为OK,表示数据传输成功。

在交易的详细信息之后,您将看到以下值:

  • Server:该字段将网络服务器列为nginx/0.8.53。nginx 是一种流行的开源 web 服务器,是 Apache 的替代产品。
  • Date:该字段标记对象被访问的日期和时间,并用于监控用于缓存计算的资源的年龄。第 35 帧Tue, 01 Mar 2011 20:45:16 GMT列为日期。
  • Content-Type:这个字段提供了一个关于什么类型的对象被返回给客户端的参考。第 35 帧Content-Type列为image/png,是便携图形格式 ( PNG )格式的图像。
  • Content-Length:该字段列出了图像的长度,为21684字节。在字段值下面,您将看到 Wireshark 生成的一个[Content length: 21684]值。这个值将与 HTTP 头底部的Portable Network Graphics头匹配。如果将光标放在标题上,您将看到状态栏中反映的值,如下面的屏幕截图所示:

Figure 15.16 – Content length of the image
)

图 15.16–图像的内容长度

  • Last-Modified:该字段值将指示页面上次修改的时间,列为Fri, 21 Jan 2011 03:41:14 GMT
  • Connection:该值被列为keep-alive(或持久)连接。
  • Keep-Alive:这个字段值列出了timeout=20,它是一个由服务器设置的值(以秒为单位),表示在关闭连接之前保持对话的时间。

在网络上,缓存的概念很重要,因为在大多数情况下,发出请求的主机希望收到尽可能最新的副本。缓存值用于标识页面的年龄。

控制缓存

网络上的大多数对象通常都有超时值。接下来的几个值提供了一种监控页面年龄的方法。条目包括以下内容:

  • Expires:该值指定对象何时到期。在第 35 帧中,到期日期列为Wed, 29 Feb 2012 20:45:16 GMT

  • Cache-Control: This value is listed as max-age=31536000.

    注意

    在很少变化的资产上,习惯上把Cache-Control值设为max-age=31536000,代表 1 年的秒数。

  • Cache-Control:该字段值被列为public,这意味着这些值可以存储在共享缓存中。其他值可以包括privateno-cache

  • Vary:该字段表示缓存服务器支持的内容类型。在这种情况下,值为Accept-Encoding。如果该指示器不存在,则格式可能存储不正确,并且当客户端检索页面时,它可能会以不可读的格式呈现页面。

  • Accept-Ranges:该字段值指示当响应客户端的数据请求时,服务器将使用哪个单元。字段值列为bytes,很常见。

在 HTTP 字段值的末尾,我们看到了Portable Graphics Format头,这表明该对象是一个 PNG 文件。接下来,我们来考察一下图像。

导出对象

如果捕获中有未加密的对象,您可以在 Wireshark 中导出它们。要查看HTTP.pcap文件中的内容,进入文件菜单选项,然后选择导出对象 | HTTP… ,将会出现以下窗口:

Figure 15.17 – Viewing Export HTTP object list
)

图 15.17–查看导出 HTTP 对象列表

如果您想让查看内容,点击图像并选择保存,这将弹出一个对话框,让您选择保存文件的位置。保存后,您可以打开图像,如下所示:

Figure 15.18 – The extracted image
)

图 15.18–提取的图像

一旦数据传输完毕,客户端不再请求对象,下一步就是结束对话。

结束对话

在交易的结束时,客户端和服务器交换一系列的完成 ( FIN )和 ACK 包,如下图所示:

Figure 15.19 – Exchange of FIN-ACK packets
)

图 15.19–FIN-ACK 数据包的交换

虽然这是一个简单的数据事务示例,但它提供了一种理解客户机与 web 服务器交互的机制的可靠方法。

总结

HTTP 是一个丰富的协议,在一个事务中,数据将跨越几个网络,同时会遇到不同的客户端和服务器。因此,存在大量的规则和变量。在这次讨论中,我们主要关注客户机和服务器之间的 HTTP 请求-响应会话的关键元素。

我们首先逐步介绍了网页的关键元素,以及检索数据和对象时客户端和服务器的角色。我们回顾了不同的 HTTP 版本,并简要介绍了可用的 HTTP 方法。然后,我们继续学习不同类型的连接,以及 cookies 如何帮助维护事务期间的状态。最后,我们用一个完整 HTTP 对话的简单示例进行了总结。

在下一章中,我们将回顾地址解析协议 ( ARP ),并从概述这一基本协议的作用和目的开始。为了让您了解 ARP 是如何工作的,我们将介绍一个 ARP 事务,并仔细看看报头和字段值。我们将看到无偿 ARP 的重要性,并简要提及您可能会遇到的一些其他类型的 ARP 流量。最后,我们将了解 ARP 攻击以及如何识别和防御这些类型的威胁。

问题

现在,是时候检查你的知识了。选择以下问题的最佳答案,然后检查您的答案,这些答案可在评估附录中找到:

  1. 两个主要的 HTTP 请求方法是GET和 _____。
    1. PUT
    2. DELETE
    3. POST
    4. STATE
  2. _____ 是当今最流行的开源 web 服务器应用之一,因为它拥有完整的模块库,甚至可以支持最大的网站。
    1. 云耀斑
    2. Microsoft IIS
    3. 升速
    4. 街头流氓
  3. HTTP 版本 _____ 通过压缩报头来减少开销,多路传输请求和响应,并主动将内容推送到客户端,从而减少延迟并提高效率。
    1. One
    2. One point one
    3. One point two
    4. Two
  4. 从 web 服务器传输数据时,持久连接会保持会话活动,直到检索到所有对象。这种类型的连接也称为 HTTP _____。
    1. 耀斑状态
    2. 并联接法
    3. 保持活力
    4. Cookie 状态
  5. 在 HTTP 头中,您可以看到在Cache-Control字段中列出的值3600。这意味着内容可以在缓存中保存 _____。
    1. 1 天
    2. 1 小时
    3. 1 年
    4. 1 个月
  6. _____ 最初是为支持电子邮件而开发的,旨在以各种格式呈现数据,包括文本、图像、音频、应用和视频。
    1. 升速
    2. 哑剧
    3. 饼干艺术
    4. nginx
  7. 网络上的大多数对象通常都有超时值。_____ 值提供了一种监控页面年龄的方法。
    1. 隐藏物
    2. 哑剧
    3. 饼干
    4. 状态

延伸阅读

请参考以下链接了解更多信息:

十六、了解 ARP

当数据在网络间传输时,数据包使用逻辑 or 互联网协议 ( IP )地址来识别目的主机。然而,在局域网 ( LAN )上,数据包使用物理或媒体访问控制 ( MAC )地址向主机传送数据。当数据包从网站通过互联网传输到局域网上的主机时,交换机只有一个 IP 地址来标识主机。设备如何定位目的主机?这是地址解析协议 ( ARP )的职责,它将 IP 地址解析为 MAC 地址,以便将数据传送到正确的主机。

在本章中,我们将了解 ARP 的工作原理,以及为什么它是确保数据及时传输的重要协议。然后,我们将进一步了解 Wireshark 中的 ARP 报头和字段。我们还将研究您在进行分析时可能遇到的不同类型的 ARP,包括无偿、反向、逆向和代理。最后,为了让您意识到 ARP 可能被恶意使用,我们将讨论 ARP 攻击以及防御这些类型威胁的可能方法。

本章将涵盖以下内容:

  • 理解 ARP 的作用和目的
  • 探索 ARP 报头和字段
  • 研究不同类型的 ARP
  • ARP 攻击与防御方法的比较

了解 ARP 的作用和目的

ARP 是三个主要网络层协议(ARP、IPv4 和互联网控制消息协议 ( ICMP )之一,所有这些都是传递数据的关键。

在下图中,我们看到 ARP 实际上位于开放系统互连 ( OSI )模型的第 3 层和第 2 层之间,因为 ARP 将 IP 地址(网络层)解析为 MAC 地址(数据链路层):

Figure 16.1 – The OSI model network layer protocols
)

图 16.1–OSI 模型网络层协议

注意

虽然 ARP 位于 OSI 模型的第 2 层和第 3 层之间,但许多人认为 ARP 是第 3 层协议。

在这个部分,我们将看看 ARP 如何解析 MAC 地址。然后我们将了解 ARP 缓存如何帮助提供更快的响应。此外,我们将发现 IPv6 网络如何使用邻居发现协议 ( NDP )将 IPv6 地址解析为 MAC 地址。

在使用 IPv4 的 LAN 中,帧头必须使用 MAC 地址来标识接收主机。为了获得正确的 MAC 地址,发送设备将在网络上发出 ARP 广播。在下一节中,让我们讨论一下为什么这很重要。

解析 MAC 地址

当数据通过不同的网络传输时,数据包使用一个 IP(或逻辑)地址。但是,要将数据传送到最终目的地,需要在帧头中放置 MAC(或物理)地址。设备将首先检查其本地 ARP 缓存。如果没有条目,设备会以广播的形式发出 ARP 请求,并等待回复。

注意

广播消息从一台主机发送到网络中的所有设备。虽然每台主机都会收到该帧,但只有一台主机会做出响应。

如下图所示,主机 A 需要网关的 MAC 地址,网关是局域网的路由器接口:

Figure 16.2 – ARP broadcast on a network
)

图 16.2–网络上的 ARP 广播

为了获得网关的 MAC 地址,主机 A 发出一个 ARP 请求。ARP 请求会问这样一个问题,“谁有 IP 地址10.40.10.101?告诉10.40.10.109,”并等待回复。然后网关发送一个 ARP 回复,让主机知道10.40.10.101在 MAC 地址BB:20:62:C4:57:23

现在我们已经了解了 ARP 请求和回复的基本知识,让我们在 Wireshark 中查看这个过程时,一步一步地看一下我们将会看到的。

查看 ARP 请求和回复

要查看 ARP 请求和回复的示例,以便您能够跟进,请访问https://crnet packets . files . WordPress . com/2015/08/ARP trace . zip,下载文件,将其解压缩,并在 Wireshark 中打开,如下所示:

Figure 16.3 – ARP request/reply
)

图 16.3–ARP 请求/回复

在 ARP 跟踪文件中,前两个数据包是 ARP 请求/回复。

帧 1 中,设备发送一个 ARP 请求。源地址和目的地址如下:

  • 源 MAC 地址是00:15:5d:0f:49:18,是请求解析的设备的 MAC 地址。
  • 目的 MAC 地址是ff:ff:ff:ff:ff:ff,是一个广播地址。

帧 2 中,设备通过 ARP 回复来识别自己。源地址和目的地址如下:

  • 源 MAC 地址是d4:be:d9:af:3e:4d,也就是 IP 地址为172.16.2.27的设备。
  • 目的 MAC 地址为00:15:5d:0f:49:18,是请求解析的设备的 MAC 地址。

请记住,在 Wireshark 中执行捕获时,在看到 ARP 回复之前看到几个 ARP 广播是正常的。

我们现在知道 ARP 将 IP 地址解析为 MAC 地址。这是因为设备有一个 MAC 地址,可以放在帧头中,以便在 LAN 上传送数据。为了使设备能够快速检索网络上设备的 MAC 地址,它将 IP 地址到 MAC 地址的配对保存在一个临时保存区中,称为 ARP 缓存。下一节将解释 ARP 缓存,它是如何使用的,以及表条目保留多长时间。

调查 ARP 缓存

网络设备,如路由器、交换机和 PC,持有一种形式的 ARP 缓存表,这是一个存储 IP 到 MAC 地址对的存储区域。要在 Windows 机器上查看自己的 ARP 缓存,请打开命令提示符并输入arp -a来查看 ARP 表中的条目,如下所示:

Figure 16.4 – Using the arp -a command
)

图 16.4–使用 arp -a 命令

在上图中,ARP 缓存表列出了以下内容:

  • 互联网地址:显示 IP 地址
  • 物理地址:显示对应的 MAC 地址
  • Type :显示条目是静态的(保持不变)还是动态的(定期刷新)

动态 ARP 缓存值将在一段时间后超时。一旦达到超时限制,条目将消失。如果操作系统 ( OS )需要 MAC 地址,而 ARP 表中没有条目,就需要发出新的 ARP 请求。

注意

ARP 表超时值是特定于系统的。例如,Cisco 交换机的默认超时计时器为 4 小时。

在 Windows 操作系统中,你可以通过进入命令行界面 ( CLI )并运行netsh interface ipv4 show interface NNN命令来确定超时值。

注意

使用该命令时,将NNN替换为您想要检查的接口的名称。

如屏幕截图所示,我们看到运行netsh interface ipv4 show interface Wi-Fi的输出,它提供了关于该界面的信息:

Figure 16.5 – Issuing the netsh show interface command
)

图 16.5–发出 netsh show interface 命令

在输出中,您将看到基本可达时间30000 ms 或 30 秒,这是 ARP 在离开之前可以在缓存中存在的时间。30 秒后,如果一个特定的 IP 地址需要一个 MAC 地址,系统必须在网络上发出一个 ARP 请求。

我们现在已经了解了 ARP 在 IPv4 网络中的工作原理,但是在 IPv6 网络中会发生什么呢?以下部分概述了 NDP 如何在 IPv6 网络中取代 ARP。

在 IPv6 中用 NDP 取代 ARP

ARP 在 IPv4 网络中是必不可少的,然而,IPv6 不使用 ARP。取而代之的是 NDP,它将 IP 地址解析为 MAC 地址。

要查看 NDP 的示例,请前往 http://packetlife.net/captures/protocol/icmpv6/的和 T2,并在 Wireshark 中打开IPv6_NDP.pcap文件。如下面的截图所示,trac e 文件中的第一个数据包是一个邻居请求 ( NS ),后面是一个邻居通告:

Figure 16.6 – Example of NDP
)

图 16.6-NDP 的例子

NS 与 ARP 广播的目的相同。然而,IPv6 不使用广播。它使用因特网控制消息协议版本 6 ( ICMPv6 )和被定向到特定主机的请求节点多播地址消息。因此,如果您正在分析一个仅使用 IPv6 的网络,您可能只会看到一些 ARP 广播(如果有的话)。

正如我们现在所了解的,ARP 是一种常见的协议,你很可能会在进行分析时看到,因为 IPv4 仍然被广泛地使用。为了让您更好地理解标准 ARP 请求和回复,以下部分提供了 ARP 报头和相应字段值的概述。

探索 ARP 报头和字段

而在一个跟踪文件中,如果你在显示过滤器中输入arp,你很可能会看到一系列的 ARP 请求和回复。在每个 ARP 报头中,有几个字段值,例如操作码 ( 操作码)、发送者和目标 IP 地址,它们有助于确保接收到 ARP 请求/回复。我们先来看一个典型的 ARP 交易。

识别标准 ARP 请求/回复

打开ARPTrace.pcapng,拿看一下前两个包,是 ARP 请求/回复。展开每个 ARP 请求/回复,您会看到 ARP 被包装在一个以太网帧中。但是,没有网络层或传输层报头。

首先,让我们研究一下 ARP 请求的组成部分。

检查 ARP 请求

要查看一个标准 ARP 请求,展开帧 1 。展开后,您可以看到有几个字段值,它们提供了有关事务的信息,如下所示:

Figure 16.7 – Frame 1 ARP request
)

图 16.7–帧 1 ARP 请求

我们在这个 ARP 请求中看到,172.16.2.3处的主机正在请求 IP 地址为172.16.2.27的主机的 MAC 地址。关键字段值包括Opcode,这表明这是一个请求,以及发送方和目标的 IP 地址。

ARP 回复类似于请求;但是,目标 MAC 地址将会出现。

评估 ARP 回复

帧 2 是 ARP 回复,在172.16.2.27的主机用其 MAC 地址d4:be:d9:af:3e:4f回复,如下图:

Figure 16.8 – Frame 2 ARP reply
)

图 16.8–帧 2 ARP 回复

关键字段值包括操作码(表明这是一个回复),以及发送方和目标的 MAC 和 IP 地址。一旦收到 ARP 回复,MAC 地址就被解析。

如图所示,ARP 报头有几个字段值,我们接下来将回顾这些值。

分解 ARP 报头字段

在这一部分,我们将回顾 ARP 字段值。为了让你理解每个领域的作用和目的,我将列举如下:

  • 字段的名称
  • 字节数
  • 字段的目的

要跟随,打开ARPTrace.pcapng并选择帧 22 。展开 ARP 报头,如下所示:

Figure 16.9 – Frame 22 ARP request
)

图 16.9–第 22 帧 ARP 请求

在 ARP 报头中,提供 ARP 交易信息的字段值在下表的中列出:

Table 16.1 – APR field values
)

表 16.1-APR 字段值

一些参数,比如操作码和硬件类型由一个数字表示。数值由iana.org定义,可以在这里找到:https://www . iana . org/assignments/ARP-parameters/ARP-parameters . XHTML

一些定义的值包括以下内容:

  • 硬件类型 31–IPsec 隧道
  • 硬件类型 18–光纤通道

现在我们可以看到标准 ARP 报头中的报头和字段,让我们看看在分析过程中可能遇到的其他类型的 ARP。

检查不同类型的地址解析协议

在 IPv4 网络中,最常见的 ARP 消息类型是请求和回复:

  • 标准 ARP 请求是在网络上发出的广播消息,请求将 IP 地址解析为 MAC 地址。
  • 标准 ARP 回复是发送给提供地址解析的请求主机的单播消息。

然而,正如我们将在本节中概述的,还有一些其他类型的 ARP 消息。我们先从反向地址解析协议 ( RARP )开始,它是 ARP 的反向。

逆向 ARP

与 ARP 相反的是 RARP,在 RARP 中,客户端通过使用其 MAC 地址向计算机网络请求其 IPv4 地址。

使用在https://wiki.wireshark.org/SampleCaptures?action=AttachFile&do = view&target = rarp _ request . cap找到的示例rarp_request.cap,我们可以看到主机请求其 IP 地址,如以下截图所示:

Figure 16.10 – Viewing a RARP request
)

图 16.10–查看 RARP 请求

发送者的 MAC 地址是00:00:a1:12:dd:88。IP 地址未知,所以列为0.0.0.0。操作码是reverse request (3)

注意

RARP 是一个过时的协议,已经被更高效的协议取代,比如动态主机配置协议(DHCP);因此,你不会在局域网上看到任何 RARP 流量。然而,在虚拟化环境中使用 RARP 来保持 MAC 表的更新。

接下来,让我们看看一种不太为人所知的 ARP,叫做逆向地址解析协议 ( InARP )。

评估 InARP

InARP 是 ARP 协议的一个扩展。通过在 https://www.cloudshark.org/captures/87be3b4b6625访问 CloudShark,并在 Wireshark 中打开FrameRelay-101.pcap,我们可以看到这样一个例子,如下所示:

Figure 16.11 – An InARP example
)

图 16.11-InARP 示例

广域网 ( )Frame Relay是一种广泛使用的数据包交换方法在局域网之间传输数据。当彼此通信时,每个路由器的接口使用期望站的数据链路连接标识符 ( DLCI ),这是设备的硬件地址。

在解析 IP 地址时,InARP 的使用方式与标准 ARP 相同。但是,它不使用广播,因为它已经知道所需电台的 DLCI。如下图所示,发送路由器99.0.0.2试图使用 InARP 解析 DLCI 3091 的 IP 地址:

Figure 16.12 – InARP over Frame Relay
)

图 16.12–帧中继上的 InARP

帧中继的使用正在被淘汰,取而代之的是一种更有效的在广域网上传输数据的方法、 ( ATM )。因此,您很少会在捕获中看到 InARP。

虽然您在进行分析时可能看不到 InARP,但您很可能会看到一种更常见的 ARP,称为无偿 ARP,如下所述。

发布一个免费的 ARP

在局域网上,重复的 IP 地址会导致冲突。为了防止这种情况,主机发出一个无偿 ARP ,这是一个未经请求的 ARP,用于防止重复的 IP 地址。要查看示例,请访问https://www.cloudshark.org/captures/54af88021aa8,然后下载并在 Wireshark 中打开该文件。打开后,展开 ARP 头,如下所示:

Figure 16.13 – Gratuitous ARP
)

图 16.13-免费 ARP

在这个画面中,我们看到了Opcode: request (1)。然而,我们也看到Sender IP address: 192.168.130.128Target IP address: 192.168.130.128是一样的,它将帧识别为一个免费的 ARP。

注意

Wireshark 会将免费 ARP 识别为ARP Announcement

免费 ARP 请求作为广播发送;然而,预计不会有任何答复。除了检查重复的 IP 地址之外,这种类型的 ARP 还可以为主机提供一种共享 IP 和 MAC 地址对的方式。例如,如果网络设备的接口出现故障,然后又恢复正常,就会发送一个免费的 ARP,以便所有主机都可以更新它们的 ARP 表。

接下来,我们将看到一个实际上不是 ARP 类型的例子,而是网络上使用的一种叫做代理 ARP 的技术。

致力于成为 ARP 的一半

一个代理是代表另一个实体工作的东西。代理 ARP 是另一个实体解析 MAC 地址的技术。在网络中,有一些情况下可以使用代理 ARP。

使用代理 ARP 的一种方法是将主机隐藏在防火墙后面。

遮蔽宿主

当一台拥有公共 IP 地址的机器在防火墙后的私有网络中时,最好隐藏它的存在。

如果您的主机在防火墙后面,解析 MAC 地址的一种方法是让防火墙使用代理 ARP 与隐藏的设备往来。这将保持机器在防火墙前的公共端的假象。

当一个子网中的主机被代理路由器分开时,代理 ARP 也可以用在 LAN 中。

充当代理人

在局域网上,有时有必要使用代理 ARP。例如,当 ARP 广播发送到另一个子网中的主机时,代理 ARP 是必要的。因为 ARP 请求是一种广播,它会在路由器的接口处停止。

在这种情况下,路由器使用自己的 MAC 地址进行响应,并充当另一个子网中主机的代理。路由器会将自己的 MAC 地址作为源地址来封装 ARP 请求数据包,然后在适当的网络上发出广播,如下所示:

Figure 16.14 – Proxy ARP
)

图 16.14-代理 ARP

您现在可以理解,在局域网上可以使用许多不同类型的 ARP 报文和技术。ARP 是一个重要的协议,但也可能是一个易受攻击的目标。在下一节中,让我们来看看一些 ARP 攻击以及防御方法。

ARP 攻击与防御方法比较

ARP 是一种广泛使用的协议,它将 IP 地址解析为 MAC 地址。在大多数情况下,ARP 可以很好地确保设备能够找到彼此。但是协议是很多年前标准化的,一直没有办法保证 ARP 报文的真实性。

因此,我们将概述一些 ARP 攻击,它们会误导流量并干扰正常的网络行为。作为回应,我们还将看看防御这些类型攻击的一些方法。

让我们从介绍一些针对 ARP 的攻击开始。

比较 ARP 攻击和工具

ARP 在 LAN 上使用,这可能是一个易受攻击的目标。一些用于穿透 ARP 框架的攻击和技术包括欺骗和风暴,这可能会误导流量或导致网络问题。在本节中,我们将比较您或您的同事可能遇到的一些攻击。

让我们从使用 ARP 欺骗网络主机开始。

发现 ARP 欺骗

在 IPv4 网络上,ARP 是向正确的主机传送数据时使用的关键协议。恶意参与者可以通过在局域网上使用 ARP 缓存病毒(或 ARP 欺骗)攻击将流量重定向到他们的机器。这种中间人攻击是通过欺骗网络上的主机,使其相信恶意参与者的 MAC 地址是某个其他主机,目的是拦截流量。

注意

要更深入地了解 ARP 欺骗攻击,请参阅第一章**用信息武装黑客小节中的

*除了 ARP 欺骗之外,攻击者还可以发起 ARP 风暴,如下所述。

ARP 风暴回顾

在局域网上,看到 ARP 请求/回复消息是很正常的。但是,当有大量的 ARP 请求时,如下面的截图所示,这是一个 ARP 风暴的指示,是一种拒绝服务 ( DoS )攻击的形式:

Figure 16.15 – An ARP storm
)

图 16.15–一场 ARP 风暴

让我们一步步了解 ARP 风暴是如何工作的:

  1. 为了高效地传送数据,交换机使用一个内容可寻址存储器 ( CAM )表,该表包含成对的 MAC 地址及其关联的物理交换机端口。
  2. ARP 风暴淹没了 CAM 表,数以千计的虚假条目淹没了交换机。
  3. 此时,交换机只是充当一个集线器,从所有端口发送数据,这可能导致以下结果:
    • 允许可能暴露敏感数据的流量嗅探
    • 导致网络无法正常运行

如你所见,ARP 风暴是可能的。在 Wireshark 中,您可以监控 ARP 风暴。要对此进行修改,选择一个 ARP 头,单击右键,选择协议首选项 | 开放地址解析协议首选项… ,将显示如下截图:

Figure 16.16 – ARP/RARP preferences
)

图 16.16–ARP/RARP 首选项

一旦进入首选项菜单,您可以修改以下内容:

  • 期间检测的请求数:输入适当的值,例如30个请求。
  • 检测周期(毫秒):输入合适的值,例如100毫秒

虽然 Wireshark 不能阻止 ARP 风暴,但它可以帮助您识别潜在的攻击。

我们现在知道有欺骗和强攻等攻击。这些攻击是如何发动的?以下部分概述了一些可用于在局域网上发起 ARP 攻击的工具。

了解 ARP 攻击工具

ARP 攻击可能发生在局域网上。许多可用的工具都内置在 Kali Linux 中。Kali Linux 是一组软件工具,旨在帮助网络管理员在网络上进行道德黑客活动。如需完整列表,请访问 https://tools.kali.org/tools-listing。

Kali Linux 中用于发起 ARP 攻击的一些工具包括:

  • dsniff 是一套工具,包括 arpspoof ,它允许黑客广告一个欺骗的 MAC 地址,作为误导流量的一种方式。
  • Ettercap 是一款易于使用的 ARP 攻击工具,与其他工具一起可以拦截网络流量。
  • Arpoison 是一个免费的命令行工具,允许黑客定制一个 ARP 数据包,并定义发送者和目标地址。

如图所示,发起 ARP 攻击有多种方式,黑客有许多工具可供使用。以下部分概述了我们可以抵御 ARP 攻击的一些方法。

防御 ARP 攻击

如前所述,ARP 可能是一个易受攻击的目标。除了列出的攻击之外,还有其他攻击。网络管理员应该知道检测和防御这类攻击的方法。

一些防止 ARP 攻击的工具和技术包括:

  • 入侵检测系统/入侵防御系统 ( IDSs/IPSs ):调优设备监控异常 ARP 活动,如 ARP 风暴,通常有特定的特征。如果检测到未经请求的回复,设备应发送警报。
  • 静态 ARP 条目:硬编码地址映射,防止欺骗。虽然静态 ARP 条目可以防止 ARP 欺骗,但这不是最好的防御方法,因为它不能很好地适应大型网络。
  • 防火墙:使用带有包过滤的访问控制列表,确保只有授权的流量才允许通过网段。
  • 反 ARP 软件:这个软件监控欺骗,欺骗可以表现为两个 IP 地址有相同的 MAC 地址。很多时候,软件还会包含检测其他恶意 ARP 行为的方法。
  • 安全邻居发现 ( 发送):在 IPv6 网络上,可以使用发送协议。这是 NDP 的扩展,通过使用加密技术提供认证,并降低在局域网上成功发起 ARP 欺骗攻击的能力。

虽然网络有可能成为恶意 ARP 活动的受害者,但最好激活可能的防御策略,以防止严重的攻击。

总结

到目前为止,您已经对 ARP 有了更好的理解,它是如何工作的,以及为什么它对传送数据很重要。为了让您了解 ARP 请求和回复过程中发生了什么,我们逐步完成了这个过程,然后查看了 ARP 报头和字段值。我们还讨论了这样一个事实,即除了标准 ARP,您在 Wireshark 中分析流量时可能会遇到不同类型的 ARP,例如免费 ARP 或 InARP。最后,为了让您意识到 ARP 可能被恶意使用,我们讲述了一些攻击,以及一些用于发起 ARP 攻击的工具。然后,我们总结了一些您应该采用的方法来抵御各种类型的攻击。

下一章将介绍 Wireshark 如何帮助识别和排除网络延迟问题。您将能够体会到时间值在网络中的重要性,并发现几种显示时间的方法。此外,您将看到 Wireshark 中颜色规则的价值,以及帮助突出显示有趣流量的智能滚动条。最后,您将学习如何使用专家信息,以便您可以在分析过程中专注于问题点。

问题

现在,是时候检查你的知识了。选择最佳答案,然后将您的答案与评估附录中的答案进行核对:

  1. 在局域网中,____ 层使用目的机器的 MAC 地址,而不是 IP 地址:
    1. 网络
    2. 介绍会;展示会
    3. 数据传输器
    4. 运输
  2. ARP 操作码列出了发送方正在执行的操作。虽然有很多,但最常见的操作码是 _____:
    1. 10 和 12
    2. 0 和 8
    3. 7 amd 8
    4. 1 和 2
  3. 对于(n)_ _ _ _ _ _ _,客户端使用其 MAC 地址向计算机网络请求其 IPv4 地址:
    1. 吸进去
    2. 反向地址解析协议(Reverse Address Resolution Protocol)
    3. 无偿 ARP
    4. 代理 ARP
  4. ____ 是一种未经请求的 ARP,用于防止网络上出现重复的 IP 地址。不期待任何答复:
    1. 吸进去
    2. 反向地址解析协议(Reverse Address Resolution Protocol)
    3. 无偿 ARP
    4. 代理 ARP
  5. ARP_____ 是大量的 ARP 请求,会造成 DoS 攻击并阻止网络正常运行:
    1. 暴风雨
    2. 愚弄
    3. 免费的
    4. 相反的
  6. ____ 定义了发送者正在执行的操作:
    1. 暴风雨
    2. 愚弄
    3. 操作码
    4. 协议类型
  7. 防范 ARP 攻击的一种可能的防御策略是使用(n)_ _ _ _ _ _ _,并调整设备以监控异常 ARP 活动,如 ARP 风暴:
    1. 水獭箱
    2. IDS/IPS
    3. 免费代码
    4. 凸轮警报

延伸阅读

请参考以下链接了解更多信息:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值