H3C-iMC智能管理中心存在远程代码执行漏洞,攻击者利用该漏洞可以在服务器执行远程命令。
**产品名称:**H3C iMC产品
受影响的版本:EIA E0632H06及之前的版本
修复的版本:EIA E0632H07及之后的版本
这个漏洞其实是一个组合漏洞,先是利用;.js
的方式绕过权限限制。之后可以访问到后台功能点,利用后台功能点的反序列化漏洞执行系统命令。
先来跟踪一下漏洞过程:
漏洞入口在org.apache.myfaces.renderkit.html.HtmlResponseStateManager#getSavedState
处。
是 MyFaces 框架中的一个方法,用于在 JavaServer Faces (JSF) 应用中管理视图状态。这个方法的作用是从请求中获取保存的视图状态。
在 JSF 中,视图状态(ViewState
)是一个重要的概念,它用于维护用户界面组件的状态以及应用程序的行为。这个状态通常在多个请求之间持久化,因此在一个请求中产生的状态可以在后续的请求中使用。JSF 使用一个隐藏字段来传递视图状态,通常命名为 javax.faces.ViewState
。
这里通过Faces上下文
的请求参数中获取该值。根据命名encodedState
可以看出来,后去的状态是加密的。
跟进函数org.apache.myfaces.shared.util.StateUtils#reconstruct
,该函数主要对出入的数据进行一些列的解码、解密。
之后传递给org.apache.myfaces.shared.util.StateUtils#getAsObject
,从字符转换成对象,在Java中通常称为反序列化。
虽然说这是一个反序列化,但是不能直接利用,还需要对payload进行加密。
发送的post请求体是加密的,所以需要分析一下加解密。
第一层:org.apache.myfaces.shared.util.StateUtils#decode
解码,这是一个base64解码。一般byte[]
格式的数据,都会进行base64加密,更好保存和传输,以避免过程中报错。
第二层:org.apache.myfaces.shared.util.StateUtils#decrypt
,这是一个AES
解密函数。
先通过上下文保存的iv
和key
对解密器进行初始化
然后对数据进行解密并返回
第三层:org.apache.myfaces.shared.util.StateUtils#decompress
,这是一个解压缩函数,系统采用的GZIP
压缩
我们在生成payload的时候,并不需要根据解密函数反推出加密函数,只需要对已有加密函数进行微调即可
加密:org.apache.myfaces.shared.util.StateUtils#encrypt
先来看一下加密逻辑,跟解密逻辑类似,先根据上下文对加密器进行初始化,之后再对数据进行加密
看一下初始化时的值是从哪里来的,拿org.apache.myfaces.shared.util.StateUtils#getSecret
举例
从各种地方查找键为org.apache.myfaces.SECRET.CACHE
的值
全局查找,实在配置中写死的
client/web/apps/imc/WEB-INF/assembly/web.xml
我们生成payload的时候,肯定没办法调用应用的上下文,这时候就需要重写加密函数,把从上下文中获取的值,直接写入到函数中。
还需要构造序列化的对象,直接用ysoserial
工具的Myfaces2
生成可以,也可以自定义
这里的payload修改成从请求头中直接获取命令的方式,更方便一些。
输入payload后,几个阶段中的数据变化
接收
解密后
反序列化
该漏洞主要因为没有对反序列化的数据进行验证,导致任意命令执行。针对反序列化,通常有如下几条修复方法
原则: 通过白名单策略,限制可反序列化的类。
解决方案
ObjectInputFilter
来控制允许哪些类被反序列化。Java 9及更高版本支持这一特性。SerializationUtils
提供的反序列化工具,这些工具通常有更严格的安全控制。readObject
或readResolve
方法原则: 在可控的类中,通过自定义的readObject
或readResolve
方法来验证数据或防止不安全的反序列化行为。
解决方案
readObject
: 允许你在反序列化过程中执行额外的安全检查。readResolve
: 确保反序列化后的对象处于安全的状态。官方已经针对该漏洞进行修复,升级新版本即可修复漏洞
https://www.h3c.com/cn/Service/Online_Help/psirt/security-notice/detail_2021.htm?Id=134
6 篇文章
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!