1 DHCP协议分析
1.1 简介
动态主机设置协议(Dynamic Host Configuration Protocol,DHCP)是一个局域网的网络协议,使用UDP
协议工作,工作在应用层,客户端使用68/udp
,服务端使用67/udp
。
主要有两个用途:
- 用于内部网或网络服务供应商自动分配IP地址(及其它网络信息,如网关、DNS服务器等)给用户
- 用于内部网管理员作为对所有计算机作中央管理的手段
DHCP
于1993年10月成为标准协议,其前身是BOOTP
协议。故在 wireshark 中过滤时应使用bootp
而不是dhcp
1.2 协议结构
DHCP协议的协议结构如下:
8 bits | 16 bits | 24 bits | 32 bits |
---|---|---|---|
Op | Htype | Hlen | Hops |
Xid | |||
Secs | Flags | ||
Ciaddr | |||
Yiaddr | |||
Siaddr | |||
Giaddr | |||
Chaddr (16 bytes) | |||
Sname (64 bytes) | |||
File (128 bytes) | |||
Option (variable) |
其中:
Op
:消息操作代码,只能为REQUEST(0X01)或REPLY(0X02)Htype
:硬件地址类型,通常为0x01(以太网MAC地址)Hlen
:硬件地址长度,通常为0x06Xid
:处理ID,可变Secs
:从获取到IP地址或者续约过程开始到现在所消耗的时间Flags
:标记,通常为0x0000Ciaddr
:客户机IP地址,通常为 0.0.0.0Yiaddr
:“你的”(客户机)IP地址,通常为分配的IP地址或0.0.0.0Siaddr
:在bootstrap中使用的下一台服务器的IP地址,通常为0.0.0.0Giaddr
:用于导入的接替代理IP地址,通常为 0.0.0.0Chaddr
:客户端硬件地址Sname
:任意服务器主机名称,空终止符,通常全为0File
:DHCP发现协议中的引导文件名、空终止符、属名或者空,DHCP供应协议中的受限目录路径名,通常全为0Options
:可选参数字段。非常重要
使用 wireshark 抓包显示的包结构如下:
Yersinia 中显示的包结构:
1.3 运行过程
如上图所示,DHCP运行分为如下四个基本过程:
- DISCOVERY:客户端发现DHCP服务器。客户端在物理子网上发送广播(DHCPDISCOVERY消息)来寻找可用的服务器。网络管理员也可以配置一个本地路由来转发DHCP包给另一个子网上的DHCP服务器。该客户端实现生成一个目的地址为255.255.255.255或者一个子网广播地址的UDP包。
- OFFER:服务器提供IP租约。当DHCP服务器收到一个来自客户的IP租约请求时,它会提供一个IP租约。DHCP为客户保留一个IP地址,然后通过网络单播一个DHCPOFFER消息给客户。该消息将分配的IP地址指定于YIADDR字段。并在选项中包含客户的MAC地址、子网掩码、租期、DNS服务器IP、路由器IP以及服务器的IP。
- REQUEST:客户端请求IP租约。当客户PC收到一个IP租约提供时,它必须告诉所有其他的DHCP服务器它已经接受了一个租约提供。因此,该客户会发送一个DHCPREQUEST消息,其中包含提供租约的服务器的IP。当其他DHCP服务器收到了该消息后,它们会收回所有可能已提供给客户的租约。
- ACK:服务器确认IP租约。这个响应阶段包括发送一个DHCPACK包给客户。这个包包含租期和客户可能请求的其他所有配置信息。这时候,TCP/IP配置过程就完成了。整个系统期望客户来根据选项来配置其网卡。
客户在获得了一个IP地址以后,就可以发送一个ARP请求来避免由于DHCP服务器地址池重叠而引发的IP冲突。
2 在Ubuntu-Server上安装DHCP服务
为了对DHCP的工作原理有更加清晰的理解,下面我们将在虚拟机软件(Virtual Box)中的Ubuntu-Server上安装DHCP服务
2.1 网络拓扑图
如上图所示,此次实验将会涉及到两个虚拟机:Ubuntu-Server和Win10
虚拟机系统的网卡使用的连接方式都是“NAT网络”,以让它们处于同一局域网中,如下两个图所示:
2.2 安装DHCP服务
使用如下命令即可:
1
sudo apt install isc-dhcp-server
如下图所示:
2.3 修改配置文件
和DHCP配置相关的文件主要有两个:/etc/default/isc-dhcp-server
和/etc/dhcp/dhcpd.conf
。主要配置如下:
isc-dhcp-server
:由于此次实验使用的是网卡(网络接口)enp0s9
,所以在/etc/default/isc-dhcp-server
文件中将INTERFACES
配置为enp0s9
dhcpd.conf
:在主配置文件/etc/dhcp/dhcpd.conf
中,主要配置了域名、域名服务器、可分配IP地址池、选项路由器IP地址
如下图所示:
2.4 启动DHCP服务
1
sudo systemctl start isc-dhcp-server.service
2.5 查看DHCP服务状态
1
sudo systemctl status isc-dhcp-server.service
如下图所示:
2.6 Win10 客户端配置
在客户端做相应的配置后才能使用我们搭建的DHCP服务器,具体配置过程如下:
2.7 Win10结果演示
通过在 CMD 中使用ipconfig/renew
命令重新获取IP地址后结果如下所示(即成功获得了IP地址池中的第一个IP地址 192.168.2.200,且域名为前面配置的 55555.io,网关为前面配置的 192.168.2.1):
2.8 服务器端日志分析
通过查看服务器端的日志文件(/var/log/syslog
),我们可以看到DHCP协议的运行过程,如下图所示:
可见,和前面 DHCP 协议分析中的运行过程是一致的。即由 DHCP 客户端先发送 DHCPDISCOVER 包到当前局域网内(通过广播的方式)查询 DHCP 服务器;然后服务器收到相应的包后回应一个 DHCPOFFER 包,为查询 DHCP 服务器的客户端提供一个IP租约;再然后客户端又发送给服务器一个 DHCPREQUEST 包,请求前述的IP;服务器确认无误后最后返回一个 DHCPACK 包以确认
3 DHCP协议攻击
3.1 攻击原理
DHCP饥饿攻击也可以归类为DHCP DOS攻击,攻击者利用伪造的MAC地址广播假的DHCP请求。如果官方DHCP服务器回复此虚假请求,那么它可能会耗尽DHCP服务器可用的地址空间一段时间。这可以通过使用诸如“Yersinia”的攻击工具来实现。现在,攻击者可以在网络中放置伪造的DHCP服务器并响应来自客户端的新DHCP请求,以实现DHCP欺骗攻击。如下图所示:
3.2 准备工作
对于饥饿攻击而言,我们只需要做一个准备工作:
- 熟悉Yersinia工具,或者使用Scapy(一个Python库)写一个攻击脚本
而对于DHCP欺骗攻击我们需要做如下准备工作:
- 开启Kali Linux的路由转发功能
- 临时:echo “1” >/proc/sys/net/ipv4/ip_forward
- 永久:编辑 /etc/sysctl.conf 文件,取消注释 net.ipv4.ip_forward = 1 一行
- 在attacker(kali)上安装并配置DHCP服务(和ubuntu-server类似)
- 了解当前局域网的网络拓扑图
下面将一一讲述。
3.2.1 熟悉工具Yersinia
Yersinia是一种网络工具,旨在利用不同网络协议中的一些弱点。它假装是分析和测试部署的网络和系统的坚实框架。Kali中自带,使用如下命令打开:
1
Yersinia –G &
打开后的界面如右图所示
目前Yersinia支持如下协议:
- 生成树协议(STP)
- 思科发现协议(CDP)
- 动态中继协议(DTP)
- 动态主机配置协议(DHCP)x
- 热备用路由器协议(HSRP)
- IEEE 802.1Q
- IEEE 802.1X
- 交换机间链路协议(ISL)
- VLAN中继协议(VTP)
3.2.2 开启Kali Linux的路由转发功能
开启方法如下:
- 临时:
echo "1" >/proc/sys/net/ipv4/ip_forward
- 永久:编辑
/etc/sysctl.conf
文件,取消注释net.ipv4.ip_forward = 1
一行 因为没有必要永久开启路由转发功能,所以使用了第一个方法,如下图所示:
3.2.3 在Kali上安装并配置DHCP服务
这个过程和前述的在Ubuntu-server上安装DHCP服务完全一致,故在此不再赘述。见下图即可:
3.2.4 网络拓扑图
3.3 DHCP饥饿攻击
3.3.1 攻击
我们使用Yersinia工具进行DHCP饥饿攻击,如下图所示:
3.3.2 验证
通过使用wireshark抓包我们可以验证我们刚刚进行的DHCP饥饿攻击:
此外,我们还可以通过查看服务器端日志文件验证我们刚刚发起的饥饿,如下图所示:
3.4 DHCP欺骗攻击
现在,我们将在网络中放置伪造的DHCP服务器(kali)并响应来自客户端的新DHCP请求。以实现DHCP欺骗攻击
3.4.1 停止yersinia饥饿攻击
首先我们需要停止之前发起的DHCP饥饿攻击,进行如下图所示的步骤即可停止:
3.4.2 在Kali中开启DHCP服务
现在我们可以在攻击者中开启DHCP服务了,以让新设备使用我们搭建的DHCP服务而非官方的DHCP服务(官方的现在已经没有多余的IP地址可以分配了),如下图所示:
3.4.3 等待有缘人
由于实验设备有限(受害者只有一个,并没有新的设备接入网络)。故而只能让受害者(Win10)强行受害。我们使用ipconfig/release和ipconfig/renew命令强制更新IP地址(因为之前由ubuntu-server服务器分配过)。试了N次后终于成功,获得如下IP地址:
由上图可以看到,受害者获得了新的IP地址(2.100而不是之前的2.200,因为kali上配置的IP地址池是2.100~2.200),并且获得了虚假的网关(2.20),而这个虚假网关的IP地址正好是攻击者的IP地址。所以理论上,现在受害者所有的网上流量都将经过攻击者,他的一切网络活动都将在攻击者的监视下!
3.4.4 验证
通过使用tracert命令我们可以跟踪一个数据包的去向,如下图所示:
可以看到,客户端(win10)发送的数据包经过了攻击者的电脑
除此之外,通过ping命令然后进行抓包也能看出客户端的所有数据包均经过了攻击者的电脑,实现了流量劫持,如下两个图所示:
3.4.5 其它攻击(如密码嗅探、会话劫持等)
现在,我们便可以使用其它攻击手段来做我们想做的事了。因为受害者(Win10)的所有流量都将经过攻击者(kali),我们可以看到受害者的所有网络活动,从而可以嗅探到明文密码,劫持会话,等等……
4 遇到的问题及解决方案
4.1 DHCP服务配置错误?
DHCP配置过程中,修改配置文件并启动DHCP服务时,在 /var/log/syslog 日志文件中出现了‘DHCPREQUEST for 192.168.1.4 (192.168.1.3) from 08:00:27:87:a5:36 via enp0s9: ignored (not authoritative).‘ 的错误,如下所示:
解决办法:
在 /etc/dhcp/dhcpd.conf 文件中添加新行:
1
authoritative;
如下图所示:
4.2 欺骗攻击只能攻击新接入的设备?
- 对于之前接入的设备除非等到它过期,否则无法成功欺骗(有木有重置的方法?即发个请求让它必须放弃当前的IP地址重新申请IP(从而申请到攻击者搭建的DHCP服务器的IP))?
- 或者直接把原来的DHCP服务器击溃?死机?
4.3 为什么我选择了这样的网络连接方式?
这是一个关于我在使用虚拟机(Virtual Box)模拟攻击环境时遇到的最重要的问题,即应该选择怎样的网络配置以模拟真实的网络环境?前文提到,我最后采用了“NAT网络”这个网络连接方式,但也事实上,我是经过了多次纠结后才得出这个结论的:
- 起初我使用的是默认的“网络地址转换NAT”,但是它无法完成该攻击,因为这样的网络环境中只有一个主机
- 后来选择了“仅主机模式”,可以完成基本的饥饿攻击和欺骗攻击,但是不能访问Internet
- 再后来选择了“网络地址转换NAT”和“仅主机模式”两种结合,但是实现起来有点复杂
- 最后选择了“NAT网络”(配置了一个名叫“NatNetwork”的NAT网络),因为“NAT网络”相当于构建了一个类似于宿舍局域网(路由器使用易讯拨号)的局域网,但是却又发现其DHCP看似可以用,实则不能用。为了模拟真实的网络环境(通常有DHCP服务器,集成在路由器中,并且DHCP攻击需要),我用了Ubuntu-Server作原DHCP服务器(即饥饿攻击的目标)
总之费了不少时间 -_-
5 参考资料
- DHCP Penetration Testing
- 动态主机设置协议
man Yersinia
- ‘DHCPINFORM from X.X.X.X via ethN: not authoritative for subnet X.X.X.X’ appears in /var/log/messages file after configuring DHCP Server in Gaia
- ubuntu16.04上安装配置DHCP服务的详细过程
- 安全科普:流氓DHCP服务器内网攻击测试
- Ubuntu环境下的iptables的端口转发配置实例
- Kali Linux滲透測試工具(電子書)