杜文亮深度实践笔记 - chap12 - 数据包嗅探和伪造
课程前置计算机网络知识回顾
$$
\quad
$$
Classful Addressing 将 IP 地址分为 5 类。由于网络地址长度是固定的,故每一类 IP 地址可分配的数量也是固定的。这样在分配给企业时有可能造成 IP 地址过多浪费等问题。
Classless Addressing 中网络地址的长度可以自定义(即IP 地址 /
后的数字),引申出子网掩码(Net Mask)的概念。
随着互联网设备的增多,IPV4 已经不能满足为所有设备提供唯一的 IP 地址。IPV6 可以暂时地解决 IP 地址不足的问题,但 NAT(Network Address Translation)可以完美地解决这个问题。大部分电脑都配置有 NAT 服务,该服务允许设备在本地使用自定义的私人 IP 地址,当要与互联网通信时,NAT 会将私人 IP 转译为其在互联网上的真实 IP。
获取 IP 地址的方法有手动和自动。自动获取 IP 地址需借助 DHCP(Dynamic Host Configuration Protocol) 。
DNS(Domain Name System)将 IP 地址与主机名进行对应,方便人们记忆。
12.1 Introduction
数据包嗅探和伪造(Packet Sniffing and Spoofing)是两种常见的攻击形式,也是众多其他网络攻击的基础。
嗅探(Sniffing):Trying to receive everybody’s packets.
伪造(Spoffing):Put some fake information into the packet and send it out.
12.2 Use Socket to send packets
将数据打包成数据包是很复杂的事情,这件事由 OS 来完成。应用只需要使用 OS 提供的系统调用,将数据通过对应的 API 传入内核即可。
Packets 中不止要包括传输的信息,还需包括使用的协议、目的 IP 地址等信息。
以下是分别使用 Python 和 C++ 编写的 UDP 程序,来进行 Packets Sending 的过程。
12.3 Receiving Packets
1. IP layer and above
IP layer:判断“我”是否是该数据包要被传送到的最终地址。
Transport layer:IP layer 会判断该数据包所采取的 Transport Protocol(e.g. UDP, TCP),并送至对应的模块。
Application:应用通过端口 port 来接受数据包,因此可以通过 OS 与指定的端口号进行绑定。所以每当数据包到来时,传输层得以知道这是哪个应用需要的数据包。传输层会将数据包存储至对应端口的缓冲区 buffer。
2. IP layer and below & Packet Sniffing
一般情况下,当电脑通过网卡 NIC 接收到数据包时,会检测目的地址是否与自己的 MAC 地址相同来判断“这个数据包是不是发给我的”。如果不同则大多数情况下会选择丢弃该数据包。 OS 提供了一种特殊模式来支持 Packet Sniffing(即使不是发给自己的也不选择丢弃,这样才可以“偷”到别人的数据包),该模式叫做混杂模式(Promiscuous Mode)。在混杂模式下,一台机器的网卡能够接收所有经过它的数据流,而不论其目的地址是否是它。
由于 Sniffer Program 位于上层,在 Protocol stack 中的 IP layer 仍会对该数据包的 IP 地址进行检查。也就是说不是发给自己的数据包会在 IP layer 的时候会被检测到异常,从而被丢弃。可以通过一种特殊的 Socket(Raw Socket)来避免这个问题。若存在 Raw Socket,所有数据包会被进行复制并传给这个 Raw Socket。
有时我们只需要对我们有用的数据包,如和 DNS 有关的数据包。所以对嗅探到的数据包进行筛选是很重要的。 BPF 是一种高效的、提前筛选的方法。
12.4 Packet Sniffing
杜文亮深度实践笔记 - chap12 - 数据包嗅探和伪造