https://www.ichunqiu.com/course/59111?f=1
介绍:
FFmpeg是一个完整的跨平台解决方案,用于记录、转换流式传输音频和视频,可用于预览生成和视频转换的视频编码软件。目前有非常多的视音频软件或是视频网站、手机APP都采用了这个库,但是这个库历史上曝出的漏洞也非常之多。
此次漏洞利用了FFmpeg可以处理HLS播放列表的特性,而播放列表可以引用外部文件。通过在AVI文件中添加自定义的包含本地文件引用的HLS播放列表,可以触发该漏洞并在该文件播放过程中显示本地文件的内容。经验证该漏洞可导致读取本地任意文件,危害较大.经研究人员验证,Google,Yahoo,Youtube等门户、视听网站以及支持流转码服务的业务已被爆出存在该漏洞。
影响范围:
经测试FFmpeg 3.2.2、3.2.5和2.6.8版本均存在该漏洞,其它版本未经系统性测试,请按漏洞检测脚本进行自行排查。
实验环境
操作机:Windows XP
IP:172.16.11.2
目标机IP:172.16.12.2
实验目的
了解FFmpeg文件读取漏洞危害
掌握检测利用FFmpeg文件读取漏洞技术
FFmpeg
FFmpeg是一套目前非常流行的可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。它提供了录制、转换以及流化音视频的完整解决方案。目前有非常多的视音频软件或是视频网站、手机 APP 都采用了这个库。
HLS 协议简单介绍
HLS(HTTP Live Streaming)是苹果公司针对iPhone、iPod、iTouch和iPad等移动设备而开发的基于HTTP协议的流媒体解决方案。在 HLS 技术中 Web服务器向客户端提供接近实时的音视频流。但在使用的过程中是使用的标准的 HTTP 协议,所以这时,只要使用 HLS 的技术,就能在普通的 HTTP 的应用上直接提供点播和直播。
该技术基本原理是将视频文件或视频流切分成小片(ts)并建立索引文件(m3u8)。客户端会先向服务器请求 m3u8索引文件,然后根据索引文件里面的url去请求真正的ts视频文件。如果是多级的m3u8索引的话,那就会从根索引文件开始,一层一层的往下去请求子的索引文件,获取最终的TS流文件的http请求地址与时间段。
漏洞介绍
6月24日,HackerOne平台名为neex的白帽子针对俄罗斯最大社交网站VK.com上报了该漏洞,并因此获得1000美元奖金。
ffmpeg可处理HLS播放列表,而播放列表中已知可包含外部文件的援引。neex表示他借由该特性,利用avi文件中的GAB2字幕块,可以通过XBIN codec获取到视频转换网站的本地文件。
影响范围
3.2.2 3.2.5 3.1.2 2.6.8
不受影响的版本
3.3.2
漏洞危害
该漏洞可导致读取本地任意文件,危害较大,Google,Yahoo,Youtube等门户、视听网站以及支持流转码服务的业务已被曝出存在该漏洞。国内支持流转码的网站也可能有存在该漏洞的风险。
实验步骤
步骤1:查看脚本使用说明
脚本已经提前下载好了,位于C盘的根目录下,脚本的使用方法如下
./gen_xbin_avi.py file:// file_read.avi
其中的为我们需要读取的文件的路径,file_read.avi为生成的avi文件。
步骤2:运行脚本
输入cmd,进入命令行界面,进入脚本所在目录输入
输入命令dir,查看本目录下存在的文件
最关键的一步,在命令行输入如下命令
python gen_xbin_avi.py file:///etc/passwd passwd.avi
执行之后,在该目录下就成功生成了一个sxcurit.avi的文件,这就是我们的payload。
步骤3:上传生成的文件
访问我们的目标网站172.16.12.2,然后通过上传按钮上传我们的passwd.avi文件。
提交之后,就可以看到目标主机的/etc/passwd文件的内容了
实验结果分析与总结
该漏洞主要还是利用了 CVE-2016-1897 和 CVE-2016-1898,一个 SSRF 和一个任意文件读取漏洞。
其中 SSRF 用到的就是 m3u8 可以访问获取远程资源的特性,一个m3u8文件的基本格式如下:
#EXTM3U
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.0,
http://cdev.dx.su:1234/8.mp4 # 可以是远程资源
#EXT-X-ENDLIST
或者是
#EXTM3U
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.0,
test.ts # 也可以是真正的视频资源
#EXT-X-ENDLIST
具体解释如下:
EXTM3U: 每个M3U文件第一行必须是这个tag。
EXTINF:指定每个媒体段(ts)的持续时间,这个仅对其后面的URI有效,每两个媒体段URI间被这个tag分隔
1、生成payload
2、上传payload
3、成功读取文件内容