概述
研究人员在对Cockpit CMS进行源码审计时,发现了一些漏洞。攻击者可以利用这些漏洞控制任意账户并实现远程代码执行。下文中,研究人员详细记录了漏洞发现的过程,并演示了如何利用这些漏洞。
提取用户名
/auth/check中的NoSQL注入漏洞:CVE-2020-35846
负责对应用程序用户进行身份验证的Auth控制器使用的检查方法如下图所示:
Auth::check方法
身份验证功能
可以看出,以上代码缺少对用户参数类型的检查,从而允许在查询中嵌入具有任意MongoDB运算符的对象,进行盲注攻击。
要成功利用该漏洞,还需找到一种方法来返回条件结果。在对源代码进行分析后,研究人员找到了一种方法,即在password参数中传递一个数组(而不是字符串),从而可以通过password_verify函数弹出关于无效值类型的警告。
NoSQL盲注方法之使用$eq运算符
$eq运算符将匹配字段值等于指定值的文档,可以利用它对用户名进行暴力破解。
满足条件:找到名为admin的用户
不满足条件:找不到名为admini的用户
NoSQL盲注方法之使用$regex运算符
$regex运算符为查询中的模式匹配字符串提供正则表达式功能,可以利用它对应用程序的所有用户名进行暴力破解。
满足条件:找到一个以ad开头的用户名
不满足条件:找不到以ada开头的用户名
此外,我们可以通过在查询中添加$nin运算符来排除已找到的所有用户,从而加快暴力破解的速度。同时,我们还可以在正则表达式中添加固定的量词,以查找或限制字符串的长度。
NoSQL盲注方法之使用MongoLite库中的$func运算符
$func运算符允许调用标准函数$b(任何具有单个参数的PHP函数),该函数采用等于字段$a(在本例中为user字段)的单个参数:
通过将var_dump或var_exportPHP函数作为参数传递,我们将把盲注变成经典的带内注入。只需一个查询,我们就可以获取应用程序的所有用户名:
提取密码重置令牌
与其他的Web应用程序一样,Cockpit允许用户重置帐户密码。研究人员发现了两个NoSQL注入漏洞,利用这些漏洞可以获得任意用户的密码重置令牌。
/auth/resetpassword中的NoSQL注入漏洞:CVE-2020-35847
Auth控制器的resetpassword方法负责使用reset令牌更改用户密码,代码如下所示:
可以看出代码中未对token参数类型进行检查,因此我们可以使用以下查询获取现有的令牌:
/auth/newpassword中的NoSQL注入:CVE-2020-35848
Auth控制器的newpassword方法负责显示用户密码重置表单,代码如下所示:
同样,没有针对令牌参数的类型检查,因此可以使用类似的查询进行获取:
用户账户入侵
成功获取密码重置令牌后,就可以通过以下步骤对我们感兴趣任意用户进行入侵:
1. 访问/auth/requestreset以生成用于重置所选用户密码的令牌:
2.使用上述方法之一(/auth/resetpassword或/auth/newpassword)提取令牌:
3. 使用/auth/newpassword方法和在上一步中获得的密码重置令牌,提取用户帐户数据(用户名、密码哈希、API密钥、密码重置令牌):
提取用户名
掌握了这些数据之后,我们可以:
1. 该应用程序与API密钥一起使用。
2. 利用密码哈希对帐户密码进行暴力破解
3. 使用/auth/resetpassword方法更改帐户密码:
远程代码执行
成功入侵管理员帐户后,可以使用Cockpit的标准Finder组件上传Web Shell,以实现远程代码执行:
将Web Shell _shell.php上载到Cockpit根目录
使用Web Shell在服务器上执行命令
END
本文始发于微信公众号(SecTr安全团队):CMS源码审计之从零到实现RCE
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论