CMS源码审计之从零到实现RCE

  • A+
所属分类:代码审计

CMS源码审计之从零到实现RCE点击上方蓝字关注我们


概述


Cockpit是一个免费的、开源的、自托管的无头CMS,其使用api和JSON调用将内容呈现到网页中,仅用于存储和分发内容。


研究人员在对Cockpit CMS进行源码审计时,发现了一些漏洞。攻击者可以利用这些漏洞控制任意账户并实现远程代码执行。下文中,研究人员详细记录了漏洞发现的过程,并演示了如何利用这些漏洞。


CMS源码审计之从零到实现RCE


提取用户名


/auth/check中的NoSQL注入漏洞:CVE-2020-35846


负责对应用程序用户进行身份验证的Auth控制器使用的检查方法如下图所示:


CMS源码审计之从零到实现RCE

Auth::check方法


以及cockpit模块的身份验证功能如下所示:


CMS源码审计之从零到实现RCE

身份验证功能


可以看出,以上代码缺少对用户参数类型的检查,从而允许在查询中嵌入具有任意MongoDB运算符的对象,进行盲注攻击。


要成功利用该漏洞,还需找到一种方法来返回条件结果。在对源代码进行分析后,研究人员找到了一种方法,即在password参数中传递一个数组(而不是字符串),从而可以通过password_verify函数弹出关于无效值类型的警告。


CMS源码审计之从零到实现RCE


NoSQL盲注方法之使用$eq运算符


$eq运算符将匹配字段值等于指定值的文档,可以利用它对用户名进行暴力破解。


CMS源码审计之从零到实现RCE

满足条件:找到名为admin的用户


CMS源码审计之从零到实现RCE

不满足条件:找不到名为admini的用户


NoSQL盲注方法之使用$regex运算符


$regex运算符为查询中的模式匹配字符串提供正则表达式功能,可以利用它对应用程序的所有用户名进行暴力破解。


CMS源码审计之从零到实现RCE

满足条件:找到一个以ad开头的用户名


CMS源码审计之从零到实现RCE

不满足条件:找不到以ada开头的用户名


此外,我们可以通过在查询中添加$nin运算符来排除已找到的所有用户,从而加快暴力破解的速度。同时,我们还可以在正则表达式中添加固定的量词,以查找或限制字符串的长度


CMS源码审计之从零到实现RCE


CMS源码审计之从零到实现RCE


NoSQL盲注方法之使用MongoLite库中的$func运算符


$func运算符允许调用标准函数$b(任何具有单个参数的PHP函数),该函数采用等于字段$a(在本例中为user字段)的单个参数:


CMS源码审计之从零到实现RCE


通过将var_dump或var_exportPHP函数作为参数传递,我们将把盲注变成经典的带内注入。只需一个查询,我们就可以获取应用程序的所有用户名:


CMS源码审计之从零到实现RCE


提取密码重置令牌


与其他的Web应用程序一样,Cockpit允许用户重置帐户密码。研究人员发现了两个NoSQL注入漏洞,利用这些漏洞可以获得任意用户的密码重置令牌。


/auth/resetpassword中NoSQL注入漏洞:CVE-2020-35847


Auth控制器的resetpassword方法负责使用reset令牌更改用户密码,代码如下所示:


CMS源码审计之从零到实现RCE


可以看出代码中未对token参数类型进行检查,因此我们可以使用以下查询获取现有的令牌:


CMS源码审计之从零到实现RCE


/auth/newpassword中的NoSQL注入:CVE-2020-35848


Auth控制器的newpassword方法负责显示用户密码重置表单,代码如下所示:



CMS源码审计之从零到实现RCE


同样,没有针对令牌参数的类型检查,因此可以使用类似的查询进行获取:


CMS源码审计之从零到实现RCE


用户账户入侵


成功获取密码重置令牌后,就可以通过以下步骤对我们感兴趣任意用户进行入侵:


1. 访问/auth/requestreset以生成用于重置所选用户密码的令牌:


CMS源码审计之从零到实现RCE


2.使用上述方法之一(/auth/resetpassword或/auth/newpassword)提取令牌:


CMS源码审计之从零到实现RCE


3. 使用/auth/newpassword方法和在上一步中获得的密码重置令牌,提取用户帐户数据(用户名、密码哈希、API密钥、密码重置令牌):


CMS源码审计之从零到实现RCE

提取用户名


掌握了这些数据之后,我们可以:


1. 该应用程序与API密钥一起使用。

2. 利用密码哈希对帐户密码进行暴力破解

3. 使用/auth/resetpassword方法更改帐户密码:


CMS源码审计之从零到实现RCE


远程代码执行


成功入侵管理员帐户后,可以使用Cockpit的标准Finder组件上传Web Shell,以实现远程代码执行:


CMS源码审计之从零到实现RCE

将Web Shell _shell.php上载到Cockpit根目录


CMS源码审计之从零到实现RCE

使用Web Shell在服务器上执行命令


CMS源码审计之从零到实现RCE

END



CMS源码审计之从零到实现RCE


好文!必须在

本文始发于微信公众号(SecTr安全团队):CMS源码审计之从零到实现RCE

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: