ghostscript 命令注入漏洞分析
最近在網上看到一個關于ghostscript軟件的一個poc生成腳本,看了下生成的poc感覺應該挺簡單的,隨手分析下,該漏洞目前在野。
漏洞信息
1、漏洞簡述
? 漏洞名稱:無
? 漏洞編號:無
? 漏洞類型:命令注入
? 漏洞影響:遠程命令執行
? CVSS評分:無
? 利用難度:簡單
? 基礎權限:不需要
2、組件概述
ghostscript是一款圖像瀏覽工具。ghostscript能夠查看以及打印PS、EPS、PDF格式的文件。適用于Unix、Mac OS X、VMS、Windows、OS/2和Mac OS classic等操作系統的使用。
3、漏洞影響
Ghostscript9.50, 基于Ghostscript的三方庫和工具。
其他版本不詳,未測試。
漏洞復現
1、環境搭建
Ubuntu20.4
2、復現過程
a) 使用提供的poc生成腳本生成poc
python '/home/hua/桌面/IM-RCE-via-GhostScript-9.5.py' 'touch the_poc' '/home/hua/桌面/test.jpg'
b) 安裝imagemagick
sudo apt install imagemagick-6.q16
c) 運行convert轉換圖片
convert test.jpg test.png

漏洞分析
根據流出的poc readme 得知該漏洞并不是直接由convert觸發,而是convert調用了GhostScript, GhostScript觸發了該漏洞。
先找到convert調用GhostScript的地方,并觀察傳遞的命令行參數。
在linux系統中,調用其他進程的函數無非就system,execX,popen這幾個函數,所以可以在libc中對這幾個函數下斷點。
一段操作后并未發現斷點命中,懷疑可能是先fork然后在子進程中調用。果然命中。

根據棧回溯,找到調用fork函數的地方,并修改ip強制將ip指向子進程的空間中,找到了調用gs的地方。



傳遞的詳細命令行參數如下
gs -sstdout=%stderr -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 -sDEVICE=pngalpha -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -r72x72 -g612x792 -dEPSCrop -sOutputFile=/tmp/magick-15565sSaJTfcgWCk7%d -f/tmp/magick-15565gqAGdyB3qGD9 -f/tmp/magick-15565RttrpTjPQ4Qb
其中最關鍵的參數是/tmp/magick-15565RttrpTjPQ4Qb指向的文件。

可以看到,我們傳入的命令已經被寫入到了其中。
手動執行上面的命令行測試。
/tmp/magick-15565RttrpTjPQ4Qb 是一個軟連接,它指向/proc/self/fd/3, 由于進程不同所以需要將self替換為convert的進程id。

可以肯定該漏洞肯定是由GhostScript觸發的。
現在來調試GhostScript,和前面的思路一樣,既然是命令注入肯定逃不脫system、execX、popen系列的函數,所以還是在libc中將這些函數下斷點等它來即可。

可以看到在popen函數中命中了斷點,并且利用’;’來執行命令。
查了一下GhostScript是一個開源的軟件,下載了一份源碼看下具體的調用邏輯,但由于太過復雜,所以只是簡單的分析了下來龍去脈。
這里有一個數據結構,應該是根據%pipe%這個字段來調用該數據結構中的函數指針進行解析。

pipe_fopen函數中調用了open_pipe函數指針。

open_pipe函數指針在pipe_init函數中初始化并賦值為fs_file_open_pipe。

fs_file_open_pipe函數中調用了popen函數,這里就是漏洞的觸發點。

很明顯,此處是將括號中的字符串當作文件名直接傳遞給了popen函數來進行執行,所以才導致該漏洞存在。 
另附poc生成腳本(可點擊文末閱讀原文前往下載附件)。