您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關如何通過WebPageTest服務0day漏洞實現Mozilla AWS環境遠程代碼執行,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
Assetnote CS安全團隊在分析Mozilla AWS云服務網絡環境攻擊面時,發現了部署于其中的網絡性能測試工具WebPageTest存在一個0day漏洞,利用該漏洞最終實現了對Mozilla AWS服務器的遠程代碼執行(RCE)。
WebPageTest是一款開源的Web前端性能分析工具,其有在線版本和本地搭建版本兩種,能針對特定網站提供免費的性能評測,支持IE和Chrome瀏覽器,它會模擬使用真正的瀏覽器(IE和Chrome)連接速度,從全球多個地點運行免費網站速度測試。可以運行簡單的測試或執行高級測試,包括多步驟事務、視頻捕獲、內容阻塞等等。還將依據測試結果提供豐富的診斷信息,包括資源加載瀑布圖,頁面速度優化檢查和改進建議,會給每一項內容一個最終的評級。企業或組織可以下載 開源版本搭建內部測試站點,對內部網站進行性能測試分析。
在內網部署的WebPageTest服務中,可以通過修改其中的settings.ini文件來啟用一些基本的用戶名密碼驗證,所以還是建議對此進行配置,以便阻止一些匿名用戶的登錄訪問。
在Assetnote CS安全團隊評估的很多內網WebPageTest服務中,都缺乏基本的用戶驗證措施,所以,可能產生的結果就是,攻擊者可以利用WebPageTest的一系列性能測試工具,來發起SSRF(服務端請求偽造)攻擊,實現對目標內網資源的訪問獲取。
2017年11月,Assetnote CS安全團隊在對Mozilla的AWS(亞馬遜云服務)環境測試過程中,發現了以下兩個網絡資產:
wpt-vpn.stage.mozaws.net
wpt1.dev.mozaws.net
這兩個網絡資產都屬Mozilla AWS環境中的WebPageTest服務測試實例,而且,Mozilla AWS環境中部署的WebPageTest服務沒有任何基本的用戶名密碼驗證措施,在與白帽Mathias的合作下,我們對其中部署的WebPageTest服務進行了源碼分析,經過數個小時的測試,我們就發現了一個可以導致遠程代碼執行(RCE)的攻擊鏈。
由于在當時這算是一個0day漏洞,所以,我們及時與Mozilla公司和WebPageTest團隊進行了溝通協商,修復了這個漏洞。在2018年1月17日的修復版本中可以看到其中提交的commit信息。
在WebPageTest的源碼中,首先引起我們注意的是/www/work/workdone.php腳本具備的上傳和解壓任意zip文件功能,該php腳本文件包含了限制127.0.0.1之外的訪問源邏輯,代碼如下(第110行):
...!strcmp($_SERVER['REMOTE_ADDR'], "127.0.0.1")...
同樣在這個php文件中,我們發現了另外一個危險之處,那就是上傳任意zip文件并解壓至一個已知位置的邏輯,代碼如下(第133-136行):
if (isset($_FILES['file']['tmp_name'])) { ExtractZipFile($_FILES['file']['tmp_name'], $testPath); CompressTextFiles($testPath);}
基于以上代碼邏輯,如果我們能把IP偽裝為127.0.0.1,那么是不是就可以通過它們來實現服務端代碼執行了呢?但是,事實沒有我們想得這么簡單,在/www/work/workdone.php中的第321行,還存在這么一個方法函數:
SecureDir($testPath);
SecureDir方法函數的代碼定義在/www/common_lib.inc文件的第2322 - 2347行:
/*** Make sure there are no risky files in the given directory and make everything no-execute** @param mixed $path*/function SecureDir($path) { $files = scandir($path); foreach ($files as $file) { $filepath = "$path/$file"; if (is_file($filepath)) { $parts = pathinfo($file); $ext = strtolower($parts['extension']); if (strpos($ext, 'php') === false && strpos($ext, 'pl') === false && strpos($ext, 'py') === false && strpos($ext, 'cgi') === false && strpos($ext, 'asp') === false && strpos($ext, 'js') === false && strpos($ext, 'rb') === false && strpos($ext, 'htaccess') === false && strpos($ext, 'jar') === false) { @chmod($filepath, 0666); } else { @chmod($filepath, 0666); // just in case the unlink fails for some reason unlink($filepath); } } elseif ($file != '.' && $file != '..' && is_dir($filepath)) { SecureDir($filepath); } }}
它會檢查過濾掉一些危險的文件,并確保無任何文件的執行操作,由于它在之后后續的代碼流中才出現,因此就存在一種可利用的競爭條件(Race Condition ),即解壓到web服務器的PHP文件在被過濾刪除之前可被短暫地訪問到。
在我們構造的攻擊鏈中,其前提條件非常簡單,由于在目標資產wpt-vpn.stage.mozaws.net的WebPageTest服務中,執行Traceroute命令后,我們可以獲取到WebPageTest生成的一個有效 test ID,有了這個ID號就比較好辦了。比如,我們在其中執行執行對https://google.com的Traceroute命令:
之后,WebPageTest服務會跳轉到一個包含test ID的性能測試結果URL頁面去:
http://wpt-vpn.stage.mozaws.net/result/171124_GW_9/
這里,171124_GW_9為test ID。
到此,我們還差著127.0.0.1 IP偽造這一步,如果這步能成功,就能有效訪問到workdone.php文件,發起命令執行了。
經過分析,我們在 /www/common.inc 文件中的第70行發現了以下代碼邏輯:
if (isset($_SERVER["HTTP_FASTLY_CLIENT_IP"]))
$_SERVER["REMOTE_ADDR"] = $_SERVER["HTTP_FASTLY_CLIENT_IP"];
從這個代碼段中可以發現,我們能通過發送請求的方式,把 FASTLY-CLIENT-IP 請求頭設置為127.0.0.1,從而實現以遠程用戶身份任意更改 $_SERVER["REMOTE_ADDR"]的IP地址。
綜上所述,我們可以設置兩個Burp Intruder 攻擊擴展來實現最終的服務端代碼執行。其中一個Burp Intruder用來實現上傳一個惡意的zip文件,另外一個Burp Intruder用來訪問解壓過后存在于目標系統中的php文件。我們對上述競爭條件的利用,最大Burp Intruder線程數為200。
但好在有高速請求插件Turbo Intruder的幫助下,我們的漏洞利用鏈就比較穩定了。最終,我們在Mozilla AWS網絡環境中成功實現了服務端代碼執行。如下,我們在wpt-vpn.stage.mozaws.net中實現了對phpinfo() 的調用讀取:
關于如何通過WebPageTest服務0day漏洞實現Mozilla AWS環境遠程代碼執行就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。