DHCP 是 Dynamic Host Configuration Protocol(动态主机分配协议)缩写,它的前身是 BOOTP。DHCP 可以说是 BOOTP 的增强版本,它分为两个部份:一个是服务器端,而另一个是客户端。所有的 IP 网络设定数据都由 DHCP 服务器集中管理,并负责处理客户端的 DHCP 要求;而客户端则会使用从服务器分配下来的IP环境数据。
那么在网络测试环境中,可能存在着一些私用的DHCPServer,这样会影响到其他环境的运行,尤其是在同一个局域网内,那么侦测局域网内的dhcp server的存在,避免第三方的dhcp对实验的影响,我们可以模拟发现当前的dhcp server的运行。
一般当开启DHCP的时候,会使用mac地址的过滤,以防止对其他物理环境的影响。在dhcpd.conf文件中添加: deny unknown-clients;选项。
如果环境中开启了一些dhcp的server,怎么才能检测出环境中的dhcp的存在呢。我们要了解一些DHCP的知识。
DHCP简单的来说是BOOTP + Dynamic allocation of IP addresses。DHCP又比BOOTP多了一种租约的概念,有效且动态的分配客户端的 TCP/IP 设定。那么我们先了解一下BOOTP的协议。
dhcp client请求的过程如下:
我们看一下DHCP的 discovery 和 offer的消息格式,我们可以组装我们的数据包。
http://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol
组装数据包如下:
packet += b'\x01' #Message type: Boot Request (1) packet += b'\x01' #Hardware type: Ethernet packet += b'\x06' #Hardware address length: 6 packet += b'\x00' #Hops: 0 packet += transactionID #Transaction ID packet += b'\x00\x00' #Seconds elapsed: 0 packet += b'\x80\x00' #Bootp flags: 0x8000 (Broadcast) + reserved flags packet += b'\x00\x00\x00\x00' #Client IP address: 0.0.0.0 packet += b'\x00\x00\x00\x00' #Your (client) IP address: 0.0.0.0 packet += b'\x00\x00\x00\x00' #Next server IP address: 0.0.0.0 packet += b'\x00\x00\x00\x00' #Relay agent IP address: 0.0.0.0 packet += b'\x00\x26\x9e\x04\x1e\x9b' #Client MAC address: 00:26:9e:04:1e:9b,or local MacAddress packet += b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' #Client hardware address padding: 00000000000000000000 packet += b'\x00' * 67 #Server host name not given packet += b'\x00' * 125 #Boot file name not given packet += b'\x63\x82\x53\x63' #Magic cookie: DHCP packet += b'\x35\x01\x01' #Option: (t=53,l=1) DHCP Message Type = DHCP Discover #packet += b'\x3d\x06\x00\x26\x9e\x04\x1e\x9b' #Option: (t=61,l=6) Client identifier packet += b'\x3d\x06' + macaddress packet += b'\x37\x03\x03\x01\x06' #Option: (t=55,l=3) Parameter Request List packet += b'\xff' #End Option
使用socket 将封装后的数据包发送出去。然后recv数据包进行数据包的分析。
我们可以分析后的数据看到:
DHCP Server : 192.168.8.xxx
Offered IP address : 192.168.8.1xx
Next Server : 192.168.9.1xx
subnet mask : 192.168.8.1