【cve-2018-11759】針對Apache mod_jk 訪問控制的繞過方法

本文為《 CVE-2018-11759]Apache mod_jk access control bypass 》的翻譯文章。
嘿,各位大佬們:
我非常激動向你們介紹一個我同事(ID為Xel)和我在一次滲透測試中發現的新漏洞:CVE-2018-11795
一年前,我在Wordpress上面才擁有我的第一個CVE,但是現在我們又搞到了第二個!
漏洞概要
漏洞詳情
比對CVE-2018-1323的漏洞補丁
在我們一位客戶的一次基於Apache mod_jk 模組的JBoss / Tomcat 網路伺服器進行滲透測試時候,我們發現伺服器上存在CVE-2018-1323漏洞(是由Biznet Bilisim A.S.公司的Alphan YAVAS發現並提交的),這會影響到mod_jk模組,同時所影響版本的範圍到1.2.42。
為理解其漏洞原理,我們分析了1.2.43版本的mod_jk 補丁。在這個過程中,我們意識到這個漏洞是一個路徑穿越問題,是基於Apache httpd、Tomcat或者其他Java伺服器的,而且關於他們在處理當用分號進行跨目錄路徑遍歷時各自路徑解析的差異點。
Apache httpd將url中的分號視作路徑解析中的普通字元,然而Tomcat卻將他們當作查詢分隔符(和”?”類似)。因此,攻擊者可以獲取到例如這樣的路徑: http://server/java_app/..;
,但是對於httpd來中,這並沒有觸發伺服器,並跳轉到對應的目錄下,而僅僅是被原封原樣地轉發到了Tomcat上,而且地址尾部會被解析為 .. 。*
譯者注:”.. “是兩個點加一個空格
這就允許攻擊者可以獲取到本不應該在Tomcat上可以訪問的資源。
圖1:比對CVE-2018-1323我們現在已經確定了這個漏洞其實並未完全挖掘出來,因為mod_jk的補丁雖然確實修復了針對mod_jk的特定路徑遍歷攻擊,但是還是沒有解決mod_jk對分號路徑解析方式的核心問題。
探測JK狀態管理器
探測jkstatus
jkstatus是mod_jk模組的管理介面。當設為讀寫許可權的時候,它允許通過配置AJP連線Java Web伺服器來代理HTTP請求。
通常,我們可以限制對jkstatus的訪問,比如使用如下的httpd指令:
<Location /jkstatus> JKMount jk-status Require ip 127.0.0.1 </Location>
這條指令會阻攔任何外部資源對jkstatus的訪問。
我們發現通過在 /jkstatus
後面注入分號,就可以繞過這樣的限制。
圖3:jkstatus訪問控制繞過(分號注入)上圖可以看到,在url分號之後提交的get引數,就可以成功向jkstatus請求修改其訪問許可權的配置。
圖4:url中分號後面get引數部分能被解析如果給jkstatus設定成具有讀寫訪問許可權的配置,要繞過jkstatus訪問控制的話,其產生的影響就等同於通過更改工作人員使用的埠來實現對所有由mod_jk供應的應用程式拒絕服務的效果。不僅如此,如果攻擊者再將相應的AJP連線到任何一臺他所掌控的伺服器上,他也可能會劫持到所有由mod_jk供應服務的web應用的流量。
理論上講,通過將AJP的目標和埠修改為內部主機和其對應的埠,我們也可以進行內部TCP埠掃描,這是因為Tomcat和httpd的jkstatus返回的錯誤資訊不一致的緣故,具體情況取決於提交的AJP埠是否有效 (錯誤閘道器與服務不可用的情況) *。我們並不能對這種型別的SSRF攻擊造成的全面影響進行預估和考量。
譯者注:錯誤閘道器:Bad gateway;服務不可用:Service Unavaliable
圖5:AJP:可以提交任意主機名和埠jkstatus(如果是隻讀許可權的配置)還會公開內部伺服器主機名、ip、埠、mod_jk模組服務的伺服器和路由、以及檔案系統上http伺服器的絕對路徑。
這種對訪問控制權限繞過的手法具有很大的破壞效果,但是必須要注意一點的就是,通過JkMount指令定義任何端點的訪問控制都有可能被分號注入繞過。
漏洞索引
mod_jk(1.2.46版本)已經提供了相應補丁,其他的修復措施(注意,並一定能完全防禦,只是起緩解作用)包括有:使用例如 /jkstatus*
這樣的位置值設定。
Github POC
github上我們的庫裡面有一個docker環境可以拿來測試復現這個漏洞。
漏洞挖掘時間線
- 2018/09/06:第一次和Apache Tomcat安全團隊上報此漏洞
- 2018/09/06:第一次收到Apache Tomcat安全團隊對此漏洞的迴應
- 2018/10/13: mod_jk 1.2.46版本補丁發行
- 2018/10/31:釋出CVE-2018-11759公告
- 2018/11/01:漏洞揭露公示完畢
漏洞挖掘人員
兩位來自immunIT公司的Raphaël Arrouas (ID為Xel)和Jean Lejeune(ID為Nitrax) 同志。
