【漏洞分析】Drupal 远程代码执行(CVE-2017-6920)

打印 上一主题 下一主题

主题 891|帖子 891|积分 2673

前几天在参加 FOFA-攻防挑战赛时,遇到了 Drupal 的盲盒漏洞环境,最终确定漏洞为 CVE-2017-6920 ,但是还是无法 getflag ,因为网上相关参考文章并不是很多,大多都只是简单的复现了,于是就想着对这个漏洞进行一个详细的分析。
漏洞描述

[img=600,122.01833333333333]https://www.hetianlab.com/headImg.action?news=5d7e7ff6-7a2f-4ebc-9362-6d2d2343c778.png[/img]
环境搭建

环境的搭建,我们可以选择 p神 的 Vulhub 上的环境,我们也可以利用 vulfocus 的在线环境,或者将镜像拉取下来本地启动。
因为 p 神的环境还需要再进行配置 yaml ,为了方便,我们这里就选择 vulfocus 的镜像来进行复现学习
[img=720,533.6012364760433]https://www.hetianlab.com/headImg.action?news=74f723e7-14c5-410c-9142-94d3bb4fe467.png[/img]
  
  1. docker pull vulfocus/drupal-cve_2017_6920:latest<br>docker ps
复制代码
  
[img=720,303.7873754152824]https://www.hetianlab.com/headImg.action?news=5372790c-2a01-4655-a970-e28789dd50ae.png[/img]
访问随机生成的端口 49156 http://127.0.0.1:49156/
[img=720,154.5475910693302]https://www.hetianlab.com/headImg.action?news=458115dd-4707-412d-b66d-81cfad714c5c.png[/img]
漏洞复现

访问登录界面 http://127.0.0.1:49156/user/login
[img=720,193.70725034199725]https://www.hetianlab.com/headImg.action?news=5e3ded24-d335-4098-9ddc-ced0f533e023.png[/img]
输入账号密码 admin:admin123
登录成功
[img=720,209.57142857142858]https://www.hetianlab.com/headImg.action?news=91a932e8-7b4c-4e58-8828-8955aed8ffc6.png[/img]
登陆成功后访问路由 
/admin/config/development/configuration/single/import
[img=720,370.1873256277401]https://www.hetianlab.com/headImg.action?news=a2bd55e8-2790-4629-85d3-346b53e4f749.png[/img]
填写相关参数
  !php/object "O:24:\"GuzzleHttp\\Psr7\\FnStream\":2:{s:33:\"\0GuzzleHttp\\Psr7\\FnStream\0methods\";a:1:{s:5:\"close\";s:7:\"phpinfo\";}s:9:\"_fn_close\";s:7:\"phpinfo\";}"
[img=720,424.8171021377672]https://www.hetianlab.com/headImg.action?news=7095804c-d1b9-4b1d-86c6-f264008ddfa7.png[/img]
点击 import 触发漏洞
[img=720,277.9813816756492]https://www.hetianlab.com/headImg.action?news=b8f1062f-80db-456b-b67e-656505a12309.png[/img]
 
【----帮助网安学习,以下所有学习资料免费领!加vx:yj009991,备注 “博客园” 获取!】
 ① 网安学习成长路径思维导图
 ② 60+网安经典常用工具包
 ③ 100+SRC漏洞分析报告
 ④ 150+网安攻防实战技术电子书
 ⑤ 最权威CISSP 认证考试指南+题库
 ⑥ 超1800页CTF实战技巧手册
 ⑦ 最新网安大厂面试题合集(含答案)
 ⑧ APP客户端安全检测指南(安卓+IOS)
漏洞分析

漏洞存在于 drupal 8.3.3 所以我们下载 存在漏洞的版本 drupal 8.3.3 和修复的版本 drupal 8.3.4 进行对比,发现漏洞位于
core\lib\Drupal\Component\Serialization\YamlPecl.php
[img=720,212.68765133171914]https://www.hetianlab.com/headImg.action?news=a5f8f617-6631-4ccc-b298-050b9aba927c.png[/img]
我们看到修改的位置有这么一句 
// We never want to unserialize !php/object.
就大概可以推测出是在这个地方,以!php/object 为开头时 会产生反序列化漏洞
  
为了方便进行调试,所以我们换一下 docker 启动时的命令,方便启动后进行 php 远程调试,在配置调试环境时出现了各种问题,本来是在本地搭建 docker 环境进行调试的,但是一直没有成功,所以就采用在虚拟机中搭建 docker 环境,采用远程调试。
  
