作者:wh1t3p1g
項目地址:https://github.com/wh1t3p1g/ysomap

01 YSOMAP

Ysomap是一款適配于各類實際復雜環境的Java反序列化利用框架,可動態配置具備不同執行效果的Java反序列化利用鏈payload。

隨著利用鏈的補充,ysomap同樣可作為一款Java反序列化利用鏈教學庫。目前,ysomap支持Java原生反序列化利用鏈、fastjson利用鏈、hessian利用鏈、xmldecoder、xstream等等。

另外,ysomap具備exploit模塊,用于充分調動反序列化利用鏈。目前,ysomap已支持RMI、JNDI、JMX、shiro、xmlrpc等exploits。

02 YSOMAP解決了什么痛點?

Java反序列化漏洞是Java語言中最嚴重的漏洞之一,此種類型漏洞常被用于滲透、某行動中,其中最出名的莫過于weblogic的T3/IIOP反序列化漏洞。從2015年反序列化漏洞被提出,到如今仍然有各類著名中間件出現此類問題,這都使得此種類型漏洞成為安全研究人員的研究熱點之一。

然而,在實際碰到的漏洞環境中,我們常會發現目前存在的兩款工具(ysoserial、marshalsec)均無法很好的進行利用。這是因為實際環境是復雜的,我們需要通過各種“技巧”來達到真正exploit的效果。

譬如,XStream的LazyValue具備任意調用靜態函數的利用效果,而實際想要利用,我們必須找一個切實可用的函數來利用。在之前的文章中我找了javax.naming.InitialContext.doLookup進行利用,可以對外發起jndi連接。那么,實際環境會那么簡單嗎?答案當然是否定的,我們經常會遇到目標環境是不出網的情況,那么又該如何去進一步利用呢?這里提一個簡單的解決方案,依賴spring框架我們可以找到函數org.springframework.util.SerializationUtils.deserialize來進行二次反序列化。此時,原本的XStream的payload就進一步轉化為了Java原生反序列化的利用。(這里提到的案例是真實存在于某開源框架的)

那么問題就來了,如何在實際利用中快速配置此類“技巧”呢?

ysomap的存在就是為了解決此類問題,采用模塊化的思想,ysomap將具備動態組合利用鏈和利用效果的能力。對于遇到的不同環境,根據特定的組合來達成實際利用。

為此,我將原本的利用鏈切分成了兩個部分payloadbullet

  1. payload:指代利用鏈的前序部分
  2. bullet:指代最終利用鏈可達成的效果,如命令執行、jndi外鏈等效果

舉個例子,CommonsCollection1和3,在分析時我們可以看到實際1和3的區別在于1使用的是InvokerTransformer,而3使用的是templatesImpl的方式。那么提取相同的前序payload部分,我們只需寫兩個不同的bullet即可。而且這兩個bullet也同樣能被用于其他的payload。

實際還有就是我在寫RMIRegistryExploit時,也有這種可將不變部分重用的地方,而無需2,3之類的出現。

另外,ysomap本身具備可擴展的屬性,你可以通過編寫自己的payload、bullet、exploit來擴展ysomap本身的功能。

03 如何上手YSOMAP?

在談如何使用ysomap之前,假設使用者有一定的Java反序列化利用的前置知識,以及一些常見利用的原理,如rmi、ldap等。

Jar編譯

由于XStream的幾個payload依賴JDK8的環境,所以后續的使用均在JDK8的環境下編譯并運行

mvn clean package -DskipTests

正常編譯不出錯,可在cli/target目錄找到ysomap.jar

當然,你也可以直接下載release,但還是推薦自行clone后編譯,因為大版本的更新將積攢一批利用鏈后才會發布release。

Jar運行

經過幾次迭代,目前ysomap支持兩種運行模式:終端cli模式和腳本模式

終端模式

java -jar ysomap.jar cli

腳本模式

java -jar ysomap.jar script path/to/script.yso

終端模式更易于選擇和配置exploit、payload、bullet,但對于重復性的配置,終端模式顯的格外繁瑣。所以后續又增加了腳本模式。通過編寫特定配置的yso腳本,使用ysomap進行載入調用。腳本模式在正確配置的前提下將極大的節省使用者輸入重復配置的工作量,提高使用效率。同時,yso腳本也可以被分享給其他使用者進行快捷使用。

基礎使用方法

ysomap > help
help                print this message
list <type>         list exploits, bullets and payloads
use <type> <name>   choose a exploit/payload/bullet
set <key> <value>   set exploit/bullet's arguments
run                 run current session
show <type>         show payload/bullet/exploit details
clear               clear current sessions
session [c|i]       recover to a session or create a new session
sessions            print current running exploit sessions
stop                stop current session
kill [uuid|all]     kill sessions, like 'kill uuid' or 'kill all'
exit                exit ysomap

使用help命令可以看到如上的一些命令,這里將依次進行介紹XD

命令均可用tab鍵進行補全

list操作

list <type>         list exploits, bullets and payloads

ysomap支持多種類型的exploits、payloads、bullets,使用list命令可以查看當前支持的所有內容

比如list exploits 查看所有的exploit

image-20211122223827577

同理可查看payload、bullet

show操作

show <type>         show payload/bullet/exploit details

show操作同list有點類似,其主要作用是查看當前選擇的payload/bullet/exploit的細節,后續舉例子時會用到。

set操作

set <key> <value>   set exploit/bullet's arguments

set操作主要用于配置exploit或payload的詳細信息,后續舉例子時會用到

這里有兩個特殊的配置將用于payload生成

