SwanQ's blog

To live is to Risk it All

0%

一篇文章搞懂所有协议

0x01 DHCP协议

局域网内分配ip

一、动态主机配置协议DHCP

1.DHCP简介

​ DHCP(Dynamic Host Configuration Protocol),动态主机配置协议,是一个应用层协议。当我们将客户主机ip地址设置为动态获取方式时,DHCP服务器就会根据DHCP协议给客户端分配IP,使得客户机能够利用这个IP上网。

​ DHCP的前身是BOOTP协议(Bootstrap Protocol),BOOTP被创建出来为连接到网络中的设备自动分配地址,后来被DHCP取代了,DHCP比BOOTP更加复杂,功能更强大。后面可以看到,在用Wireshark过滤显示DHCP包,需要输入过滤条件BOOTP,而不是DHCP,但或许是因为我使用的Wireshark版本是比较旧的1.12.9,没有在新版本中尝试过,也许可以输入DHCP让其只显示DHCP包。

2.工作原理

img

DHCP的实现分为4步:

第一步:Client端在局域网内发起一个DHCP Discover包,目的是想发现能够给它提供IP的DHCP Server。

第二步:可用的DHCP Server接收到Discover包之后,通过发送DHCP Offer包给予Client端应答,意在告诉Client端它可以提供IP地址。

第三步:Client端接收到Offer包之后,发送DHCP Request包请求分配IP。

第四步:DHCP Server发送ACK数据包,确认信息。

二、利用Wireshark抓取DHCP包

1.分析

要想抓取到DHCP包,先要保证有可用的DHCP服务器,然后将主机IP地址获取方式设置为自动获取。如果主机在抓包之前已经联网,需要先断开主机的网络连接,然后再连接网络。

cmd中可以使用ipconfig /?查看各参数的含义:

img

(1)ipconfig /release

断开当前的网络连接,主机IP变为0.0.0.0,主机与网络断开,不能访问网络。

img

(2)ipconfig /renew

更新适配器信息,请求连接网络,这条命令结束之后,主机会获得一个可用的IP,再次接入网络。

2.开始抓包

实验环境:Win10专业版,Wireshark3.2.7,有线连接

DHCP服务器IPv4地址:10.170.72.254

本机被分配IP:10.170.56.55

(1)在Wireshark中点击start开始抓包,在过滤栏输入bootp,使其只显示DHCP数据包。

(2)在cmd中输入ipconfig /release 断开网络连接。

img

可以看到此时所有的网卡都已经断开。以太网处于断开状态。 由于开了虚拟机的原因,Wireshark中截获到一个DHCP Release数据包。

(3)在cmd中输入ipconfig /renew 请求网络连接。

此时,可以看到在Wireshark中新增了4个DHCP数据包:

img

数据包1:DHCP Discover

数据包2:DHCP Offer

数据包3:DHCP Request

数据包4:DHCP ACK

注:当直接手动连接wifi时,直接发起request包(另一台pc)

img

等待这条命令执行完毕之后,在cmd中可以看到主机被分配了IP,主机成功连入网络中。

img

(4)为了后续分析使用,我们再执行一次ipconfig /renew:

可以看到Wireshark中新增了3个数据包:DHCP ACK;DHCP Request;DHCP ACk。如果再次使用ipconfig /renew,每执行一次会新增2个数据包:DHCP Request;DHCP ACK

三、DHCP包分析

下面着重来分析当执行,ipconfig /renew这条命令产生的4个DHCP数据包,这4个数据包代表了客户机和DHCP服务器的交互过程,也是IP动态分配的过程。

1.DHCP Discover数据包

(1)Client端使用IP地址0.0.0.0发送了一个广播包,可以看到此时的目的IP为255.255.255.255。Client想通过这个数据包发现可以给它提供服务的DHCP服务器。

(2)从下图可以看出,DHCP属于应用层协议,它在传输层使用UDP协议,目的端口是67。

img

2.DHCP Offer包

当DHCP服务器收到一条DHCP Discover数据包时,用一个DHCP Offer包给予客户端响应。

img

(1)DHCP服务器使用广播地址作为目的地址,因为此时请求分配IP的Client并没有自己ip,而可能有多个Client在使用0.0.0.0这个IP作为源IP向DHCP服务器发出IP分配请求,DHCP也不能使用0.0.0.0这个IP作为目的IP地址,于是依然采用广播的方式,告诉正在请求的Client们,这是一台可以使用的DHCP服务器。

