背景
使用 springboot 时, 当用户向/functionRouter 路由发送 headers 带有 spring.cloud.function.routing-expression 键的 POST 包时,会触发 SPEL 解析该键值
影响范围
3.0.0.RELEASE <= Spring Cloud Function <= 3.2.2
环境搭建
最后修改参数 pom.xml 里面的参数让 spring 的版本在漏洞影响范围即可
什么是 Sysmon
System Monitor (Sysmon) 是一种 Windows 系统服务和设备驱动程序,一旦安装在系统上,它就会在系统重新启动后保持驻留,以监视系统活动并将其记录到 Windows 事件日志中。
参考文档
https://docs.microsoft.com/en-us/sysinternals/downloads/sysmon
本文使用的工具
https://github.com/nshalabi/SysmonTools
工具的配置文件
https://github.com/SwiftOnSecurity/sysmon-config
如何使用
Install: sysmon64 -i [<configfile>]
Update configuration: sysmon64 -c [<configfile>]
Install event manifest: sysmon64 -m
Print schema: sysmon64 -s
Uninstall: sysmon64 -u [force]
如果我们使用 payload 执行命令,我们可以检查 sysmon 日志,并且可以查看我执行了哪个命令
补充说明
原理:
漏洞是出在 SpringCloud Function 的 RoutingFunction 功能上,其功能的目的本身就是为了微服务应运而生的,可以直接通过 HTTP 请求与单个的函数进行交互,同时 spring.cloud.function.definition 参数提供要调用的函数的名称。
调用反转字符串的函数
POST /functionRouter HTTP/1.1
Host: localhost:8080
spring.cloud.function.definition: reverseString
Content-Type: text/plain
Content-Length: 3
world
其结果就会在页面上输出 dlrow,因此我们只需要在 header 头上指定要调用的函数名称就可以对其进行调用。
漏洞是存在于 header 头的 spring.cloud.function.routing-expression 参数
从 SpringCloud Function 的 Controller 处理来一步步 follow。
在 org.springframework.cloud.function.web.mvc.FunctionController#post 方法 breakpiont 程序会判断当前请求是否为 RoutingFunction,并将请求的内容和 Header 头编译成 Message 带入到 FunctionInvocationWrapper.apply 方法中,随后又进入其中的 doApply 方法
最后进入到 org.springframework.cloud.function.context.config.RoutingFunction#route 方法中
在这里判断了请求 headers 头中有没有 spring.cloud.function.routing-expression 参数
并将结果带入到 this.functionFromExpression()方法中
最终直接由 SpelExpressionParser 来解析,导致 Spel 表达式注入
自搭环境
小 tips: 坑 1 project modules sdk java 版本需保持一致 不然 maven 报错 坑 2 SpringBoot 没有主清单属性 网上修改的 pom 中缺少
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
漏洞修复
官方修复 判断变量是否从 header 头中读取,否则进入安全函数来解析
补充日志说明
日志名称: Microsoft-Windows-Sysmon/Operational
来源: Microsoft-Windows-Sysmon
日期: 2022/4/6 18:06:02
事件 ID: 1
任务类别: Process Create (rule: ProcessCreate)
级别: 信息
关键字:
用户: SYSTEM
计算机: 10_0_0_10
描述:
Process Create:
RuleName: -
UtcTime: 2022-04-06 10:06:02.181
ProcessGuid: {8df5b70d-660a-624d-a802-00000000a100}
ProcessId: 3928
Image: C:WindowsSystem32calc.exe
FileVersion: 6.3.9600.17667 (winblue_r8.150123-1500)
Description: Windows Calculator
Product: Microsoft® Windows® Operating System
Company: Microsoft Corporation
OriginalFileName: CALC.EXE
CommandLine: calc
CurrentDirectory: C:webtest
User: 10_0_0_10Administrator
LogonGuid: {8df5b70d-573d-624d-4730-030000000000}
LogonId: 0x33047
TerminalSessionId: 2
IntegrityLevel: High
Hashes: SHA256=5543A258A819524B477DAC619EFA82B7F42822E3F446C9709FADC25FDFF94226
ParentProcessGuid: {8df5b70d-5a01-624d-ce00-00000000a100}
ParentProcessId: 788
ParentImage: C:javajdk-15binjava.exe
ParentCommandLine: java -jar SpringCloud-Function-0.0.1-SNAPSHOT.jar
ParentUser: 10_0_0_10Administrator
事件 Xml:
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
<System>
<Provider Name="Microsoft-Windows-Sysmon" Guid="{5770385F-C22A-43E0-BF4C-06F5698FFBD9}" />
<EventID>1</EventID>
<Version>5</Version>
<Level>4</Level>
<Task>1</Task>
<Opcode>0</Opcode>
<Keywords>0x8000000000000000</Keywords>
<TimeCreated SystemTime="2022-04-06T10:06:02.181964400Z" />
<EventRecordID>60</EventRecordID>
<Correlation />
<Execution ProcessID="748" ThreadID="3404" />
<Channel>Microsoft-Windows-Sysmon/Operational</Channel>
<Computer>10_0_0_10</Computer>
<Security UserID="S-1-5-18" />
</System>
<EventData>
<Data Name="RuleName">-</Data>
<Data Name="UtcTime">2022-04-06 10:06:02.181</Data>
<Data Name="ProcessGuid">{8DF5B70D-660A-624D-A802-00000000A100}</Data>
<Data Name="ProcessId">3928</Data>
<Data Name="Image">C:WindowsSystem32calc.exe</Data>
<Data Name="FileVersion">6.3.9600.17667 (winblue_r8.150123-1500)</Data>
<Data Name="Description">Windows Calculator</Data>
<Data Name="Product">Microsoft® Windows® Operating System</Data>
<Data Name="Company">Microsoft Corporation</Data>
<Data Name="OriginalFileName">CALC.EXE</Data>
<Data Name="CommandLine">calc</Data>
<Data Name="CurrentDirectory">C:webtest</Data>
<Data Name="User">10_0_0_10Administrator</Data>
<Data Name="LogonGuid">{8DF5B70D-573D-624D-4730-030000000000}</Data>
<Data Name="LogonId">0x33047</Data>
<Data Name="TerminalSessionId">2</Data>
<Data Name="IntegrityLevel">High</Data>
<Data Name="Hashes">SHA256=5543A258A819524B477DAC619EFA82B7F42822E3F446C9709FADC25FDFF94226</Data>
<Data Name="ParentProcessGuid">{8DF5B70D-5A01-624D-CE00-00000000A100}</Data>
<Data Name="ParentProcessId">788</Data>
<Data Name="ParentImage">C:javajdk-15binjava.exe</Data>
<Data Name="ParentCommandLine">java -jar SpringCloud-Function-0.0.1-SNAPSHOT.jar</Data>
<Data Name="ParentUser">10_0_0_10Administrator</Data>
</EventData>
</Event>
原文始发于微信公众号(Aaron与安全的那些事):实用蓝队工具| Sysmon分享
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论