# 配置序列化數據生成后采用base64進行編碼
set encoder base64
# 配置序列化數據生成后輸出的位置,console為直接在終端輸出,file為默認在當前目錄生成obj.ser文件
set output console
set output file

use操作

use <type> <name>   choose a exploit/payload/bullet

use操作用于選擇對應的exploit、payload、bullet

session操作

clear               clear current sessions
session [c|i]       recover to a session or create a new session
sessions            print current running exploit sessions
stop                stop current session
kill [uuid|all]     kill sessions, like 'kill uuid' or 'kill all'

ysomap中每一個payload或exploit的配置都會生成一個session,session用于維持當前的配置信息和運行狀態

使用sessions查看當前的所有session

image-20211122230059781

使用session c在保證當前session完整性的前提下,創建新的session用于配制新的payload或exploit

使用session i uuid來還原uuid所指向的session配置

image-20211122230128309

另外,對于無需再運行的session,可以使用kill uuid的方式清除該session

也可以使用stop來停止當前正在運行的session

也可以使用clear來清除當前session的所有配置

run操作

run                 run current session

在配置完具體的內容后,使用run操作來運行或生成相應的序列化數據/exploit

使用流程

接下來,介紹以下兩種流程

生成序列化后的payload

當你需要使用ysomap生成特定的序列化數據時

第一步:use payload xxxx 設置一個payload

第二步:show options獲得當前payload的配置信息,會提示可以選擇的bullet信息

第三步:use bullet xxxx 給當前的payload裝上子彈(具體能達成的利用方式)

第四步:show options 可以看到包括payload和bullet的配置信息

第五步:set xxx xxx 設置當前需要配置的內容

第六步:run 配置完成后,執行并生成相應的序列化數據

當生成的序列化數據為json或xml時,序列化后的數據將直接打印在終端上;當生成的序列化數據為二進制數據,則會在當前目錄生成一個obj.ser文件

利用exploit包進行攻擊

當你需要使用ysomap進行攻擊時

第一步:use exploit xxxx 設置一個exploit

第二步:show options獲得當前exploit的配置信息,會提示需要設置payload或其他配置

第三步:如果需要設置payload,過程參考上面的步驟;

第四步:如果不需要設置其他payload,或其他設置已經設置完成 set xxx xxx 設置當前需要配置的內容

第五步:run 配置完成后,執行并進行相應的攻擊

實例配置

以配置exploit RMIListener為例

image-20211122224045328

使用use操作可以選擇exploit為RMIListener

選擇了exploit,可以通過show操作查看當前exploit需要配置的內容

image-20211122224436123

這里有兩個配置項,一個是exploit可能需要配置相應的利用鏈payload,另一個是exploit本身所需要的配置信息。通過show options可以查看推薦的payload名,此處RMIListener支持ysomap的所有gadgets。

假設此處payload選擇CommonsBeanutils1,bullet選擇也可以通過show options查看,這里選擇TemplatesImplBullet

image-20211122231106286

然后使用set操作配置內容

image-20211122231211281

最后使用run操作運行,session中也能看到當前所運行的exploit的相關信息

image-20211122231238152

到這里,exploit RMIListner就運行起來了

對于第一次的配置,我們可以通過終端模式的提示一步一步配置。在接下來的運行中,我們可以將執行的操作記錄成yso文件,然后使用script模式進行載入

use exploit RMIListener
use payload CommonsBeanutils1
use bullet TemplatesImplBullet
set lport 1099
set body "open -a Caclulator.app"
run

04 如何自定義擴展YSOMAP?

從上面的介紹可以知道ysomap主要由exploit、payload、bullet組成。

擴展exploit需要繼承AbstractExploit對象,并分別聲明@Exploits、@Authors、@Require、@Details

@Exploits
@Authors({Authors.WH1T3P1G})
@Require(bullets = {"required payload"}, param = false)
@Details("exploit descriptions")
public class ExploitDemo extends AbstractExploit {

}

擴展payload需要繼承AbstractPayload對象,并分別聲明@Payloads、@Authors、@Targets、@Require、@Dependencies

@Payloads
@Authors({ Authors.WH1T3P1G })
@Targets({Targets.JDK})
@Require(bullets = {"required bullet"},param = false)
@Dependencies({"dependency"})
public class PayloadDemo extends AbstractPayload<Object> {

}

擴展bullet需要實現接口Bullet對象,并分別聲明@Bullets、@Authors、@Targets、@Require、@Dependencies

@Bullets
@Targets({Targets.JDK})
@Authors({ Authors.WH1T3P1G })
@Details("指定目錄文件寫入")
@Dependencies({"dependency"})
public class StoreableCachingMapBullet implements Bullet<Object> {

}

其中聲明@Exploits、@Payloads、@Bullets將用于尋址,未標明的exploit、payload或bullet將無法使用

具體的編寫案例可以直接在項目里找一個對應的對象模仿著寫,相信寫過一次之后就熟悉了。當然,如果在擴展中存在什么問題可以直接提issue

05 最后

ysomap目前所覆蓋的利用鏈仍然是一小部分,還存在大量的利用鏈、exploit可以擴展。

后續將不定期更新已有的、我或者其他研究者發現的利用鏈。ysomap的使用存在一定前置門檻,我也在考慮如何降低這部分的門檻。比如script腳本模式就是我目前認為可以一鍵式運行或exploit的方式,當前,也許你有其他的更好的方法來提升使用體驗,歡迎提issue、提PR~

最后的最后,感謝ysoserial、marshalsec這兩款工具。

404星鏈計劃

ysomap 現已加入 404星鏈計劃

加入404星鏈計劃社群,請掃碼識別運營菜菜子二維碼,添加時備注“星鏈計劃”。


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.jmbmsq.com/1766/