(2)DHCP服务器提供了一个可用的IP,在数据包的Your (client) IP Address字段可以看到DHCP服务器提供的可用IP。

(3)除此之外,如图中红色矩形框的内容所示,服务器还发送了子网掩码,路由器,DNS,域名,IP地址租用期等信息。

3.DHCP Request包

当Client收到了DHCP Offer包以后(如果有多个可用的DHCP服务器,那么可能会收到多个DHCP Offer包),确认有可以和它交互的DHCP服务器存在,于是Client发送Request数据包,请求分配IP。

img

此时的源IP和目的IP依然是0.0.0.0和255.255.255.255。

4.DHCP ACK包

服务器用DHCP ACK包对DHCP请求进行响应。

img

在数据包中包含以下信息,表示将这些资源信息分配给Client.

Your(client) IP address:分配给Client的可用IP

后面有许多项option信息,前两项是DHCP服务器发送的消息类型(ACK)和服务器的身份标识,后面几项是:

Subnet Mask:Client端分配到的IP的子网掩码;

Router:路由器

Domain Name Server:DNS,域名服务器

Domain Name:域名

IP Address Lease Time:IP租用期。

四、DHCP starvation attack

1.DHCP starvation attack,DHCP饥饿攻击

有许多中攻击DHCP的技术,这里介绍其中一种,有点类似于SYN 洪范攻击。

DHCP starvation attack,中文即DHCP饥饿攻击,就是大量地进食,把可以吃的食物全部吃完,然后让其他人没得吃,最后给其他人提供一些毒药,把人家毒死。

下面来说这种攻击是如何实现的。一些不法分子,伪造合法的MAC地址,不断地向DHCP服务器发出DHCP Request包,最后耗尽服务器的可用IP,于是原有的这台DHCP服务器便不能够给客户端分配IP了,此时不法分子再伪造一台DHCP服务器,给客户端分配IP,将客户端的默认网关和DNS都设置成自己的机器,于是便可以对客户端进行中间人攻击

参考:https://blog.csdn.net/zqixiao_09/article/details/77131239

0x02 ICMP协议

一、动态主机配置协议ICMP 不可靠

1.ICMP简介

​ 网络控制消息协议(Internet Control Message Protocol,ICMP)是网路协议族的核心协议之一。它用于TCP/IP网络中发送控制消息,提供可能发生在通信环境中的各种问题反馈,令管理者可以对所发生的问题作出诊断并采取适当的措施。

​ ICMP 依靠IP来完成它的任务,它是IP的主要部分。它与传输协议,如TCP和UDP显著不同:它一般不用于在两点间传输数据。仅ping和traceroute会用到。 IPv4中的ICMP被称作ICMPv4,IPv6中的ICMP则被称作ICMPv6。

​ ICMP是在RFC 792中定义的互联网协议族之一。通常用于返回的错误信息或是分析路由。ICMP错误消息总是包括了源数据并返回给发送者。 ICMP错误消息的例子之一是TTL值过期。每个路由器在转发数据报的时候都会把IP包头中的TTL值减一。如果TTL值为0,“TTL在传输中过期”的消息将会回报给源地址。 每个ICMP消息都是直接封装在一个IP数据包中的,因此,和UDP一样,ICMP是不可靠的。

​ 虽然ICMP是包含在IP数据包中的,但是对ICMP消息通常会特殊处理,会和一般IP数据包的处理不同,而不是作为IP的一个子协议来处理。在很多时候,需要去查看ICMP消息的内容,然后发送适当的错误消息到那个原来产生IP数据包的程序,即那个导致ICMP讯息被传送的IP数据包。

​ 很多常用的工具是基于ICMP消息的。

  • traceroute是通过发送包含有特殊的TTL的包,然后接收ICMP超时消息和目标不可达消息来实现的。
  • ping则是用ICMP的”Echo request”(类别代码:8)和”Echo reply”(类别代码:0)消息来实现的。ping是一款用于检测一个设备可连接性的工具,用于发送ICMP echo请求数据包。

二、利用Wireshark抓取DHCP包

1.ping分析

ping自己服务器

img

(1)echo ping请求包request

