Java安全之log4j反序列化漏洞分析

Java安全之log4j反序列化漏洞分析0x00前言前段时间在看某个cms代码的时候,发现log4j组件版本存在漏洞,并且开启了端口,但web站点是nginx反向代理的,而在外网并没有开放到该端

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

Java安全之log4j反序列化漏洞分析

0x00 前言

前段时间在看某个cms代码的时候,发现log4j组件版本存在漏洞,并且开启了端口,但web站点是nginx反向代理的,而在外网并没有开放到该端口,所以并没有利用成功。但该漏洞遇到的比较少,就算一些cms中log4j组件版本存在漏洞,但是该漏洞需要使用SimpleSocketServer开启端口才能够接受socket中的数据进行反序列化操作,从而才能利用。

0x01 log4j 漏洞简介

漏洞简介

log4j用的其实还是比较多,记录一些Java的日志,这个相信接触过Java的都知道,在此不做多的赘诉。

漏洞版本:CVE-2019-17571

1.2.4 <= Apache Log4j <= 1.2.17

漏洞原因是因为调用SimpleSocketServer.main开启一个端口,进行接受数据,进行反序列化操作。

根据官方描述作用是把接受到的LoggingEvent作为本地的日志记录事件,再使用在服务器端配置的Log4J环境来记录日志。默认可能会开启在4560端口中。

0x02 log4j 反序列化分析

漏洞复现

配置漏洞代码

import org.apache.log4j.net.SimpleSocketServer;
public class log4j {
    public static void main(String[] args) {
        System.out.println("INFO: Log4j Listening on port 1234");
        String[] arguments = {"1234", (new log4j()).getClass().getClassLoader().getResource("log4j.properties").getPath()};
        SimpleSocketServer.main(arguments);
        System.out.println("INFO: Log4j output successfuly.");
    }
}

配置log4j文件

log4j.rootCategory=DEBUG,stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.threshold=DEBUG
log4j.appender.stdout.layout.ConversionPattern=[%d{yyy-MM-dd HH:mm:ss,SSS}]-[%p]-[MSG!:%m]-[%c\:%L]%n

然后使用yso生成gadget的序列化数据,直接使用nc进行发送。但是nc发送传输有时候会有些问题,有时候传输数据缺失,会反序列化失败。

nc 127.0.0.1 1234 < log4j.curl.bin

Java安全之log4j反序列化漏洞分析

漏洞分析

漏洞比较简单,还是现在漏洞位置先下断点。

Java安全之log4j反序列化漏洞分析

跟进查看

Java安全之log4j反序列化漏洞分析

在这里开启serverSocket进行监听,也就是socket的服务端,然后new了SocketNode进行传入。

继续跟进

Java安全之log4j反序列化漏洞分析

而在这里接受了socket的数据。

下一步会来到run的这个方法里面,是因为前面调用了线程的start,而start的底层会调用run

Java安全之log4j反序列化漏洞分析

直接就对ois也就是刚刚接受的socket数据,调用readobject进行反序列化。

Java安全之log4j反序列化漏洞分析

0x03 工具编写

在复现的时候,使用nc发送数据时数据传输不完整,导致反序列化失败。就随手写了一个小工具,方便下次遇到的时候使用(可能也极少能遇到,比较鸡肋)

命令执行:

Java安全之log4j反序列化漏洞分析

反弹shell:

Java安全之log4j反序列化漏洞分析

POC:

Java安全之log4j反序列化漏洞分析
Java安全之log4j反序列化漏洞分析

由于比较少见,反序列化回显暂不构造。

github地址:https://github.com/nice0e3/log4j_POC

动动小手点点star

0x04 结尾

log4j的反序列化漏洞比较简单,而类似于这种反序列化工具原理其实差不多,只是发包构造的数据包不一样,分析一下漏洞知道漏洞怎么形成的。原理其实比较简单,但也会遇到很多细节问题,如回显方式,或gui的优化问题。

Java安全之log4j反序列化漏洞分析

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119881.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python nonlocal的用法_python nonlocal 的具体原理[通俗易懂]

    python nonlocal的用法_python nonlocal 的具体原理[通俗易懂]很多文章都大概列了下nonlocal的具体用法,比如看到几篇文章写的“nonlocal关键字用来在函数或其他作用域中使用外层(非全局)变量”看完以后我感觉自己是懂了,但光从这句话来说还没完全理解它的真实含义nonlocaldefmake_average():series=[]defaverage(new_value):series.append(new_value)total=sum(s…

    2025年9月16日
    5
  • 【转载】D3D深度测试和Alpha混合

    【转载】D3D深度测试和Alpha混合

    2021年9月15日
    57
  • 运维mysql数据库面试题_运维面试题之数据库

    运维mysql数据库面试题_运维面试题之数据库mysql篇:mysql主从复制原理?mysql的复制是基于3个线程1、master上的binlogdump线程负责把binlog事件传到slave2、slave上面的IO线程负责接收binlog事件,并写入relaylog3、save上面的SQL线程负责读取relaylog并执行innodb和myisam引擎的主要区别?InnoDB支持事物,MyISAM不支持InnoDB支持外键,M…

    2022年5月2日
    43
  • ViewStub的使用

    ViewStub的使用ViewStub经常用在ListView中,用来隐藏一些操作,使用起来也很简单,主要就是在ListView的Item中通过一个ViewStub来引用被隐藏的布局文件。监听用户点击Item,判断下当前是可见还是不可见,实时进行状态的转换即可。效果图如下:   下面看代码:MainActivity.java:设置数据源 publicclassMainActiv…

    2022年6月28日
    43
  • directshow是什么_direction arrow

    directshow是什么_direction arrow3.1DirectShow的功用(1)保证数据量庞大的多媒体数据处理的高效性;(2)时刻保持音频和视频的同步;(3)用简单的方法处理复杂的媒体源问题,包括本地文件,计算机网络,广播电视以及其他数码产品;(4)处理各种各样的媒体格式问题,包括AVI,ASF,MPEG,DV,MOV等;(5)支持目标系统中不可预知的硬件;DirectShow的设计初衷就是尽量要让

    2022年10月12日
    3
  • 等价类划分法用例设计「建议收藏」

    等价类划分法用例设计「建议收藏」等价类划分法等价类划分法是一种常用的、典型的黑盒测试方法。由于做到穷举测试不可能,因此需要从大量的数据中选取一部分数据用于测试,这也是等价类划分法的意义所在。用尽可能少的测试用例覆盖尽可能多的数据,以发现尽可能多的软件缺陷。等价类划分法概述(1)等价类概念等价类指输入域的某个互不相交的子集,所有等价类的集便是整个输入域。等价类中的元素有一些共同的特点,即在该子集合中,各个输入数据对于发现程序中的错误都是等效的,并合理地假定,测试某个等价类的代表值就等于对这一类其他值的测试。也

    2022年10月18日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号