Apereo CAS 4.X反序列化漏洞:存在于登录的execution参数,漏洞分析及复现
摘要:Apereo CAS 4 X反序列化漏洞:存在于登录的execution参数,漏洞分析及复现。
环境设定
由于某些cas版本的加密功能进行了相应的更改,因此,如果您想根据本文重现该漏洞,请选择与我的版本相同的版本。
jdk8u144(不一定相同)
ApereoCas-4.1.5
下载CAS-Overlay-Template
github链接:https://github.com/apereo/cas-overlay-template/tree/4.1
在github上有详细的部署操作。 注意pom.xml文件cas的版本:
<cas.version> 4.1.5 </cas.version>
编译后,将在target目录中生成cas.war war软件包。 war软件包将放置在tomcat Web目录中。 启动tomcat之后,您可以通过http://localhost/cas访问example。
成功部署后:
漏洞分析
该漏洞存在于登录的execution参数中。 数据包捕获发现参数值应该被加密,因此有必要知道相应的加密方法和处理过程。
检查与登录URL对应的servlet,以了解它是由Spring的DispatcherServlet处理的。 配置文件是/WEB-INF/cas-servlet.xml
从springmvc的执行流程图中,您可以知道,只要找到相应的处理器适配器,就可以找到相应的处理器。
全局搜索login一词,并查看loginHandlerAdapter适配器,处理器的类名称为org.jasig.cas.web.flow.SelectiveFlowHandlerAdapter
org.jasig.cas.web.flow.SelectiveFlowHandlerAdapter此类在登录时继承FlowHandlerAdapter类并调用继承的类的处理程序方法:
//org.springframework.webflow.mvc.servlet.FlowHandlerAdapter#handlepublic ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { FlowHandler flowHandler = (FlowHandler)handler; this.checkAndPrepare(request, response, false); String flowExecutionKey = this.flowUrlHandler.getFlowExecutionKey(request); if (flowExecutionKey != null) { try { ServletExternalContext context = this.createServletExternalContext(request, response); FlowExecutionResult result = this.flowExecutor.resumeExecution(flowExecutionKey, context); this.handleFlowExecutionResult(result, context, request, response, flowHandler); } catch (FlowException var11) { this.handleFlowException(var11, request, response, flowHandler); } } else { try { String flowId = this.getFlowId(flowHandler, request); MutableAttributeMap<Object> input = this.getInputMap(flowHandler, request); ServletExternalContext context = this.createServletExternalContext(request, response); FlowExecutionResult result = this.flowExecutor.launchExecution(flowId, input, context); this.handleFlowExecutionResult(result, context, request, response, flowHandler); } catch (FlowException var10) { this.handleFlowException(var10, request, response, flowHandler); } } return null; }
其中flowExecutionKey通过getFlowExecutionKey方法获取参数execution值
String flowExecutionKey = this.flowUrlHandler.getFlowExecutionKey(request);
将flowExecutionKey作为参数传递给resumeExecution方法,以跟进该功能。 在第91行,判断flowExecutionKey值的格式,并且字符串通过“-”分为uuid和base64编码的流状态两部分,因此,如果不满意该格式,则无法继续。
跟进getFlowExecution的第96行。
public FlowExecution getFlowExecution(FlowExecutionKey key) throws FlowExecutionRepositoryException { if (!(key instanceof ClientFlowExecutionKey)) { throw new IllegalArgumentException("Expected instance of ClientFlowExecutionKey but got " + key.getClass().getName()); } else { byte[] encoded = ((ClientFlowExecutionKey)key).getData(); try { ClientFlowExecutionRepository.SerializedFlowExecutionState state = (ClientFlowExecutionRepository.SerializedFlowExecutionState)this.transcoder.decode(encoded); FlowDefinition flow = this.flowDefinitionLocator.getFlowDefinition(state.getFlowId()); return this.flowExecutionFactory.restoreFlowExecution(state.getExecution(), flow, key, state.getConversationScope(), this.flowDefinitionLocator); } catch (IOException var5) { throw new ClientFlowExecutionRepositoryException("Error decoding flow execution", var5); } } }
在第105行,对解码后的已编码base64进行解密,然后再执行解密函数this.transcoder.decode(已编码)
可以看出,在执行一系列操作之后,密文在第83行被解密,并在第99行被反序列化,从而触发了漏洞。 可以看出,被调用的解码方法属于EncryptedTranscoder类。 此类还定义了加密方法encode。 在这里,可以直接生成恶意对象。 直接调用org.jasig.spring.webflow.plugin.EncryptedTranscoder#encoding生成加密的字节数组base64。 添加“ uuid-”构成执行的价值。
整个调用栈
构造payload
默认环境的jar包中有commons-collections4-4.0.jar。 使用ysoserial直接生成payload。 记住要对payload的特殊符号进行URL编码。
演示结果
成功执行系统命令
构造回显payload
文章提到org.springframework.webflow.context.ExternalContextHolder.getExternalContext()方法可以获取上下文信息,然后通过getNativeRequest()方法通过getNativeResponse()方法获取请求对象,以获取响应对象。 它还提到了org.springframework.cglib.core.ReflectUtils.defineClass()。 NewInstance(); 加载有效载荷。 我的猜测想法是通过defineClass从字节[]中恢复Class对象。 恶意对象主要是执行命令,获取响应对象,并在执行命令后通过响应对象的输出流输出结果。 使用commons-collections1时,我发现由于构造函数是私有的,因此无法使用ReflectUtils,并且setAccessible必须设置为true。 因此,如果您使用commons-collections2,则无需担心通过defineClass加载有效负载,只需将其直接写入利用率类即可。
//org.springframework.cglib.core.ReflectUtilsprivate ReflectUtils() { }//org.springframework.cglib.core.ReflectUtils#defineClass public static Class defineClass(String className, byte[] b, ClassLoader loader) throws Exception { Object[] args = new Object[]{className, b, new Integer(0), new Integer(b.length), PROTECTION_DOMAIN}; Class c = (Class)DEFINE_CLASS.invoke(loader, args); Class.forName(className, true, loader); return c; }
这是ysoserial的commons-collections2构造恶意对象的主要方法。 在这里,我们使用javassist,第66行获取要操作的类,第75行将代码插入此类的构造函数中,因此我们只需要将此类的构造函数ysoserial.payloads.util.Gadgets.StubTransletPayload修改为 执行系统命令,修改响应输出流。 您可以直接修改ysoserial的源代码并重新编译。 为了方便起见,我直接使用payload对其进行了更改。
相关热词搜索:Apereo CAS 4 X 反序列化漏洞 execution参数 漏洞分析及复现 重庆网络安全
上一篇:CVE-2019-1215漏洞成因分析:用后释放漏洞,ws2ifsl.sys中,实现本地提权
下一篇:CVE-2020-5316:SupportAssist Client软件漏洞,导致SupportAssist二进制文件加载任意DLL,进而导致执行任意特权代码
人机验证(Captcha)绕过方法:使用Chrome开发者工具在目标网站登录页面上执行简单的元素编辑,以实现Captcha绕过
牛创网络: " 人机身份验证(Captcha)通常显示在网站的注册,登录名和密码重置页面上。 以下是目标网站在登录页面中排列的验证码机制。 从上图可以
2020-01-26 12:44:09 )8872( 亮了
自动发现IDOR(越权)漏洞的方法:使用BurpSuite中的Autozie和Autorepeater插件来检测和识别IDOR漏洞,而无需手动更改每个请求的参数
牛创网络: "自动发现IDOR(越权)漏洞的方法:使用BurpSuite中的Autozie和Autorepeater插件来检测和识别IDOR漏洞,而无需手动更改每个请求的参数
2020-01-30 14:04:47 )6288( 亮了
Grafana CVE-2020-13379漏洞分析:重定向和URL参数注入漏洞的综合利用可以在任何Grafana产品实例中实现未经授权的服务器端请求伪造攻击SSRF
牛创网络: "在Grafana产品实例中,综合利用重定向和URL参数注入漏洞可以实现未经授权的服务器端请求伪造攻击(SSRF)。该漏洞影响Grafana 3 0 1至7 0 1版本。
2020-08-12 14:26:44 )4301( 亮了
Nginx反向代理配置及反向代理泛目录,目录,全站方法
牛创网络: "使用nginx代理dan(sui)是http响应消息写入服务地址或Web绝对路径的情况。 写一个死的服务地址是很少见的,但它偶尔也会发生。 最棘手的是写入web绝对路径,特别是如果绝对路径没有公共前缀
2019-06-17 10:08:58 )3858( 亮了
fortify sca自定义代码安全扫描工具扫描规则(源代码编写、规则定义和扫描结果展示)
牛创网络: "一般安全问题(例如代码注入漏洞),当前fortify sca规则具有很多误报,可通过规则优化来减少误报。自带的扫描规则不能检测到这些问题。 需要自定义扫描规则,合规性角度展示安全风险。
2020-02-12 10:49:07 )3505( 亮了
整理几款2020年流行的漏洞扫描工具
牛创网络: "漏洞扫描器就是确保可以及时准确地检测信息平台基础架构的安全性,确保业务的平稳发展,业务的高效快速发展以及公司,企业和国家 地区的所有信息资产的维护安全。
2020-08-05 14:36:26 )2536( 亮了
微擎安装使用技巧-微擎安装的时候页面显示空白是怎么回事?
牛创网络: "我们在公众号开发中,有时候会用到微擎,那我们来看一下微擎安装的时候页面显示空白是怎么回事吧
2019-06-08 15:34:16 )2261( 亮了
渗透测试:利用前端断点拦截和JS脚本替换对前端加密数据的修改
牛创网络: " 本文介绍的两种方法,虽然断点调试比JS脚本代码替换更容易,但是JS脚本代码替换方法可以实现更强大的功能,测试人员可以根据实际需要选择适当的测试方法
2020-01-07 09:34:42 )1995( 亮了
从工业界到学界盘点SAS与R优缺点比较
牛创网络: "虽然它在业界仍然由SAS主导,但R在学术界广泛使用,因为它的免费开源属性允许用户编写和共享他们自己的应用程序 然而,由于缺乏SAS经验,许多获得数据分析学位的学生很难找到工作。
2019-07-13 22:25:29 )1842( 亮了
41款APP侵犯用户隐私权:QQ,小米,搜狐,新浪,人人均被通报
牛创网络: "随着互联网的不断发展,我们进入了一个时代,每个人都离不开手机。 但是,APP越来越侵犯了用户隐私权。12月19日,工业和信息化部发布了《关于侵犯用户权益的APP(第一批)》的通知。
2019-12-20 11:28:14 )1775( 亮了