img

ICMP头部的Type以及Code的内容:

  1. Type表示ICMP消息基于RFC规范的类型或分类。
  2. Code表示ICMP消息基于RFC规范的子类型。
  3. ICMP头部中的Type的值是8,Code值是0,说明是一个echo请求数据包,所包含的数据很少。除了指定的类型、代码以及校验和,这里还有序列号用于匹配请求和响应,并且在可变域中包含有一串随机字符串。

(2)echo ping reply响应包

img

  1. ICMP头部中,类型和代码的值都是0,表示这是一个echo响应。
  2. 第二个数据包的序列号和第一个数据包匹配,确定对应关系
  3. Data的部分,这个数据包和第一个数据包字符相同。说明数据包被成功接收,ping成功。

2.安全问题

​ ICMP协议本身的特点就决定了它易于攻击网络上的路由器和主机。

  1. DDoS:用户可以利用操作系统规定的ICMP数据包的最大尺寸不超过64K这个规定,向网络上的主机发起Ping of Death攻击。因为当ICMP数据包的大小超过64K的时候,目标主机就有可能出现内存分配的错误的情况,导致TCP/IP堆栈崩溃,使得主机死机。
  2. ICMP风暴:向目标主机长时间、连续、大量地发送ICMP数据包,也会最终使系统瘫痪。大量的ICMP数据包会形成“ICMP风暴”,耗费目标主机大量的CPU资源。
  3. ICMP的echo请求使用的字符串可被利用,攻击者可使用这段内容来推测设备所使用的操作系统。或放置一些数据位用作反向连接。

2.路由跟踪

img

​ 路由跟踪识别一个设备到另一个设备的路径。对于溯源来说,确定数据包从一个地方到另一个地方所走的路径是异常重要的。

​ tracert:利用了ICMP协议,通过其跟踪结果,我们就可以画出数据包所走的路径。总共经过9个跃点到达目标IP

(1)第一个数据包:192.168.137.44 –> 192.168.137.1

img

​ 类比于此前分析的echo请求。这个数据包是从IP地址为192.168.137.44到47.95.28.98的简单的echo的请求,并且ICMP数据包头部的每一部分都与echo请求数据包相同。数据包的IP头中的TTL的值为1:****这个数据包会在它所遇到的第一个路由器的地方被丢弃。由于目标地址47.95.28.98是外网地址,肯定至少存在一个路由器,因此这个数据包不会到达目的地。

(2)第二个数据包: 192.168.137.1 –>192.168.137.44

img

​ 此数据包是在前往目的地的路径上,第一个路由器发回的reply响应。由于第一个数据包到达192.168.137.1后,TTL的值变成了0,因此就不能够继续传输,此时路由器就回复了一个ICMP响应。这个数据包的类型是11,代码是0,告诉我们这个数据包的TTL在传输中超时,所以目标地址不可达。

ICMP双头包:在ICMP的结尾部分包含了原echo请求的IP头和ICMP数据的拷贝。因此这个数据包也被叫做ICMP双头包,表示包含有两个ICMP的包头信息。双包头信息在网络故障检修的时候会非常有用。

(3)第三个数据包:找192.168.137.44

img

​ TTL为2,保证此数据包到达第二跳的路由。但是即便TTL的值变成了2,从下面的数据包来看,它也是无法到达目的地,直至TTL的值增长到9,这个数据包才到达了目的地。

(4)响应: 192.168.137.1 –>10.170.72.254

img

为何在此之前由两个数据包TTL为3呢?说明第二跳已经找到,开始物色第三跳,只不过回应时间稍长而已。

(5)找第三跳

(6)第三跳响应:172.16.255.242–>192.168.137.44

img

(6)第四跳响应:113.140.11.97–>192.168.137.44

之后如上

0x03 地址解析协议ARP**

1.ARP简介

​ ARP:IP地址解析为物理地址(MAC地址)。这里之所以需要使用MAC地址,是因为网络中用于连接各个设备的交换机使用了内容可寻址存储器(CAM,Coment Addressable Memory)。该存储器维护的ARP表列出了它在每一个端口的所有连接设备的MAC地址。

