本文讲的是
FFMPEG任意文件读取漏洞靶场搭建过程,
丑化说在前头,我这人有一癖好,就是研究一些已经过时的东西,发一些过时的文章。文章之前就写好了,只是一直没发出来充数。距离FFMPEG任意文件读取漏洞发布的时间已经过去很久了,记得刚出来那会儿国内几个大型的视频网站都有这个问题。靶机是之前为了一个比赛场景搭建的,作为环境搭建的初探者,主要介绍下自己在搭建这个环节过程中遇到的一些坑。
1. 搭建需求
搭建一个FFMPEG任意文件读取漏洞靶场,可用于漏洞练习或者攻防题目。
2. Win2003下复现FFMPGE任意文件读取漏洞
最初想法:优先尝试了win下复现FFMPEG任意文件读取漏洞。
结果在WIN上搭建FFMPEG,出现补丁报错的情况。
找到解决办法,安装如下补丁:WindowsServer2003-KB914961-SP2-x86-CHS,地址:https://www.microsoft.com/zh-cn/download/details.aspx?id=41。
解决后可以正常运行ffmpeg并实现视频、图片等文件的格式转换,但问题由来了。 Windows下无法复现ffmpeg任意文件读取漏洞,原因如下:ffmpeg任意文件读取漏洞payload中需要利用类似linux中的/dev/zero的空文件进行对数据进行读取和不断的写入。Win下不存在这种文件或者功能。尝试修改payload无果,最后没能在win下复现该漏洞。
3. Linux下复现FFMPGE任意文件读取漏洞
Linux下安装ffmpeg漏洞版本很容易,也不会出问题。直接执行如下脚本便可安装好。
sudo apt-get install build-essential git-core checkinstall yasm texi2html libvorbis-dev libx11-dev libvpx-dev libxfixes-dev zlib1g-dev pkg-config netcat libncurses5-dev
FFMPEG_VERSION=2.3.3
cd /usr/local/src
if [ ! -d "/usr/local/src/ffmpeg-${FFMPEG_VERSION}" ]; then
sudo wget "http://ffmpeg.org/releases/ffmpeg-${FFMPEG_VERSION}.tar.bz2"
sudo tar -xjf "ffmpeg-${FFMPEG_VERSION}.tar.bz2"
fi
cd "ffmpeg-${FFMPEG_VERSION}"
sudo ./configure --enable-version3 --enable-postproc --enable-libvorbis --enable-libvpx
sudo make
sudo checkinstall --pkgname=ffmpeg --pkgversion="5:${FFMPEG_VERSION}" --backup=no --deldoc=yes --default
执行poc,生成avi文件:python3 gen_xbin_avi.py file:///etc/passwd 111.avi
POC地址:
https://github.com/neex/ffmpeg-avi-m3u-xbin/blob/master/gen_xbin_avi.py
本地测试漏洞:转换视频格式ffmpeg -i 111.avi 2.mp4
播放转换格式后的视频文件,成功看到转换过程中写入的文件。
4. Ubuntu下搭建环境的坑
为了用户体验好,决定找一个像模像样的整站,嵌入视频处理功能实现需求。
l 优先想到的是找个开源的在线视频cms进行修改,结果找了很久也没找到这样的站点。
l 没办法,上述路线走不通只能自己搭建了,于是基于如下基础漏洞代码,找个cms写个视频的功能。可是,最终发现效果太深(生)硬。一看就知道问题所在了没什么意思。
l 最后,在wordpress的插件中搜索ffmpeg关键词发现有处理视频的插件。发布文章时可以嵌入视频,于是研究一番真的可以调用ffmpeg处理视频,插件名为:Video Embed & Thumbnail Generator。最后决定用自豪的WordPress搭建这个环境。
那么,先搭建LAMP环境。
Ø Mysql安装坑
通过sudo apt-get install mysql-server 安装的mysql默认以mysql_safe模式启动,此模式下很难完成mysql提权操作。所以最好是自己下载mysql版本进行编译安装。
Ø 安装&修复PHPmyamdin报错
sudo apt-get install phpmyadmin
sudo cp /usr/share/phpmyadmin /var/www/html -a
通过apt-get安装的phpmyadmin可通过sudo dpkg-reconfigure phpmyadmin解决报错问题。
5. Wordpress下调用ffmpeg任意文件读取
看来这么多,MD终于可以进入正题了。来吧,相互伤害(装插件)吧。
Wordpress后台安装插件:Video Embed & Thumbnail Generator。安装后看下配置项中bin、ffmpeg的位置是否对应得上。
安装后会自动执行测试命令,如果配置没问题会有如下显示:
安装好后咋们就可以去发布文章了,在添加媒体处,可以上传视频文件:
上传后编辑视频文件,可调用ffmpeg插件进行处理视频,包括格式转换,截图等等。
这里最快的方法就是直接点Generate进行截图:发现在这个过程中已经进行了文件读取:
所以,这个FFMPEG文件读取漏洞不管是存在于视频文件转换过程中,图片等格式的转换也可能造成任意文件读取。
6. 解决Wordpress配置访问IP问题
本以为大功告成了,结果又遇到了一个坑。wordpress在安装时会向数据库中写明站点URL,在站点迁移或者想同时部署多个靶机时,会出先因为IP地址和URL地址不一致问题,导致无法正常使用。如原始服务器IP为192.168.222.13。当站点被迁移到其他机器,服务器IP变更为192.168.222.133时候,你再访问http://192.168.222.133/便会出现如下情况:站点无法正常显示,而且很慢。
访问后台地址http://192.168.222.133/wp-admin/,网站会自动跳转到初始配置IP。
http://192.168.222.133/wp-login.php?redirect_to=http%3A%2F%2F192.168.222.13%2Fwp-admin%2F&reauth=1
这样肯定不行呀,怎么解决楠?
参考了网上提供的方法,不太实用需求,这里也说下吧。对于个人的站点,可通过进入后台修改(此方法不适用于黑盒实验)
WordPress支持自动重定位方法,该方法可自动计算定位并更新定位值。将网站从一台服务器重新定位到另一台服务器上时,该方法能够快速协助网站开始运行。用法如下:
1.、编辑wp-config.php 文件,在“define”语句后添加如下代码:define('RELOCATE',true);
2、 在web浏览器中访问wp-login.php页面,进入后台可更改配置IP:
后来仔细想想,既然配置文件写在数据库中的,那么我完全可以通过动态修改数据库中的数据达到修改IP的目的。过程如下:
在首页包含的代码中增加一条语句自动更新数据库中的URL地址,这里我选择了wp-blog-header.php,只要有人访问网站就会执行这条语句,获取服务器IP并修改配置IP的字段。
$iipp=$_SERVER['SERVER_ADDR'];
$sql1="UPDATE `wordpress`.`wp_options` SET `option_value` = 'http://".$iipp."' WHERE `wp_options`.`option_id` = 1;";
$sql2="UPDATE `wordpress`.`wp_options` SET `option_value` = 'http://".$iipp."' WHERE `wp_options`.`option_id` = 2;";
mysql_query($sql1);
mysql_query($sql2);
修改后,便能自动修改后台中的URL。
这样一来就可以随意更改服务器IP了。
7. 来个小姐
搭建靶机是个细活儿,需要多研究漏洞原理并理解相关利用方法。这是一个很简单的环境但牵扯到很多细节的东西。所以还是很佩服那些CTF出题的老师们。
原文发布时间为:2017年9月4日
本文作者:whoamiecho
本文来自云栖社区合作伙伴嘶吼,了解相关信息可以关注嘶吼网站。