0xFF 实验环境:

真DHCP服务器:CentOS 8

攻击者:Kali

受害者:Windows 10

0x00 预备知识

阅读本文所需要的知识:计算机网络、网络安全、Linux操作系统

计算机网络——DHCP:

需要连接到互联网的计算机,必须对IP地址等项目进行协议配置。

互联网现在广泛使用的是动态主机协议配置DHCP(Dynamic Host Configuration Protocol),其作用:

  1. 用于内部网或网络服务供应商自动分配IP地址给用户
  2. 用于内部网管理员对所有电脑作中央管理

DHCP以C/S模式运行,二者交互过程如下:

  1. DHCP发现(DISCOVER):客户端以广播方式发出DHCP DISCOVER报文, 寻找网络中的DHCP服务器。
  2. DHCP提供(OFFER):DHCP服务器接收到来自客户端的DHCP DISCOVER报文后,会在自己的地址池中查找是否有可提供的IP地址。如果有,服务器就将此IP地址做上标记,并用DHCP OFFER报文将其发送给客户端。
  3. DHCP请求(REQUEST):由于网络中可能会存在多台DHCP服务器,因此客户端可能会接收到多个DHCP OFFER报文。通常,客户端选择最先到达的DHCP OFFER,并再次以广播方式发送DHCP REQUEST报文。这时,不仅要告知它所选择的服务器,同时也要告知其他没有选择的服务器。这样,这些服务器就可以将之前所提供的IP地址收回。
  4. DHCP确认(Acknowledge,ACK):被选择的DHCP服务器收到客户端发来的DHCP REQUEST报文后,首先将刚才所提供的IP地址标记为已租用,然后向客户端发送一个DHCP ACK确认报文,该报文中含有IP地址的有效租约、默认网关和DNS服务器等网络配置信息。当客户端收到DHCP ACK报文后,就成功获得了IP地址,完成了初始化过程。

网络安全——DHCP攻击

Step1 受害者向广播域发送DISCOVER报文

Step2 DHCP服务器和攻击者均向广播域回应OFFER报文(由于DHCP Server和DHCP Client之间没有认证机制,所以攻击者可以伪装成DHCP Server)

Step3 客户端可能接收到多个OFFER报文,其通常只接受第一个。这里我们假设受害者接受了攻击者的OFFER,此后受害者向广播域发送REQUEST报文以通知此事

Step4 DHCP服务器接收到REQUSET报文后取消标记预分配的IP地址,攻击者收到REQUEST报文后向广播域发送ACK报文。

Step5 最终攻击者建立了与受害者的连接,作为受害者的DHCP服务器接受其所有发送至互联网的数据,充当了受害者与互联网之间的“中间人”,所以DHCP攻击是一种中间人攻击。

那么问题出现了,攻击者怎样才能使受害者必须接受自己的OFFER报文呢?

这就引入了耗尽攻击,攻击者可以伪造多个MAC地址,用他们向广播域发送大量DISCOVER报文,每一个都会占用DHCP服务器的一个IP地址,形成半开连接,当伪造DISCOVER报文足够多时,其他DHCP服务器的IP地址都会被耗尽,整个广播域内就只有攻击者向他人可以发送OFFER报文了。

0x01 配置DHCP服务器

0x010 将三台虚拟机绑定到VMnet1网卡

注:最好在这些操作前安装好后文所用到的软件

VMnet1在这里起划分子网的作用,让三台虚拟机形成一个广播域。这里没有接入实体机的网络,所有当你这样配置后,三台虚拟机都应该是断网的状态。

0x011 分配静态IP

首先要修改网卡的设置,由于每台虚拟机的网卡命名都不统一,所以只能进入目录查看这个配置文件。

cd /etc/sysconfig/network-scripts

vim ifcfg-ens160

将BOOTPROTO参数修改为static,然后在下面新增如下几行表示IP地址、掩码、网关和DNS。

这里的$prefix = 24 = 3 * 8bit$,代表掩码255.255.255.0

0x012 安装DHCP服务

yum install dhcp-* -y

*:通配符,表示安装配置dhcp所需的全部程序

-y--yes,将接下来的询问全部回答为yes

0x013 配置DHCP服务

