Python PIL 遠程命令執行漏洞(GhostButt)CVE-2017-8291
Python中處理圖片的模塊PIL(Pillow),因為其內部調用了GhostScript而受到GhostButt漏洞(CVE-2017-8291)的影響,造成遠程命令執行漏洞。
漏洞詳情:
漏洞簡述
PIL內部根據圖片頭(Magic Bytes)判斷圖片類型,如果發現是一個eps文件(頭為%!PS),則分發給PIL/EpsImagePlugin.py處理。
在這個模塊中,PIL調用了系統的gs命令,也就是GhostScript來處理圖片文件:
command = ["gs",
"-q", # quiet mode
"-g%dx%d" % size, # set output geometry (pixels)
"-r%fx%f" % res, # set input DPI (dots per inch)
"-dBATCH", # exit after processing
"-dNOPAUSE", # don't pause between pages,
"-dSAFER", # safe mode
"-sDEVICE=ppmraw", # ppm driver
"-sOutputFile=%s" % outfile, # output file
"-c", "%d %d translate" % (-bbox[0], -bbox[1]),
# adjust for image origin
"-f", infile, # input file
]
# 省略判斷是GhostScript是否安裝的代碼
try:
with open(os.devnull, 'w+b') as devnull:
subprocess.check_call(command, stdin=devnull, stdout=devnull)
im = Image.open(outfile)
雖然設置了-dSAFER,也就是安全模式,但因為GhostScript的一個沙盒繞過漏洞(GhostButt CVE-2017-8291),導致這個安全模式被繞過,可以執行任意命令。
另外,截至目前,GhostScript官方最新版9.21仍然受到這個漏洞影響,所以可以說:只要操作系統上安裝了GhostScript,我們的PIL就存在命令執行漏洞。
漏洞測試
運行環境:
docker-compose build
docker-compose up -d
運行后,訪問http://your-ip:8000/即可看到一個上傳頁面。正常功能是我們上傳一個PNG文件,后端調用PIL加載圖片,輸出長寬。但我們可以將可執行命令EPS文件后綴改成PNG進行上傳,因為后端是根據文件頭來判斷圖片類型,所以無視后綴檢查。
比如poc.png,我們上傳之,即可執行touch /tmp/aaaaa。將POC中的命令改為反彈命令,即可獲得shell:

Vulhub 文檔
推薦文章: