CVE-2019-0193/Apache Solr DataImportHandler远程代码执行漏洞分析报告

调试环境搭建

  • 1.JDK 8U20
  • 2.下载solr 8.1.0(8.2.0需要开启enable.dih.dataConfigParam)
    https://archive.apache.org/dist/lucene/solr/8.1.0/solr-8.1.0.zip
  • 3.下载java数据库驱动jar,这里以mysql举例
    https://cdn.mysql.com//Downloads/Connector-J/mysql-connector-java-8.0.17.zip
    解压以后可以获得mysql-connector-java-8.0.17.jar
  • 4.放置mysql-connector-java-8.0.17.jarsolr-8.1.0/server/solr-webapp/webapp/WEB-INF/lib/
  • 5.安装apache-ant
  • 6.进入solr根目录运行ant idea,即可将solr源码编译成intellij idea项目。在编译idea项目时时候可能会失败,此时可以运行 ant ivy-bootstrap
  • 7.使用idea open编译好的文件夹,等待一段时间
  • 8.新增Remote,作如下配置
CVE-2019-0193/Apache Solr DataImportHandler远程代码执行漏洞分析报告_第1张图片
Remote

如果没有server模块,请到solr根目录下运行ant server

  • 9.在如下位置新增xml内容
CVE-2019-0193/Apache Solr DataImportHandler远程代码执行漏洞分析报告_第2张图片
xml内容
 
    
      db-data-config.xml
    
  

db-data-config.xml


    
    
        
            

            
                
            
            
            
                
                    
                
            
        
    

  • 10.进入solr/solr/bin,执行如下命令启动solr远程debug模式
    ./solr start -p 8988 -f -a "-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8988"
    等待terminal出现Listening for transport dt_socket at address: 8988提示语时,点击idea的debug按钮
CVE-2019-0193/Apache Solr DataImportHandler远程代码执行漏洞分析报告_第3张图片
debug

点击以后,debugger启动,同时solr启动正常

CVE-2019-0193/Apache Solr DataImportHandler远程代码执行漏洞分析报告_第4张图片
debugger启动
CVE-2019-0193/Apache Solr DataImportHandler远程代码执行漏洞分析报告_第5张图片
solr启动正常
  • 11.访问http://127.0.0.1:8988/solr/即可

漏洞分析

1.JNDI触发

根据官方或者网络上的Solr DIH指南,不难得出DIH的基本xml配置如下








得到JdbcDataSource关键字,尝试搜索相关类,最终在org.apache.solr.handler.dataimport包内找到JdbcDataSource类

CVE-2019-0193/Apache Solr DataImportHandler远程代码执行漏洞分析报告_第6张图片
JdbcDataSource类

翻看此类发现jndiName属性,猜测该类可能有JNDI注入的可能性。在JdbcDataSource类中搜索jndiName,找到if (jndiName != null)相关代码片段。尝试在此处打入断点,且尝试构造xml写入配置进行debug。

CVE-2019-0193/Apache Solr DataImportHandler远程代码执行漏洞分析报告_第7张图片
debug

跟踪该断点,直接跳转到getFromJndi方法,随之进入InitialContext类的对象方法lookup

lookup

执行lookup(),可以进行JNDI注入,最终触发org.apache.solr.core.SolrCoreexecute完成RCE

RCE
JNDI注入

2.ScriptTransformer触发

根据NVD的漏洞预警和qita的指南,可以得知此次的漏洞是可以通过ScriptTransformer配合script触发的。

CVE-2019-0193/Apache Solr DataImportHandler远程代码执行漏洞分析报告_第8张图片
NVD
CVE-2019-0193/Apache Solr DataImportHandler远程代码执行漏洞分析报告_第9张图片
qita

配置DataSource有多种方式,这里以JdbcDataSource为例

CVE-2019-0193/Apache Solr DataImportHandler远程代码执行漏洞分析报告_第10张图片
DataSource

org.apache.solr.handler.dataimport.DataImportHandlerhandleRequestBody打上断点插入数据进行debug

发现,他会进入下面的判断体

判断体

这里我们的请求的command为full-import

CVE-2019-0193/Apache Solr DataImportHandler远程代码执行漏洞分析报告_第11张图片
full-import

随即进入maybeReloadConfiguration,由于dataconfig不为空,使用loadDataConfig加载

CVE-2019-0193/Apache Solr DataImportHandler远程代码执行漏洞分析报告_第12张图片
loadDataConfig

随后使用readFromXml加载配置文件中提交的数据,使用getText获得function

CVE-2019-0193/Apache Solr DataImportHandler远程代码执行漏洞分析报告_第13张图片
getText

最后获取到所有数据以后,返回一个DIHConfiguration对象,当debug为ture执行runCmd方法

debug为ture

在判断command为full-import时,执行 this.doFullImport(sw, reqParams);

CVE-2019-0193/Apache Solr DataImportHandler远程代码执行漏洞分析报告_第14张图片
doFullImport

doFullImport中存在this.docBuilder.execute();,将得到一个EntityProcessorWrapper对象——epw

epw中的nextRow中存在applyTransformer()转换脚本,而其使用的是相应Transformer的transformRow

CVE-2019-0193/Apache Solr DataImportHandler远程代码执行漏洞分析报告_第15张图片
applyTransformer

根据官方文档,ScriptTransformer允许多种Java支持的脚本语言调用,如Javascript、JRuby、Jython、Groovy和BeanShell等

CVE-2019-0193/Apache Solr DataImportHandler远程代码执行漏洞分析报告_第16张图片
官方文档

而在solr中,JS的默认引擎是Nashorn

Nashorn

使用scriptEngine.eval(scriptText);取出具体脚本语言和我们要执行的代码

取出

最后调用return this.engine == null ? row : this.engine.invokeFunction(this.functionName, row, context);

CVE-2019-0193/Apache Solr DataImportHandler远程代码执行漏洞分析报告_第17张图片
调用

发现这里调用的invokeFunction其实是javax.script.InvocableinvokeFunction

CVE-2019-0193/Apache Solr DataImportHandler远程代码执行漏洞分析报告_第18张图片
javax.script.Invocable

最终RCE触发成功

RCE触发成功

调用栈如下:

CVE-2019-0193/Apache Solr DataImportHandler远程代码执行漏洞分析报告_第19张图片
调用栈

POC

JdbcDataSource poc








URLDataSource poc



  
  
    
  

JNDI 触发poc可通过自行debug得出

鸣谢

pyn3rd

参考

用Intellij idea搭建solr调试环境:
https://www.cnblogs.com/jeniss/p/5995921.html
SolrでDataImportHandlerのTransformerをJavaScriptで書く:
https://qiita.com/nanakenashi/items/fc613d5b9deec5d2bed7
nvd CVE-2019-0193:
https://nvd.nist.gov/vuln/detail/CVE-2019-0193
Solr Ref Guide 8.1:
https://lucene.apache.org/solr/guide/8_1/uploading-structured-data-store-data-with-the-data-import-handler.html

你可能感兴趣的:(CVE-2019-0193/Apache Solr DataImportHandler远程代码执行漏洞分析报告)