DHCP用来自动分配ip地址,每一个DHCP service(DHCP服务器)都有一个DHCP pool(分配池),每一个终端对DHCP service发送请求时,DHCP service会从池中给终端分配IP,分配的方式会因为OS不同而不同,从前往后,从后往前,或者随机分配
终端开启DHCP服务后向网段内广播发送discover请求,DHCP service接收到discover后,记录下discover请求中的CHADDR(硬件地址)和IP地址,回应offer,然后主机在对其发送request请求,服务器ack回应,如下图:
下面在eNSP中简单展示DHCP请求的发送过程,如下为拓扑
DHCP service中开启DHCP服务
dhcp enable //开启dhcp
int g0/0/0 //进入端口
ip address 192.168.11.254 24 //配置ip
quit
ip pool test //进入dhcp pool
gateway-list 192.168.11.254
network 192.168.11.0 mask 255.255.255.0
dns-list 8.8.8.8
quit
int g0/0/0
dhcp select global //全局启用
我们在两者之间进行抓包可以发现终端经过dhcp服务取得ip的过程,其中discover报文中就蕴含着后面提到的DHCP饿死攻击中利用的点。上面的地址为以太网II协议中包含的主机MAC地址,而下面的则是写入到Discover中的CHADDR地址
DHCP饿死攻击是利用修改discover报文中的CHADDR地址,不断的向DHCP service发送请求,以此来耗尽DHCP pool中的地址。
我们可以利用kali-linux中的dhcpstarv工具来复现这一攻击模式,如图为拓扑
先把终端切换回静态IP,然后重置ip pool
在kali中使用dhcpstarv工具攻击
此时在DHCP service端口处抓到的包如图所示,可见CHADDR地址和MAC地址并不统一
如图所示IP pool中的ip被消耗完了
当其他终端在此想使用DHCP服务时,收到的ip为空
像上文这种仅伪造CHADDR地址的饿死攻击会被DHCP snooping(下文攻击防范时提到)防御下来,于是就有了另一种同时伪造MAC地址和CHADDR地址的方式,可以通过kali中的yersinia工具实现
在DHCP资源池耗尽的时候,如果还有终端发送广播的discover消息,可以使用kali伪造DHCP服务器,那么终端访问外界都需通过kali进行,kali对其进行了嗅探
在kali-linux中我们可以用yersinia来形成DHCP仿冒攻击:
当终端开启DHCP服务时,kali便能开始嗅探
使用DHCP snooping中的设置信任端口
/*在交换机SW1中*/
dhcp enable
dhcp snooping enable
vlan 1
dhcp snooping enable //开启vlan 1 中的dhcp snooping
/*设置信任端口*/
dhcp snooping trusted interface g0/0/24
只向信任端口转发discover,只接收信任端口的offer和ack,如此便挡住了仿冒攻击
开启DHCP snooping和DHCP snooping check chaddr(用于比较MAC和CHADDR地址是否一致,若不一致则直接丢弃。
/*需要在组内进行*/
port group 1 //创建组1
group-member g0/0/1 to g0/0/24 //1到24端口一同开启
dhcp snooping check dhcp-chaddr enable
对于同时仿冒mac和chaddr的攻击,无法仅仅使用check chaddr的方式阻挡,需要通过端口安全方式实现,通过设置使交换机的一个access接口只允许通过设定数量的MAC学习,若是学习到多个给予惩罚
port-security enable //开启端口安全
port-security max-mac-num 1 //最大可学习的mac为1
shutdown
undo shutdown //重启
port-security protect-action shutdown //惩罚为重启