docker run -itd -p 80:80 vulfocus/drupal-cve_2017_6920:latest
wget https://xdebug.org/files/xdebug-2.5.5.tgz
docker cp xdebug-2.5.5.tgz 30:/xdebug-2.5.5.tgz
docker exec -it 30 /bin/bash
cd /
tar xvf xdebug-2.5.5.tgz
cd xdebug-2.5.5
phpize
find / -name php-config
  1. `/etc/alternatives/php-config`  <br>`/usr/bin/php-config`  <br>`/var/lib/dpkg/alternatives/php-config`
复制代码
./configure --enable-xdebug --with-php-config=/usr/bin/php-config
make && make install ==xdebug 被安装到了 /usr/lib/php5/20121212/==
find / -name php.ini
  1. `/etc/php5/cli/php.ini`  <br>`/etc/php5/apache2/php.ini`
复制代码
vim /etc/php5/apache2/php.ini ==修改 php.ini 文件==
shift + g ==定位到最后一行==
echo "" > /var/www/html/phpinfo.php
sudo service apache2 restart
  
  
修改php.ini配置文件,在文件中追加以下内容
  1. [Xdebug]<br>zend_extension=/usr/lib/php5/20121212/xdebug.so;指定Xdebug扩展文件的路径<br>xdebug.remote_enable=1 ;是否开启远程调试<br>xdebug.remote_handler=dbgp ;指定远程调试的处理协议<br>xdebug.remote_mode=req ;可以设为req或jit,req表示脚本一开始运行就连接远程客户端,jit表示脚本出错时才连接远程客户端。<br>xdebug.remote_host=192.168.222.1 ;指定远程调试的主机名(安装phpstorm的主机ip)<br>xdebug.remote_port=9001 ;指定远程调试的端口号<br>xdebug.idekey="PHPSTORM" ;指定传递给DBGp调试器处理程序的IDE Key<br>xdebug.remote_enable=on; <br>​<br>​<br>​<br>[Xdebug]<br>zend_extension=/usr/lib/php5/20121212/xdebug.so;<br>xdebug.remote_enable=1;<br>xdebug.remote_handler=dbgp;<br>xdebug.remote_mode=req;<br>xdebug.remote_host=192.168.222.1;<br>xdebug.remote_port=9001;<br>xdebug.idekey="PHPSTORM";
复制代码
访问 http://192.168.222.129/phpinfo.php 发现 xdebug 被安装成功
[img=720,272.3743155798905]https://www.hetianlab.com/headImg.action?news=cd8b73e3-053c-4d93-9c45-5d1d1594baa1.png[/img]
  
先将代码拷贝出来 
docker cp 30:/var/www/html html
利用 PHPSTROM 打开项目代码
File -> Settings -> Languages & Frameworks -> PHP -> Debug
[img=720,516.3814180929095]https://www.hetianlab.com/headImg.action?news=02d3cf65-7d5d-4890-acda-b4839dae9978.png[/img]
[img=720,516.3814180929095]https://www.hetianlab.com/headImg.action?news=93c66b1d-00d6-4683-ab9b-5c3ca4bb25b2.png[/img]
配置 Servers
[img=720,516.3814180929095]https://www.hetianlab.com/headImg.action?news=c28b1f40-b5aa-48ba-9202-8d85f1a6f13a.png[/img]
此处要注意,需要直接指定到网站的目录位置
配置PHP Web Application
[img=720,516.276991809382]https://www.hetianlab.com/headImg.action?news=cf2086da-997d-4cee-bf08-91b45884433d.png[/img]
配置完成后打开右上角的电话按钮

打开浏览器的插件 Xdebug helper
[img=720,484.77486910994764]https://www.hetianlab.com/headImg.action?news=591520c9-2a87-4b9c-b57c-4cee2f23fc69.png[/img]
  
