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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 用户权限表设计_数据库权限表设计7张表

    用户权限表设计_数据库权限表设计7张表用户管理权限设计一直是大家讨论的热点,因为几乎涉及到每一个开发的业务系统。我找了很多很多的资料,大家的核心基本上都是一样的:基于角色管理.用户,角色,模块,权限的相互组合,就可以形成一个强大的权限管理系统。最近在一个项目中设计的一个用户权限的设计,很乐意与大家一起讨论及分享.设计思路我的设计思路或者说是我想要实现的功能1.用户的权限通过角色来控制,一个用户可以拥有多个角

    2022年9月29日
    0
  • 单片机定时器实验报告C语言,51单片机定时器实验报告.doc

    单片机定时器实验报告C语言,51单片机定时器实验报告.doc51单片机定时器实验报告51单片机定时器实验报告51单片机定时器实验实验内容:实验内容:编写程序使定时器0或者定时器1工作在方式1,定时50ms触发蜂鸣器。C语言程序#include#defineuintunsignedint#defineucahrunsignedcharsbitFM=P0^0;voidmain(){TMOD=0x01;TH0=(65535-50000)/256;…

    2022年7月26日
    5
  • android 转到iphone6s,安卓如何将数据转到iPhone上?

    android 转到iphone6s,安卓如何将数据转到iPhone上?原标题:安卓如何将数据转到iPhone上?同事张明月之前使用的是安卓荣耀手机,不过前几天在更换手机的时候,在别人的建议她入手了一款iPhone12手机。张明月也想见识一下传说中非常流畅的苹果ios系统,她使用了一天后表示这款手机确实比较好用,所以她现在需要把之前荣耀手机中的数据转移到iPhone手机上了。张明月在找了一些“安卓如何将数据转移到iPhone上”的相关问题,发现QQ手机同步助手是可以把…

    2022年9月2日
    2
  • verilog语言转vhdl语言_vhdl转换为verilog

    verilog语言转vhdl语言_vhdl转换为verilog1.下载后先运行X-HDL-4.2.1-Setup.exe文件,选择安装路径,注意路径中不要有中文。2.运行crack_xhdl_4.2.1.exe文件,选择刚刚你安装XHDL的路径下的\bin文件夹,点击next—finish,出现success代表激活成功教程成功。3.可能会要求你重启电脑,这时候同意重启就好了。4.重启之后运行X-HDL。5.可以选择VHDL转Verilog或Verilog转…

    2022年9月21日
    0
  • GridView控件

    GridView控件

    2021年11月28日
    34
  • threadpoolmanager_threadlocal是线程安全的吗

    threadpoolmanager_threadlocal是线程安全的吗在WEB开发中,为了减少页面等待时间提高用户体验,我们往往会把一些浪费时间的操作放到新线程中在后台运行。简单的实现代码就是://代码一newThread(()=&gt;{//dosomething}).Start();但是对于一个请求量大的网址这样做是很不现实的——每一个操作都要开启一个新线程,最终会因CPU不堪重负而使网站挂掉。更好的做法是使用线程队列。对于线程队列 ThreadPoo…

    2022年9月24日
    0

发表回复

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

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