Jenkins 任意檔案讀取漏洞分析
一、漏洞背景
漏洞編號:CVE-2018-1999002
漏洞等級:高危
Jenkins 7 月 18 日的安全通告修復了多個漏洞,其中 SECURITY-914 是由 Orange (部落格連結:http://blog.orange.tw/)挖出的 Jenkins 未授權任意檔案讀取漏洞。
騰訊安全雲鼎實驗室安全研究人員對該漏洞進行分析發現,利用這個漏洞,攻擊者可以讀取 Windows 伺服器上的任意檔案,對於 Linux,在特定條件下也可以進行檔案讀取。利用檔案讀取漏洞,攻擊者可以獲取到 Jenkins 的憑證資訊,從而造成敏感資訊洩露。另外,在很多時候,Jenkins 的部分憑證和其內使用者的帳號密碼相同,獲取到憑證資訊後也可以直接登入 Jenkins 進行命令執行操作等。
二、漏洞分析
Jenkins 在處理請求的時候是通過 Stapler 進行處理的,Stapler 是一個 Java Web 框架。檢視 web.xml 可知,Stapler 攔截了所有請求:
單步跟入 hudson.util.PluginServletFilter,最後會跟到 jenkins\core\src\main\java\hudson\Plugin.java 的 doDynamic 方法:
可以發現,Jenkins 在 serve /plugin/SHORTNAME 這個 URL 的時候,呼叫的是 StaplerResponse 的 serveLocalizedFile 方法處理靜態檔案的,繼續跟入這個方法:
其中 request.getLocale() 是 jetty-server-9.4.5.v20170502-sources.jar!\org\eclipse\jetty\server\Request.java 內的,其實現為:
非常明顯,Jetty 在獲取 Locale 的時候直接從 HTTP Headers 裡取出 Accept-Language 頭,用 - 分割後返回了一個 Locale 物件。也就是我傳入 Accept-Language: ../../../aaaa-bbbbbb 時,那麼我將會得到一個 Locale("../../../aaaa", "BBBBBB") 物件。
最後到跟入 stapler-1.254-sources.jar!\org\kohsuke\stapler\Stapler.java:
我們可以發現,Stapler 首先將字尾名單獨取出,接著將 Jenkins 目錄和傳入的 locale 的 language 以及字尾名拼接,然後開啟這個路徑。那麼攻擊者只需要構造出如下 HTTP 請求即可造成檔案讀取:
最後 URL 拼接的現場為:
在 Windows 下,不存在的目錄可以通過 ../ 遍歷過去的,而對於 Linux 則不行。那麼這個漏洞在 Windows 下是可以任意檔案讀取的,而在 Linux 下則需要在 Jenkins plugins 目錄下存在一個名字中存在 _ 的目錄才可以。
三、利用方式
一般來說,檔案讀取漏洞很難轉化為命令執行,對於 Jenkins 也是如此。不過 Jenkins 有一個 Credentials 模組,這個模組儲存了 Jenkins 的一些憑證資訊,很多時候,其憑證的帳號密碼是和 Jenkins 的帳號密碼相同的。無論如何,在成功利用檔案讀取漏洞後,都要將憑證資訊讀取並解密,以收集更多的資訊。
如果我們想獲取 Jenkins 的憑證資訊的話,需要以下幾個檔案:
· credentials.xml
· secrets/hudson.util.Secret
· secrets/master.key
很幸運的是這幾個檔案我們都可以利用檔案讀取漏洞讀取出來。在 Shodan 上嘗試獲取國外 real world 的 Jenkins 的帳號密碼:
當然,獲取到的帳號密碼是不能直接登入的,但是稍微修改一下使用者名稱就可以成功的登入進去了:
四、修復方案
雖然這個漏洞危害較大,但是使用者不必太過擔心,因為預設安裝 Jenkins 的時候匿名使用者是沒有可讀許可權的。並且此漏洞在 Linux 上被利用的可能性較小。以下為推薦的修復方案:
➢針對此高危漏洞利用,騰訊雲網站管家 WAF AI 引擎可檢測並攔截,如果需要,可在騰訊雲官網進一步瞭解
➢在全域性安全配置中將匿名使用者的可讀許可權去掉
➢升級到最新版本的 Jenkins(2.121.2)
➢使用 Linux
騰訊安全雲鼎實驗室主要關注騰訊雲安全體系建設,專注於雲上網路環境的攻防研究和安全運營,以及基於機器學習等前沿技術理念打造雲安全產品。