在 phpinfo 处加载断点,并访问 http://192.168.222.129/phpinfo.php成功加载到断点
[img=720,382.42902208201895]https://www.hetianlab.com/headImg.action?news=dc76d862-ead1-49bb-9082-8bebd903fb35.png[/img]
之前也配置过 PHP 的远程调试环境,但是在 Docker 里面调试的时候,配置了很久的调试环境,最后才成功,中间出了大大小小无数的问题,遇到的最大的问题是最开始端口一直显示被占用状态,因为我启动 docker 时的命令是 docker run -itd -p 80:80 -p 9001:9001 vulfocus/drupal-cve_2017_6920:latest 我一直认为说这个 9001 端口也要对外映射出来,但是我在调试时发现一直提示端口被占用,百思不得其解,采用百度大法看到了这么一句 不要在docker-compose 中添加 9000 端口 ,我灵机一动,将 -p 9001:9001 给删除掉,就成功了。这下我才完全理解了,原来这个端口是远程调控,就是安装 PHPSTORM 机器上的端口。
  
正式开始调试分析
漏洞的最终触发位置是在
core/lib/Drupal/Component/Serialization/YamlPecl.php::decode
[img=720,240.50420168067228]https://www.hetianlab.com/headImg.action?news=34d1d2a4-f94f-40e2-8287-72a8e02162d2.png[/img]
对传入的 参数 $raw 如果可控的话,如果使用!php/object,那么yaml_parse将会以反序列化(unserialize)的形式来进行处理字符串。
[img=720,67.99154334038055]https://www.hetianlab.com/headImg.action?news=a4ed58d8-cd15-4a7d-b518-fadafcea12e8.png[/img]
我们看在哪里可以调用
YamlPecl.php::decode
core/lib/Drupal/Component/Serialization/Yaml.php::decode
[img=720,124.30834213305174]https://www.hetianlab.com/headImg.action?news=85721c48-6fce-44b1-afdc-15748e9a525c.png[/img]
decode 函数中 调用了静态 getSerializer 函数
[img=720,434.1803818301514]https://www.hetianlab.com/headImg.action?news=2bb20a62-f8cb-4c4f-81cd-4ef8461290d9.png[/img]
  
如果存在 yaml 扩展,$serializer 就使用 YamlPecl 类,之后会调用 YamlPecl 类中的 decode 函数;
如果不存在 yaml 扩展,$serializer 就使用 YamlSymfony 类,之后会调用 YamlSymfony 类中的 decode 函数。 目前的环境是已经安装了 yaml 扩展了,所以我们只需要寻找,可控输入的 
Yaml::decode
core/modules/config/src/Form/ConfigSingleImportForm.php::validateForm
[img=720,390.9375]https://www.hetianlab.com/headImg.action?news=e0b1bc1d-0b55-4ad2-9adc-38b71c5fc478.png[/img]
如此我们就已经确定了漏洞的触发位置,以及漏洞的入口点,但是距离漏洞的利用成功还差一个 payload
我们已经知道这个漏洞是一个反序列化漏洞,我们就要找出这个系统中存在的反序列化链,针对这个漏洞有两条利用链路,任意命令执行以及任意文件写入
任意命令执行

html\vendor\guzzlehttp\psr7\src\FnStream.php
[img=720,386.75803900896153]https://www.hetianlab.com/headImg.action?news=01a40914-31f9-448c-bfb5-57a6488b1dce.png[/img]
反序列化这个类造成任意无参数函数执行
  1. [/code][/indent][img=720,255.7068062827225]https://www.hetianlab.com/headImg.action?news=55a66aaa-96dc-4da9-be94-950ae37bfa6a.png[/img]
  2. 序列化字符串加上yaml的!php/object
  3. [indent][code]!php/object "O:24:"GuzzleHttp\\Psr7\\FnStream":2:{s:7:"methods";a:1:{s:5:"close";s:7:"phpinfo";}s:9:"_fn_close";s:7:"phpinfo";}"
复制代码
[img=720,370.188679245283]https://www.hetianlab.com/headImg.action?news=b9a93164-0ad5-4559-8737-70e935fe0c8c.png[/img]
[img=720,360.3377110694184]https://www.hetianlab.com/headImg.action?news=104037dd-ce6c-4f47-a2e5-217f1f44708f.png[/img]
任意文件写入

html\vendor\guzzlehttp\guzzle\src\Cookie\FileCookieJar.php
[img=720,416.88188976377955]https://www.hetianlab.com/headImg.action?news=5f1b5e97-0469-4cd8-8b0d-fbfb13caa0e8.png[/img]
反序列化这个类达到任意文件写入的效果,但是因为这个系统启动并不是 root 权限启动,所以只有在 tmp 目录下写文件的权限
<blockquote>[code]
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

南飓风

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表