文中大量参考TCP/IP协议详解。
我们应该有进一步的勇气,也要有退一步的从容。
1. DHCP作用
(Dynamic Host Configuration Protocol) 动态主机配置协议。DHCP服务器主要使用UDP67、68号端口进行通讯。其中UDP67号端口作用于客户端发起的请求,UDP68是服务器应答时使用。
2. DHCP原理
也成为DHCP租约过程,分为四个步骤:
- Clinet发送DHCP DISCOVER广播包;
- 所有的DHCP Server都能够接收到DHCP Client发送的DHCP Discover报文,所有的DHCP Server都会给出响应,向DHCP Client发送一个DHCP Offer报文;DHCP Offer报文含有DHCP Server能够提供给DHCP Client使用的IP地址,且DHCP Server会将自己的IP地址也放在其中,用于区分不同DHCP Server;
- DHCP Client只能处理其中的一个DHCP Offer报文,一般的原则是DHCP Client处理最先收到的DHCP Offer报文。DHCP Client会发出一个广播的DHCP Request报文,在选项字段中会加入选中的DHCP Server的IP地址和需要的IP地址;
- 部分未被选择的DHCP服务器会发送拒绝包(不再提供这个IP给clinet使用)。根据DHCP服务器的操作系统、软件版本不同做出的反应也不同;
- DHCP Server收到DHCP Request报文后,判断选项字段中的IP地址是否与自己的地址相同。如果不相同,DHCP Server不做任何处理只清除相应IP地址分配记录;如果相同,DHCP Server就会向DHCP Client响应一个DHCP ACK报文,并在选项字段中增加IP地址的使用租期信息;
- DHCP Client接收到DHCP ACK报文后,检查DHCP Server分配的IP地址是否能够使用。如果可以使用,则DHCP Client成功获得IP地址并根据IP地址使用租期自动启动续延过程;如果DHCP Client发现分配的IP地址已经被使用,则DHCP Client向DHCPServer发出DHCP Decline报文,通知DHCP Server禁用这个IP地址,然后DHCP Client开始新的地址申请过程;
- DHCP Client在成功获取IP地址后,随时可以通过发送DHCP Release报文释放自己的IP地址,DHCP Server收到DHCP Release报文后,会回收相应的IP地址并重新分配。
3. DHCP续约
- 租期达到50%(T1)时,DHCP客户端会自动以单播的方式向DHCP服务器发送DHCP REQUEST报文,请求更新IP地址租期。如果收到DHCP服务器回应的DHCP ACK报文,则租期更新成功(即租期从0开始计算);如果收到DHCP NAK报文,则重新发送DHCP DISCOVER报文请求新的IP地址。
- 当租期达到87.5%(T2)时,如果仍未收到DHCP服务器的应答,DHCP客户端会自动以广播的方式向DHCP服务器发送DHCP REQUEST报文,请求更新IP地址租期。如果收到DHCP服务器回应的DHCP ACK报文,则租期更新成功(即租期从0开始计算);如果收到DHCP NAK报文,则重新发送DHCP DISCOVER报文请求新的IP地址。windows:若租期达到T2阶段时,客户端发送DHCP REQUEST报文未得到响应,会释放该网络地址,重新发送DHCP DISCOVER请求,若还未能得到回应,那么网卡会给自己分配一个地址。(全球统一无效地址:169.254.0.0/16)
- 如果租期时间到时都没有收到服务器的回应,客户端停止使用此IP地址,重新发送DHCP DISCOVER报文请求新的IP地址。
- 当租约未到期时,客户端重启重新发起DHCP DISCOVER请求,服务器会按正常通讯流程将未过期的IP及其相关信息重新下发。
4. 攻击思路
-
伪造MAC地址,持续发送Discovery包,获得IP地址后,进行确认。直到耗尽IP地址池。
-
伪造DHCP服务器,提供错误的信息给客户端的网卡。
5. 防御思路
-
硬件防护:在管理交换机的端口上做MAC地址动态绑定/静态绑定。防止不法客户端伪造MAC地址。
-
网络防护:在管理交换机上,除合法的DHCP服务器所在接口外,全部设置为禁止发送DHCP OFFER包。
6.部署DHCP服务,Linux版部署,windows的太简单不宜演示。
6.1 初始化DHCP Server环境
- 我使用的是克隆我的模板机器,我的模板机器目前已经将firewalld,SELinux已经禁用。
systemctl disable firewalld && sed -i #SELINUX=enforcing#SELINUX=disabled# /etc/selinux/config && setenforce 0
6.2 安装DHCP Server
- 这边常规yum安装即可。
yum install -y dhcp
- 设置开机启动。
systemctl enable dhcpd
6.3 修改配置文件
- 主配置文件在/etc/dhcp/dhcpd.conf
[root@localhost ~]# cat /etc/dhcp/dhcpd.conf
#
# DHCP Server Configuration file.
# see /usr/share/doc/dhcp*/dhcpd.conf.example 可以看到这里是有一个示例文件的
# see dhcpd.conf(5) man page
#
- 看看我们的示例配置文件。
# 以下配置为通用选项
option domain-name "ns.lqh.com"; #此项为DNS域名
option domain-name-servers 192.168.85.241, 192.168.84.241; #此项为DNS Server服务器选项
default-lease-time 600; #此项为租约时间
max-lease-time 7200; #此项为最大租约时间
# 是否启用动态DNS更新,通常被设置为interim(none:不支持动态更新/interim:互动更新模式/特殊更新模式)。
ddns-update-style none;
#是否为权威DHCP服务器
#authoritative;
#拷贝指向系统日志收集系统
log-facility local7;
# 定义子网 这里只能提供网卡所在网段的子网则否报错“提示没有配置任何监听端口”
subnet 192.168.85.0 netmask 255.255.255.0 {
range 192.168.85.20 192.168.85.250;
#option domain-name-servers ns1.internal.example.org;
#option domain-name "internal.example.org";
option routers 192.168.85.1;
option broadcast-address 192.168.85.255;
#default-lease-time 600;
#max-lease-time 7200;
}
#作用于某台主机
host lqh_desktop {
hardware ethernet 00:0c:29:e0:e8:a3;
fixed-address 192.168.85.3;
}
6.4 启动服务,并检查端口情况。
systemctl start dhcpd && netstat -anulp | grep "67|68"
7.抓包验证整个协议通讯过程。
-
字段太多不能一一细扣,容易把自己绕进去。
-
DHCP Release(客户端释放租约信息,其中重要信息:单播、客户端IP、mac地址、消息的类型、server的IP、server不做回应)。
- DHCP Discover (客户端广播请求server的回应,包含有自己的mac地址,消息类型、ip地址、和参数请求列表)。
- DHCP offer(这里server发出的不仅包含分配给clinet的ip,还有子网掩码,dns等信息)。
- DHCP request (确认选择,广播形式)
- DHCP ack(确认时会重新下发ip、子网掩码、网关、dns等信息)。
网友评论