0x1題記
很早之前在打shiro遇見(jiàn)過(guò)這么情況沈自,有key無(wú)利用鏈劫拗,那段時(shí)間又出來(lái)了一個(gè)shiro無(wú)cc利用鏈,但是在實(shí)際打時(shí)好時(shí)壞勺疼,想研究下為什么教寂,最近有空記錄下吧,當(dāng)時(shí)用的工具應(yīng)該是這個(gè)执庐。
0x2環(huán)境
引入shiro必要依賴(lài)后酪耕,可以看到自動(dòng)導(dǎo)入了cb依賴(lài)
手動(dòng)將其去掉后,發(fā)現(xiàn)啟動(dòng)異常轨淌,說(shuō)明cb是一個(gè)必要的依賴(lài)迂烁,也是shiro無(wú)cc鏈利用前提看尼。
0x3cb1利用
看樣子是可以直接用cb鏈打,使用cb鏈生成payload再AES加密通過(guò)rememberMe發(fā)送婚被,狡忙。并沒(méi)有計(jì)算機(jī)彈出,打失敗了址芯,看下tomcat異常灾茁,有個(gè)類(lèi)沒(méi)有,是cc依賴(lài)中的谷炸,跟一下看哪調(diào)用了北专。
Caused by: org.apache.shiro.util.UnknownClassException: Unable to load class named [org.apache.commons.collections.comparators.ComparableComparator] from the thread context, current, or system/application ClassLoaders. All heuristics have been exhausted. Class could not be found.
在cb鏈中會(huì)通過(guò)Comparator去調(diào)用TemplatesImpl的getOutputProperties()方法最后執(zhí)行,如下旬陡。
這里傳進(jìn)去的是string拓颓,調(diào)用的第二個(gè)構(gòu)造函數(shù),然后會(huì)獲取ComparableComparator的實(shí)例描孟,這是在commons.collections依賴(lài)中的驶睦,由于此處的環(huán)境沒(méi)有依賴(lài),導(dǎo)致異常匿醒。
0x4nocc利用
既然如此场航,找一個(gè)實(shí)現(xiàn)了Comparator的接口傳過(guò)去,讓其調(diào)用第三個(gè)構(gòu)造函數(shù)即可廉羔。在Comparator.java的示例中使用String.CASE_INSENSITIVE_ORDER
修改為
BeanComparator comparator = new BeanComparator(null, String.CASE_INSENSITIVE_ORDER);
生成payload發(fā)送溉痢,攻擊成功
0x5版本問(wèn)題
回到開(kāi)頭,當(dāng)時(shí)為什么會(huì)出現(xiàn)大量情況打不了憋他。
經(jīng)過(guò)測(cè)試孩饼,高版本的shiro使用的cb版本為1.9.3,當(dāng)時(shí)工具使用的為1.8.3竹挡,由于打的payload和目標(biāo)服務(wù)器的版本不一致镀娶,導(dǎo)致報(bào)錯(cuò)如下
Caused by: java.io.InvalidClassException: org.apache.commons.beanutils.BeanComparator; local class incompatible: stream classdesc serialVersionUID = -3490850999041592962, local class serialVersionUID = -2044202215314119608
將cb版本修改為1.9.3重新生成payload發(fā)送,利用成功揪罕。
0x6后記
在使用shiro較高版本后梯码,發(fā)現(xiàn)其自動(dòng)引入了commons.collections依賴(lài),版本為3.2.2耸序,這不正好解決了之前cb1鏈利用失敗的那個(gè)問(wèn)題。
重新使用cb鏈生成payload測(cè)試鲁猩,發(fā)送后利用成功坎怪。雖然引入了commons.collections依賴(lài),但是版本為3.2.2廓握,用cc鏈仍然打不了搅窿。