如何用0day漏洞黑掉西部數據NAS存儲設備
我們以入侵和破解設備為樂,今天,要向大家展示的是近期我們對西部數據(Western Digital )網路存儲設備(NAS)的漏洞發現和入侵利用過程。點擊閱讀原文觀看入侵視頻。
漏洞發現
去年年中,我打算入手一台支持硬體解碼的NAS存儲來搭建Plex流媒體服務平台,經過一番比較,在一位朋友的推薦下,我選擇了西部數據(Western Digital )的MyCloud PR4100,該存儲設備完全滿足我所有的功能需求。把該設備添加進網路之後,可以通過一個Web界面訪問登錄,由於我對使用設備有安全潔癖,所以在登錄開啟SSH連接之後,我開始對其網頁服務功能進行了安全審計,並發現了以下存在漏洞:
登錄驗證繞過漏洞
很驚訝,我很快發現了一個用cookie和PHP session進行登錄檢查的bug。雖然使用cookie認證並不都是壞事,但該設備的使用方式存在問題,請看以下腳本:
/lib/login_checker.php
function login_check()
{
$ret = 0;
if (isset($_SESSION["username"]))
{
if(isset($_SESSION["username"]) && $_SESSION["username"] != "")
$ret = 2; //login, normal user
if ($_SESSION["isAdmin"] == 1)
$ret = 1; //login,admin
}
else if (isset($_COOKIE["username"]))
{
if (isset($_COOKIE["username"])&& $_COOKIE["username"] != "")
$ret = 2; //login, normaluser
if ($_COOKIE["isAdmin"] == 1)
$ret = 1; //login,admin
}
return $ret;
}
代碼包含一個名為 「login_check」的函數,後台PHP腳本通過調用該函數對預登錄用戶進行認證校驗。函數代碼顯示,可以通過兩種方式進行認證,一種是session方式的 「username」
當存在「username」 變數且不為空時,用戶作為正常許可權用戶登錄;
當存在「isAdmin」變數且不為空時,用戶作為管理員登錄;
這意味著,只要使用php腳本進行登錄驗證時,攻擊者就可以構造特殊cookie變數繞過驗證。
補丁更新導致新的漏洞
然而,就在我的研究過程中,該存儲設備的一個固件更新釋出對上述bug的修復補丁。但更不可思議的是,該補丁卻導致了另外一種方式的驗證繞過漏洞。以下是更新後的登錄驗證腳本:
/var/www/web/lib/login_checker.php
function login_check()
{
$ret = 0;
if (isset($_SESSION["username"]))
{
if(isset($_SESSION["username"]) && $_SESSION["username"] != "")
$ret = 2; //login, normal user
if ($_SESSION["isAdmin"] == 1)
$ret = 1; //login,admin
}
else if (isset($_COOKIE["username"]))
{
if(isset($_COOKIE["username"]) && $_COOKIE["username"] != "")
$ret = 2; //login, normal user
if ($_COOKIE["isAdmin"] == 1)
$ret = 1; //login, admin
if(wto_check($_COOKIE["username"]) === 0) //wto check fail
$ret = 0;
}
return $ret;
}
?>
更新後的代碼第40行,增加了對用戶驗證的 「wto_check()」
/var/www/web/lib/login_checker.php
/*
return value: 1: Login, 0: No login
*/
function wto_check($username)
{
if (empty($username))
return 0;
exec(sprintf("wto -n "%s" -i "%s" -c",escapeshellcmd($username), $_SERVER["REMOTE_ADDR"]), $login_status);
if ($login_status[0] === "WTO CHECK OK")
return 1;
else
return 0;
}
/*ret: 0: no login, 1: login, admin, 2: login, normal user */
上述代碼第11行中,用戶名和IP地址被初始化為wto變數參數,而問題就出在用來處理整個命令字元串的方法「
escapeshellcmd
Freebuf百科: escapeshellcmd()
這裡,最好使用Escapeshellarg方法函數,Escapeshellarg()會將任何引起參數或命令結束的字元進行轉義,如單引號「』」會被轉義為「』」,雙引號「」」會被轉義為「」」,分號「;」會被轉義為「;」,這樣escapeshellarg會將參數內容限制在一對單引號或雙引號裡面,轉義參數中所包含的單引號或雙引號,使其無法對當前執行進行截斷,實現防範命令繞過或注入攻擊的目的。
命令注入漏洞
大多數的西部數據MyCloud設備Web界面,實際上是由CGI腳本來實現的,這些腳本中大部分二進位文件都存在著相同的功能模式,如從請求包中獲取post/get/cookie值,然後應用這些值執行相關命令。然而,大多數情況下,這些命令會使用到用戶提交的一些未經安全處理的惡意數據。例如,以下設備中存在的代碼:
php/users.php
15 $username = $_COOKIE["username"];
16 exec("wto -n"$username" -g", $ret);
代碼把包含cookie值的全局變數數組$_COOKIE命名為」$username」,之後,該」$username」作為後續「exec()」命令執行的調用參數。因為沒有任何過濾措施,可以這樣更改一下,把username值設為:
username=$(touch /tmp/1)
那麼執行命令將會變為:
wto -n "$(touch /tmp/1)" -g
很容易就執行了用戶的自定義命令。
由於命令行參數被雙引號封裝,在執行「$(COMMANDHERE)」語法時,命令「touch /tmp/1」先於wto前就已經執行,並把返回結果作為-n參數。這種web介面對內置腳本的交互調用模式,明顯會導致命令注入漏洞。而且,使得注意的是,所有通過web端構造的命令都會被以root許可權執行。
其它Bug
除了以上兩個高危漏洞之外,該設備在web服務方面還存在其它一些嚴重Bugs,比如以下文件中正常登錄驗證行為被錯誤地注釋掉:
6 //include("../lib/login_checker.php");
7//
8///* login_check() return 0: no login, 1: login, admin, 2: login, normal user*/
9//if (login_check() == 0)
10//{
11// echo json_encode($r);
12// exit;
13//}
而以下上傳功能文件可以針對設備系統,執行無需用戶驗證的,任意目錄位置的任意文件上傳:
addons/upload.php
2 //if(!isset($_REQUEST["name"])) throw newException("Name required");
3//if(!preg_match("/^[-a-z0-9_][-a-z0-9_.]*$/i", $_REQUEST["name"])) throw newException("Name error");
4//
5//if(!isset($_REQUEST["index"])) throw new Exception("Index required");
6//if(!preg_match("/^[0-9]+$/", $_REQUEST["index"])) throw new Exception("Indexerror");
7//
8//if(!isset($_FILES["file"])) throw new Exception("Upload required");
9//if($_FILES["file"]["error"] != 0) throw new Exception("Upload error");
10
11$path = str_replace("//","/",$_REQUEST["folder"]);
12$filename = str_replace("\","",$_REQUEST["name"]);
13$target = $path . $filename . "-" .$_REQUEST["index"];
14
15//$target = $_REQUEST["folder"] .$_REQUEST["name"] . "-" . $_REQUEST["index"];
16
17move_uploaded_file($_FILES["file"]["tmp_name"], $target);
18
19
20//$handle = fopen("/tmp/debug.txt", "w+");
21//fwrite($handle, $_FILES["file"]["tmp_name"]);
22//fwrite($handle, "
");
23//fwrite($handle, $target);
24//fclose($handle);
25
26// Might execute too quickly.
27sleep(1);
除此之外,我們還發現了另外一個個遠程命令執行漏洞(RCE)和身份驗證命令執行漏洞,在此就不作公開。由於這些漏洞在此之前,沒人發現或爆料過,可以算是西部數據NAS設備的0day漏洞。
漏洞總結
1 x 登錄驗證繞過漏洞
1 x 任意文件上傳漏洞
1 x 無需用戶驗證的遠程代碼執行漏洞
1x 身份驗證命令執行漏洞
漏洞影響範圍
涉及西部數據以下型號系列的NAS設備
My Cloud
My Cloud Gen 2
My Cloud Mirror
My Cloud PR2100
My Cloud PR4100
My Cloud EX2 Ultra
My Cloud EX2
My Cloud EX4
My Cloud EX2100
後續的補丁更新和相關情況,請繼續關注我們的Twitter @exploiters
*參考來源:exploiteers,freebuf小編clouds編譯,轉載請註明來自Freebuf.com。


※直播閱讀神器SqlMap源碼(第一集)
※朝鮮使用先進工具監視公民的數字生活
※聊聊身份欺詐和竊取那些事
TAG:FreeBuf |
※坐擁20TB容量 西部數據My Book Duo又創存儲記錄
※正確使用OSS Lifecycle機制節約數據存儲費用
※西部數據推出iNAND 7250A嵌入式存儲設備
※西部數據推出My Passport Ultra USB存儲驅動器
※西部數據收購雲存儲服務公司 Upthere
※西部數據推出HGST品牌Ultrastar? SS300
※西部數據推出新款 My Book Duo 桌面存儲硬碟,容量高達 20TB
※數據存儲篇之MongoDB 使用場景
※【FB TV】一周「BUF大事件」:黑客泄露竊取的900Gb Cellebrite數據;Netgear路由器存在密碼繞過漏洞
※西部數據宣布收購雲存儲公司Upthere
※重磅,Science:DNA像硬碟一樣存儲數據
※如何使用Python對Instagram進行數據分析?
※墨西哥退稅網站MoneyBack泄露400GB客戶敏感數據
※Android使用OKHTTP解析JSON數據
※一份數據支持多種應用場景 CarbonData融合數據存儲方案技術揭秘
※蘋果數據線缺貨不用愁 Ravpower 0.9m蘋果MFi數據線團購
※西數數據升級充氦技術WD Red和WD Red Pro NAS硬碟內存至10TB
※USB 3.1 Gen2成標配 西部數據首款移動SSD用料很足
※西部數據推出首款My Passport攜帶型SSD