​ 当交换机收到了一个指向特定MAC地址的网络流量,它就会使用这个表,来确定应该使用哪一个端口发送流量。如果目标MAC地址是未知的,那么这个传输设备会首先在它的缓存中查找这个地址,如果没有找到,那么这个地址就需要通过在网络上额外的通信中解析了。或者我们可以结合下图来说明这个问题:

img

​ OSI模型将网络分为了七层,而IP地址位于第三层,也就是网络层,MAC地址位于数据链路层,也就是第二层。那么在通过以太网发送IP数据包的时候,需要首先封装第三层和第二层的报头。但由于发送数据包时只知道目标IP地址,不知道其MAC地址,而又不能直接跨越第二、三层,所以需要地址解析协议。而在使用了ARP协议后,计算机可以按照网络层IP数据包的头部信息,将硬件地址信息(MAC地址)对应起来,以保证通信的顺利进行。ARP协议的基本功能就是将一个已知的IP地址解析成MAC地址,以便主机之间可以正常地通信。

​ ARP协议是在RFC826中定义的。RFC(Request for Comments)是定义各种协议实现标准的官方文档。可在RFC Editor的首页搜索RFC文档。

2.工作原理

通过查看RFC826可以知道,其实ARP协议的解析过程只使用了两种数据包:一个ARP请求和一个ARP响应,如下图所示:

img

其详细工作原理为:

(1)当主机A想要给主机B发送数据时,主机A会首先在自己的本地ARP缓存表中检查与主机B相匹配的MAC地址。

(2)如果主机A在自己的缓存表中没找到主机B的相关条目,那么它就要想办法获取主机B的MAC地址。这就需要将ARP的请求帧广播到本地网络上的所有主机中。这个请求帧包含有主机A的IP地址和MAC地址,以及主机B的IP地址。网络中凡是收到请求帧的主机都会检查自己的IP地址是否与请求地址一致,如果不一致,则会丢弃该请求帧。对于上图来说,主机C和主机D会丢弃主机A发出的请求帧。

(3)主机B确定ARP请求中的IP地址和自己的IP地址一致,那么就会将主机A的IP地址和MAC地址添加到本地的缓存列表中

(4)主机B将包含有自己MAC地址的ARP响应消息直接回复给主机A(单播)

(5)主机A收到从主机B发来的ARP响应消息后,会将主机B的IP地址和MAC地址添加到自己的ARP缓存表中。接下来,主机A就可以向主机B发送消息了。

二、利用Wireshark抓取ARP包

查找局域网内IP:for /L %i IN (1,1,254) DO ping -w 2 -n 1 192.168.9.%i

​ arp -a

1.ARP分析

ARP缓存表如下:

本机所在局域网的ARP缓存表为192.168.9.20,每行表示一个ARP条目。缓存表有效期为120秒

主机启动时会主动发送ARP应答 刷新邻居的ARP缓存

img

(1)ARP请求包request

img

1.Ethernet:数据包目的地址是ff:ff:ff:ff:ff:ff,广播地址,说明当前数据包会被广播到当前网段中的所有设备上。

2.ARP请求的头部信息:硬件类型、协议类型、硬件地址长度、协议长度、

3.操作码(该值为1,表示这是一个ARP请求包)、发送方的MAC和IP地址,以及接收方的IP地址。

4.目标MAC地址还是未知的,因此就以全0的形式显示。

(2)ARP reply响应包

img

1.目标MAC地址已更新

2.操作码(Opcode)现在是2,表明这是一个用于响应的数据

(3)免费的ARP

img

  1. 以广播的形式发出,网络上的所有主机都能收到它。
  2. 发送方的IP地址和接收方的IP地址是一致的。网络中的其它主机收到这个数据包之后,它会让这些主机使用新的IP和MAC地址映射关系来更新它们的ARP表。
  3. 由于这个ARP数据包是源主机未经请求主动发出的,并导致了目标主机更新了ARP缓存,所以称之为免费的ARP。

2.安全问题

​ ARP协议本身广播不验证的特点就决定了它易于攻击

  1. DDoS:用户可以利用操作系统规定的ICMP数据包的最大尺寸不超过64K这个规定,向网络上的主机发起Ping of Death攻击。因为当ICMP数据包的大小超过64K的时候,目标主机就有可能出现内存分配的错误的情况,导致TCP/IP堆栈崩溃,使得主机死机。
  2. ARP欺骗:向目标主机连续、大量地发送假的ARP数据包。