0xFF 实验环境:
真DHCP服务器:CentOS 8
攻击者:Kali
受害者:Windows 10
0x00 预备知识
阅读本文所需要的知识:计算机网络、网络安全、Linux操作系统
计算机网络——DHCP:
需要连接到互联网的计算机,必须对IP地址等项目进行协议配置。
互联网现在广泛使用的是动态主机协议配置DHCP(Dynamic Host Configuration Protocol),其作用:
- 用于内部网或网络服务供应商自动分配IP地址给用户
- 用于内部网管理员对所有电脑作中央管理
DHCP以C/S模式运行,二者交互过程如下:
- DHCP发现(DISCOVER):客户端以广播方式发出DHCP DISCOVER报文, 寻找网络中的DHCP服务器。
- DHCP提供(OFFER):DHCP服务器接收到来自客户端的DHCP DISCOVER报文后,会在自己的地址池中查找是否有可提供的IP地址。如果有,服务器就将此IP地址做上标记,并用DHCP OFFER报文将其发送给客户端。
- DHCP请求(REQUEST):由于网络中可能会存在多台DHCP服务器,因此客户端可能会接收到多个DHCP OFFER报文。通常,客户端选择最先到达的DHCP OFFER,并再次以广播方式发送DHCP REQUEST报文。这时,不仅要告知它所选择的服务器,同时也要告知其他没有选择的服务器。这样,这些服务器就可以将之前所提供的IP地址收回。
- 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数据包
当然,这次实验并没有让这个网段连接至互联网,所以访问我的博客也会失败。