查询dhcp-server软件包的配置文件列表

rpm -qc dhcp-server

查看一下配置文件

vim /etc/dhcp/dhcpd.conf

里面说你可以查看配置样例,那我们先直接把样例文件粘过来

cp /usr/share/doc/dhcp-server/dhcpd.conf.example /etc/dhcp/dhcpd.conf

然后对样例进行修改,首先分配一个DNS:8.8.8.8(同上文),然后在下面新建一个块,写入子网IP、子网掩码、分配地址池的范围和网关。

vim /etc/dhcp/dhcpd.conf

0x014 启动并检查DHCP服务

systemctl start dhcpd

systemctl status dhcpd.service

如果出现了绿圈和active (running)代表我们的DHCP服务器运行成功了

以数字地址(-n)显示全部(-a)udp协议(-u)及其所对应进程的PID和名称(-p

netstat -anpu

此时打开我们的Windows 10,它就会自动从DHCP服务器(CentOS 8)处获取IP地址。

ipconfig /all

0x02 攻击方法

首先要在攻击机上配置DHCP服务,方法类似0x01

0x021 分配静态IP

因各个Linux发行版存在差异,为Kali分配静态IP需要修改两个配置文件。

vim /etc/network/interfaces

vim /etc/resovl.conf

0x022 安装DHCP服务

apt install isc-dhcp-server -y

Debian系Linux使用apt安装软件,RedHat系Linux使用yum安装软件。

0x023 配置DHCP服务

vim /etc/dhcp/dhcpd.conf

0x024 启动并检查DHCP服务

service isc-dhcp-server start

service isc-dhcp-server status

0x025 耗尽真DHCP服务器IP地址

即将展开攻击,我们整理一下已知资料:

真DHCP服务器 攻击者
操作系统 CentOS 8 Kali
IP地址 192.168.145.100 192.168.145.105
域名 example.org hack.org
DNS 8.8.8.8 9.9.9.9
IP地址池 192.168.145.200-220 192.168.145.230-250

我们使用dhcpstarv程序伪造MAC地址进行DHCP请求,消耗掉真DHCP服务器的IP地址。

dhcpstrarv -i eth0 -e 192.168.145.200

现在可以来查看一下CentOS 8的DHCP服务,发现其对于接收到的DHCP DISCOVER报文显示了no free leases,这说明它已经没有可用IP了。

注:DHCP在指定时间内收不到REQUEST请求则会自动取消IP地址的标记使其成为可用状态,因此dhcpstarv程序一直开着就好。

0x026 受害机请求IP地址

当有主机请求IP地址时,因真DHCP已无剩余IP地址,故受害机只会收到攻击机的OFFER,进而获取其分配的IP地址。

这里我们使用测试DHCP服务器的主机作为受害机,让其重新获取IP:

ipconfig /release

ipconfig /renew

ipconfig /all

框出的部分明显地宣布了我们本次攻击的成功。

0x027 嗅探网段内报文

ettercap -i eth0 -Tq -M dhcp:192.168.145.230-250/255.255.255.0/9.9.9.9

若在受害者获取IP地址前,使用etterecap嗅探网段中的报文,我们便会发现一次完整的DHCP过程。

这次实验的报文很整齐美观:受害者(MAC地址00:0C:29:0A:26:F7)间隔固定时间发送一次DISCOVER报文,随后攻击者(IP地址192.168.145.105)不停地对每一个DISCOVER报文回复OFFER,在第三次DISCOCER后受害者接受了OFFER,并回应了REQUEST报文,随后攻击者立刻向其回应了ACK报文。

0x03 后渗透利用

0x030 获取受害机发送的数据包

此时,攻击机已经成为了受害机的DHCP服务器,受害机的所有数据包都会发向攻击机。

不论QQ、微信的聊天记录,还是登陆网站所用的账号、密码都必须经过攻击机这个“中间人”,所以DHCP耗尽攻击属于中间人攻击。

以我的博客为例

攻击者尝试解析域名xuwp.top

攻击者接收到DNS数据包

受害者尝试ping IP地址

攻击者收到ICMP数据包

当然,这次实验并没有让这个网段连接至互联网,所以访问我的博客也会失败。